From 14048f7de50a577643d1bd28f8384a3d0bd2a6cc Mon Sep 17 00:00:00 2001 From: Mia Steinkirch Date: Mon, 24 Jun 2019 10:49:18 -0700 Subject: [PATCH] add zsh h() --- venv/.Python | 1 - venv/bin/activate | 78 - venv/bin/activate.csh | 42 - venv/bin/activate.fish | 101 - venv/bin/activate.ps1 | 60 - venv/bin/activate_this.py | 46 - venv/bin/easy_install | 10 - venv/bin/easy_install-2.7 | 10 - venv/bin/pip | 10 - venv/bin/pip2 | 10 - venv/bin/pip2.7 | 10 - venv/bin/python | Bin 51744 -> 0 bytes venv/bin/python-config | 78 - venv/bin/python2 | 1 - venv/bin/python2.7 | 1 - venv/bin/wheel | 10 - venv/include/python2.7 | 1 - venv/lib/python2.7/UserDict.py | 1 - venv/lib/python2.7/UserDict.pyc | Bin 11745 -> 0 bytes venv/lib/python2.7/_abcoll.py | 1 - venv/lib/python2.7/_abcoll.pyc | Bin 32310 -> 0 bytes venv/lib/python2.7/_weakrefset.py | 1 - venv/lib/python2.7/_weakrefset.pyc | Bin 12798 -> 0 bytes venv/lib/python2.7/abc.py | 1 - venv/lib/python2.7/abc.pyc | Bin 6858 -> 0 bytes venv/lib/python2.7/codecs.py | 1 - venv/lib/python2.7/codecs.pyc | Bin 42819 -> 0 bytes venv/lib/python2.7/config | 1 - venv/lib/python2.7/copy_reg.py | 1 - venv/lib/python2.7/copy_reg.pyc | Bin 5828 -> 0 bytes venv/lib/python2.7/distutils/__init__.py | 134 - venv/lib/python2.7/distutils/__init__.pyc | Bin 4499 -> 0 bytes venv/lib/python2.7/distutils/distutils.cfg | 6 - venv/lib/python2.7/encodings | 1 - venv/lib/python2.7/fnmatch.py | 1 - venv/lib/python2.7/fnmatch.pyc | Bin 4004 -> 0 bytes venv/lib/python2.7/genericpath.py | 1 - venv/lib/python2.7/genericpath.pyc | Bin 4232 -> 0 bytes venv/lib/python2.7/lib-dynload | 1 - venv/lib/python2.7/linecache.py | 1 - venv/lib/python2.7/linecache.pyc | Bin 3662 -> 0 bytes venv/lib/python2.7/locale.py | 1 - venv/lib/python2.7/locale.pyc | Bin 57164 -> 0 bytes .../lib/python2.7/no-global-site-packages.txt | 0 venv/lib/python2.7/ntpath.py | 1 - venv/lib/python2.7/orig-prefix.txt | 1 - venv/lib/python2.7/os.py | 1 - venv/lib/python2.7/os.pyc | Bin 29144 -> 0 bytes venv/lib/python2.7/posixpath.py | 1 - venv/lib/python2.7/posixpath.pyc | Bin 12915 -> 0 bytes venv/lib/python2.7/re.py | 1 - venv/lib/python2.7/re.pyc | Bin 14778 -> 0 bytes .../python2.7/site-packages/easy_install.py | 5 - .../python2.7/site-packages/easy_install.pyc | Bin 369 -> 0 bytes .../pip-19.1.1.dist-info/INSTALLER | 1 - .../pip-19.1.1.dist-info/LICENSE.txt | 20 - .../pip-19.1.1.dist-info/METADATA | 75 - .../site-packages/pip-19.1.1.dist-info/RECORD | 618 -- .../site-packages/pip-19.1.1.dist-info/WHEEL | 6 - .../pip-19.1.1.dist-info/entry_points.txt | 5 - .../pip-19.1.1.dist-info/top_level.txt | 1 - .../python2.7/site-packages/pip/__init__.py | 1 - .../python2.7/site-packages/pip/__init__.pyc | Bin 215 -> 0 bytes .../python2.7/site-packages/pip/__main__.py | 19 - .../python2.7/site-packages/pip/__main__.pyc | Bin 562 -> 0 bytes .../site-packages/pip/_internal/__init__.py | 78 - .../site-packages/pip/_internal/__init__.pyc | Bin 2298 -> 0 bytes .../site-packages/pip/_internal/build_env.py | 215 - .../site-packages/pip/_internal/build_env.pyc | Bin 10101 -> 0 bytes .../site-packages/pip/_internal/cache.py | 224 - .../site-packages/pip/_internal/cache.pyc | Bin 9463 -> 0 bytes .../pip/_internal/cli/__init__.py | 4 - .../pip/_internal/cli/__init__.pyc | Bin 290 -> 0 bytes .../pip/_internal/cli/autocompletion.py | 152 - .../pip/_internal/cli/autocompletion.pyc | Bin 5912 -> 0 bytes .../pip/_internal/cli/base_command.py | 340 - .../pip/_internal/cli/base_command.pyc | Bin 10137 -> 0 bytes .../pip/_internal/cli/cmdoptions.py | 809 -- .../pip/_internal/cli/cmdoptions.pyc | Bin 21201 -> 0 bytes .../pip/_internal/cli/main_parser.py | 104 - .../pip/_internal/cli/main_parser.pyc | Bin 2974 -> 0 bytes .../site-packages/pip/_internal/cli/parser.py | 261 - .../pip/_internal/cli/parser.pyc | Bin 11559 -> 0 bytes .../pip/_internal/cli/status_codes.py | 8 - .../pip/_internal/cli/status_codes.pyc | Bin 454 -> 0 bytes .../pip/_internal/commands/__init__.py | 79 - .../pip/_internal/commands/__init__.pyc | Bin 3475 -> 0 bytes .../pip/_internal/commands/check.py | 41 - .../pip/_internal/commands/check.pyc | Bin 1725 -> 0 bytes .../pip/_internal/commands/completion.py | 94 - .../pip/_internal/commands/completion.pyc | Bin 3577 -> 0 bytes .../pip/_internal/commands/configuration.py | 253 - .../pip/_internal/commands/configuration.pyc | Bin 8747 -> 0 bytes .../pip/_internal/commands/download.py | 176 - .../pip/_internal/commands/download.pyc | Bin 5692 -> 0 bytes .../pip/_internal/commands/freeze.py | 96 - .../pip/_internal/commands/freeze.pyc | Bin 3677 -> 0 bytes .../pip/_internal/commands/hash.py | 57 - .../pip/_internal/commands/hash.pyc | Bin 2783 -> 0 bytes .../pip/_internal/commands/help.py | 37 - .../pip/_internal/commands/help.pyc | Bin 1651 -> 0 bytes .../pip/_internal/commands/install.py | 587 -- .../pip/_internal/commands/install.pyc | Bin 16064 -> 0 bytes .../pip/_internal/commands/list.py | 302 - .../pip/_internal/commands/list.pyc | Bin 11121 -> 0 bytes .../pip/_internal/commands/search.py | 135 - .../pip/_internal/commands/search.pyc | Bin 5521 -> 0 bytes .../pip/_internal/commands/show.py | 168 - .../pip/_internal/commands/show.pyc | Bin 6435 -> 0 bytes .../pip/_internal/commands/uninstall.py | 78 - .../pip/_internal/commands/uninstall.pyc | Bin 3344 -> 0 bytes .../pip/_internal/commands/wheel.py | 186 - .../pip/_internal/commands/wheel.pyc | Bin 6127 -> 0 bytes .../pip/_internal/configuration.py | 384 - .../pip/_internal/configuration.pyc | Bin 13105 -> 0 bytes .../site-packages/pip/_internal/download.py | 979 -- .../site-packages/pip/_internal/download.pyc | Bin 28623 -> 0 bytes .../site-packages/pip/_internal/exceptions.py | 274 - .../pip/_internal/exceptions.pyc | Bin 16273 -> 0 bytes .../site-packages/pip/_internal/index.py | 1108 --- .../site-packages/pip/_internal/index.pyc | Bin 36283 -> 0 bytes .../site-packages/pip/_internal/locations.py | 211 - .../site-packages/pip/_internal/locations.pyc | Bin 5685 -> 0 bytes .../pip/_internal/models/__init__.py | 2 - .../pip/_internal/models/__init__.pyc | Bin 278 -> 0 bytes .../pip/_internal/models/candidate.py | 31 - .../pip/_internal/models/candidate.pyc | Bin 1709 -> 0 bytes .../pip/_internal/models/format_control.py | 73 - .../pip/_internal/models/format_control.pyc | Bin 3380 -> 0 bytes .../pip/_internal/models/index.py | 31 - .../pip/_internal/models/index.pyc | Bin 1555 -> 0 bytes .../pip/_internal/models/link.py | 163 - .../pip/_internal/models/link.pyc | Bin 7361 -> 0 bytes .../pip/_internal/operations/__init__.py | 0 .../pip/_internal/operations/__init__.pyc | Bin 203 -> 0 bytes .../pip/_internal/operations/check.py | 155 - .../pip/_internal/operations/check.pyc | Bin 4985 -> 0 bytes .../pip/_internal/operations/freeze.py | 247 - .../pip/_internal/operations/freeze.pyc | Bin 7528 -> 0 bytes .../pip/_internal/operations/prepare.py | 426 - .../pip/_internal/operations/prepare.pyc | Bin 13680 -> 0 bytes .../site-packages/pip/_internal/pep425tags.py | 381 - .../pip/_internal/pep425tags.pyc | Bin 11594 -> 0 bytes .../site-packages/pip/_internal/pyproject.py | 171 - .../site-packages/pip/_internal/pyproject.pyc | Bin 4063 -> 0 bytes .../pip/_internal/req/__init__.py | 78 - .../pip/_internal/req/__init__.pyc | Bin 1982 -> 0 bytes .../pip/_internal/req/constructors.py | 340 - .../pip/_internal/req/constructors.pyc | Bin 9643 -> 0 bytes .../pip/_internal/req/req_file.py | 383 - .../pip/_internal/req/req_file.pyc | Bin 11785 -> 0 bytes .../pip/_internal/req/req_install.py | 1028 --- .../pip/_internal/req/req_install.pyc | Bin 32280 -> 0 bytes .../pip/_internal/req/req_set.py | 193 - .../pip/_internal/req/req_set.pyc | Bin 6797 -> 0 bytes .../pip/_internal/req/req_tracker.py | 96 - .../pip/_internal/req/req_tracker.pyc | Bin 4564 -> 0 bytes .../pip/_internal/req/req_uninstall.py | 633 -- .../pip/_internal/req/req_uninstall.pyc | Bin 23635 -> 0 bytes .../site-packages/pip/_internal/resolve.py | 393 - .../site-packages/pip/_internal/resolve.pyc | Bin 11222 -> 0 bytes .../pip/_internal/utils/__init__.py | 0 .../pip/_internal/utils/__init__.pyc | Bin 198 -> 0 bytes .../pip/_internal/utils/appdirs.py | 268 - .../pip/_internal/utils/appdirs.pyc | Bin 9403 -> 0 bytes .../pip/_internal/utils/compat.py | 264 - .../pip/_internal/utils/compat.pyc | Bin 8638 -> 0 bytes .../pip/_internal/utils/deprecation.py | 93 - .../pip/_internal/utils/deprecation.pyc | Bin 3408 -> 0 bytes .../pip/_internal/utils/encoding.py | 39 - .../pip/_internal/utils/encoding.pyc | Bin 1649 -> 0 bytes .../pip/_internal/utils/filesystem.py | 30 - .../pip/_internal/utils/filesystem.pyc | Bin 912 -> 0 bytes .../pip/_internal/utils/glibc.py | 93 - .../pip/_internal/utils/glibc.pyc | Bin 2406 -> 0 bytes .../pip/_internal/utils/hashes.py | 115 - .../pip/_internal/utils/hashes.pyc | Bin 5026 -> 0 bytes .../pip/_internal/utils/logging.py | 371 - .../pip/_internal/utils/logging.pyc | Bin 12636 -> 0 bytes .../site-packages/pip/_internal/utils/misc.py | 1011 -- .../pip/_internal/utils/misc.pyc | Bin 34905 -> 0 bytes .../pip/_internal/utils/models.py | 40 - .../pip/_internal/utils/models.pyc | Bin 2950 -> 0 bytes .../pip/_internal/utils/outdated.py | 162 - .../pip/_internal/utils/outdated.pyc | Bin 5214 -> 0 bytes .../pip/_internal/utils/packaging.py | 85 - .../pip/_internal/utils/packaging.pyc | Bin 3489 -> 0 bytes .../pip/_internal/utils/setuptools_build.py | 8 - .../pip/_internal/utils/setuptools_build.pyc | Bin 404 -> 0 bytes .../pip/_internal/utils/temp_dir.py | 155 - .../pip/_internal/utils/temp_dir.pyc | Bin 6397 -> 0 bytes .../pip/_internal/utils/typing.py | 29 - .../pip/_internal/utils/typing.pyc | Bin 1350 -> 0 bytes .../site-packages/pip/_internal/utils/ui.py | 424 - .../site-packages/pip/_internal/utils/ui.pyc | Bin 17200 -> 0 bytes .../pip/_internal/vcs/__init__.py | 604 -- .../pip/_internal/vcs/__init__.pyc | Bin 22654 -> 0 bytes .../site-packages/pip/_internal/vcs/bazaar.py | 103 - .../pip/_internal/vcs/bazaar.pyc | Bin 5100 -> 0 bytes .../site-packages/pip/_internal/vcs/git.py | 362 - .../site-packages/pip/_internal/vcs/git.pyc | Bin 12424 -> 0 bytes .../pip/_internal/vcs/mercurial.py | 105 - .../pip/_internal/vcs/mercurial.pyc | Bin 5223 -> 0 bytes .../pip/_internal/vcs/subversion.py | 234 - .../pip/_internal/vcs/subversion.pyc | Bin 8821 -> 0 bytes .../site-packages/pip/_internal/wheel.py | 1098 --- .../site-packages/pip/_internal/wheel.pyc | Bin 32820 -> 0 bytes .../site-packages/pip/_vendor/__init__.py | 109 - .../site-packages/pip/_vendor/__init__.pyc | Bin 3389 -> 0 bytes .../site-packages/pip/_vendor/appdirs.py | 604 -- .../site-packages/pip/_vendor/appdirs.pyc | Bin 23990 -> 0 bytes .../pip/_vendor/cachecontrol/__init__.py | 11 - .../pip/_vendor/cachecontrol/__init__.pyc | Bin 630 -> 0 bytes .../pip/_vendor/cachecontrol/_cmd.py | 57 - .../pip/_vendor/cachecontrol/_cmd.pyc | Bin 2288 -> 0 bytes .../pip/_vendor/cachecontrol/adapter.py | 133 - .../pip/_vendor/cachecontrol/adapter.pyc | Bin 4045 -> 0 bytes .../pip/_vendor/cachecontrol/cache.py | 39 - .../pip/_vendor/cachecontrol/cache.pyc | Bin 2923 -> 0 bytes .../_vendor/cachecontrol/caches/__init__.py | 2 - .../_vendor/cachecontrol/caches/__init__.pyc | Bin 329 -> 0 bytes .../_vendor/cachecontrol/caches/file_cache.py | 146 - .../cachecontrol/caches/file_cache.pyc | Bin 4755 -> 0 bytes .../cachecontrol/caches/redis_cache.py | 33 - .../cachecontrol/caches/redis_cache.pyc | Bin 2500 -> 0 bytes .../pip/_vendor/cachecontrol/compat.py | 29 - .../pip/_vendor/cachecontrol/compat.pyc | Bin 849 -> 0 bytes .../pip/_vendor/cachecontrol/controller.py | 367 - .../pip/_vendor/cachecontrol/controller.pyc | Bin 10121 -> 0 bytes .../pip/_vendor/cachecontrol/filewrapper.py | 80 - .../pip/_vendor/cachecontrol/filewrapper.pyc | Bin 3043 -> 0 bytes .../pip/_vendor/cachecontrol/heuristics.py | 135 - .../pip/_vendor/cachecontrol/heuristics.pyc | Bin 6673 -> 0 bytes .../pip/_vendor/cachecontrol/serialize.py | 186 - .../pip/_vendor/cachecontrol/serialize.pyc | Bin 6411 -> 0 bytes .../pip/_vendor/cachecontrol/wrapper.py | 29 - .../pip/_vendor/cachecontrol/wrapper.pyc | Bin 906 -> 0 bytes .../pip/_vendor/certifi/__init__.py | 3 - .../pip/_vendor/certifi/__init__.pyc | Bin 287 -> 0 bytes .../pip/_vendor/certifi/__main__.py | 2 - .../pip/_vendor/certifi/__main__.pyc | Bin 273 -> 0 bytes .../pip/_vendor/certifi/cacert.pem | 4658 ---------- .../site-packages/pip/_vendor/certifi/core.py | 15 - .../pip/_vendor/certifi/core.pyc | Bin 633 -> 0 bytes .../pip/_vendor/chardet/__init__.py | 39 - .../pip/_vendor/chardet/__init__.pyc | Bin 1088 -> 0 bytes .../pip/_vendor/chardet/big5freq.py | 386 - .../pip/_vendor/chardet/big5freq.pyc | Bin 54748 -> 0 bytes .../pip/_vendor/chardet/big5prober.py | 47 - .../pip/_vendor/chardet/big5prober.pyc | Bin 1592 -> 0 bytes .../pip/_vendor/chardet/chardistribution.py | 233 - .../pip/_vendor/chardet/chardistribution.pyc | Bin 9073 -> 0 bytes .../pip/_vendor/chardet/charsetgroupprober.py | 106 - .../_vendor/chardet/charsetgroupprober.pyc | Bin 3249 -> 0 bytes .../pip/_vendor/chardet/charsetprober.py | 145 - .../pip/_vendor/chardet/charsetprober.pyc | Bin 4666 -> 0 bytes .../pip/_vendor/chardet/cli/__init__.py | 1 - .../pip/_vendor/chardet/cli/__init__.pyc | Bin 202 -> 0 bytes .../pip/_vendor/chardet/cli/chardetect.py | 85 - .../pip/_vendor/chardet/cli/chardetect.pyc | Bin 3331 -> 0 bytes .../pip/_vendor/chardet/codingstatemachine.py | 88 - .../_vendor/chardet/codingstatemachine.pyc | Bin 3736 -> 0 bytes .../pip/_vendor/chardet/compat.py | 34 - .../pip/_vendor/chardet/compat.pyc | Bin 451 -> 0 bytes .../pip/_vendor/chardet/cp949prober.py | 49 - .../pip/_vendor/chardet/cp949prober.pyc | Bin 1600 -> 0 bytes .../pip/_vendor/chardet/enums.py | 76 - .../pip/_vendor/chardet/enums.pyc | Bin 3505 -> 0 bytes .../pip/_vendor/chardet/escprober.py | 101 - .../pip/_vendor/chardet/escprober.pyc | Bin 3607 -> 0 bytes .../pip/_vendor/chardet/escsm.py | 246 - .../pip/_vendor/chardet/escsm.pyc | Bin 8062 -> 0 bytes .../pip/_vendor/chardet/eucjpprober.py | 92 - .../pip/_vendor/chardet/eucjpprober.pyc | Bin 3422 -> 0 bytes .../pip/_vendor/chardet/euckrfreq.py | 195 - .../pip/_vendor/chardet/euckrfreq.pyc | Bin 24134 -> 0 bytes .../pip/_vendor/chardet/euckrprober.py | 47 - .../pip/_vendor/chardet/euckrprober.pyc | Bin 1601 -> 0 bytes .../pip/_vendor/chardet/euctwfreq.py | 387 - .../pip/_vendor/chardet/euctwfreq.pyc | Bin 54757 -> 0 bytes .../pip/_vendor/chardet/euctwprober.py | 46 - .../pip/_vendor/chardet/euctwprober.pyc | Bin 1601 -> 0 bytes .../pip/_vendor/chardet/gb2312freq.py | 283 - .../pip/_vendor/chardet/gb2312freq.pyc | Bin 38399 -> 0 bytes .../pip/_vendor/chardet/gb2312prober.py | 46 - .../pip/_vendor/chardet/gb2312prober.pyc | Bin 1610 -> 0 bytes .../pip/_vendor/chardet/hebrewprober.py | 292 - .../pip/_vendor/chardet/hebrewprober.pyc | Bin 4331 -> 0 bytes .../pip/_vendor/chardet/jisfreq.py | 325 - .../pip/_vendor/chardet/jisfreq.pyc | Bin 44543 -> 0 bytes .../pip/_vendor/chardet/jpcntx.py | 233 - .../pip/_vendor/chardet/jpcntx.pyc | Bin 25988 -> 0 bytes .../pip/_vendor/chardet/langbulgarianmodel.py | 228 - .../_vendor/chardet/langbulgarianmodel.pyc | Bin 25011 -> 0 bytes .../pip/_vendor/chardet/langcyrillicmodel.py | 333 - .../pip/_vendor/chardet/langcyrillicmodel.pyc | Bin 30731 -> 0 bytes .../pip/_vendor/chardet/langgreekmodel.py | 225 - .../pip/_vendor/chardet/langgreekmodel.pyc | Bin 24686 -> 0 bytes .../pip/_vendor/chardet/langhebrewmodel.py | 200 - .../pip/_vendor/chardet/langhebrewmodel.pyc | Bin 23497 -> 0 bytes .../pip/_vendor/chardet/langhungarianmodel.py | 225 - .../_vendor/chardet/langhungarianmodel.pyc | Bin 24981 -> 0 bytes .../pip/_vendor/chardet/langthaimodel.py | 199 - .../pip/_vendor/chardet/langthaimodel.pyc | Bin 23476 -> 0 bytes .../pip/_vendor/chardet/langturkishmodel.py | 193 - .../pip/_vendor/chardet/langturkishmodel.pyc | Bin 23493 -> 0 bytes .../pip/_vendor/chardet/latin1prober.py | 145 - .../pip/_vendor/chardet/latin1prober.pyc | Bin 4117 -> 0 bytes .../pip/_vendor/chardet/mbcharsetprober.py | 91 - .../pip/_vendor/chardet/mbcharsetprober.pyc | Bin 3171 -> 0 bytes .../pip/_vendor/chardet/mbcsgroupprober.py | 54 - .../pip/_vendor/chardet/mbcsgroupprober.pyc | Bin 1477 -> 0 bytes .../pip/_vendor/chardet/mbcssm.py | 572 -- .../pip/_vendor/chardet/mbcssm.pyc | Bin 19168 -> 0 bytes .../pip/_vendor/chardet/sbcharsetprober.py | 132 - .../pip/_vendor/chardet/sbcharsetprober.pyc | Bin 4050 -> 0 bytes .../pip/_vendor/chardet/sbcsgroupprober.py | 73 - .../pip/_vendor/chardet/sbcsgroupprober.pyc | Bin 2070 -> 0 bytes .../pip/_vendor/chardet/sjisprober.py | 92 - .../pip/_vendor/chardet/sjisprober.pyc | Bin 3443 -> 0 bytes .../pip/_vendor/chardet/universaldetector.py | 286 - .../pip/_vendor/chardet/universaldetector.pyc | Bin 7403 -> 0 bytes .../pip/_vendor/chardet/utf8prober.py | 82 - .../pip/_vendor/chardet/utf8prober.pyc | Bin 2892 -> 0 bytes .../pip/_vendor/chardet/version.py | 9 - .../pip/_vendor/chardet/version.pyc | Bin 478 -> 0 bytes .../pip/_vendor/colorama/__init__.py | 6 - .../pip/_vendor/colorama/__init__.pyc | Bin 530 -> 0 bytes .../pip/_vendor/colorama/ansi.py | 102 - .../pip/_vendor/colorama/ansi.pyc | Bin 5184 -> 0 bytes .../pip/_vendor/colorama/ansitowin32.py | 257 - .../pip/_vendor/colorama/ansitowin32.pyc | Bin 11113 -> 0 bytes .../pip/_vendor/colorama/initialise.py | 80 - .../pip/_vendor/colorama/initialise.pyc | Bin 2683 -> 0 bytes .../pip/_vendor/colorama/win32.py | 152 - .../pip/_vendor/colorama/win32.pyc | Bin 5862 -> 0 bytes .../pip/_vendor/colorama/winterm.py | 169 - .../pip/_vendor/colorama/winterm.pyc | Bin 6935 -> 0 bytes .../pip/_vendor/distlib/__init__.py | 23 - .../pip/_vendor/distlib/__init__.pyc | Bin 1623 -> 0 bytes .../pip/_vendor/distlib/_backport/__init__.py | 6 - .../_vendor/distlib/_backport/__init__.pyc | Bin 498 -> 0 bytes .../pip/_vendor/distlib/_backport/misc.py | 41 - .../pip/_vendor/distlib/_backport/misc.pyc | Bin 1616 -> 0 bytes .../pip/_vendor/distlib/_backport/shutil.py | 761 -- .../pip/_vendor/distlib/_backport/shutil.pyc | Bin 28427 -> 0 bytes .../_vendor/distlib/_backport/sysconfig.cfg | 84 - .../_vendor/distlib/_backport/sysconfig.py | 788 -- .../_vendor/distlib/_backport/sysconfig.pyc | Bin 22518 -> 0 bytes .../pip/_vendor/distlib/_backport/tarfile.py | 2607 ------ .../pip/_vendor/distlib/_backport/tarfile.pyc | Bin 86950 -> 0 bytes .../pip/_vendor/distlib/compat.py | 1120 --- .../pip/_vendor/distlib/compat.pyc | Bin 44256 -> 0 bytes .../pip/_vendor/distlib/database.py | 1339 --- .../pip/_vendor/distlib/database.pyc | Bin 53896 -> 0 bytes .../pip/_vendor/distlib/index.py | 516 -- .../pip/_vendor/distlib/index.pyc | Bin 20999 -> 0 bytes .../pip/_vendor/distlib/locators.py | 1295 --- .../pip/_vendor/distlib/locators.pyc | Bin 49817 -> 0 bytes .../pip/_vendor/distlib/manifest.py | 393 - .../pip/_vendor/distlib/manifest.pyc | Bin 12954 -> 0 bytes .../pip/_vendor/distlib/markers.py | 131 - .../pip/_vendor/distlib/markers.pyc | Bin 7112 -> 0 bytes .../pip/_vendor/distlib/metadata.py | 1094 --- .../pip/_vendor/distlib/metadata.pyc | Bin 38836 -> 0 bytes .../pip/_vendor/distlib/resources.py | 355 - .../pip/_vendor/distlib/resources.pyc | Bin 15896 -> 0 bytes .../pip/_vendor/distlib/scripts.py | 417 - .../pip/_vendor/distlib/scripts.pyc | Bin 14496 -> 0 bytes .../site-packages/pip/_vendor/distlib/t32.exe | Bin 92672 -> 0 bytes .../site-packages/pip/_vendor/distlib/t64.exe | Bin 102400 -> 0 bytes .../site-packages/pip/_vendor/distlib/util.py | 1756 ---- .../pip/_vendor/distlib/util.pyc | Bin 67805 -> 0 bytes .../pip/_vendor/distlib/version.py | 736 -- .../pip/_vendor/distlib/version.pyc | Bin 29804 -> 0 bytes .../site-packages/pip/_vendor/distlib/w32.exe | Bin 89088 -> 0 bytes .../site-packages/pip/_vendor/distlib/w64.exe | Bin 99328 -> 0 bytes .../pip/_vendor/distlib/wheel.py | 988 -- .../pip/_vendor/distlib/wheel.pyc | Bin 33453 -> 0 bytes .../site-packages/pip/_vendor/distro.py | 1216 --- .../site-packages/pip/_vendor/distro.pyc | Bin 42880 -> 0 bytes .../pip/_vendor/html5lib/__init__.py | 35 - .../pip/_vendor/html5lib/__init__.pyc | Bin 1495 -> 0 bytes .../pip/_vendor/html5lib/_ihatexml.py | 288 - .../pip/_vendor/html5lib/_ihatexml.pyc | Bin 16440 -> 0 bytes .../pip/_vendor/html5lib/_inputstream.py | 923 -- .../pip/_vendor/html5lib/_inputstream.pyc | Bin 30522 -> 0 bytes .../pip/_vendor/html5lib/_tokenizer.py | 1721 ---- .../pip/_vendor/html5lib/_tokenizer.pyc | Bin 57395 -> 0 bytes .../pip/_vendor/html5lib/_trie/__init__.py | 14 - .../pip/_vendor/html5lib/_trie/__init__.pyc | Bin 489 -> 0 bytes .../pip/_vendor/html5lib/_trie/_base.py | 37 - .../pip/_vendor/html5lib/_trie/_base.pyc | Bin 2266 -> 0 bytes .../pip/_vendor/html5lib/_trie/datrie.py | 44 - .../pip/_vendor/html5lib/_trie/datrie.pyc | Bin 3296 -> 0 bytes .../pip/_vendor/html5lib/_trie/py.py | 67 - .../pip/_vendor/html5lib/_trie/py.pyc | Bin 3489 -> 0 bytes .../pip/_vendor/html5lib/_utils.py | 124 - .../pip/_vendor/html5lib/_utils.pyc | Bin 4808 -> 0 bytes .../pip/_vendor/html5lib/constants.py | 2947 ------ .../pip/_vendor/html5lib/constants.pyc | Bin 83207 -> 0 bytes .../pip/_vendor/html5lib/filters/__init__.py | 0 .../pip/_vendor/html5lib/filters/__init__.pyc | Bin 207 -> 0 bytes .../filters/alphabeticalattributes.py | 29 - .../filters/alphabeticalattributes.pyc | Bin 1876 -> 0 bytes .../pip/_vendor/html5lib/filters/base.py | 12 - .../pip/_vendor/html5lib/filters/base.pyc | Bin 1341 -> 0 bytes .../html5lib/filters/inject_meta_charset.py | 73 - .../html5lib/filters/inject_meta_charset.pyc | Bin 2648 -> 0 bytes .../pip/_vendor/html5lib/filters/lint.py | 93 - .../pip/_vendor/html5lib/filters/lint.pyc | Bin 3500 -> 0 bytes .../_vendor/html5lib/filters/optionaltags.py | 207 - .../_vendor/html5lib/filters/optionaltags.pyc | Bin 4754 -> 0 bytes .../pip/_vendor/html5lib/filters/sanitizer.py | 896 -- .../_vendor/html5lib/filters/sanitizer.pyc | Bin 27270 -> 0 bytes .../_vendor/html5lib/filters/whitespace.py | 38 - .../_vendor/html5lib/filters/whitespace.pyc | Bin 1941 -> 0 bytes .../pip/_vendor/html5lib/html5parser.py | 2791 ------ .../pip/_vendor/html5lib/html5parser.pyc | Bin 141299 -> 0 bytes .../pip/_vendor/html5lib/serializer.py | 409 - .../pip/_vendor/html5lib/serializer.pyc | Bin 13932 -> 0 bytes .../_vendor/html5lib/treeadapters/__init__.py | 30 - .../html5lib/treeadapters/__init__.pyc | Bin 1022 -> 0 bytes .../_vendor/html5lib/treeadapters/genshi.py | 54 - .../_vendor/html5lib/treeadapters/genshi.pyc | Bin 1973 -> 0 bytes .../pip/_vendor/html5lib/treeadapters/sax.py | 50 - .../pip/_vendor/html5lib/treeadapters/sax.pyc | Bin 1970 -> 0 bytes .../_vendor/html5lib/treebuilders/__init__.py | 88 - .../html5lib/treebuilders/__init__.pyc | Bin 3662 -> 0 bytes .../pip/_vendor/html5lib/treebuilders/base.py | 417 - .../_vendor/html5lib/treebuilders/base.pyc | Bin 16123 -> 0 bytes .../pip/_vendor/html5lib/treebuilders/dom.py | 236 - .../pip/_vendor/html5lib/treebuilders/dom.pyc | Bin 13400 -> 0 bytes .../_vendor/html5lib/treebuilders/etree.py | 340 - .../_vendor/html5lib/treebuilders/etree.pyc | Bin 16763 -> 0 bytes .../html5lib/treebuilders/etree_lxml.py | 366 - .../html5lib/treebuilders/etree_lxml.pyc | Bin 16913 -> 0 bytes .../_vendor/html5lib/treewalkers/__init__.py | 154 - .../_vendor/html5lib/treewalkers/__init__.pyc | Bin 5071 -> 0 bytes .../pip/_vendor/html5lib/treewalkers/base.py | 252 - .../pip/_vendor/html5lib/treewalkers/base.pyc | Bin 9693 -> 0 bytes .../pip/_vendor/html5lib/treewalkers/dom.py | 43 - .../pip/_vendor/html5lib/treewalkers/dom.pyc | Bin 2517 -> 0 bytes .../pip/_vendor/html5lib/treewalkers/etree.py | 130 - .../_vendor/html5lib/treewalkers/etree.pyc | Bin 4770 -> 0 bytes .../html5lib/treewalkers/etree_lxml.py | 213 - .../html5lib/treewalkers/etree_lxml.pyc | Bin 10584 -> 0 bytes .../_vendor/html5lib/treewalkers/genshi.py | 69 - .../_vendor/html5lib/treewalkers/genshi.pyc | Bin 2626 -> 0 bytes .../pip/_vendor/idna/__init__.py | 2 - .../pip/_vendor/idna/__init__.pyc | Bin 291 -> 0 bytes .../site-packages/pip/_vendor/idna/codec.py | 118 - .../site-packages/pip/_vendor/idna/codec.pyc | Bin 4486 -> 0 bytes .../site-packages/pip/_vendor/idna/compat.py | 12 - .../site-packages/pip/_vendor/idna/compat.pyc | Bin 999 -> 0 bytes .../site-packages/pip/_vendor/idna/core.py | 396 - .../site-packages/pip/_vendor/idna/core.pyc | Bin 13150 -> 0 bytes .../pip/_vendor/idna/idnadata.py | 1979 ---- .../pip/_vendor/idna/idnadata.pyc | Bin 35078 -> 0 bytes .../pip/_vendor/idna/intranges.py | 53 - .../pip/_vendor/idna/intranges.pyc | Bin 2452 -> 0 bytes .../pip/_vendor/idna/package_data.py | 2 - .../pip/_vendor/idna/package_data.pyc | Bin 229 -> 0 bytes .../pip/_vendor/idna/uts46data.py | 8205 ----------------- .../pip/_vendor/idna/uts46data.pyc | Bin 296556 -> 0 bytes .../site-packages/pip/_vendor/ipaddress.py | 2419 ----- .../site-packages/pip/_vendor/ipaddress.pyc | Bin 85785 -> 0 bytes .../pip/_vendor/lockfile/__init__.py | 347 - .../pip/_vendor/lockfile/__init__.pyc | Bin 13475 -> 0 bytes .../pip/_vendor/lockfile/linklockfile.py | 73 - .../pip/_vendor/lockfile/linklockfile.pyc | Bin 3238 -> 0 bytes .../pip/_vendor/lockfile/mkdirlockfile.py | 84 - .../pip/_vendor/lockfile/mkdirlockfile.pyc | Bin 3802 -> 0 bytes .../pip/_vendor/lockfile/pidlockfile.py | 190 - .../pip/_vendor/lockfile/pidlockfile.pyc | Bin 6473 -> 0 bytes .../pip/_vendor/lockfile/sqlitelockfile.py | 156 - .../pip/_vendor/lockfile/sqlitelockfile.pyc | Bin 5126 -> 0 bytes .../pip/_vendor/lockfile/symlinklockfile.py | 70 - .../pip/_vendor/lockfile/symlinklockfile.pyc | Bin 3201 -> 0 bytes .../pip/_vendor/msgpack/__init__.py | 66 - .../pip/_vendor/msgpack/__init__.pyc | Bin 2871 -> 0 bytes .../pip/_vendor/msgpack/_version.py | 1 - .../pip/_vendor/msgpack/_version.pyc | Bin 251 -> 0 bytes .../pip/_vendor/msgpack/exceptions.py | 41 - .../pip/_vendor/msgpack/exceptions.pyc | Bin 3313 -> 0 bytes .../pip/_vendor/msgpack/fallback.py | 977 -- .../pip/_vendor/msgpack/fallback.pyc | Bin 32803 -> 0 bytes .../pip/_vendor/packaging/__about__.py | 27 - .../pip/_vendor/packaging/__about__.pyc | Bin 841 -> 0 bytes .../pip/_vendor/packaging/__init__.py | 26 - .../pip/_vendor/packaging/__init__.pyc | Bin 663 -> 0 bytes .../pip/_vendor/packaging/_compat.py | 31 - .../pip/_vendor/packaging/_compat.pyc | Bin 1404 -> 0 bytes .../pip/_vendor/packaging/_structures.py | 68 - .../pip/_vendor/packaging/_structures.pyc | Bin 5013 -> 0 bytes .../pip/_vendor/packaging/markers.py | 296 - .../pip/_vendor/packaging/markers.pyc | Bin 13362 -> 0 bytes .../pip/_vendor/packaging/requirements.py | 138 - .../pip/_vendor/packaging/requirements.pyc | Bin 5695 -> 0 bytes .../pip/_vendor/packaging/specifiers.py | 749 -- .../pip/_vendor/packaging/specifiers.pyc | Bin 28139 -> 0 bytes .../pip/_vendor/packaging/utils.py | 57 - .../pip/_vendor/packaging/utils.pyc | Bin 2143 -> 0 bytes .../pip/_vendor/packaging/version.py | 420 - .../pip/_vendor/packaging/version.pyc | Bin 19025 -> 0 bytes .../pip/_vendor/pep517/__init__.py | 4 - .../pip/_vendor/pep517/__init__.pyc | Bin 308 -> 0 bytes .../pip/_vendor/pep517/_in_process.py | 207 - .../pip/_vendor/pep517/_in_process.pyc | Bin 7785 -> 0 bytes .../site-packages/pip/_vendor/pep517/build.py | 108 - .../pip/_vendor/pep517/build.pyc | Bin 3865 -> 0 bytes .../site-packages/pip/_vendor/pep517/check.py | 202 - .../pip/_vendor/pep517/check.pyc | Bin 6183 -> 0 bytes .../pip/_vendor/pep517/colorlog.py | 115 - .../pip/_vendor/pep517/colorlog.pyc | Bin 3906 -> 0 bytes .../pip/_vendor/pep517/compat.py | 23 - .../pip/_vendor/pep517/compat.pyc | Bin 1587 -> 0 bytes .../pip/_vendor/pep517/envbuild.py | 158 - .../pip/_vendor/pep517/envbuild.pyc | Bin 5625 -> 0 bytes .../pip/_vendor/pep517/wrappers.py | 163 - .../pip/_vendor/pep517/wrappers.pyc | Bin 7144 -> 0 bytes .../pip/_vendor/pkg_resources/__init__.py | 3286 ------- .../pip/_vendor/pkg_resources/__init__.pyc | Bin 137751 -> 0 bytes .../pip/_vendor/pkg_resources/py31compat.py | 23 - .../pip/_vendor/pkg_resources/py31compat.pyc | Bin 881 -> 0 bytes .../pip/_vendor/progress/__init__.py | 177 - .../pip/_vendor/progress/__init__.pyc | Bin 8933 -> 0 bytes .../site-packages/pip/_vendor/progress/bar.py | 91 - .../pip/_vendor/progress/bar.pyc | Bin 4043 -> 0 bytes .../pip/_vendor/progress/counter.py | 41 - .../pip/_vendor/progress/counter.pyc | Bin 2422 -> 0 bytes .../pip/_vendor/progress/spinner.py | 43 - .../pip/_vendor/progress/spinner.pyc | Bin 2211 -> 0 bytes .../site-packages/pip/_vendor/pyparsing.py | 6493 ------------- .../site-packages/pip/_vendor/pyparsing.pyc | Bin 277107 -> 0 bytes .../pip/_vendor/pytoml/__init__.py | 4 - .../pip/_vendor/pytoml/__init__.pyc | Bin 448 -> 0 bytes .../site-packages/pip/_vendor/pytoml/core.py | 13 - .../site-packages/pip/_vendor/pytoml/core.pyc | Bin 1400 -> 0 bytes .../pip/_vendor/pytoml/parser.py | 341 - .../pip/_vendor/pytoml/parser.pyc | Bin 14699 -> 0 bytes .../site-packages/pip/_vendor/pytoml/test.py | 30 - .../site-packages/pip/_vendor/pytoml/test.pyc | Bin 1551 -> 0 bytes .../site-packages/pip/_vendor/pytoml/utils.py | 67 - .../pip/_vendor/pytoml/utils.pyc | Bin 3298 -> 0 bytes .../pip/_vendor/pytoml/writer.py | 106 - .../pip/_vendor/pytoml/writer.pyc | Bin 5606 -> 0 bytes .../pip/_vendor/requests/__init__.py | 133 - .../pip/_vendor/requests/__init__.pyc | Bin 4332 -> 0 bytes .../pip/_vendor/requests/__version__.py | 14 - .../pip/_vendor/requests/__version__.pyc | Bin 634 -> 0 bytes .../pip/_vendor/requests/_internal_utils.py | 42 - .../pip/_vendor/requests/_internal_utils.pyc | Bin 1676 -> 0 bytes .../pip/_vendor/requests/adapters.py | 533 -- .../pip/_vendor/requests/adapters.pyc | Bin 20399 -> 0 bytes .../site-packages/pip/_vendor/requests/api.py | 158 - .../pip/_vendor/requests/api.pyc | Bin 7499 -> 0 bytes .../pip/_vendor/requests/auth.py | 305 - .../pip/_vendor/requests/auth.pyc | Bin 11699 -> 0 bytes .../pip/_vendor/requests/certs.py | 18 - .../pip/_vendor/requests/certs.pyc | Bin 665 -> 0 bytes .../pip/_vendor/requests/compat.py | 74 - .../pip/_vendor/requests/compat.pyc | Bin 2003 -> 0 bytes .../pip/_vendor/requests/cookies.py | 549 -- .../pip/_vendor/requests/cookies.pyc | Bin 25235 -> 0 bytes .../pip/_vendor/requests/exceptions.py | 126 - .../pip/_vendor/requests/exceptions.pyc | Bin 8345 -> 0 bytes .../pip/_vendor/requests/help.py | 119 - .../pip/_vendor/requests/help.pyc | Bin 3572 -> 0 bytes .../pip/_vendor/requests/hooks.py | 34 - .../pip/_vendor/requests/hooks.pyc | Bin 1398 -> 0 bytes .../pip/_vendor/requests/models.py | 953 -- .../pip/_vendor/requests/models.pyc | Bin 31863 -> 0 bytes .../pip/_vendor/requests/packages.py | 16 - .../pip/_vendor/requests/packages.pyc | Bin 643 -> 0 bytes .../pip/_vendor/requests/sessions.py | 770 -- .../pip/_vendor/requests/sessions.pyc | Bin 24341 -> 0 bytes .../pip/_vendor/requests/status_codes.py | 120 - .../pip/_vendor/requests/status_codes.pyc | Bin 7881 -> 0 bytes .../pip/_vendor/requests/structures.py | 103 - .../pip/_vendor/requests/structures.pyc | Bin 6281 -> 0 bytes .../pip/_vendor/requests/utils.py | 977 -- .../pip/_vendor/requests/utils.pyc | Bin 29364 -> 0 bytes .../site-packages/pip/_vendor/retrying.py | 267 - .../site-packages/pip/_vendor/retrying.pyc | Bin 11662 -> 0 bytes .../site-packages/pip/_vendor/six.py | 952 -- .../site-packages/pip/_vendor/six.pyc | Bin 37306 -> 0 bytes .../pip/_vendor/urllib3/__init__.py | 92 - .../pip/_vendor/urllib3/__init__.pyc | Bin 3012 -> 0 bytes .../pip/_vendor/urllib3/_collections.py | 329 - .../pip/_vendor/urllib3/_collections.pyc | Bin 15104 -> 0 bytes .../pip/_vendor/urllib3/connection.py | 391 - .../pip/_vendor/urllib3/connection.pyc | Bin 13186 -> 0 bytes .../pip/_vendor/urllib3/connectionpool.py | 896 -- .../pip/_vendor/urllib3/connectionpool.pyc | Bin 28575 -> 0 bytes .../pip/_vendor/urllib3/contrib/__init__.py | 0 .../pip/_vendor/urllib3/contrib/__init__.pyc | Bin 206 -> 0 bytes .../urllib3/contrib/_appengine_environ.py | 30 - .../urllib3/contrib/_appengine_environ.pyc | Bin 1838 -> 0 bytes .../contrib/_securetransport/__init__.py | 0 .../contrib/_securetransport/__init__.pyc | Bin 223 -> 0 bytes .../contrib/_securetransport/bindings.py | 593 -- .../contrib/_securetransport/bindings.pyc | Bin 12359 -> 0 bytes .../contrib/_securetransport/low_level.py | 346 - .../contrib/_securetransport/low_level.pyc | Bin 10132 -> 0 bytes .../pip/_vendor/urllib3/contrib/appengine.py | 289 - .../pip/_vendor/urllib3/contrib/appengine.pyc | Bin 10129 -> 0 bytes .../pip/_vendor/urllib3/contrib/ntlmpool.py | 111 - .../pip/_vendor/urllib3/contrib/ntlmpool.pyc | Bin 4173 -> 0 bytes .../pip/_vendor/urllib3/contrib/pyopenssl.py | 466 - .../pip/_vendor/urllib3/contrib/pyopenssl.pyc | Bin 19914 -> 0 bytes .../urllib3/contrib/securetransport.py | 804 -- .../urllib3/contrib/securetransport.pyc | Bin 24494 -> 0 bytes .../pip/_vendor/urllib3/contrib/socks.py | 192 - .../pip/_vendor/urllib3/contrib/socks.pyc | Bin 6298 -> 0 bytes .../pip/_vendor/urllib3/exceptions.py | 246 - .../pip/_vendor/urllib3/exceptions.pyc | Bin 15502 -> 0 bytes .../pip/_vendor/urllib3/fields.py | 178 - .../pip/_vendor/urllib3/fields.pyc | Bin 7346 -> 0 bytes .../pip/_vendor/urllib3/filepost.py | 98 - .../pip/_vendor/urllib3/filepost.pyc | Bin 3780 -> 0 bytes .../pip/_vendor/urllib3/packages/__init__.py | 5 - .../pip/_vendor/urllib3/packages/__init__.pyc | Bin 387 -> 0 bytes .../urllib3/packages/backports/__init__.py | 0 .../urllib3/packages/backports/__init__.pyc | Bin 217 -> 0 bytes .../urllib3/packages/backports/makefile.py | 53 - .../urllib3/packages/backports/makefile.pyc | Bin 1713 -> 0 bytes .../pip/_vendor/urllib3/packages/six.py | 868 -- .../pip/_vendor/urllib3/packages/six.pyc | Bin 36102 -> 0 bytes .../packages/ssl_match_hostname/__init__.py | 19 - .../packages/ssl_match_hostname/__init__.pyc | Bin 697 -> 0 bytes .../ssl_match_hostname/_implementation.py | 156 - .../ssl_match_hostname/_implementation.pyc | Bin 4598 -> 0 bytes .../pip/_vendor/urllib3/poolmanager.py | 450 - .../pip/_vendor/urllib3/poolmanager.pyc | Bin 16523 -> 0 bytes .../pip/_vendor/urllib3/request.py | 150 - .../pip/_vendor/urllib3/request.pyc | Bin 6445 -> 0 bytes .../pip/_vendor/urllib3/response.py | 705 -- .../pip/_vendor/urllib3/response.pyc | Bin 24614 -> 0 bytes .../pip/_vendor/urllib3/util/__init__.py | 54 - .../pip/_vendor/urllib3/util/__init__.pyc | Bin 1567 -> 0 bytes .../pip/_vendor/urllib3/util/connection.py | 134 - .../pip/_vendor/urllib3/util/connection.pyc | Bin 4192 -> 0 bytes .../pip/_vendor/urllib3/util/queue.py | 21 - .../pip/_vendor/urllib3/util/queue.pyc | Bin 1665 -> 0 bytes .../pip/_vendor/urllib3/util/request.py | 118 - .../pip/_vendor/urllib3/util/request.pyc | Bin 3945 -> 0 bytes .../pip/_vendor/urllib3/util/response.py | 87 - .../pip/_vendor/urllib3/util/response.pyc | Bin 2583 -> 0 bytes .../pip/_vendor/urllib3/util/retry.py | 411 - .../pip/_vendor/urllib3/util/retry.pyc | Bin 15622 -> 0 bytes .../pip/_vendor/urllib3/util/ssl_.py | 381 - .../pip/_vendor/urllib3/util/ssl_.pyc | Bin 12270 -> 0 bytes .../pip/_vendor/urllib3/util/timeout.py | 242 - .../pip/_vendor/urllib3/util/timeout.pyc | Bin 10233 -> 0 bytes .../pip/_vendor/urllib3/util/url.py | 230 - .../pip/_vendor/urllib3/util/url.pyc | Bin 6910 -> 0 bytes .../pip/_vendor/urllib3/util/wait.py | 150 - .../pip/_vendor/urllib3/util/wait.pyc | Bin 4842 -> 0 bytes .../pip/_vendor/webencodings/__init__.py | 342 - .../pip/_vendor/webencodings/__init__.pyc | Bin 12364 -> 0 bytes .../pip/_vendor/webencodings/labels.py | 231 - .../pip/_vendor/webencodings/labels.pyc | Bin 5361 -> 0 bytes .../pip/_vendor/webencodings/mklabels.py | 59 - .../pip/_vendor/webencodings/mklabels.pyc | Bin 2486 -> 0 bytes .../pip/_vendor/webencodings/tests.py | 153 - .../pip/_vendor/webencodings/tests.pyc | Bin 7341 -> 0 bytes .../_vendor/webencodings/x_user_defined.py | 325 - .../_vendor/webencodings/x_user_defined.pyc | Bin 3842 -> 0 bytes .../site-packages/pkg_resources/__init__.py | 3286 ------- .../site-packages/pkg_resources/__init__.pyc | Bin 136325 -> 0 bytes .../pkg_resources/_vendor/__init__.py | 0 .../pkg_resources/_vendor/__init__.pyc | Bin 207 -> 0 bytes .../pkg_resources/_vendor/appdirs.py | 608 -- .../pkg_resources/_vendor/appdirs.pyc | Bin 24415 -> 0 bytes .../_vendor/packaging/__about__.py | 21 - .../_vendor/packaging/__about__.pyc | Bin 846 -> 0 bytes .../_vendor/packaging/__init__.py | 14 - .../_vendor/packaging/__init__.pyc | Bin 668 -> 0 bytes .../_vendor/packaging/_compat.py | 30 - .../_vendor/packaging/_compat.pyc | Bin 1472 -> 0 bytes .../_vendor/packaging/_structures.py | 68 - .../_vendor/packaging/_structures.pyc | Bin 5370 -> 0 bytes .../_vendor/packaging/markers.py | 301 - .../_vendor/packaging/markers.pyc | Bin 13962 -> 0 bytes .../_vendor/packaging/requirements.py | 127 - .../_vendor/packaging/requirements.pyc | Bin 5683 -> 0 bytes .../_vendor/packaging/specifiers.py | 774 -- .../_vendor/packaging/specifiers.pyc | Bin 29374 -> 0 bytes .../pkg_resources/_vendor/packaging/utils.py | 14 - .../pkg_resources/_vendor/packaging/utils.pyc | Bin 708 -> 0 bytes .../_vendor/packaging/version.py | 393 - .../_vendor/packaging/version.pyc | Bin 17248 -> 0 bytes .../pkg_resources/_vendor/pyparsing.py | 5742 ------------ .../pkg_resources/_vendor/pyparsing.pyc | Bin 260233 -> 0 bytes .../pkg_resources/_vendor/six.py | 868 -- .../pkg_resources/_vendor/six.pyc | Bin 36102 -> 0 bytes .../pkg_resources/extern/__init__.py | 73 - .../pkg_resources/extern/__init__.pyc | Bin 3353 -> 0 bytes .../site-packages/pkg_resources/py31compat.py | 23 - .../pkg_resources/py31compat.pyc | Bin 866 -> 0 bytes .../setuptools-41.0.1.dist-info/INSTALLER | 1 - .../setuptools-41.0.1.dist-info/LICENSE | 19 - .../setuptools-41.0.1.dist-info/METADATA | 77 - .../setuptools-41.0.1.dist-info/RECORD | 186 - .../setuptools-41.0.1.dist-info/WHEEL | 6 - .../dependency_links.txt | 2 - .../entry_points.txt | 65 - .../setuptools-41.0.1.dist-info/top_level.txt | 3 - .../setuptools-41.0.1.dist-info/zip-safe | 1 - .../site-packages/setuptools/__init__.py | 228 - .../site-packages/setuptools/__init__.pyc | Bin 10555 -> 0 bytes .../setuptools/_deprecation_warning.py | 7 - .../setuptools/_deprecation_warning.pyc | Bin 690 -> 0 bytes .../setuptools/_vendor/__init__.py | 0 .../setuptools/_vendor/__init__.pyc | Bin 204 -> 0 bytes .../setuptools/_vendor/packaging/__about__.py | 21 - .../_vendor/packaging/__about__.pyc | Bin 843 -> 0 bytes .../setuptools/_vendor/packaging/__init__.py | 14 - .../setuptools/_vendor/packaging/__init__.pyc | Bin 665 -> 0 bytes .../setuptools/_vendor/packaging/_compat.py | 30 - .../setuptools/_vendor/packaging/_compat.pyc | Bin 1460 -> 0 bytes .../_vendor/packaging/_structures.py | 68 - .../_vendor/packaging/_structures.pyc | Bin 5307 -> 0 bytes .../setuptools/_vendor/packaging/markers.py | 301 - .../setuptools/_vendor/packaging/markers.pyc | Bin 13854 -> 0 bytes .../_vendor/packaging/requirements.py | 127 - .../_vendor/packaging/requirements.pyc | Bin 5650 -> 0 bytes .../_vendor/packaging/specifiers.py | 774 -- .../_vendor/packaging/specifiers.pyc | Bin 29161 -> 0 bytes .../setuptools/_vendor/packaging/utils.py | 14 - .../setuptools/_vendor/packaging/utils.pyc | Bin 702 -> 0 bytes .../setuptools/_vendor/packaging/version.py | 393 - .../setuptools/_vendor/packaging/version.pyc | Bin 17101 -> 0 bytes .../setuptools/_vendor/pyparsing.py | 5742 ------------ .../setuptools/_vendor/pyparsing.pyc | Bin 258922 -> 0 bytes .../site-packages/setuptools/_vendor/six.py | 868 -- .../site-packages/setuptools/_vendor/six.pyc | Bin 35865 -> 0 bytes .../site-packages/setuptools/archive_util.py | 173 - .../site-packages/setuptools/archive_util.pyc | Bin 6574 -> 0 bytes .../site-packages/setuptools/build_meta.py | 254 - .../site-packages/setuptools/build_meta.pyc | Bin 10676 -> 0 bytes .../site-packages/setuptools/cli-32.exe | Bin 65536 -> 0 bytes .../site-packages/setuptools/cli-64.exe | Bin 74752 -> 0 bytes .../site-packages/setuptools/cli.exe | Bin 65536 -> 0 bytes .../setuptools/command/__init__.py | 18 - .../setuptools/command/__init__.pyc | Bin 936 -> 0 bytes .../site-packages/setuptools/command/alias.py | 80 - .../setuptools/command/alias.pyc | Bin 3482 -> 0 bytes .../setuptools/command/bdist_egg.py | 502 - .../setuptools/command/bdist_egg.pyc | Bin 19800 -> 0 bytes .../setuptools/command/bdist_rpm.py | 43 - .../setuptools/command/bdist_rpm.pyc | Bin 2130 -> 0 bytes .../setuptools/command/bdist_wininst.py | 21 - .../setuptools/command/bdist_wininst.pyc | Bin 1425 -> 0 bytes .../setuptools/command/build_clib.py | 98 - .../setuptools/command/build_clib.pyc | Bin 3006 -> 0 bytes .../setuptools/command/build_ext.py | 321 - .../setuptools/command/build_ext.pyc | Bin 13452 -> 0 bytes .../setuptools/command/build_py.py | 270 - .../setuptools/command/build_py.pyc | Bin 11963 -> 0 bytes .../setuptools/command/develop.py | 221 - .../setuptools/command/develop.pyc | Bin 8733 -> 0 bytes .../setuptools/command/dist_info.py | 36 - .../setuptools/command/dist_info.pyc | Bin 2069 -> 0 bytes .../setuptools/command/easy_install.py | 2342 ----- .../setuptools/command/easy_install.pyc | Bin 88096 -> 0 bytes .../setuptools/command/egg_info.py | 717 -- .../setuptools/command/egg_info.pyc | Bin 29768 -> 0 bytes .../setuptools/command/install.py | 125 - .../setuptools/command/install.pyc | Bin 5493 -> 0 bytes .../setuptools/command/install_egg_info.py | 62 - .../setuptools/command/install_egg_info.pyc | Bin 3639 -> 0 bytes .../setuptools/command/install_lib.py | 121 - .../setuptools/command/install_lib.pyc | Bin 5518 -> 0 bytes .../setuptools/command/install_scripts.py | 65 - .../setuptools/command/install_scripts.pyc | Bin 3161 -> 0 bytes .../setuptools/command/launcher manifest.xml | 15 - .../setuptools/command/py36compat.py | 136 - .../setuptools/command/py36compat.pyc | Bin 6198 -> 0 bytes .../setuptools/command/register.py | 18 - .../setuptools/command/register.pyc | Bin 1080 -> 0 bytes .../setuptools/command/rotate.py | 66 - .../setuptools/command/rotate.pyc | Bin 3322 -> 0 bytes .../setuptools/command/saveopts.py | 22 - .../setuptools/command/saveopts.pyc | Bin 1291 -> 0 bytes .../site-packages/setuptools/command/sdist.py | 221 - .../setuptools/command/sdist.pyc | Bin 9479 -> 0 bytes .../setuptools/command/setopt.py | 149 - .../setuptools/command/setopt.pyc | Bin 6596 -> 0 bytes .../site-packages/setuptools/command/test.py | 271 - .../site-packages/setuptools/command/test.pyc | Bin 11758 -> 0 bytes .../setuptools/command/upload.py | 196 - .../setuptools/command/upload.pyc | Bin 6915 -> 0 bytes .../setuptools/command/upload_docs.py | 206 - .../setuptools/command/upload_docs.pyc | Bin 8436 -> 0 bytes .../site-packages/setuptools/config.py | 656 -- .../site-packages/setuptools/config.pyc | Bin 22827 -> 0 bytes .../site-packages/setuptools/dep_util.py | 23 - .../site-packages/setuptools/dep_util.pyc | Bin 1073 -> 0 bytes .../site-packages/setuptools/depends.py | 186 - .../site-packages/setuptools/depends.pyc | Bin 7166 -> 0 bytes .../site-packages/setuptools/dist.py | 1278 --- .../site-packages/setuptools/dist.pyc | Bin 51591 -> 0 bytes .../site-packages/setuptools/extension.py | 57 - .../site-packages/setuptools/extension.pyc | Bin 2742 -> 0 bytes .../setuptools/extern/__init__.py | 73 - .../setuptools/extern/__init__.pyc | Bin 3323 -> 0 bytes .../site-packages/setuptools/glibc.py | 86 - .../site-packages/setuptools/glibc.pyc | Bin 2230 -> 0 bytes .../site-packages/setuptools/glob.py | 174 - .../site-packages/setuptools/glob.pyc | Bin 5311 -> 0 bytes .../site-packages/setuptools/gui-32.exe | Bin 65536 -> 0 bytes .../site-packages/setuptools/gui-64.exe | Bin 75264 -> 0 bytes .../site-packages/setuptools/gui.exe | Bin 65536 -> 0 bytes .../site-packages/setuptools/launch.py | 35 - .../site-packages/setuptools/launch.pyc | Bin 1108 -> 0 bytes .../site-packages/setuptools/lib2to3_ex.py | 62 - .../site-packages/setuptools/lib2to3_ex.pyc | Bin 3490 -> 0 bytes .../site-packages/setuptools/monkey.py | 179 - .../site-packages/setuptools/monkey.pyc | Bin 6478 -> 0 bytes .../site-packages/setuptools/msvc.py | 1301 --- .../site-packages/setuptools/msvc.pyc | Bin 44716 -> 0 bytes .../site-packages/setuptools/namespaces.py | 107 - .../site-packages/setuptools/namespaces.pyc | Bin 5681 -> 0 bytes .../site-packages/setuptools/package_index.py | 1136 --- .../setuptools/package_index.pyc | Bin 44744 -> 0 bytes .../site-packages/setuptools/pep425tags.py | 319 - .../site-packages/setuptools/pep425tags.pyc | Bin 10313 -> 0 bytes .../site-packages/setuptools/py27compat.py | 28 - .../site-packages/setuptools/py27compat.pyc | Bin 1261 -> 0 bytes .../site-packages/setuptools/py31compat.py | 32 - .../site-packages/setuptools/py31compat.pyc | Bin 1712 -> 0 bytes .../site-packages/setuptools/py33compat.py | 55 - .../site-packages/setuptools/py33compat.pyc | Bin 1962 -> 0 bytes .../site-packages/setuptools/sandbox.py | 491 - .../site-packages/setuptools/sandbox.pyc | Bin 21826 -> 0 bytes .../setuptools/script (dev).tmpl | 6 - .../site-packages/setuptools/script.tmpl | 3 - .../site-packages/setuptools/site-patch.py | 74 - .../site-packages/setuptools/site-patch.pyc | Bin 1847 -> 0 bytes .../site-packages/setuptools/ssl_support.py | 260 - .../site-packages/setuptools/ssl_support.pyc | Bin 9597 -> 0 bytes .../site-packages/setuptools/unicode_utils.py | 44 - .../setuptools/unicode_utils.pyc | Bin 1688 -> 0 bytes .../site-packages/setuptools/version.py | 6 - .../site-packages/setuptools/version.pyc | Bin 376 -> 0 bytes .../site-packages/setuptools/wheel.py | 211 - .../site-packages/setuptools/wheel.pyc | Bin 9864 -> 0 bytes .../setuptools/windows_support.py | 29 - .../setuptools/windows_support.pyc | Bin 1490 -> 0 bytes .../wheel-0.33.4.dist-info/INSTALLER | 1 - .../wheel-0.33.4.dist-info/LICENSE.txt | 22 - .../wheel-0.33.4.dist-info/METADATA | 60 - .../wheel-0.33.4.dist-info/RECORD | 32 - .../wheel-0.33.4.dist-info/WHEEL | 6 - .../wheel-0.33.4.dist-info/entry_points.txt | 6 - .../wheel-0.33.4.dist-info/top_level.txt | 1 - .../python2.7/site-packages/wheel/__init__.py | 2 - .../site-packages/wheel/__init__.pyc | Bin 219 -> 0 bytes .../python2.7/site-packages/wheel/__main__.py | 19 - .../site-packages/wheel/__main__.pyc | Bin 811 -> 0 bytes .../site-packages/wheel/bdist_wheel.py | 372 - .../site-packages/wheel/bdist_wheel.pyc | Bin 14394 -> 0 bytes .../site-packages/wheel/cli/__init__.py | 88 - .../site-packages/wheel/cli/__init__.pyc | Bin 4405 -> 0 bytes .../site-packages/wheel/cli/convert.py | 269 - .../site-packages/wheel/cli/convert.pyc | Bin 7962 -> 0 bytes .../python2.7/site-packages/wheel/cli/pack.py | 58 - .../site-packages/wheel/cli/pack.pyc | Bin 3102 -> 0 bytes .../site-packages/wheel/cli/unpack.py | 25 - .../site-packages/wheel/cli/unpack.pyc | Bin 1182 -> 0 bytes .../python2.7/site-packages/wheel/metadata.py | 141 - .../site-packages/wheel/metadata.pyc | Bin 5114 -> 0 bytes .../site-packages/wheel/pep425tags.py | 185 - .../site-packages/wheel/pep425tags.pyc | Bin 6677 -> 0 bytes .../python2.7/site-packages/wheel/pkginfo.py | 43 - .../python2.7/site-packages/wheel/pkginfo.pyc | Bin 2403 -> 0 bytes .../lib/python2.7/site-packages/wheel/util.py | 46 - .../python2.7/site-packages/wheel/util.pyc | Bin 2061 -> 0 bytes .../site-packages/wheel/wheelfile.py | 169 - .../site-packages/wheel/wheelfile.pyc | Bin 7532 -> 0 bytes venv/lib/python2.7/site.py | 851 -- venv/lib/python2.7/site.pyc | Bin 28822 -> 0 bytes venv/lib/python2.7/sre.py | 1 - venv/lib/python2.7/sre_compile.py | 1 - venv/lib/python2.7/sre_compile.pyc | Bin 13534 -> 0 bytes venv/lib/python2.7/sre_constants.py | 1 - venv/lib/python2.7/sre_constants.pyc | Bin 6520 -> 0 bytes venv/lib/python2.7/sre_parse.py | 1 - venv/lib/python2.7/sre_parse.pyc | Bin 22357 -> 0 bytes venv/lib/python2.7/stat.py | 1 - venv/lib/python2.7/stat.pyc | Bin 3401 -> 0 bytes venv/lib/python2.7/types.py | 1 - venv/lib/python2.7/types.pyc | Bin 3180 -> 0 bytes venv/lib/python2.7/warnings.py | 1 - venv/lib/python2.7/warnings.pyc | Bin 14673 -> 0 bytes 897 files changed, 145054 deletions(-) delete mode 120000 venv/.Python delete mode 100644 venv/bin/activate delete mode 100644 venv/bin/activate.csh delete mode 100644 venv/bin/activate.fish delete mode 100644 venv/bin/activate.ps1 delete mode 100644 venv/bin/activate_this.py delete mode 100755 venv/bin/easy_install delete mode 100755 venv/bin/easy_install-2.7 delete mode 100755 venv/bin/pip delete mode 100755 venv/bin/pip2 delete mode 100755 venv/bin/pip2.7 delete mode 100755 venv/bin/python delete mode 100755 venv/bin/python-config delete mode 120000 venv/bin/python2 delete mode 120000 venv/bin/python2.7 delete mode 100755 venv/bin/wheel delete mode 120000 venv/include/python2.7 delete mode 120000 venv/lib/python2.7/UserDict.py delete mode 100644 venv/lib/python2.7/UserDict.pyc delete mode 120000 venv/lib/python2.7/_abcoll.py delete mode 100644 venv/lib/python2.7/_abcoll.pyc delete mode 120000 venv/lib/python2.7/_weakrefset.py delete mode 100644 venv/lib/python2.7/_weakrefset.pyc delete mode 120000 venv/lib/python2.7/abc.py delete mode 100644 venv/lib/python2.7/abc.pyc delete mode 120000 venv/lib/python2.7/codecs.py delete mode 100644 venv/lib/python2.7/codecs.pyc delete mode 120000 venv/lib/python2.7/config delete mode 120000 venv/lib/python2.7/copy_reg.py delete mode 100644 venv/lib/python2.7/copy_reg.pyc delete mode 100644 venv/lib/python2.7/distutils/__init__.py delete mode 100644 venv/lib/python2.7/distutils/__init__.pyc delete mode 100644 venv/lib/python2.7/distutils/distutils.cfg delete mode 120000 venv/lib/python2.7/encodings delete mode 120000 venv/lib/python2.7/fnmatch.py delete mode 100644 venv/lib/python2.7/fnmatch.pyc delete mode 120000 venv/lib/python2.7/genericpath.py delete mode 100644 venv/lib/python2.7/genericpath.pyc delete mode 120000 venv/lib/python2.7/lib-dynload delete mode 120000 venv/lib/python2.7/linecache.py delete mode 100644 venv/lib/python2.7/linecache.pyc delete mode 120000 venv/lib/python2.7/locale.py delete mode 100644 venv/lib/python2.7/locale.pyc delete mode 100644 venv/lib/python2.7/no-global-site-packages.txt delete mode 120000 venv/lib/python2.7/ntpath.py delete mode 100644 venv/lib/python2.7/orig-prefix.txt delete mode 120000 venv/lib/python2.7/os.py delete mode 100644 venv/lib/python2.7/os.pyc delete mode 120000 venv/lib/python2.7/posixpath.py delete mode 100644 venv/lib/python2.7/posixpath.pyc delete mode 120000 venv/lib/python2.7/re.py delete mode 100644 venv/lib/python2.7/re.pyc delete mode 100644 venv/lib/python2.7/site-packages/easy_install.py delete mode 100644 venv/lib/python2.7/site-packages/easy_install.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip-19.1.1.dist-info/INSTALLER delete mode 100644 venv/lib/python2.7/site-packages/pip-19.1.1.dist-info/LICENSE.txt delete mode 100644 venv/lib/python2.7/site-packages/pip-19.1.1.dist-info/METADATA delete mode 100644 venv/lib/python2.7/site-packages/pip-19.1.1.dist-info/RECORD delete mode 100644 venv/lib/python2.7/site-packages/pip-19.1.1.dist-info/WHEEL delete mode 100644 venv/lib/python2.7/site-packages/pip-19.1.1.dist-info/entry_points.txt delete mode 100644 venv/lib/python2.7/site-packages/pip-19.1.1.dist-info/top_level.txt delete mode 100644 venv/lib/python2.7/site-packages/pip/__init__.py delete mode 100644 venv/lib/python2.7/site-packages/pip/__init__.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/__main__.py delete mode 100644 venv/lib/python2.7/site-packages/pip/__main__.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/__init__.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/__init__.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/build_env.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/build_env.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/cache.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/cache.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/cli/__init__.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/cli/__init__.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/cli/autocompletion.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/cli/autocompletion.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/cli/base_command.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/cli/base_command.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/cli/cmdoptions.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/cli/cmdoptions.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/cli/main_parser.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/cli/main_parser.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/cli/parser.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/cli/parser.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/cli/status_codes.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/cli/status_codes.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/__init__.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/__init__.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/check.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/check.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/completion.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/completion.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/configuration.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/configuration.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/download.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/download.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/freeze.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/freeze.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/hash.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/hash.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/help.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/help.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/install.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/install.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/list.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/list.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/search.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/search.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/show.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/show.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/uninstall.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/uninstall.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/wheel.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/wheel.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/configuration.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/configuration.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/download.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/download.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/exceptions.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/exceptions.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/index.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/index.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/locations.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/locations.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/models/__init__.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/models/__init__.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/models/candidate.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/models/candidate.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/models/format_control.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/models/format_control.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/models/index.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/models/index.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/models/link.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/models/link.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/operations/__init__.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/operations/__init__.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/operations/check.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/operations/check.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/operations/freeze.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/operations/freeze.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/operations/prepare.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/operations/prepare.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/pep425tags.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/pep425tags.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/pyproject.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/pyproject.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/req/__init__.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/req/__init__.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/req/constructors.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/req/constructors.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/req/req_file.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/req/req_file.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/req/req_install.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/req/req_install.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/req/req_set.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/req/req_set.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/req/req_tracker.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/req/req_tracker.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/req/req_uninstall.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/req/req_uninstall.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/resolve.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/resolve.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/__init__.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/__init__.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/appdirs.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/appdirs.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/compat.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/compat.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/deprecation.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/deprecation.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/encoding.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/encoding.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/filesystem.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/filesystem.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/glibc.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/glibc.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/hashes.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/hashes.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/logging.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/logging.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/misc.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/misc.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/models.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/models.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/outdated.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/outdated.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/packaging.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/packaging.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/setuptools_build.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/setuptools_build.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/temp_dir.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/temp_dir.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/typing.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/typing.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/ui.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/ui.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/vcs/__init__.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/vcs/__init__.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/vcs/bazaar.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/vcs/bazaar.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/vcs/git.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/vcs/git.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/vcs/mercurial.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/vcs/mercurial.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/vcs/subversion.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/vcs/subversion.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/wheel.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_internal/wheel.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/__init__.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/__init__.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/appdirs.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/appdirs.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/__init__.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/__init__.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/_cmd.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/_cmd.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/adapter.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/adapter.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/cache.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/cache.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/__init__.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/__init__.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/file_cache.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/compat.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/compat.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/controller.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/controller.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/filewrapper.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/filewrapper.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/heuristics.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/heuristics.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/serialize.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/serialize.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/wrapper.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/wrapper.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/certifi/__init__.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/certifi/__init__.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/certifi/__main__.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/certifi/__main__.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/certifi/cacert.pem delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/certifi/core.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/certifi/core.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/__init__.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/__init__.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/big5freq.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/big5freq.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/big5prober.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/big5prober.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/chardistribution.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/chardistribution.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/charsetgroupprober.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/charsetgroupprober.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/charsetprober.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/charsetprober.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/cli/__init__.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/cli/__init__.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/cli/chardetect.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/cli/chardetect.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/codingstatemachine.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/codingstatemachine.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/compat.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/compat.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/cp949prober.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/cp949prober.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/enums.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/enums.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/escprober.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/escprober.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/escsm.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/escsm.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/eucjpprober.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/eucjpprober.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/euckrfreq.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/euckrfreq.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/euckrprober.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/euckrprober.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwfreq.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwfreq.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwprober.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwprober.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/gb2312freq.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/gb2312freq.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/gb2312prober.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/gb2312prober.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/hebrewprober.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/hebrewprober.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/jisfreq.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/jisfreq.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/jpcntx.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/jpcntx.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/langbulgarianmodel.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/langbulgarianmodel.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/langcyrillicmodel.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/langcyrillicmodel.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/langgreekmodel.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/langgreekmodel.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/langhebrewmodel.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/langhebrewmodel.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/langhungarianmodel.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/langhungarianmodel.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/langthaimodel.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/langthaimodel.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/langturkishmodel.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/langturkishmodel.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/latin1prober.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/latin1prober.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcharsetprober.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcharsetprober.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcsgroupprober.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcsgroupprober.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcssm.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcssm.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcharsetprober.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcharsetprober.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcsgroupprober.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcsgroupprober.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/sjisprober.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/sjisprober.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/universaldetector.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/universaldetector.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/utf8prober.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/utf8prober.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/version.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/version.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/colorama/__init__.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/colorama/__init__.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/colorama/ansi.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/colorama/ansi.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/colorama/ansitowin32.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/colorama/ansitowin32.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/colorama/initialise.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/colorama/initialise.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/colorama/win32.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/colorama/win32.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/colorama/winterm.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/colorama/winterm.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/__init__.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/__init__.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/__init__.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/__init__.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/misc.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/misc.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/shutil.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/shutil.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/tarfile.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/tarfile.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/compat.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/compat.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/database.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/database.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/index.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/index.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/locators.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/locators.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/manifest.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/manifest.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/markers.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/markers.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/metadata.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/metadata.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/resources.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/resources.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/scripts.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/scripts.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/t32.exe delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/t64.exe delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/util.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/util.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/version.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/version.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/w32.exe delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/w64.exe delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/wheel.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/wheel.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distro.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distro.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/__init__.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/__init__.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_ihatexml.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_ihatexml.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_inputstream.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_inputstream.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_tokenizer.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_tokenizer.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/__init__.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/__init__.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/_base.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/_base.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/datrie.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/datrie.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/py.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/py.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_utils.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_utils.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/constants.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/constants.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/__init__.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/__init__.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/base.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/base.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/lint.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/lint.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/optionaltags.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/optionaltags.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/sanitizer.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/sanitizer.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/whitespace.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/whitespace.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/html5parser.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/html5parser.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/serializer.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/serializer.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treeadapters/__init__.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treeadapters/genshi.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treeadapters/sax.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treeadapters/sax.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/__init__.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/base.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/base.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/dom.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/dom.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/etree.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/etree.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/__init__.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/base.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/base.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/dom.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/dom.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/etree.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/etree.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/genshi.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/idna/__init__.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/idna/__init__.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/idna/codec.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/idna/codec.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/idna/compat.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/idna/compat.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/idna/core.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/idna/core.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/idna/idnadata.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/idna/idnadata.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/idna/intranges.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/idna/intranges.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/idna/package_data.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/idna/package_data.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/idna/uts46data.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/idna/uts46data.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/ipaddress.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/ipaddress.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/lockfile/__init__.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/lockfile/__init__.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/lockfile/linklockfile.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/lockfile/linklockfile.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/lockfile/mkdirlockfile.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/lockfile/mkdirlockfile.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/lockfile/pidlockfile.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/lockfile/pidlockfile.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/lockfile/sqlitelockfile.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/lockfile/sqlitelockfile.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/lockfile/symlinklockfile.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/lockfile/symlinklockfile.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/msgpack/__init__.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/msgpack/__init__.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/msgpack/_version.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/msgpack/_version.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/msgpack/exceptions.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/msgpack/exceptions.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/msgpack/fallback.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/msgpack/fallback.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/packaging/__about__.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/packaging/__about__.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/packaging/__init__.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/packaging/__init__.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/packaging/_compat.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/packaging/_compat.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/packaging/_structures.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/packaging/_structures.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/packaging/markers.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/packaging/markers.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/packaging/requirements.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/packaging/requirements.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/packaging/specifiers.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/packaging/specifiers.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/packaging/utils.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/packaging/utils.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/packaging/version.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/packaging/version.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pep517/__init__.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pep517/__init__.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pep517/_in_process.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pep517/_in_process.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pep517/build.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pep517/build.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pep517/check.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pep517/check.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pep517/colorlog.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pep517/colorlog.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pep517/compat.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pep517/compat.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pep517/envbuild.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pep517/envbuild.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pep517/wrappers.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pep517/wrappers.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pkg_resources/__init__.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pkg_resources/__init__.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pkg_resources/py31compat.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pkg_resources/py31compat.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/progress/__init__.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/progress/__init__.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/progress/bar.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/progress/bar.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/progress/counter.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/progress/counter.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/progress/spinner.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/progress/spinner.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pyparsing.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pyparsing.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pytoml/__init__.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pytoml/__init__.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pytoml/core.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pytoml/core.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pytoml/parser.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pytoml/parser.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pytoml/test.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pytoml/test.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pytoml/utils.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pytoml/utils.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pytoml/writer.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pytoml/writer.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/__init__.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/__init__.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/__version__.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/__version__.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/_internal_utils.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/_internal_utils.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/adapters.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/adapters.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/api.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/api.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/auth.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/auth.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/certs.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/certs.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/compat.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/compat.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/cookies.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/cookies.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/exceptions.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/exceptions.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/help.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/help.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/hooks.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/hooks.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/models.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/models.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/packages.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/packages.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/sessions.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/sessions.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/status_codes.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/status_codes.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/structures.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/structures.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/utils.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/utils.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/retrying.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/retrying.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/six.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/six.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/__init__.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/__init__.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/_collections.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/_collections.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/connection.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/connection.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/connectionpool.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/connectionpool.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/__init__.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/__init__.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/appengine.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/appengine.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/securetransport.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/securetransport.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/socks.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/socks.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/exceptions.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/exceptions.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/fields.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/fields.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/filepost.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/filepost.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/__init__.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/__init__.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/backports/__init__.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/backports/makefile.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/six.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/six.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/poolmanager.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/poolmanager.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/request.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/request.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/response.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/response.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/__init__.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/__init__.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/connection.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/connection.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/queue.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/queue.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/request.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/request.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/response.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/response.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/retry.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/retry.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/ssl_.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/ssl_.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/timeout.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/timeout.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/url.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/url.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/wait.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/wait.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/webencodings/__init__.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/webencodings/__init__.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/webencodings/labels.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/webencodings/labels.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/webencodings/mklabels.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/webencodings/mklabels.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/webencodings/tests.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/webencodings/tests.pyc delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/webencodings/x_user_defined.py delete mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/webencodings/x_user_defined.pyc delete mode 100644 venv/lib/python2.7/site-packages/pkg_resources/__init__.py delete mode 100644 venv/lib/python2.7/site-packages/pkg_resources/__init__.pyc delete mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/__init__.py delete mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/__init__.pyc delete mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/appdirs.py delete mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/appdirs.pyc delete mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/__about__.py delete mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/__about__.pyc delete mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/__init__.py delete mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/__init__.pyc delete mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/_compat.py delete mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/_compat.pyc delete mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/_structures.py delete mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/_structures.pyc delete mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/markers.py delete mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/markers.pyc delete mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/requirements.py delete mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/requirements.pyc delete mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/specifiers.py delete mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/specifiers.pyc delete mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/utils.py delete mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/utils.pyc delete mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/version.py delete mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/version.pyc delete mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/pyparsing.py delete mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/pyparsing.pyc delete mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/six.py delete mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/six.pyc delete mode 100644 venv/lib/python2.7/site-packages/pkg_resources/extern/__init__.py delete mode 100644 venv/lib/python2.7/site-packages/pkg_resources/extern/__init__.pyc delete mode 100644 venv/lib/python2.7/site-packages/pkg_resources/py31compat.py delete mode 100644 venv/lib/python2.7/site-packages/pkg_resources/py31compat.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/INSTALLER delete mode 100644 venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/LICENSE delete mode 100644 venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/METADATA delete mode 100644 venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/RECORD delete mode 100644 venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/WHEEL delete mode 100644 venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/dependency_links.txt delete mode 100644 venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/entry_points.txt delete mode 100644 venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/top_level.txt delete mode 100644 venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/zip-safe delete mode 100644 venv/lib/python2.7/site-packages/setuptools/__init__.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/__init__.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/_deprecation_warning.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/_deprecation_warning.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/__init__.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/__init__.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/__about__.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/__about__.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/__init__.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/__init__.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/_compat.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/_compat.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/requirements.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/requirements.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/utils.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/utils.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/six.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/six.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/archive_util.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/archive_util.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/build_meta.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/build_meta.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/cli-32.exe delete mode 100644 venv/lib/python2.7/site-packages/setuptools/cli-64.exe delete mode 100644 venv/lib/python2.7/site-packages/setuptools/cli.exe delete mode 100644 venv/lib/python2.7/site-packages/setuptools/command/__init__.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/command/__init__.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/command/alias.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/command/alias.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/command/bdist_egg.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/command/bdist_rpm.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/command/bdist_rpm.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/command/bdist_wininst.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/command/bdist_wininst.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/command/build_clib.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/command/build_clib.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/command/build_ext.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/command/build_ext.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/command/build_py.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/command/build_py.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/command/develop.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/command/develop.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/command/dist_info.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/command/dist_info.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/command/easy_install.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/command/easy_install.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/command/egg_info.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/command/egg_info.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/command/install.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/command/install.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/command/install_egg_info.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/command/install_egg_info.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/command/install_lib.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/command/install_lib.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/command/install_scripts.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/command/install_scripts.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/command/launcher manifest.xml delete mode 100644 venv/lib/python2.7/site-packages/setuptools/command/py36compat.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/command/py36compat.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/command/register.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/command/register.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/command/rotate.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/command/rotate.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/command/saveopts.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/command/saveopts.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/command/sdist.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/command/sdist.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/command/setopt.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/command/setopt.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/command/test.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/command/test.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/command/upload.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/command/upload.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/command/upload_docs.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/command/upload_docs.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/config.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/config.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/dep_util.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/dep_util.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/depends.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/depends.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/dist.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/dist.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/extension.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/extension.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/extern/__init__.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/extern/__init__.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/glibc.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/glibc.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/glob.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/glob.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/gui-32.exe delete mode 100644 venv/lib/python2.7/site-packages/setuptools/gui-64.exe delete mode 100644 venv/lib/python2.7/site-packages/setuptools/gui.exe delete mode 100644 venv/lib/python2.7/site-packages/setuptools/launch.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/launch.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/lib2to3_ex.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/lib2to3_ex.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/monkey.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/monkey.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/msvc.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/msvc.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/namespaces.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/namespaces.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/package_index.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/package_index.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/pep425tags.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/pep425tags.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/py27compat.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/py27compat.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/py31compat.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/py31compat.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/py33compat.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/py33compat.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/sandbox.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/sandbox.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/script (dev).tmpl delete mode 100644 venv/lib/python2.7/site-packages/setuptools/script.tmpl delete mode 100644 venv/lib/python2.7/site-packages/setuptools/site-patch.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/site-patch.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/ssl_support.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/ssl_support.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/unicode_utils.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/unicode_utils.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/version.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/version.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/wheel.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/wheel.pyc delete mode 100644 venv/lib/python2.7/site-packages/setuptools/windows_support.py delete mode 100644 venv/lib/python2.7/site-packages/setuptools/windows_support.pyc delete mode 100644 venv/lib/python2.7/site-packages/wheel-0.33.4.dist-info/INSTALLER delete mode 100644 venv/lib/python2.7/site-packages/wheel-0.33.4.dist-info/LICENSE.txt delete mode 100644 venv/lib/python2.7/site-packages/wheel-0.33.4.dist-info/METADATA delete mode 100644 venv/lib/python2.7/site-packages/wheel-0.33.4.dist-info/RECORD delete mode 100644 venv/lib/python2.7/site-packages/wheel-0.33.4.dist-info/WHEEL delete mode 100644 venv/lib/python2.7/site-packages/wheel-0.33.4.dist-info/entry_points.txt delete mode 100644 venv/lib/python2.7/site-packages/wheel-0.33.4.dist-info/top_level.txt delete mode 100644 venv/lib/python2.7/site-packages/wheel/__init__.py delete mode 100644 venv/lib/python2.7/site-packages/wheel/__init__.pyc delete mode 100644 venv/lib/python2.7/site-packages/wheel/__main__.py delete mode 100644 venv/lib/python2.7/site-packages/wheel/__main__.pyc delete mode 100644 venv/lib/python2.7/site-packages/wheel/bdist_wheel.py delete mode 100644 venv/lib/python2.7/site-packages/wheel/bdist_wheel.pyc delete mode 100644 venv/lib/python2.7/site-packages/wheel/cli/__init__.py delete mode 100644 venv/lib/python2.7/site-packages/wheel/cli/__init__.pyc delete mode 100644 venv/lib/python2.7/site-packages/wheel/cli/convert.py delete mode 100644 venv/lib/python2.7/site-packages/wheel/cli/convert.pyc delete mode 100644 venv/lib/python2.7/site-packages/wheel/cli/pack.py delete mode 100644 venv/lib/python2.7/site-packages/wheel/cli/pack.pyc delete mode 100644 venv/lib/python2.7/site-packages/wheel/cli/unpack.py delete mode 100644 venv/lib/python2.7/site-packages/wheel/cli/unpack.pyc delete mode 100644 venv/lib/python2.7/site-packages/wheel/metadata.py delete mode 100644 venv/lib/python2.7/site-packages/wheel/metadata.pyc delete mode 100644 venv/lib/python2.7/site-packages/wheel/pep425tags.py delete mode 100644 venv/lib/python2.7/site-packages/wheel/pep425tags.pyc delete mode 100644 venv/lib/python2.7/site-packages/wheel/pkginfo.py delete mode 100644 venv/lib/python2.7/site-packages/wheel/pkginfo.pyc delete mode 100644 venv/lib/python2.7/site-packages/wheel/util.py delete mode 100644 venv/lib/python2.7/site-packages/wheel/util.pyc delete mode 100644 venv/lib/python2.7/site-packages/wheel/wheelfile.py delete mode 100644 venv/lib/python2.7/site-packages/wheel/wheelfile.pyc delete mode 100644 venv/lib/python2.7/site.py delete mode 100644 venv/lib/python2.7/site.pyc delete mode 120000 venv/lib/python2.7/sre.py delete mode 120000 venv/lib/python2.7/sre_compile.py delete mode 100644 venv/lib/python2.7/sre_compile.pyc delete mode 120000 venv/lib/python2.7/sre_constants.py delete mode 100644 venv/lib/python2.7/sre_constants.pyc delete mode 120000 venv/lib/python2.7/sre_parse.py delete mode 100644 venv/lib/python2.7/sre_parse.pyc delete mode 120000 venv/lib/python2.7/stat.py delete mode 100644 venv/lib/python2.7/stat.pyc delete mode 120000 venv/lib/python2.7/types.py delete mode 100644 venv/lib/python2.7/types.pyc delete mode 120000 venv/lib/python2.7/warnings.py delete mode 100644 venv/lib/python2.7/warnings.pyc diff --git a/venv/.Python b/venv/.Python deleted file mode 120000 index cc24a1e..0000000 --- a/venv/.Python +++ /dev/null @@ -1 +0,0 @@ -/System/Library/Frameworks/Python.framework/Versions/2.7/Python \ No newline at end of file diff --git a/venv/bin/activate b/venv/bin/activate deleted file mode 100644 index 762de86..0000000 --- a/venv/bin/activate +++ /dev/null @@ -1,78 +0,0 @@ -# This file must be used with "source bin/activate" *from bash* -# you cannot run it directly - -deactivate () { - unset -f pydoc >/dev/null 2>&1 - - # reset old environment variables - # ! [ -z ${VAR+_} ] returns true if VAR is declared at all - if ! [ -z "${_OLD_VIRTUAL_PATH+_}" ] ; then - PATH="$_OLD_VIRTUAL_PATH" - export PATH - unset _OLD_VIRTUAL_PATH - fi - if ! [ -z "${_OLD_VIRTUAL_PYTHONHOME+_}" ] ; then - PYTHONHOME="$_OLD_VIRTUAL_PYTHONHOME" - export PYTHONHOME - unset _OLD_VIRTUAL_PYTHONHOME - fi - - # This should detect bash and zsh, which have a hash command that must - # be called to get it to forget past commands. Without forgetting - # past commands the $PATH changes we made may not be respected - if [ -n "${BASH-}" ] || [ -n "${ZSH_VERSION-}" ] ; then - hash -r 2>/dev/null - fi - - if ! [ -z "${_OLD_VIRTUAL_PS1+_}" ] ; then - PS1="$_OLD_VIRTUAL_PS1" - export PS1 - unset _OLD_VIRTUAL_PS1 - fi - - unset VIRTUAL_ENV - if [ ! "${1-}" = "nondestructive" ] ; then - # Self destruct! - unset -f deactivate - fi -} - -# unset irrelevant variables -deactivate nondestructive - -VIRTUAL_ENV="/Users/miavonsteinkirch/Projects/ARXIV_/Shell-Scripts_and_Dotfiles/venv" -export VIRTUAL_ENV - -_OLD_VIRTUAL_PATH="$PATH" -PATH="$VIRTUAL_ENV/bin:$PATH" -export PATH - -# unset PYTHONHOME if set -if ! [ -z "${PYTHONHOME+_}" ] ; then - _OLD_VIRTUAL_PYTHONHOME="$PYTHONHOME" - unset PYTHONHOME -fi - -if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT-}" ] ; then - _OLD_VIRTUAL_PS1="${PS1-}" - if [ "x" != x ] ; then - PS1="${PS1-}" - else - PS1="(`basename \"$VIRTUAL_ENV\"`) ${PS1-}" - fi - export PS1 -fi - -# Make sure to unalias pydoc if it's already there -alias pydoc 2>/dev/null >/dev/null && unalias pydoc || true - -pydoc () { - python -m pydoc "$@" -} - -# This should detect bash and zsh, which have a hash command that must -# be called to get it to forget past commands. Without forgetting -# past commands the $PATH changes we made may not be respected -if [ -n "${BASH-}" ] || [ -n "${ZSH_VERSION-}" ] ; then - hash -r 2>/dev/null -fi diff --git a/venv/bin/activate.csh b/venv/bin/activate.csh deleted file mode 100644 index 39e408b..0000000 --- a/venv/bin/activate.csh +++ /dev/null @@ -1,42 +0,0 @@ -# This file must be used with "source bin/activate.csh" *from csh*. -# You cannot run it directly. -# Created by Davide Di Blasi . - -set newline='\ -' - -alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH:q" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT:q" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; test "\!:*" != "nondestructive" && unalias deactivate && unalias pydoc' - -# Unset irrelevant variables. -deactivate nondestructive - -setenv VIRTUAL_ENV "/Users/miavonsteinkirch/Projects/ARXIV_/Shell-Scripts_and_Dotfiles/venv" - -set _OLD_VIRTUAL_PATH="$PATH:q" -setenv PATH "$VIRTUAL_ENV:q/bin:$PATH:q" - - - -if ("" != "") then - set env_name = "" -else - set env_name = "$VIRTUAL_ENV:t:q" -endif - -# Could be in a non-interactive environment, -# in which case, $prompt is undefined and we wouldn't -# care about the prompt anyway. -if ( $?prompt ) then - set _OLD_VIRTUAL_PROMPT="$prompt:q" -if ( "$prompt:q" =~ *"$newline:q"* ) then - : -else - set prompt = "[$env_name:q] $prompt:q" -endif -endif - -unset env_name - -alias pydoc python -m pydoc - -rehash diff --git a/venv/bin/activate.fish b/venv/bin/activate.fish deleted file mode 100644 index 7741586..0000000 --- a/venv/bin/activate.fish +++ /dev/null @@ -1,101 +0,0 @@ -# This file must be used using `source bin/activate.fish` *within a running fish ( http://fishshell.com ) session*. -# Do not run it directly. - -function _bashify_path -d "Converts a fish path to something bash can recognize" - set fishy_path $argv - set bashy_path $fishy_path[1] - for path_part in $fishy_path[2..-1] - set bashy_path "$bashy_path:$path_part" - end - echo $bashy_path -end - -function _fishify_path -d "Converts a bash path to something fish can recognize" - echo $argv | tr ':' '\n' -end - -function deactivate -d 'Exit virtualenv mode and return to the normal environment.' - # reset old environment variables - if test -n "$_OLD_VIRTUAL_PATH" - # https://github.com/fish-shell/fish-shell/issues/436 altered PATH handling - if test (echo $FISH_VERSION | tr "." "\n")[1] -lt 3 - set -gx PATH (_fishify_path $_OLD_VIRTUAL_PATH) - else - set -gx PATH $_OLD_VIRTUAL_PATH - end - set -e _OLD_VIRTUAL_PATH - end - - if test -n "$_OLD_VIRTUAL_PYTHONHOME" - set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME - set -e _OLD_VIRTUAL_PYTHONHOME - end - - if test -n "$_OLD_FISH_PROMPT_OVERRIDE" - # Set an empty local `$fish_function_path` to allow the removal of `fish_prompt` using `functions -e`. - set -l fish_function_path - - # Erase virtualenv's `fish_prompt` and restore the original. - functions -e fish_prompt - functions -c _old_fish_prompt fish_prompt - functions -e _old_fish_prompt - set -e _OLD_FISH_PROMPT_OVERRIDE - end - - set -e VIRTUAL_ENV - - if test "$argv[1]" != 'nondestructive' - # Self-destruct! - functions -e pydoc - functions -e deactivate - functions -e _bashify_path - functions -e _fishify_path - end -end - -# Unset irrelevant variables. -deactivate nondestructive - -set -gx VIRTUAL_ENV "/Users/miavonsteinkirch/Projects/ARXIV_/Shell-Scripts_and_Dotfiles/venv" - -# https://github.com/fish-shell/fish-shell/issues/436 altered PATH handling -if test (echo $FISH_VERSION | tr "." "\n")[1] -lt 3 - set -gx _OLD_VIRTUAL_PATH (_bashify_path $PATH) -else - set -gx _OLD_VIRTUAL_PATH $PATH -end -set -gx PATH "$VIRTUAL_ENV/bin" $PATH - -# Unset `$PYTHONHOME` if set. -if set -q PYTHONHOME - set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME - set -e PYTHONHOME -end - -function pydoc - python -m pydoc $argv -end - -if test -z "$VIRTUAL_ENV_DISABLE_PROMPT" - # Copy the current `fish_prompt` function as `_old_fish_prompt`. - functions -c fish_prompt _old_fish_prompt - - function fish_prompt - # Save the current $status, for fish_prompts that display it. - set -l old_status $status - - # Prompt override provided? - # If not, just prepend the environment name. - if test -n "" - printf '%s%s' "" (set_color normal) - else - printf '%s(%s) ' (set_color normal) (basename "$VIRTUAL_ENV") - end - - # Restore the original $status - echo "exit $old_status" | source - _old_fish_prompt - end - - set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV" -end diff --git a/venv/bin/activate.ps1 b/venv/bin/activate.ps1 deleted file mode 100644 index 6d8ae2a..0000000 --- a/venv/bin/activate.ps1 +++ /dev/null @@ -1,60 +0,0 @@ -# This file must be dot sourced from PoSh; you cannot run it directly. Do this: . ./activate.ps1 - -$script:THIS_PATH = $myinvocation.mycommand.path -$script:BASE_DIR = split-path (resolve-path "$THIS_PATH/..") -Parent - -function global:deactivate([switch] $NonDestructive) -{ - if (test-path variable:_OLD_VIRTUAL_PATH) - { - $env:PATH = $variable:_OLD_VIRTUAL_PATH - remove-variable "_OLD_VIRTUAL_PATH" -scope global - } - - if (test-path function:_old_virtual_prompt) - { - $function:prompt = $function:_old_virtual_prompt - remove-item function:\_old_virtual_prompt - } - - if ($env:VIRTUAL_ENV) - { - $old_env = split-path $env:VIRTUAL_ENV -leaf - remove-item env:VIRTUAL_ENV -erroraction silentlycontinue - } - - if (!$NonDestructive) - { - # Self destruct! - remove-item function:deactivate - remove-item function:pydoc - } -} - -function global:pydoc -{ - python -m pydoc $args -} - -# unset irrelevant variables -deactivate -nondestructive - -$VIRTUAL_ENV = $BASE_DIR -$env:VIRTUAL_ENV = $VIRTUAL_ENV - -$global:_OLD_VIRTUAL_PATH = $env:PATH -$env:PATH = "$env:VIRTUAL_ENV/bin:" + $env:PATH -if (!$env:VIRTUAL_ENV_DISABLE_PROMPT) -{ - function global:_old_virtual_prompt - { - "" - } - $function:_old_virtual_prompt = $function:prompt - function global:prompt - { - # Add a prefix to the current prompt, but don't discard it. - write-host "($( split-path $env:VIRTUAL_ENV -leaf )) " -nonewline - & $function:_old_virtual_prompt - } -} diff --git a/venv/bin/activate_this.py b/venv/bin/activate_this.py deleted file mode 100644 index 59b5d72..0000000 --- a/venv/bin/activate_this.py +++ /dev/null @@ -1,46 +0,0 @@ -"""Activate virtualenv for current interpreter: - -Use exec(open(this_file).read(), {'__file__': this_file}). - -This can be used when you must use an existing Python interpreter, not the virtualenv bin/python. -""" -import os -import site -import sys - -try: - __file__ -except NameError: - raise AssertionError("You must use exec(open(this_file).read(), {'__file__': this_file}))") - -# prepend bin to PATH (this file is inside the bin directory) -bin_dir = os.path.dirname(os.path.abspath(__file__)) -os.environ["PATH"] = os.pathsep.join([bin_dir] + os.environ.get("PATH", "").split(os.pathsep)) - -base = os.path.dirname(bin_dir) - -# virtual env is right above bin directory -os.environ["VIRTUAL_ENV"] = base - -# add the virtual environments site-package to the host python import mechanism -IS_PYPY = hasattr(sys, "pypy_version_info") -IS_JYTHON = sys.platform.startswith("java") -if IS_JYTHON: - site_packages = os.path.join(base, "Lib", "site-packages") -elif IS_PYPY: - site_packages = os.path.join(base, "site-packages") -else: - IS_WIN = sys.platform == "win32" - if IS_WIN: - site_packages = os.path.join(base, "Lib", "site-packages") - else: - site_packages = os.path.join(base, "lib", "python{}".format(sys.version[:3]), "site-packages") - -prev = set(sys.path) -site.addsitedir(site_packages) -sys.real_prefix = sys.prefix -sys.prefix = base - -# Move the added items to the front of the path, in place -new = list(sys.path) -sys.path[:] = [i for i in new if i not in prev] + [i for i in new if i in prev] diff --git a/venv/bin/easy_install b/venv/bin/easy_install deleted file mode 100755 index 7e8e4ce..0000000 --- a/venv/bin/easy_install +++ /dev/null @@ -1,10 +0,0 @@ -#!/Users/miavonsteinkirch/Projects/ARXIV_/Shell-Scripts_and_Dotfiles/venv/bin/python -# -*- coding: utf-8 -*- -import re -import sys - -from setuptools.command.easy_install import main - -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/venv/bin/easy_install-2.7 b/venv/bin/easy_install-2.7 deleted file mode 100755 index 7e8e4ce..0000000 --- a/venv/bin/easy_install-2.7 +++ /dev/null @@ -1,10 +0,0 @@ -#!/Users/miavonsteinkirch/Projects/ARXIV_/Shell-Scripts_and_Dotfiles/venv/bin/python -# -*- coding: utf-8 -*- -import re -import sys - -from setuptools.command.easy_install import main - -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/venv/bin/pip b/venv/bin/pip deleted file mode 100755 index 1aaee04..0000000 --- a/venv/bin/pip +++ /dev/null @@ -1,10 +0,0 @@ -#!/Users/miavonsteinkirch/Projects/ARXIV_/Shell-Scripts_and_Dotfiles/venv/bin/python -# -*- coding: utf-8 -*- -import re -import sys - -from pip._internal import main - -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/venv/bin/pip2 b/venv/bin/pip2 deleted file mode 100755 index 1aaee04..0000000 --- a/venv/bin/pip2 +++ /dev/null @@ -1,10 +0,0 @@ -#!/Users/miavonsteinkirch/Projects/ARXIV_/Shell-Scripts_and_Dotfiles/venv/bin/python -# -*- coding: utf-8 -*- -import re -import sys - -from pip._internal import main - -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/venv/bin/pip2.7 b/venv/bin/pip2.7 deleted file mode 100755 index 1aaee04..0000000 --- a/venv/bin/pip2.7 +++ /dev/null @@ -1,10 +0,0 @@ -#!/Users/miavonsteinkirch/Projects/ARXIV_/Shell-Scripts_and_Dotfiles/venv/bin/python -# -*- coding: utf-8 -*- -import re -import sys - -from pip._internal import main - -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/venv/bin/python b/venv/bin/python deleted file mode 100755 index bf7e5ed4528e77c7274417d5ba5cb64999144233..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51744 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 F{|7X(L)!oV diff --git a/venv/bin/python-config b/venv/bin/python-config deleted file mode 100755 index 83c376e..0000000 --- a/venv/bin/python-config +++ /dev/null @@ -1,78 +0,0 @@ -#!/Users/miavonsteinkirch/Projects/ARXIV_/Shell-Scripts_and_Dotfiles/venv/bin/python - -import sys -import getopt -import sysconfig - -valid_opts = ['prefix', 'exec-prefix', 'includes', 'libs', 'cflags', - 'ldflags', 'help'] - -if sys.version_info >= (3, 2): - valid_opts.insert(-1, 'extension-suffix') - valid_opts.append('abiflags') -if sys.version_info >= (3, 3): - valid_opts.append('configdir') - - -def exit_with_usage(code=1): - sys.stderr.write("Usage: {0} [{1}]\n".format( - sys.argv[0], '|'.join('--'+opt for opt in valid_opts))) - sys.exit(code) - -try: - opts, args = getopt.getopt(sys.argv[1:], '', valid_opts) -except getopt.error: - exit_with_usage() - -if not opts: - exit_with_usage() - -pyver = sysconfig.get_config_var('VERSION') -getvar = sysconfig.get_config_var - -opt_flags = [flag for (flag, val) in opts] - -if '--help' in opt_flags: - exit_with_usage(code=0) - -for opt in opt_flags: - if opt == '--prefix': - print(sysconfig.get_config_var('prefix')) - - elif opt == '--exec-prefix': - print(sysconfig.get_config_var('exec_prefix')) - - elif opt in ('--includes', '--cflags'): - flags = ['-I' + sysconfig.get_path('include'), - '-I' + sysconfig.get_path('platinclude')] - if opt == '--cflags': - flags.extend(getvar('CFLAGS').split()) - print(' '.join(flags)) - - elif opt in ('--libs', '--ldflags'): - abiflags = getattr(sys, 'abiflags', '') - libs = ['-lpython' + pyver + abiflags] - libs += getvar('LIBS').split() - libs += getvar('SYSLIBS').split() - # add the prefix/lib/pythonX.Y/config dir, but only if there is no - # shared library in prefix/lib/. - if opt == '--ldflags': - if not getvar('Py_ENABLE_SHARED'): - libs.insert(0, '-L' + getvar('LIBPL')) - if not getvar('PYTHONFRAMEWORK'): - libs.extend(getvar('LINKFORSHARED').split()) - print(' '.join(libs)) - - elif opt == '--extension-suffix': - ext_suffix = sysconfig.get_config_var('EXT_SUFFIX') - if ext_suffix is None: - ext_suffix = sysconfig.get_config_var('SO') - print(ext_suffix) - - elif opt == '--abiflags': - if not getattr(sys, 'abiflags', None): - exit_with_usage() - print(sys.abiflags) - - elif opt == '--configdir': - print(sysconfig.get_config_var('LIBPL')) diff --git a/venv/bin/python2 b/venv/bin/python2 deleted file mode 120000 index d8654aa..0000000 --- a/venv/bin/python2 +++ /dev/null @@ -1 +0,0 @@ -python \ No newline at end of file diff --git a/venv/bin/python2.7 b/venv/bin/python2.7 deleted file mode 120000 index d8654aa..0000000 --- a/venv/bin/python2.7 +++ /dev/null @@ -1 +0,0 @@ -python \ No newline at end of file diff --git a/venv/bin/wheel b/venv/bin/wheel deleted file mode 100755 index eba121d..0000000 --- a/venv/bin/wheel +++ /dev/null @@ -1,10 +0,0 @@ -#!/Users/miavonsteinkirch/Projects/ARXIV_/Shell-Scripts_and_Dotfiles/venv/bin/python -# -*- coding: utf-8 -*- -import re -import sys - -from wheel.cli import main - -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/venv/include/python2.7 b/venv/include/python2.7 deleted file mode 120000 index 3fe034f..0000000 --- a/venv/include/python2.7 +++ /dev/null @@ -1 +0,0 @@ -/System/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7 \ No newline at end of file diff --git a/venv/lib/python2.7/UserDict.py b/venv/lib/python2.7/UserDict.py deleted file mode 120000 index b735f02..0000000 --- a/venv/lib/python2.7/UserDict.py +++ /dev/null @@ -1 +0,0 @@ -/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/UserDict.py \ No newline at end of file diff --git a/venv/lib/python2.7/UserDict.pyc b/venv/lib/python2.7/UserDict.pyc deleted file mode 100644 index 7a7400f734db77148bcb800c76d149d9fd8990f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11745 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 betv9deDCn> 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 diff --git a/venv/lib/python2.7/config b/venv/lib/python2.7/config deleted file mode 120000 index 88ddfa1..0000000 --- a/venv/lib/python2.7/config +++ /dev/null @@ -1 +0,0 @@ -/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/config \ No newline at end of file diff --git a/venv/lib/python2.7/copy_reg.py b/venv/lib/python2.7/copy_reg.py deleted file mode 120000 index 8d0265c..0000000 --- a/venv/lib/python2.7/copy_reg.py +++ /dev/null @@ -1 +0,0 @@ -/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/copy_reg.py \ No newline at end of file diff --git a/venv/lib/python2.7/copy_reg.pyc b/venv/lib/python2.7/copy_reg.pyc deleted file mode 100644 index df2ea361a7e495c1379e511e7ce890ea0ca455ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5828 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 CWO5z= diff --git a/venv/lib/python2.7/distutils/__init__.py b/venv/lib/python2.7/distutils/__init__.py deleted file mode 100644 index b9b0f24..0000000 --- a/venv/lib/python2.7/distutils/__init__.py +++ /dev/null @@ -1,134 +0,0 @@ -import os -import sys -import warnings - -# opcode is not a virtualenv module, so we can use it to find the stdlib -# Important! To work on pypy, this must be a module that resides in the -# lib-python/modified-x.y.z directory -import opcode - -dirname = os.path.dirname - -distutils_path = os.path.join(os.path.dirname(opcode.__file__), "distutils") -if os.path.normpath(distutils_path) == os.path.dirname(os.path.normpath(__file__)): - warnings.warn("The virtualenv distutils package at %s appears to be in the same location as the system distutils?") -else: - __path__.insert(0, distutils_path) # noqa: F821 - if sys.version_info < (3, 4): - import imp - - real_distutils = imp.load_module("_virtualenv_distutils", None, distutils_path, ("", "", imp.PKG_DIRECTORY)) - else: - import importlib.machinery - - distutils_path = os.path.join(distutils_path, "__init__.py") - loader = importlib.machinery.SourceFileLoader("_virtualenv_distutils", distutils_path) - if sys.version_info < (3, 5): - import types - - real_distutils = types.ModuleType(loader.name) - else: - import importlib.util - - spec = importlib.util.spec_from_loader(loader.name, loader) - real_distutils = importlib.util.module_from_spec(spec) - loader.exec_module(real_distutils) - - # Copy the relevant attributes - try: - __revision__ = real_distutils.__revision__ - except AttributeError: - pass - __version__ = real_distutils.__version__ - -from distutils import dist, sysconfig # isort:skip - -try: - basestring -except NameError: - basestring = str - -# patch build_ext (distutils doesn't know how to get the libs directory -# path on windows - it hardcodes the paths around the patched sys.prefix) - -if sys.platform == "win32": - from distutils.command.build_ext import build_ext as old_build_ext - - class build_ext(old_build_ext): - def finalize_options(self): - if self.library_dirs is None: - self.library_dirs = [] - elif isinstance(self.library_dirs, basestring): - self.library_dirs = self.library_dirs.split(os.pathsep) - - self.library_dirs.insert(0, os.path.join(sys.real_prefix, "Libs")) - old_build_ext.finalize_options(self) - - from distutils.command import build_ext as build_ext_module - - build_ext_module.build_ext = build_ext - -# distutils.dist patches: - -old_find_config_files = dist.Distribution.find_config_files - - -def find_config_files(self): - found = old_find_config_files(self) - if os.name == "posix": - user_filename = ".pydistutils.cfg" - else: - user_filename = "pydistutils.cfg" - user_filename = os.path.join(sys.prefix, user_filename) - if os.path.isfile(user_filename): - for item in list(found): - if item.endswith("pydistutils.cfg"): - found.remove(item) - found.append(user_filename) - return found - - -dist.Distribution.find_config_files = find_config_files - -# distutils.sysconfig patches: - -old_get_python_inc = sysconfig.get_python_inc - - -def sysconfig_get_python_inc(plat_specific=0, prefix=None): - if prefix is None: - prefix = sys.real_prefix - return old_get_python_inc(plat_specific, prefix) - - -sysconfig_get_python_inc.__doc__ = old_get_python_inc.__doc__ -sysconfig.get_python_inc = sysconfig_get_python_inc - -old_get_python_lib = sysconfig.get_python_lib - - -def sysconfig_get_python_lib(plat_specific=0, standard_lib=0, prefix=None): - if standard_lib and prefix is None: - prefix = sys.real_prefix - return old_get_python_lib(plat_specific, standard_lib, prefix) - - -sysconfig_get_python_lib.__doc__ = old_get_python_lib.__doc__ -sysconfig.get_python_lib = sysconfig_get_python_lib - -old_get_config_vars = sysconfig.get_config_vars - - -def sysconfig_get_config_vars(*args): - real_vars = old_get_config_vars(*args) - if sys.platform == "win32": - lib_dir = os.path.join(sys.real_prefix, "libs") - if isinstance(real_vars, dict) and "LIBDIR" not in real_vars: - real_vars["LIBDIR"] = lib_dir # asked for all - elif isinstance(real_vars, list) and "LIBDIR" in args: - real_vars = real_vars + [lib_dir] # asked for list - return real_vars - - -sysconfig_get_config_vars.__doc__ = old_get_config_vars.__doc__ -sysconfig.get_config_vars = sysconfig_get_config_vars diff --git a/venv/lib/python2.7/distutils/__init__.pyc b/venv/lib/python2.7/distutils/__init__.pyc deleted file mode 100644 index b0dbd8201c6dac1065bfd7e0f973ecf2526509a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4499 zcmd5E{SEzB?L%KW(|+Fqq!j0=FL5~pc+T#g+qb*lS=RqKKimG} z!WW@bpK1L598dADnn;ANBYhEX+;+rsM)I0?wNbk+UR{hxG9k&Nc$1^{)TjYTU6N^e zhT%1NhOsjvRYS}S<>TR119G*8>Yyh1U&YiUnU$zcV<+8m%$y`mi6(S>O&sG$GB44p z9Ejxq7;SAqyah1}k}OIz%>!YzNWT=GlOE=q5N}!1zm0~hh_^c04o(2$#%Rl{lB`K` zo>OtxIL8I4)?L$eA2}6l>*B48S(oG$F&89xmAmFD?~PX3&{Z(uYm)q+vVkS%+!RyF ze<)_N8pugnVwUyvC-ZD2uZ#D(JWS8Yg!z#i%u4=u2cOiDN7TL{-W$5uob)fsU`xC$ z8C(+Yk~k+o|FSp_(+e2d)}jCAQ1hmEmqjN4m_L@Nsn~DVc&K^lza@h!;$0Od0;X4` z2X8LQbCG8vpLJsrI+U z`#_=l`o^}Dz;W>E%FX&{mZHg=D^O9DTX(O(|9xwXajzsc1Dth*jY*DDi*;E zj%_mSF^04d2^>i5wiQOj;C{SYv=<PQYEnX<>sjEW5iw zVG5haX$e^|?8g?n7s(1so*V{tzc52f$S~04R;Qy_8%Y+YI3yr}hv}u<1bu&)n_hfu z=h4rA`51Y-1W7MWgMR##@v|XAq$oW^KNhCnYvWh+Re<57`&+D8bO&*81XF9`^dQc| z{qARZmYC2M-4ESI_kQPhclJ%ce|0C!BIW>HC8$I_#sXLr-`9a<)$w z-NIAQeN&DGEm5U+G-&^V2GXevqNfNpupchB^5(h7V0&7Vbc&Y`8r0%88%69Bz0gkO z(?W?O`8RTWT>#D#huynhY{}EQJi*8YC!$3_9WFHp(RIEI1mB00%~g{)OarnK_q(mh zJIspsxL~{>-^c#yguT6D5yBT_ZMsZJgz<(5i~N!Z&_)cnj6{uBy3ggTF4Nszrkuc4 z5vyTdaEw~_Ni6icNu%O%jF_iEZU)(r(Iy!%jda^C8CAF5%MQ~>gZ~i0t2^MbI%5nP zJPnlZJH#yy{T+1fLs)S4f{0&q8nr2B9g)9+_Nuewgp4OX<3QR%2krt5k^0uFKte>p zjUWRA7_?xml0COecu2vDx4VLtCGzyup0R$Jn4tHtbEiY_&mpX<8(Q7&(QR2f;*0k%O0X*_e2786s<_I$++!@T6QuY58Hc*=qlzSNq zDf^S(qacrbsQz!E!`^W85p>Ih4qb(g@O?_%pYbXg>rWytGS=6OwXzl`SAn<26a{hu zy=m#1|DH62?!mO64TRB#wt#NV(ln8K9ONl#l@jx87-mt)<_ZHKPcX}pQvNUa_yb!2;WY2n1|*UIMRKri&BiN!!4kx5qUC1Eywuz zwbmsM(04buEuMcobBA@lMz1zFGkMnU<=Mcmrem;Cs0CY9<)~hTtnQC99ATJuSs4UVy@A(hx@zltuLYO^cS;Zblz(oD9$vh{nv>01vv$#W z+gYkDu?((VMt{v&)AkzLEDz@Eb)@mUGl7EPe68-xpglXeh%x79muk(4X1%f4oM_Y+ Qr<$;6)R(K@#$40+FQj7=H2?qr diff --git a/venv/lib/python2.7/distutils/distutils.cfg b/venv/lib/python2.7/distutils/distutils.cfg deleted file mode 100644 index 1af230e..0000000 --- a/venv/lib/python2.7/distutils/distutils.cfg +++ /dev/null @@ -1,6 +0,0 @@ -# This is a config file local to this virtualenv installation -# You may include options that will be used by all distutils commands, -# and by easy_install. For instance: -# -# [easy_install] -# find_links = http://mylocalsite diff --git a/venv/lib/python2.7/encodings b/venv/lib/python2.7/encodings deleted file mode 120000 index 8732f85..0000000 --- a/venv/lib/python2.7/encodings +++ /dev/null @@ -1 +0,0 @@ -/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/encodings \ No newline at end of file diff --git a/venv/lib/python2.7/fnmatch.py b/venv/lib/python2.7/fnmatch.py deleted file mode 120000 index 49b6bc0..0000000 --- a/venv/lib/python2.7/fnmatch.py +++ /dev/null @@ -1 +0,0 @@ -/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/fnmatch.py \ No newline at end of file diff --git a/venv/lib/python2.7/fnmatch.pyc b/venv/lib/python2.7/fnmatch.pyc deleted file mode 100644 index eadb5a3a3aa4f3381f1381b0248e6dae238c557b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4004 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 a%++dM+ncSu)o4w(W?HRQ!~Hc|3;zJ=6%2g< diff --git a/venv/lib/python2.7/lib-dynload b/venv/lib/python2.7/lib-dynload deleted file mode 120000 index 24c555e..0000000 --- a/venv/lib/python2.7/lib-dynload +++ /dev/null @@ -1 +0,0 @@ -/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload \ No newline at end of file diff --git a/venv/lib/python2.7/linecache.py b/venv/lib/python2.7/linecache.py deleted file mode 120000 index 1f79a61..0000000 --- a/venv/lib/python2.7/linecache.py +++ /dev/null @@ -1 +0,0 @@ -/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/linecache.py \ No newline at end of file diff --git a/venv/lib/python2.7/linecache.pyc b/venv/lib/python2.7/linecache.pyc deleted file mode 100644 index 98078384279971af606970a8cc2b4cdd9668244f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3662 zcmcgv&2A&d5w4!$k2p)Nw34k|ZVaPsATR@HMIbpCMzot4mXYXS*&cc$VY3@z#A%X4 z4ri$8=E^k4)B2KJ0t5ka%v1R4LmnW=BjgnfKY;yJ4Yk@Q5W#6ych_`xRekk!(f_d( z?Em%Z&jZ?geEj|%kDa55iJqZV6nm5^dIq7CJ$mL*>{DE!xJo0RoQjZTxySUoKAnI0yov4=tM)i|-5 zznL>xY+~(lU6?3-Q+Jlf3ux((Sw&wg12>MG=H(89W06+Ha=2_E|?8b`Fk*P~Y+t>IQhD@7H5swh7ohn`Qb6rr1W zSvNwgZ8ru@{iKPpv6zca}si^UOMvWYYvb>wZz>6EkqO`*C=F@~3{c zH#TYds5dB*xwHK!i~Gm9lkj$5n(SpaO)k3gr5oqjuMa;&FEiq-!}&7g4O@6D8$xPZ zy|0?yfMx!$vEoH`IwMe^+Y{4mn;7Io6IGJNtcJG9dQ&}CNnpd-Ku$fh=+JA z2a75L{^5tuC5D|q05*V-X^n~p8>qAq`gU)5Prv~M#mMQMWo@cBkEQ_?$E1`(z+b^h zBcS74lFi3z)}r}?apILty4}EAGLN%BymA<5e4ftZ$eB01h@3*|#JREA2Tl+2%tcA2 zqm12KEG1hUCoP9qM=2-k@-Sh$P6c}*hs$y1FJx)iOZuOgSzatZEsDGd**6l&kkJ`3 z0B)jmTlnKtc@K}}w4h28==0S*)lzje-~)2z^YJ8D|AT;FAvn`5Dt^JynINf&)=1rV zB#xLu9Dl>|NXa<(R8jBie{d9!U;K^Ma1BzPsQtV`YaxU+geoWfX62MFpHN1$+#`f| zQlV9q31VHNv+P|!0Ap1_!M_Csvf5*QMbSA}W>up}jix@??}bUwt#h|{ve}t+@jc^% zmAUj3mK`T{5EXHW3<-4t#uYM*3ZwId)A>*{R7%)%u8Er&7gRWyf|nQb954YhVwp63 z?^mZCj;mugpXQkheKwMqD ztArx9p~r>_>V|m#h9dSi6!94Nz-ZI{mVYL4TL2@)@1%>18^DwQ0d9B!hs z%&7`I#*Fe`5Q<_&zzr`RDHH<`7|uru0w9IjfME!zVmqJO03-qhxS?W*8}!PjHM&)K zq0a4chgLGeuWezw`#^7laB0FQ-t_+r;LDHH`3hx3L(=L8;uC`{Fof4Iiaz8?lQZr3 z#SX0-v_hp(qx*mH=rT}%{IIfd%TamPwo$0GdzVKFUgC6V(c~^WhFua0VSfD$xow^} zelenTK+E>EBF-Gp3Z^1AJ)HR=&I~5ry*~55*io0y6=&P>t?LZEcIg*qn35FT6AS;d z(LTrU8Cxc=b;!NN1wjlOJ^K3|tzqvSn!GJ+(nM-D=*#o7Y!`b6vd$e33-SBst0om6 zd1&K++Tb5J0%kQ|j{!k#jD6@IF+^bezO?trTeoNpH?(Mlw#ob7_znF{vGz{@Z*wI? zZ;-(f7eI`{%q@xx*MmiQW`z;tjwvbOWTPUMvT48@;g$-#D|mTgq04U`?VUX`e{h)$gZy6q};omn`r1ImglA+XppK z-{y;AU@X5D$n7M2Q#?JDs;=_@<0T*Q3*eu^*{j5jWieEu(g`^gg*SwfKJUrh1xU#j zGKQ@{T}8-cj9hXjQlyrObqt<-US4?2Oma9oPZKF7OWNWRRA?))(M4IsS&$>MTYPsh4BOd!44ON>e zP`^|aucX+Ps`nW)Dje7HLv;8xis6a*l diff --git a/venv/lib/python2.7/locale.py b/venv/lib/python2.7/locale.py deleted file mode 120000 index cc8a5a7..0000000 --- a/venv/lib/python2.7/locale.py +++ /dev/null @@ -1 +0,0 @@ -/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/locale.py \ No newline at end of file diff --git a/venv/lib/python2.7/locale.pyc b/venv/lib/python2.7/locale.pyc deleted file mode 100644 index 35b5a6242b6ac3214f466df202359739e131e5ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57164 zcmeIb2Xq|Au{Juhk$^xkNMcf21&W|Vf&?=uSt1C6Bp5(y0VYWDc(Jtr23YJacXk1S zrerHw&N=67*>bj=bIv*EoO90h`>JYs0>Jx+chBQJ?;MN5eqEiry1KeL%uMq4b6XcZ zV(O-%<^Q)BxE+7q!7D9`ENc+IwnYi6Y+HkHs5@Z|CX727ai^@ol<`kngK6W=Sc4gB zy45OWt-(3g(aH)dRcf)uTdn%-mTlXVv`VekF!D}WcUjh*mUSG_Dz2vuLhG=UOz+qWKmruxO!0=UH^VMHg7K$fCs-EwN~+MawL@&>C564W467 zBR)#F$SSv414k)5X>xB3xn(BF{^$L1de=29fh+)*v#!+!{pwS6G86 z;!11q0;{yh8bm3}xxRxa3+%Ycx(hr)i7UkOLW|nPagns7w8R>`*m4p3604N4#xAu= z7h89tLMx@oNQqpomIOJgbeTohNOqT7v`Rd$uu3Uw>`IGPbE?7R9EYQISa+c}t}^5r zAy-JyTFIf^Dy=l3oz`9GuB$CtCwX3Dl~!4_UZSnGXoGlmShP_bYpl{TYjCYao2;=; zi#D@oX`Mw|xB@%z$Mslm(N>AQ!J=*A*l5wU;@D)-b>i4;(VbbkL5kU8mB7^P;@&E3 z>k{`es|3dH5cf8#WLsm`T4UE))Xk;TpP4`#Xs3iez^ZJprsr6t>n;0e<>Ek+-kU%- za3ZLW2U>0LhUUTV>9i}qNX7d(B zr3N@*Q61n})BvDLO~9l@Q-G5eO#@C@^kBegi*B_x4c=h6A4}407Ci)hfQKsFu5bt7 zPK)jW+-=dr0QXq*aKIxhdZfam6dnzDj75)CcpTvI7Ck}XiGU|r^kl$OEPATK(-fW# zc!ovKRCpHP*%m!V;kkh4S@e8`7XV&p(Tfyb40wq}F9p2JqI(ry4tRw{_bI#*@G6U5 zt?(MaYb|=6!s`KVu;_k;Hv-;d(VG?C0(h%MZ&P?X;2jpdQ{i2JcU$xxh4%v9XVLo= zJ^=WjMITc5FyJE=eN^FNfR9`B358Drz==;Od>Zf>i$1IHIl$*F`U2pK7JUiuWsAO| z@KuGc0lse0Hvr$X=v#nqTl5|E{I0_H6uu8YlpiSk5bz_5ehm1DMLz}n%%YzIeqqrs z6@I1gYrt({`AK;)(hX6O)ln3!>CJ$**z{Jw+iZHfQtwcBC*WN+y&C}O*@poOcn_%e+Vnoa`)&Gw!Uq8#vgyNs zkJ$84z{hO*xWXp@pS0;y3ZDji#-`5#K4;VC0bj7`iwa*-_%h%tHhop$Yk;rY^bLh? z0={L_w-vqv_^wUgQ}{mM2R8jssUHD;Y|~EwKeg#+fS=p+3x!_-er40I6@CNwtxdmE z_&oqs`U3#1{iDL40DrdWFG~GYslO@wUEv=J{{;NYrhh9~388F2B0))o6d;|T3?Q4J zISMU+)&!jcKxHLgI0HR!`a5>b4rLY>%k)SmSYXO}JTBooc zupvPk0hpKPmrh305lUcsW1gNnV@NfQveLu z2Lnzg=vIZ>)bk;LhbHKD^}GXcXM*lh>TbZp5_FHk!xbI@cw~YerSNFLV-oaOr5*=( ze1e_;cw&N{r0`_GQxf!4z|#`+bigwb^h||kDLfnSoCG~r;d$!$e1#VPUYMX4DfME& zOA_=_01~`R;a32 z@HW8P6Z8(H-U+~@|1O1hE4&Br-UPi*;r)OQB627VMEro9@d{S@%C1pQp$7Ye@w{3=1e2K**Lzg74h;P(mogHnG4 z{3$_yR`?6xuL=5_!rvAC0r+Qv{ss7Vf~=%~4ZwVqP)I7I0GKe-N@WzXfH_HO0kkIR z901B|Q<$r8E?{1g<|`}!EKJgQN}UhDly!l^BEaG#EdeY|(lUh$6)pl?oTN(tmnJEv za2eq8BwYcxGD*u7t^%w`QoB+smAYD~YZO)iRwt=LVU5CCKxdNHDXa&;h}xjAQDKw9 zX26ytZ3S#g(zSr=lJo$D>lJQL*beAQ(hfj(l6C@mlC%r3J4t&0y-C`uun(|5Ne2}A z00)zF2ykPP^6J^IFaSWh!wN?fjslJ)>A1om029hh08Di^D|L%f4^+xg>Op`)l7;}q zBoUyLq+x{-z-W?Og)snPjw_TECICoRQK$lHNjjla9e@O$LIcoD(xk$a!bt!+Zd&1# z!h->)lXNTKwj@0S@X#dP4!9#pcdF-I3U@0!OyM2?Vm@5q5ekn~coYE1AFc2hg~tL= z!s8SkukZwgCn`J%fOJn*>M4MyCh2JkPgi&b;F(E!mQv3KJSR!d1w1cF&sTVX!V3W} zO45rJUIKV&l3oV5H%Tv7cm?3TB)wAMRSK_Gcn#pSNqU`9uUB{j;Ql1NQQ=L1Hz(;W z3U39xElF<&ydz2PRCt%dy8-V>(t82#OVaxlJ^=V&l0KyHVZcX{^icrz3O)|_M3O!U z_*9ZU4fsrwJ`4CPlk^pZud3(Q0Eqc@g>NW)6Y#AheH-wdBz;%m zdkWtN{2)m`1pFvTKL-3HNk3Ki8Q|wh`UT*ZN%|Gw*Gc+~!fzFR2l#!G{-E$jz@L)z zXQlq4)L#LAOVZyJ{sH)BlKutwcap5sCbCnMP)Gt&DM~A36taLhDQZz@RX7LGmZG_U zb5k@AfOYYFg#`)=70v^kpP~yC76BHgXbE6xik1N`OwmPvi&Jz7;L;T30GFlcasUm z7QogNZBw{b;W~u}0IpBb4GP-pKPmu>`q^Jp)OwknJWQwL0P5~aAqSFeu0ubdk zg@*thnxfkk?f~4GqPrCCR(KfTo)kS?;SmatRCpBN(J6Y2!earCOVQ&Mo&dnw;)x1R z0z5fIPf>WP!qWgxPth{~$mN-UXQk-b0Oax*k!iyDN0zmSY zD!dGEZ;D>7)GGk@rRbFkuTprm!fODpP0{NBuTRk%l)4}A#uU8?@a7b~MZ?~zo^J!Z zJw@*Tyfa1bQtI7Gy$67T-U~pw_W|CYq7Nv1P~k&>52xrOfRCo=V}OsR=o5fXrsz|E zPp9ZJN_|$T&nbK!@P!n85%8rHeHrkT6n$0UYk;q(=o^4ZgF8rRe7hzfkxk;8!X7HQ+ZX`mIvGQ}{gq3I3qe9~J%t z_;ZT>0{Cl+{s#Daiv9ukXNvv>_;-q|w15r30xqGDR7feL0hu&q73L_k09w;@4xlYf za}~}7pndZI^V75durN*M0l<*+6)pgv*hK(DS*)-Gury7}0Lbh@0CKrV;bH)iU!v5d zfLxj`Q_sr*$m|M*D>ZC60J&VHutK37urf_oD_o8@9}L18-pxpXP)0CcBmC!i-yy8uYATVW5NH%)s1 z`_i;u;ebM)!a=~HG~Ecur>S3I0B|@>M-+}K90MFr)1bml3O568Nz(%r9QAwi*4U?NQwg{ndga3W20fS0C*QcZAyR>M9A_z6AJkn!cjcR~5bn_*9t1uV_ z16-D&%K=wp=t{uy3|$3S0Z(kcwr6N1sH-z{4PaGCuz(|Hh0d9uI0OJ`d112(50aP{ z0Z+=%lL1f3&{F|V%h1yS&&bd-0nf_NvlX5Lcy5NC2Y7ylUI2JuhF%1CafV(3cxi@S z2DmpvF9*CLL-zq*nW0w!UY()W0A8D+*8yIip*H~T&(IqIZ_3b{0dL9BTLEv&(Axp; z$k00h@5<1-0q@Dsdjapu(E9-&$j}D?AIi{&0UycGM*$zp(8mFv$j~PNpUTju0iVgx zX91tf(B}bP$j}!7U&_#z0bj|`R{>wk(ANRq$j~01(4VCNz~L+% z0UXWJF~IRG4FYb;(#?Qdvh+ZJlcfg%3RxNg6thHtQkI4RBUu^+xLFzljAyB=FafA! zsS2oN=>(vjB@fWZQWG$lr76J4EKLJWW$D3y(^t>L8Dw!U!!GT_O@r)s!m97Pl5WrL-m|B)gRk${d*}|K)(BO> zC8C7Y-+osX7mHqRTUKs=wOA;Za$d7mtJWJGt*tryH!xbtO;o9gfLgse=~Btdm8(;$ z%caRuIaeqaOP-f&RC5i)>&}(kp%ol18Fd}%^(2o%g>nTVFE{FrjOH|Dr8zNFs^^BQ z^@&2G;Z{a+96eX?a#N);GKSO7N3$rq1&?EuDkE;C#3dH16SZ<_qEu;c;a(|H;lhmA zZlzdma?Sm=ak06HLS>pWnW$FE)48TsqG*AY!UW=T%_j;qv~aXE!G%s1%1z0~Z4`#U z6V9ks@T6*SE=aY#QbU>1zA`u5tP~q=wbGI6ZR84NubK<0MWx|Fv)n-Aid8}@J;}FF zE^8**Awm6eQa3c${Wt#WYs|sbFsE5@k+xKXTmD0bT08LPacBt=WLx?Eb`EM!;71cV zoRi};TH)h3+Rcumu_P-0cn*Hn9QI0eZ_R{Tn5PX^VPFfFAbOK^%5E8HPQ&^sn;RHoJ-IJjdMWNAt-*A zNUJrkVzn~az&NnHM!i@qmyP@6aDAeYRR2Z_SZGv-jl*qZ;NuJM+`#D|4|Jh0xY$I+ zD#dB3NQFhc?4Bw~(Ee_xd*Jw?9;pQr2lwyq8t9RdK@RjD=#dJ;ec)hU&p=oHxQW_# z_&`s-w_A!waM%9*l4JLtuDo-g>sUK?eS?3lb{~RYm#gV=D{#>bKg=GN8{={uml+;N z4ae%npLaJ0;f|ecjo7RwVAxrd0)R>@WE8U2rV*%;IZCwvTKPVpBxqBZt6}FVHBYJe zN-a=WsGjF3b-q#;SeyFW7jbn6KmO?CzQSl)eSMDHBD54MDf3^x)M(Z#UJlBoRCkLy ze5;jGqfnprldtw_rJ_5Gz*?aW>2E-+!%T!>!p)I-wOQkSM9EfT9)3(`I^OieP_-<* zQ*k_Zq~g@7UZuezP;-i&1Bom`96j-=#C+Ni2l~bdaz7Uy$fQ(rhNc~_Rw$OF=Q<=U zhO-NiLH2H?p}Cbt3JrI%B*kipRnHB5IJ;UrJFYsCJ6!!})e$XLb&ScThXLzx^2P$c zqH$jyLBsVz(II!lZFoVfctuT#k(e`7ijZeTudoKV7JuHA__5M+?d<>NUy;WH|M3Ws zp>Po#r$y|?vsQfx4=oIaI}(l%GL^SEACs?Bb* zgT4vW6puNK(9_aGcd|LdI?WrxPtMon?aFe$C!`b5IUz&22fATO6fia98dFtHCsQzN zn`)hBV`JXiW4>E9G6~@-WfW}?BXf>Cj7|+YNd)?6Z0ox%>4{L`5Yop z+)|$5d=CAW@@cec!DkJOp+X}!R2nTzf@N$0q5Vd^7N)?+kh{tSu845OJIh>Qg;l_x z;R>9>6&~Qil`G(Y0NrU>w@MZ3mok&a5?oz2rZL6?rs)6@z3-1Yu^ZS9ajKKBL0}w5 z16XjIHNrp&r(|3|$A9v3Rz?x)KeR#3Kr7K=XYBd52uBjW{8!}AI({G$x7yap5;u6~ zEw@;=CalxK2VP2C!NL8YVE{1gh)T4q@i|s~uhoEmg86la&83}OXu)c#-^6i_*e4F) z;R3KR0XKe7#)-MsQO-^kl2|1kn|N*oipHg!nH}3x@XW8}pQZQ_`{xK7;A-7*=s>+$ zl5Fx9atzi7<$~96SpU|Mo6O~gIJ>-WoQKK;Gks7a5A3x(wrVVN#@s}kox)$6J z;lwknqaf@545M)jKN%_phMmq@r<2wgsyByAUwk@aE#_(`nPP`{!vbA$J~z0X$A4e` z8vN#Yvdmw`KP)L~3iJ9&^ioczRc8Cz&UNcIY}~YY%T}?E+j$gki{J{JZdsM<%foRP{d^ubSsFkR} zwqhL%=7!pZo+zGjX*i%+zsOMW^4G(8mZh6ZSLuE!_Lm5CeoR!I1DXn34>VK?b0)l1W-yc+`X$>=oJLVI-l8FY6cO(o^m5t##M5qlZ9df z+fSUs^5w^yt9Xc7@M zR><5e5w&wLDj^Q_Wxjymp+%637eVAIt-c=<5Fdz^sFI9Tea?T%RGA=FoWAKw* zE|snZ<}dCZY$bS-C6-qWPl`LsLUaVR_z>4b%7p-(pJ+|Y2l6y@1*W5{xGsQJK9M*)Y6?Ms(DB5Ul!>j%T{kB3g^cYJ-98PQ0o|?9RrlQq#i=olR^G!*hc`wm zxmdE~A<^Os{`S16Og#e^N9qal zBvvnoK1L1%j4*m-w{C2eEWty8#j$T1pNfpp0Fa=E8t zj%|eHGTdZD1QS7?H@MY|;CWgGNZIuo`8-qH=3%#jd8bsDA&F^AJgZR9*mthW;>Pt3 zph}q62c~PK`~cGAck&PGN>SM^wu`(*p@NM>8P83ek%&tgnCIaj@M0X!^4 zVusOm6j#Qd7j*nqN>k3TOc(6pg%uBPjv~ojX(`IZ_Br_2jm)?re8Vy@xo?iSIeFFg( zoel; zBoS(AMfVC{MRmv)=AyHb>soCxW85s&e99v5l{uraBcCJ9$z$je^`6s-XBvW&xv zb{)T zS9A(cOdKStVVeq2{j6v8%CDw zX~G=46DAZ)bY99sc^)$HV2?r9ns{uG$ojHhEL@Le_D}&kG!e5xt{W(C|BG$^V9!NaR0qivliVn=z13_HDV6hoZZQtd80c*81+#c{GWXf~u#$7x)J^E` ze<_RL98?2%>7N^PA!WD9VuXEcK~;=M&Q_fM5tUJ!9m*|{cJ6tIvPvY2$61z0X2tap zi3BNQk~^>)f8JsIsNoNZ1Rrel9i$Lq$1;WmB-UJ5hGNR!9nAN;_n^aldpQyet3c#% z_a5TS?<{iG(>S#r$-Ur{H)TZyi+s4=$fbAx{KmIj(z0E3Fek__;UBj4@?7=2=v(Hb z9xxkOO6g>+e*IA+c^TVfu`6=LSoFBoB7PHa=zPFC1eY_@ z@IUWY2oG{lk=Ub$7aV90FHR*OSearcg16j7L$XT5iWTd(sE;aE-b}}zPC0$5)OhBX z-o>({bW%)wbIHbQ@Sb9DrNuG+VhqUjE64-40+)Ci7XVcU1o0e+qk57X%y*Y$Vh=K! z!-)!&5x$}%OCK&QNPl*FO)ffMpG|C>pbj^2?=c%J%;<{}nZ!ISHCk}S)}nJecXiN_ zZ$a0xpc{Q!zf3w3nne3crZnzabdao-F)$$R=o9Yv8`;4&t7snXM_J)R1^E$9N(8Je zpm?yHPFUEjLL3zjs3JI^vi!&|HIb7%-e6PbI5u=y%Bo;lFZ&vtMx=!I&9Jxjd;ayU zX5GYs*r`q4BDxMaz(>|a@W=Wdn{Q|@_N-vDV?{7u7XQc+W0)8J2!ybV!CuEUfoxx( zz9<{+aV$*M*>LlLWBoa{9}juYj`tkfX95nKDx3!7VlJZ}Zfu(b3;|n~2FyhSUZp%! z3OVr{Ib=d3?@wT$`1O6y|6P5rOoa9Lv(392XpLAQGb?hl>6vJxu-2&7{RzLt&~LL_ z{JKa+PZ0qfHK6R%60xIe)i$Ws+>gLw~!xaZ6!djZQ9 z|2mtwHi_ME(hHHi%c9%cI_hN;hVNPMSoU|=nH)eoY+mEaR(Q8jGSNME-pxS(_H}qG zCpYCbMuVKfn>J?4o-^zn4yvVhVTKEC*@KOYf~q)6b9qCbE5RE#rsN<`+|L|^!YNUt zipVi+jnPeJBc!=Gn5%-^A(I>hKl1=<)m$If#z{^H0Z*ZY!}N zppls4`6q)E4R7|t@=xXXPch!C>shttpT<5caph`tyjhbws$xrng-CmLHGiJ<`#3B5 zAvmlB^W*@tEy0Vp3$es&lZ9R;$$Q5O@o$0bG%etrB|DYOzzS-U)BWXkD=3a7Vep%4 zFM;`OVqCzKeThySJZS_I2On+e!~tE+lY(eTo)iv?8W$hT3sIequ?=m{8tyPFK&T=< zkC*sRgM2cMk?jW{qmyzZ2c03>lc$7?l>@Nm!tB8LJe)OAKby7CB9^rX*Wa*HY1((B(T@5puKjs&+$L_-u@PLCa)VgU*$OfNbl z$fQ`Pur|P%9(E{@Afi5`iqV#!Ik*z+)vCB?$;a+dj>JW*Ad6;2l$Bm(gZgsK-FeZIevR|bf~@HRgl)1? zvtAX&;_+y7z3S>MTQ+W8-MLW|i(DZT^T*_^-MkIQm1=wU^~r);hLGruJWeEhHNjg+ zdT-~2?8nL>|04Fo-`U$aR=ZAm&A+(ClJssK?&otw&c(%?#1eZ+im&M`<{=&4oq|25 zCVCef7!tv>&VvSn4_mO8@nBU;%^#8Q?BwAnBMU|fychQ)wyt5kyO33GN7F4sI12u- z@u$^#70(|);B{U-;~)t-+Xzr}u=HVxZk~#OY?zTETSsy#0%)(dcHZiZcJ7=)oaoS)>QQ$vw!Elr@L1R`JEER07J&vi5iN?Up*T<8asR zo+6@JbMVKDoo@Vjf5Xr8<=l19s%5OKMBzd=-l?4|rt;CsVk?DZI@UN)r~J~~Yx$+Q zm3`JRl*4wi>fh61`^qo$Z4TO(wdrY|dU4o?ny_GqJImB2i zr-5C4@*oS`&Re>ClNu)p`% zDhvhOgdV|d{hVIA7{xTf8W&PnE>TceXfx?k5vy{SU%oO|Z{mS~a9f=pZIUN z4&BI*N5q+Pg2+R0HpCd^p*VvP1w9X7I}{#_u4RXt^J}63!<_kvrJRF_|~J`wr)Lj{^G}*9I*? zC(AXRLK$qs1nXb(;XF(?>M~*lw|PZ`kv%7iczPl*?!~Hyr0F8T=t))Svn_$3{Qt@# z;Hmz9ZwUn12&0Te;8)UrW{h{@rrgT_Md|VgUnCdJ%PQkjhiGU2TvK8 zoIvWO?6r}_!CK}XW(9ptg}0_Lfx+;QS=_6k3c*^Q#oA~XXg+xulg)Pak1pdOefmrY zG)9fes5ABrjiYe}6UO?kvEdOyu+4+}cI$!;eL8e211tZ_dKmP;r z%wzg;)Ic6HwdS^A8GEMZbhaZJ1hBr|-|UAZLWE)8z`?tH@Q07tyjHn}k)kImEV+CD z#SQfy$dcP%l4pL6g&Y@F!(1$>1|Y${nWCCA5T=5Ep$NtW4z8dh#U{Y)6nz3Hz6ccq zCorw`W)V-Y7%99mi-=;cpC63)Ixk@5=oZrr<}N)Cj2a|<{fu!Q)KDLEMkDt7k7b+3 zl8~jpuq78y8uIN?WXywAp1+RN!*Bv~yNoy;%rKtLIP}cklI$IYJM#^`XvDi9`TO|i zo%qr7I~F-#weoV{EGtr;6E?8mvE6R9U4k8%BAfF3$D^kkf8H|usH#-)x>F9AAWSwy z&ljjyAPx%@tb|ZnSfT>%`P}vOkFmZYd}cA55z0e4FqKcvv<1BZ=92D8ZoxnrWnj;53n9QXk*o*&yj__AA@dXu@ zNlX33uc$ED4VIqZyUH$xY?oRjO+gdj=m$Zj6I=pAI6!tBb-(@poFSoFV$}q(W4ni! zG+?4{LdhEwj1A;Y6>(mFBQy9;8 ziuE(Sz$bY!!N8XHV_+uXCHW>yejcqq2<(TsC3V-cf26_Z||j0^T{1myK~|8b9}3aXQ5| z!Y(Ce>2%6HgrI=6VoU{rYvZAv@z5D**T+NG$J1_zhi-_6Zj6U+jE8QDhi-~7WnHX2 z>tbQ+V`1xKVH;v$8)9J_V__R(VVh!M@w#k|g>8dgr>n23eC7waSr!KGUmA)o8NeC1`YuiM2Ilo z`RrS9dLqd-YOWOr?;TcHYv;NPH$hd6YF^B*R-zp z#@Si9CrnoEi7+dlje8HyPB2zA3C60k66`xVJHhyrNiaS&E5ZI9vlEnuOoH;z>;%Wp zkYGAUFg+{5fv70(s4ehGvPm#8TLumum|a43!X&6p%qro=Gn8;5DB;BH68g`OzzY(1 zXGpMfc9lFbRq|+7mHN-XB~1Rj(S_!Fv$-_TH@k#J#UyA{W|eUK3?pSa7%9`?ND=*p zThl|Xub#vi<|nGh3#C>Rg+B06@K|_758!e7_>gC<%n#XP%(H!6m@YbpdVIl`FnH8T z@<_jGRHG2L_NYQQrQ`b)YgG|o#^us-copNBu>KZkL%~ zwjPE`KEX{I8gX{)*7}H&Mv|eC4onF;H!wME${3pNDAu?Pk8i0-P{)K@tXDm}>B$da zy{93ZN3~U(sFRSiA0jc(9F5&fO4z!P^tK-d0Gr}-XBup9; z<->?@4~-leF)`3Qzpl(qZNFjqMv)|mZdkn0qyw9DeiQ|!ad>j8D>t}^S=^9HjaEac zk;cFS@*>=?I6HRwZQ(ILRB?vLgv1miLQI;f(;ZcvLsh5f=N2hQa+7knm6aictMZRU}K{Vn?YWKAJka)>nx5yNKrwH&U;YS}vw(E@%g@g6h3 zm2P7e^P>rZT1MgpwT$}3YKa_TwM4{OwR9VjM3(s2bu3`buWlSl;;kY&M%2wihR4XM zQC65(`gHfnimNz^181+a+B2a8M>%xhXe_iL!@5`>bq+^o8}?}Gm>I1*dqP#YPR`3P z8DfPEogjVfIo+Wdt(v8%ngy@EEBcbmF2l@qD(3J~Q=6j&ll?lakvHTV+V9U9GUVY= zD@$97lTQAyA0%Bi>C~HAm1$>pXu_&m$Ga9K(zG+8mTZw-rYfq|;T27%YCRrL)%uKx zz5v8B)D^uX);?qts;Kr&@e~@W)j3syR%G@O7Kr;ILdemnAcJB?kj~K*7^I!L)Iuy8 z7siOIgLgYRg^3Ybr+oDY^od_QjR)M&%1bn@JhPq(71uMBWoHmwnu1_&T$@sIc7}$i zvL81LSZ(1wSkWNADS=(ushmWtu9*W8egz$n;tI+(*+vrtxfH^Is{=BgHZsj>k>P;U zi17g_emaJQWw1k|&1CUH6j-CIHpDfnmeB-3Er+7*=dH4M+ITIIL#&oaJgb(ldBryH zYuOzxhjp$){*XGqmc_6i4KJe!f?7u6`QpL3sCf8IM<=riLiSXO%3nxt6bm2{!Ec;j z7bJ^IrKB`oK^I1%#hC-yiZKTfXEBF-=J++;-|Hvgi2)TWyOP8R^8Uk-G3ht6+%&u^ zH^ch+;vG#8@GcTBXhhUcyUWzbS8ApTh&Zbe<)$*8Ehj298y@kVC^3O8q9C14klCmnNNwN$vGh&W`9#6`gX1{0*g&(-RJq z4PuFv^xXrcl2g+0A}&*wYTgo-mti^;UBt$o9}9M=?CcIFq|KVEn)L|k4%gcL9&y?6 zrvQYGsAVrMQ|4xo{&=p?M=TZ+FYKdIu<+I$HJGJc{;E5JmTU5IPj>_XI^o?R8TmOl2OFNKg!C z8dJyEOvR%D(fr8=uATmbt-M1>IUG_5j!vG+n4C zq|-Pr?KBaWinAv=zxuTv9XHJ!4W~cT%-&hjhjpnhuIvi?&hMRQf}m!Rcslq|+o)eu zupHzNYA}r$AN=AMYZg|{W^fv zK@0Y?4mOfZp%bQwgJ&4|r-G4xDl+m-R%Qk0Hycq{-1PVakKF|0lAY2ZQ&dk>>UbK$ zwG>?B9Q75IxC4I6`HmmKX{wbNlA15?vITw>+`OUHcx?=Bih8^fJ!41*pBie-r98-r zUp+%=*2?d|Pd6GwMyt-TW5MWIuX9LMwk%3je;`WRsu2xVb$Y_xB|QczRh^RVz>CYY zd%X%nmCsXjR7+*6EYref>Av_DFS zv_V7`i_GYnkE_$vKKGoRXDFM3vT1hNJ>5ay2ka;nP1&Vz_er&q$NSoTEwEJ*8QvTc zvO>fy-f{l$j>YqpP~0yv&?Se+WFQe|Oa|;1QA(b(d*-?c92(JeleofK`r@@GI*vsi zJ!e$U7?5BzV(Rz_4uk_HVA_N)z@9S^2yh@neZ8}}TyYJTEAFf+9g1up8qVWln=cZz zh&keOI+`HhbR?dyNbv%GUy=Gv!P&%&nG;d``JG*1%}ha&1Ytp8ys)6CMdmq&&LHHq zK*(zmAvZM(&DVg*H9aaquhfF0BHg!u*P%#)ux4Srux8USdFekgn+4va;k7q8iv`gH zK|zstK|$VRtf1($Z8{a|+V9lJJZwhu;Yf>u1OW@0VbgTR@tkOapk|SHLCucrE~(s6v|m(H#k zrN= zxL-sAN)8bXC=q99K=z9WS~IqPY-)*<9M;>z1*g}XTJZkba6ux#8_$t&zi5Qs{@#4= z>h3(m`6+(NPu@?!2YMWs{gOtELiVVQ$|f|P zWU3g0&v(zLT-DhXosxy+Rb_b|QPI@7pP9-NEPluTJg`JO+r|98<3@Y@z zWEl_Abwl(3K|7%yTVHEU>%5~Uea^0EcL*I*4yZwVfi8U%i>ES=h|yiYQ06s(-SgeP32{MZ=-hDX=diKXMS9S5V8kn6b<{7$>exwh5EBqYoFyRs2B9ov@VTAJkMYF14&Ztz zWGFkO!X}8%XjNwUxHcG;@|qnz!bJ*xhp0T?9rKZVRLwPU-^pwR^2xz4JaC#OJeuYM z0M#dKZ4OUkuh@iOdomVM(e1nusO{(+&3Xi1JL2RB@;79}6;xQ5JtLiND#qjKan6j0 z+AHyh+AA~s!d}rF!d}sc@m>+XP?ko@@p+XQHG<>Sk*e4WaJo2X)w8t`itm~U2k@C+ zPC~p$=Q&thGdK`W=W~El1o3Q!U=Q3j;0a2?qOvAo4blB0W#v%WSSeunOeBmUdOT-yn&wk1^>9cyNr2CE|>@tkmEaPCL8Sdaq4u(q_*3l`xq_r#@e5fSMJ7i}L-o>>2%b6(H@2vsoRIYP zclY+L-q~|RtKi&kFT7J;&UB5Xo2V<%}4JJ;jDaA zS9jtv$;76#Cx4Q)o#*%KZu=yCg~ zn&qQS2M>QsGuRat&+i=@ZC3n?JgkmKr=2cyElu*Db_%+is3BeX1I#Ggn3n7~w4;Cr zy}_3)GPk$|UuCmO!o3jA)Rjvdp(Y27DV(Pj7gq|ScXGHwZn1=G4ftfAOeq0nYOUJ{ zE;+r?8#_{(DnJCedW*~*iHjjYBUbxMtTe#$L+>r0xsq6hD%A@anywk zYV6Kf*vx2zj*@sh9VOzYql9eUDcxx>xH%1_2d3DB!SRfrlBSJzmu( z{n8se;f8w|!k&gmm>Un$0T#WKq8-z4W|?7NpdE9?+9=in7h5L6>#H26&5Ttd}{ zbiO4ZE>ZHGB3w%Q?e=?}BM0TG9*#$gtZoosj1JSJSyyT#u~vq+b@8cIy!k}eZN57w zP4j57-1Hsp>*_vu01prdUv-eVO^A?IoLwE2W~G1^B=~WrRE(xr#qr2-*=6$HqWwR` zs!`_+5f6#N^M(YE6`Z|?_@)k?Y~fs-4*uOGu>T(3Qk<7_*eHuVP0xLPv^ z8c~@Nmys!*>1U+VQ5lb?qf-3B34DCQ*=JVyEHI$Qb!9hR2`4=k!*SJ@@b-@w$E(i1 zJaZin-ADvo;KLh_-mq+lE0D2(LMZp!cy&B1fM-+ofKpaxy@b)pVn2=#=oBhpE;FvC zkE@)I%hh!0;V{B>OyKA^p7gXYI8xM;51u4t#4|kZ8E-lR;qL8L8Bg$Q=!7;tHQOW` z*TIh<-!K=~jE;(@QT-*s@cj)$@e8iMd$KgmcU_3k*Z z8m46D`t@2e2eT>39<073euq0W;rp?6RzG|v6_!ZV&s{fT%MGWj_LjH;p8I*ls;(QV zv3S~t2<8N89F zQ`oyPr5>WhD?>8q@gPM-pF$8<#8^{0FxFUzW;}JFnkpVoHI?|OreXo*4@(DILd;tB zfTdu<0+nLIpi|fe#;U9DP(%-buGBQuDEjf3A0(;Zfg?)E5q4XjIYE{%cvPBUSoA@h z3WuFij+AAj%(z3R)^sJX>~LR9s#bQod@d^=%T7Tj1*G?Plf@O~D2JGS)Y*K-l{}xL zv3P0|YhI=|A~vz+pf)BeKaCjQn-D*>iCN}B8V0i~Uc*RBWfV)~pwdBQBGKZNF?|_H zJgYL5vdV_k7x$NDo*-1z0;%ANk}sR=iq=zT!wv1Wcs@QSWAS|1WWPxH)iab|)!I+T zg2YNe(#kYmpy;V0t5kz3vMX9eq2pDI7v)zm7Ekq?Ml8$B~Z{HpjhGwqT` zs!_+O65F$?6$};Rsx7R~e!#e*x~)<-4;YIpOvlTH3Kplat4;FIK73``;ZWR?5{)6w zAhAvY6*W{U(*f_;73H1Kao)xI!slHqp5MLfr?SrLKf@swwQ6zp;St`Qz(WE-*uP*U zEv}%#(uf)9wCs31EnEClv{*+}BadNAA;I(42-z3i?)F3Rl`=^;W46J2)g*$rjd9- zrqO$UwNXC%jPI)8>{H4cH8&p-sTLlTXsdB%8m``SYp$lYMh&N@x_T3rX}s?H)v9uV zj-|2Ia1Mo2zrKcoU!m6=!Fzp6vRfXKCKt6DkaS15VCj^%@`Z7op?cvIHYHeJ%<`2{ zrtPbG?n%)c_yCoAay7KH9){OM4rcH~U%Y@INQCqOyTV$D?BTZBuBd3?e%i3itTkN* z%xJOBthLDQkJhV!2BLc$CADT(ypTwhw6i6O zDOaaJ6dZ{bnF6(u;e4zS<5Qscsh(g-s8^kQI0dRO)phBEAUq_>3>TMaylyk&wZOW5 z;&#-Vp-$l835CGMkb3Wv_h86wZoMgQuuzqP&{({P9WFt}4wqU=0Y)rz(_SO_oKeF_ zy~5{+m7Zy<`&Gk}Xi~Mq(({OlC(**7cx{@p#^Z;z{pP}hi)qS|K+?{9Tv;}i>P_X6 zTxdXRJ+tDhPdWMMWm@5y+HeS}>z!J08MbTDUPQ;Tq5uu$%GLG?*r1H6Q1vTGsV3G*o8BdkMYl*5`(T#;bm&P-3;`(QpIBsL#_ z#(W?lFuo5)hO-CbyDGb49@dKfZC8Im!MkyIL)TE%JT551-hYw|(YwPFfpuD;Q9Ouj z*t!lDj)#o^8EoEY{2@f))u=gaLFj0p0@i8MNAZnx6Pu-?@opLk5_e59YHN|4m#(YG9Yh_M2T{CB9?}T#l1in0^y}~Y2z&aK8 z6TDjy?s<79c#A>?LMZMk);c?R_3g#!I^IEyV=dmi2Cc88U;|kj9bJTr^hgwah&K{L zD~HQCYTh6u@&K(E0&y=cM`z)fzfOMYCG(9$Tk(^P(g4n(*25RA_(NsnXGNAEww zukQH`^0QD{mu3hyeON~ys`is{?kjEHaYdx*ray&*ypmBNA^yCvPP-)Pwb5G~q&Krm zm;-;vQuCfMt%OnhDx-MjgyEr2hS7q$gkB=hUTk%vz3z`e&n$~Pb{QE`y9}>IiLQz? zo$lr!$bVmxxMrlAbo!&q0Z~hns?Osc4DFDLopp|p@)VTm$J#1r_U z6N{&Iju-a}7dHsNCCJdu(TH(7NBlyg3nUC%kwA7uj4lZYYv?x#Q9`3jdX$qzsxZY` zDKccISR+aPQ_g_dV41%y;iCQk6`-olVaZCN;e{x4_E^5DISTyR}Z9WjS**H zZ}bgi4SgF7{2Tg`F>(2CDC2H!j5-66<&ExpH*|f2u!i0Q6IZ|meV|-Z;x%lW)~(gT zIeLe_k1guqdWa!!bHmFzU2TXP-sO=NxaL)74TMDRI)KIu!=_UMC;740jj)IRg0#lC zGZ5YE1l`aZ3=O%uYHU)!dAbZkkpJMCxPs=%sA^PV163!bhN?D%VWhGMiYrK{W28}! zpA|_*=|K^KB9El%F%tazM^fR!ff5f#ahYtlYDsa0lfQ$b3F`uN)0nMp8Vxr22f7Bj z@~gX#=T#t8-5|&}>@|{D+1=VZ9OTQ0R7YqCGTx6rT^CiUX>|5-Pc%wpcUa}0qi*+o zWH{mbUAX3=PlWmIuw^XN&5`)aeL&;oKHTHYaefhnZ~ikI{U-zA@2>(hMr0KrLD4md z#xVV_YZ8rQW({ewdWDMxrDseYa*~P13bBs>EhZA(thke6MX>|I2l*F5DMHi}Pps_&qHcT0Nj>-#S4X1=l8Xq*jhj356(O3#5xLMM z+|)Rea(PPzP}HNdQ)lC;LhPot6h5W;8bSU$9K;p2ot5T{bUNnIyoBCU(&Rbs@4(Y z8yeyYo5nSnc3D703RUM#YiGdUms4@6tm$5~dcgC_FwrGNcC$NY#*Bm+KABZF1N+h3uND*+hW)ZvbV==G13SUgQUesBgnlV(J{gR zkliTg%8=ZFtlC3zV8CrL(#TmIbz6)yf;_axZ86da5)#m|JxqJxxZAQ5640{8`0;~( z?sC&gJT|rKpu2@h=Ab^~<>D)3S~q!2%snR{`Ozu2Ekc5UZH7g7Kn6T%Gc00qkK1Ng z1akjjx6QB!h+yy37 zuIjn_0+O#6x;F&mD6aUq{Y-MFpJ+DlthoCy6D<4P?mZ@0ujRQ%O|abZa~B3A-!5~v z8&a-kxdQ>ox0c+i0+Me@xht6Dl1Z+-yB($#auLm~nAmbL$XyeVe0RpZK0@y3bFVjP z7H&EU!V-b5B0d?X4uGCle@%Zj<2di z+!hBUpYga$O=cb#w5!*>_DVl9Z(@uaeJu|TpEB!6rA59BOI~k~8C) zXkt(3TtMRy6QpLbr6KVQKIYNZ2zlU`+sdW2nra{lhFq)BN+7%Q zZmZ!BKg8eVwwkJe+2+#QCL4Gs69 z0m-`GsC{Swzj{8>oDFv>Sik`|wQ| z7hmg*yYu8!ZKQl(_c)ox+yb+8V#G6-w?o@dN89e~Tu? zokZvQ-=bN>U!b9RT!s1kvj9Jp5$o6qz`?csdd`{=O z6Z0+nf0U4se4wV!Wl@q_Vff6QevXMxz(&f|A?%`wEaUx86P|upnAg_+C%5pduY4tD zTz)6p5u#rs@*KF<9L6!Tw`RgEOjaxSrjA<~ckx-zHHYd|Jn+)+)^z2M^&WB7^pBRx z<<=G%kqE4Rs)isaqfeFq16ws~8TJ`C6I80rUi zsfurs^9N%6&l$?ctIX%ol+E5%NUdL^^FL2}us?U^&r?OY{9jb`jMdoI*UsutzG;=e z6`aX4ck)oNR-UC$x=^Fs#-X?42ZI++37|VfXz^&gch4X zFLvf%$${Jr{OMf&0(W~42sue`9D)t)%R9-79I zt$ERD)hcuf_bj&N`5Cl4oEqGR4%Cm*vP4veSWEcj;hTIY@3rvGzn*{i9dsfYc~+Zw z`5M>5SUmVPPM!~>^L(nE=g-&6XS(vdX_tr1jnQ3NxRjan_Sk? zhQS~MB9Tm-o0yA%Gvi;PWl7tdmdxC2CY4DnIk#ng+odh%%uCLjJ8wzbocPbo{eQrL|JPhP#`Iq-YpRH_!9~QMS=d%^z-??nb{#l zS+X5dc3|22^k(MGd*Anc-}`;vDF5T0;+~H$zgSW6pRM@&3H-wU?NG{5Y6_*HoSdo} zY6=xy @Lat$?~S5s}u$twqCyK*{|)2W;;%x+Eoz~t zg0CsVFnmLujp6E6Qy5LdSWr_1<+iK&t;+3CZb4l#_`mUDLHPqYXHPQp3kK>OdT(av z-t5r58x4IsM$QhsEi-hln(ECA-J1^GtNd>n&c0;mt{m#?hu)qYdizF0zn%=u71*KX zcPeK;hrq-aaw_;MBgTM$96J z2^K)oKt9$YC6RsU(EF4R+5!3Aq&^Bl?-5$RK{+?8qr~kks(PcU0h$AHl8k9Fod?${Cc({mL1V$^*)|M=B30=U%BilmLUqXod!O z^pJ8MRntD{ZV7syifYmnVQ5om3@|D~_ zAjJH+HX{76svc3bqiX7?GW_H6_$7Jmdu`4UZ&|k0p3~Tuza!RJ0bR2x8-5HhpPbueVsf;GLN4L)?=UL@E zr)Jv(NFobwjtLb1+3uW{7oJwm8L2#zyg8}7(zgnK)j=S60` zpk9Wce>TC2JT>A0C#C6$r0H2{`drdfo+eE{C`}tl(mNb>8#$uxb9mjI(w3<4j zoEK#R0Q#I%EVT+TaYoILD|bScA&%69`HocRYXAto!EjoE@3r zY8bgSbJ^_+T-+Qi7ANMs&~#TC^&kol7fth!X;-V}Ow+GKUfoBZLA_=+*xi8XM+0U( zybncSR@?#89h@CBn|{^v7Y58QvhmoBDudEXJsfP<(VU6i>psSsF{3%xtks=n6_84Y zd@gcOg6>KoL(9q#K-dTQ8L?+I-#>nQ0d(^cp;2oYyq0?an% zA4X=SUaQspev^}y$)cGZ*Z>Id3?=Z$B+s2|!R4+*nf`F)`XQFc%)TANFw}a>u4doD zl^ghWb2_``pz<-JYUS?jy z8xdw<&UmDVQs22iPyL)9{~e%~u8QN%5R?R+xU`#9LSYA$Ihl=+zq{gAnvp$?E)ysm zcgb&prsIX+aJqd=lkyOayb4ySZwR#^-U6+WnEQ*xGeLbeuxngLu#g7?1d(a`j){qr zEc;0NxU|h_Hv)dm%AD<^GxR_0g7%7hfgthuvg`UFz?m6WD5z1jBd~2P95l_-Ga!v- z5Q4KnF{@^+31UIbFV_9)s*Kj+OMwMc2qvEaULA9KRX8{8&@7QX2V(v#62Q8MgP?yv zps%|2lB?fI2(f1SUZV++NLNuE%q~n^jJpaORZq`+zV7+`gGKKr_%jy46jz$gq^em_ zs+yOgJf)S}kXxFJqfXq4X-n!ctw=py>j>gakwK)w#_>~G&!`Je$45qQHhbdOK^M^sys6JunIM*FN%fEo>;afZ(y zP!|n#K`hw)(8mjT6%6wFLpilLsK(DafTYApj=_k*n;f%TBKQJ&)e9p5y@tQ(bMolqw5x8Y_;d@CbwY&Uw0h}abQ9CEJ35=(*gE?wnwbm2unDi$#c z`BzU-rU^kFa`{J|J8Pagc~ZYXWKoew`-&?l&>}v(kv)(Y&9LECycw?&>k)8#(|4q= zm{Lmw(jqVx2egP)i?CQ6(BdE#e#$DMkhSvI*kfbwC#Y6f;|u(q#4r3d3eXA&MN`AM zoVtkrK^%D%-k&_mkx5fqcDdV)$9cq zgcX)Ve7-n9+_}f@dHCUn&qKDE_%q&YxWS>?0$Lq0D}hV(V4DyRGZ{@O0*+GDhlH!4 zN4A0{2&wK(bFv;Rgl5%SfR1NJ5S}X)aJ-h8w!gaeMS&%BXKU0XCBGg?C-bquGXrmS zE~2jNHrzDg&=!6p$xmr!P~=5|CgIc5&z*4-^Tx^+u=NIt{_n}aQ-A0G8&p05=+nd{A6pe19(-6@}4oPYK6H>e5a>LypFT({PU){>!6htTjE0+#-=^gBSR zqY<}`Ct`XFo0Wa^B;u}Ge zdfi^Oq5EOPR!!Ff5P?9lJXcT5m>7x*R6!GrNxRYZO^_`r^$J-5{2}xlnod(J0G%8<#9>y=S=V<1C@okcE_&5gM>@AvbJ>phkjPE>O*9{= zN>C}BXWdNNiW#aNh_}3ywVF^*$PG1Ziq(U zgi4a5%^>)itDzFxQ@F@*(~kqHRNAJ#KIWj z9nIG35c_})Ux-d1tjtT#dQPmvXyBm712mkGc&eJ?CbI}tR zLc0o?dn!R&P)+e8yomC3|=Pnl1#iCkyLS5*DlkteUxJ6y)P#3`Ku;sSU zG{j56=hcORn(vf5=woqFT_~=-o}|wGOL?onhckKg0>@gx*ah@_MtaV4d$C)r*B>jG znHRb_N_X%BwQ`5pk$47M7up@s+%~+uMP2Ms7kbd;Vgcgk2MYgl#PA`5aIP7#C58S0 zB6c{9vqXXG#<~Pyj+pwNgo1Kyc<(LZW=sGS-?||$26gZWG$E|Xdc!Pvex=%sHEBbr z*F%h>Ix}Fxoub~3pE9;X8P+#A*ax3?)pM&3!$bEUikgk8tBpe%h!~ENKyfBY zNL9CrTZkBn!%O0%>p%iT*BYoHmhghSuHT>!1@R)V3P)2oC-Nq2PABuF2nGt0(MngC zi#ECG$Xz~$mKfRoA%+em1FXi;mewG;uQ4DPZxX{4IP!YD7K9yGgS-**T%HYR;RL5l zBxo8Gik*RpI@TJ20thu2@6x2SJm+Dhr`=f(f=P?EdZV9GAI%t&0Wq|o^nAfpj0h}D z8jBcY=%JK8AUFs_NbAuVL^v3_u&aP~*6ahdIQ3PLN{`{@WVk4 z52KOaq(&#hDs%!IEW^a9vp zXhlcZ)i??i11DWEylZEXlm*UC_23%VfPW2}^sp8_^9^8|u1669zs*L1+)2ctvLF(l z8hsU*hYWf_Z^8TVW>y8Mn6@S(p?%LkguqlqtE)JgwB%tjF5nByu*%?@4Yf7v(xQ(U+eGF?>j|>CP1`%soms>{w8kUrx!ljhBCAt#*PM~#% z5>b@6G@dcqNAozLnF_#lFk2vX$qPM(ma%%z$-Eh6PN%)hxE+Pd`eo(%B4CFAAR_Eb zz+nh^rl~4RDjBHFIRxsYFS`ow+*t+iSd11SA@nD7>>+TT0-$9gM@t(HnqxGwX!dK+ zK>SN~m5h;+pI*~gV67u)b{4pxFBh&@h8=Wgl&P8{2uv~;ZAMc;|tt|^jYcSRUTpjayaV1UsL5&@85dIS){xq1_J9;kp) zN^f=?0S`+jiQy-d?PzI*t|(OCVR07(1O$Mzj|G8-@NdN>5D4zudfBo0z%VgE*Udmo zFb_d6KzC}|k-~-40^0+bNo$FlK#FOsLOxC>9kDe=Su3m)HNeHOmtZ(bq#1@hI+HHa z23U9tOb2Xat5n0zs)1&*G$w zU9q}<*rfAL^SA-|g4GUO#FrIzvgu!4x*&&pZ|`jSnfWkk4Q4v&>X z63vHe--Kf#CN~%#SVjj2;D!1nX$Bo}a0AokU^+UMz3=1;<6wTVsAP9Dfm{rvK!os zk$WVR68#Txod=mJAzdqnE~@INboR@g^b8fVIp&rT|;e) zihNF_JwzO=cfL6Q;XyNoVjz*O2`@K-I^!l#v8@dd4!xvzbVwj1TUiqJwRz~)K{sOI zLEug{VpO}Jktif!g2scWz^j7?w;y5N6rs2_;S4gB0XtuMmn-}P+6rFXEMgJ<@t58@ zcIm5W8Rsu~L0t?%_P7q~sq{=Su6H3d+R2lGc2`FjPvF`*i9+*)zqE;XPhhFKM~Qf1 zTD2E-*c~xCbuARkSfgONk;U{iAUSrpU=-*rau{slKUC`=UfHSV*1D-pk*kvWytoIZMe^*jL-o_AQL2vKpuS~QT{zV7sgH)fkO29^MT->pun%9UuI(CRDwN-Nz);s zsjbtITB@N7Q^DRibOV-#^S>TkV?Bj|CsKats8Aa5M=>Rfu?v+{4J0Zc-CF(+JWb|6 z#Rd~rG~~6ZfOmjF%yoJ~R%X3+ehbTGJ&T#HQzo0tLDtg%;as{_oz^g}EoyCRl*KbF zxSrBbRnt z2$&*MS^Opu+zy^L zFqDpRe>BfbSY9F^zE$Cp^VW$!V%VKQ0-WTMl!$-p0Tv@Hj-wDGJeKOMEm57ALepJa z@-&Hodk90MYEn|bNiTc;Ox-%jCtTB!vC|`C6Ve^36T_pH9_|F5iLE2#DF8`mgYp;5 z2{$!r?aL(4&;hWXW7pj92@z>>Ae$;Ow7!a_tsQ($U>MM)i(!>`hq5c0W_5FtlY|v# z$p?oyCLD$iqZe*M!RW|w+qTDOqZ5HUy}07_4xRD<_u+PFy`67p3k=IgrB!bP4v?0hAe$FfcJGVXwub8@Fmvg6yCm2?9V^z}~j2=g^?j)pD4 z(+7|y-xgosTn+DnqdTMmuIiKu4%l=_MIW;%NDh0C9Jwh<9j9)#NP}KwjhA`=npgw` zwhcd77)m~@z&!qkc#%DF?mA&p4$^7mE($Rm^0|b)CM4;d6A=dC#ceIwz?w%Ex>83M z??gTcS(VE+CMi3DO6JiGdzDBo%3w1uLUtYpcWk6H6A}-b&Y{#0ymABmE?aQN$r?k& zvQdZ+y&&Z#x)|0=82SsO1FpRSnHP-xMyks5xF=Y=9Tlo_kVn?G?5_yQD41V~Y z#Y97ynpHtfD?qeS);Sb{Bcf&#X`j)Lav8MGam(c|bJ|=81wI$TAusSJQzl1qiZW|v zc`CI(S${UlOieD+scrg<5E|1n`aRBwz^D!8v+MHt9Lp@(yK73=*3nb?#v4sZGJ<4% zU=j#dgFX{_%uY_|@%+1E(JWAu`euvv*7@^7dyK}d+#QpjroG|wH!y(?DibqIrYmzl zwzzGLaFWT|=s|c4>Ls)|b?qoz4=SY;tRQP7_zq`H14J2nkU}UtM`-z@F&f^6LW`MX zhDn;BmeG(pFcuRoB=5@9v;bu=JBOf11Nv8W{JsO$?qiU;Z78!RcIts zM3lnvO{ON?SV0q++VxvHT7F3HD}#!@%lQzljfBg4V>aCYzFg)e8n$)Aa{13PQzG>w zzmuqk`%!55Ps1URDxg59zhs&CLW}qyhc_ZVF_f8*g*~!Oq(O$R{~|L%E**J~+(>^f z{1^(%E2uFWDJ4a?aFhOhaF39Dgbcx_X}7H$=kww7d&EGJ9HuzOs12skAvL*JQ)gFh zp_4UyeixlTG=~YbANa#xM;9&hi7K)iF9}W|#3VII@|jv@m7sG0U|C{L6WV42hLl@k z)uQauwiPWd-db2@%)pXYTsE0Ov57biFx>ZuV=7k#*B}oIswcP8*wM~>v5uCbK;`pi(1A?+X!bDigKC$8mwAEUM?d;0|)TR zWw9KsIoz{67F03f0gj>d2sh0|(OFeKq&&1h0m`bgcz^}z(;@<`CW_W{rS^{Jx6`|M zo%5v)0SBPpye{OrbKTo2Xd!>dIVbQ7No63njh!Hz_=O*Yleg{S z2X!PTIC0MYFzGSvQy8Cffg*pjj$i!4x>y1ugYN5twbfU%)$B@rY)k*z$d z0-&LMTIM4zvYvntPU;C{nBg4W-9(xJ>#F~1(abyN1n334t`30cfFEKB=ouAr!v_54p_*u=G@cKe^p))F^b!Gw38))%e&zl54Bp^UK-tz&D6 z#WIVRSWvWSbuF4&(7wWZq~DBgzg{Z*A31?NfCVZXYP)-zR^e?qt-@2yNum)EA!bdY zHc4xVF&};eO-?cC7)PHnJEu!_;4vYNn?pD>;UjqtiF`;6iVqPo;Y*((l&zr&W*R0r z#Gwmc18L`R)}N$}>MTMgHR9wn@+jpjeVns6sO6Ew1Zf`WOG+m3A>vk>N7-Uy!>a*4 zNXnX0^45m|P=(~ZhQt|ug#iNjdkKbl%avs#0e=<_5Ym#hiQ9#{n>Z2ru{=$TO!SU) zCWctPNNQM+iG~e(*3_h(EJ^l}<<2zp^hIM_*IIQ;g_MgjEle{zz^WDkwV?TIt5XDXTWQ($qK4;)&oDXqA>KZ|R=H#sq4J%>BuJm4YD$WA0p zSs$M`KJomxJ}JcZ)*UQPu;9wbR+Tl5nrwP;P%hdsD|u9~;wAj0iS3=Xab*r=O-Sy{ zPEy*P96ZMjraU%~w&iwlLn+^lji$VuDC)r7E%+64sX0t7DMUxXMtep~8fZZf4#?*c zh(shqxSP^XsJ6so!#ev?@1ysdhaO{|yE}{Y(c(y)s>XeGb4_kqoFGj%nrV(Uvv8Aa zkRr|$uwV1oF*8}+L<%yy6evy-fj54IajcJSE&sg%Dft~TTbf-th$l%aB{EGDhXmRo1ez5O-U!~x6}(`@&wHXMBK zl7!Z!LJ=dtrbxeyM9Jn+geb*$K_5;DqwCF!fk#p?(722+-arntQfR96IzI7mS$f|_ zlA`#tE-9WOaZqurBaZ7r7mbq{x_Hw9<6Mg_+{*~#Y7*n8M;)n5fo^Hw13;j(jDh{L zAyS@xmxz=uz@bG-!+kD8JE*3)d8gPW_JdN>0v4(c8isoks;RD_8J+q5_BG6VdA+HI zMUP)+0YQ^NR=N6Oy2hR2>rzJ0cab%|6%}nY?#HgqIz!T=Thf+Tl84hpUn?nO)vqQh zuGOGS1wrv=Oc2QV0qxg*0yuwH*%mN~Nh2f-)m1bs0%(1T#j7kni9#rcDvyn>A{{1E zLRo8TTunT@uTHM&v}gk2f?Q|u!eEIOFO8*CzI44U`EtHRHg7?|yiYt=C7z53dW953 zR$gbpN~B~H&Dhiy!Lf~xtdT*4(E247pGG0UHze-3{(X}E7>NhOw;7R^K*%Lj5d457 zt0LbUK{w=-^ejI>ixv_rP7af%CqF`WvFYL@IKCIg@9pw~7Zv?+ zEq!i0^KCDj^@Sm=4*=uiT2XyXkAw?D^Q)txb@72;oLDEEj0pw!c%yuwvxHOLqP=li zSDTHc{`g}OmqW?p;qg%v2EUUt?mQI@NO*Rd0T~%&O~3NRVCi>Mf50S}cHeY!h6jl^ zI$e(=#?l{};6tZ~^L#iyW{ojMhfX8*)WDYm`Pn{w4ms&lB3$|~Iz91y9PgUO~JUZkYIRHkYhLtKl6H%UVLLoAVj3T+k$4Svp2Q+aJ z?ErwoF-$luKB*h%;Zvxj`I*r(BQn?-PDWbbYZLK@2IO)YgryG_$qN%W_--+~+xjdD z$vcqvDTr0e5gsJ8ejSC}u7$JK=XvM1cn2Jz8k;9ttk*E!FH@utA*z#U{CjfU$X&h> z3Ht@3B~k8AWyw}F6j?&Kvw5=VE3(DN_Zj~^&-gSlu8HFx_^ENcaOs=pbrBTf6T_#U zpIFEC?^cfgDwyQESK{~`t)nh^v=bH2RD?9#1uH*EhoqSzd(ix+Cd&NkPBoH!Au(xi z+*;@0qSfZeGX1S|ezX+ilS1@EP8C1oS4frxr^QQ|+5uE9Nap7yoajYv0M5eVlr3^U zb6TQsj$?XKMO4d}rqir2VfPPkDUk)ZOBg|a+$CCVxSM=BBI03za>JvwoSpaIbKVlC zf)OXt2ExhN%go)4v=zh{?H=PGa=`Q3gZz}H+CuDf>@kHlFjmz{bA6nh#s ztb@EuoK83K9dyr6GSKyhiWmx)1ohD3mWH*P1!D&mpI8J@r>M|%AC-T3Lz2_Q=Su$( z897ZYf>Hie6vyJ>54qO=vW#^DuNfD^*SPp;TydH3&t~Wh7tG78t;m;<3TRWt1^(3o zf5GBEJYbP!t(#DY+ok_W0%^q6J}*H!PFI-7JP!h)MSV zYT^by$qz!x_m8Xx`E-nhWbzHOc8bL)i)UCo#o}oe&$5t{oRUV)1i*-+>1o9Kcyd-a zBK}7aTwu0baxPYK#ViOcjm6Y zasR{)w5S@ySLXQzaQ>`xiz7bzN@Sk(M{GoL&@#vR8ha!ESl?#xO%yGzk=i?+CqxQ8 zs@MK8(r7pUx!uvW4|$9H%y4h6&_SoR1E=Kj#x8v>9S-hJq!C@~{e9?#2}c{g#e)rR z)Ef>z^caWp`8LAP(b>JXu%~dtp4^UeJ$apBSEiH@$f`jt{aed z=euzTraO1w!Ton(q_&=1q3sTwsxNjFZp0hig<^NHyN$I2`R;t7h`-zLmeISN@FwL> TK*>DLys=k$)^(;!^%(yTrEMog diff --git a/venv/lib/python2.7/posixpath.py b/venv/lib/python2.7/posixpath.py deleted file mode 120000 index cc89aa2..0000000 --- a/venv/lib/python2.7/posixpath.py +++ /dev/null @@ -1 +0,0 @@ -/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.py \ No newline at end of file diff --git a/venv/lib/python2.7/posixpath.pyc b/venv/lib/python2.7/posixpath.pyc deleted file mode 100644 index e715e3d883e1c5839f21969d155d4334319b35f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12915 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 B>Qev! diff --git a/venv/lib/python2.7/re.py b/venv/lib/python2.7/re.py deleted file mode 120000 index b1a8e65..0000000 --- a/venv/lib/python2.7/re.py +++ /dev/null @@ -1 +0,0 @@ -/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/re.py \ No newline at end of file diff --git a/venv/lib/python2.7/re.pyc b/venv/lib/python2.7/re.pyc deleted file mode 100644 index 47b6a651cf59a6b12092a1a8ec1c2dd6126b5d56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14778 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 G{r?BitS8+7 diff --git a/venv/lib/python2.7/site-packages/easy_install.py b/venv/lib/python2.7/site-packages/easy_install.py deleted file mode 100644 index d87e984..0000000 --- a/venv/lib/python2.7/site-packages/easy_install.py +++ /dev/null @@ -1,5 +0,0 @@ -"""Run the EasyInstall command""" - -if __name__ == '__main__': - from setuptools.command.easy_install import main - main() diff --git a/venv/lib/python2.7/site-packages/easy_install.pyc b/venv/lib/python2.7/site-packages/easy_install.pyc deleted file mode 100644 index 18189ed0ab97115eb0f5cfea59fe9b8fdbbef887..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 369 zcmYjLO-sW-5S>kG6;bi-!5o9wY>HA8M7((Lph)#pkY&woYiRbv-A!$J6MwQlKqoa| zAI#gGuQxCL-rqg>Ja{RfLxk@QhR=}%zyv@N5CrBCxKj`jh#0B}R1A|Ch>YP2fM}fU z!Be``ZXO|xYn_BQncQ;U+-VF7iI-UUcWT@UrWhOKr=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.* - -pip - The Python Package Installer -================================== - -.. image:: https://img.shields.io/pypi/v/pip.svg - :target: https://pypi.org/project/pip/ - -.. image:: https://readthedocs.org/projects/pip/badge/?version=latest - :target: https://pip.pypa.io/en/latest - -pip is the `package installer`_ for Python. You can use pip to install packages from the `Python Package Index`_ and other indexes. - -Please take a look at our documentation for how to install and use pip: - -* `Installation`_ -* `Usage`_ -* `Release notes`_ - -If you find bugs, need help, or want to talk to the developers please use our mailing lists or chat rooms: - -* `Issue tracking`_ -* `Discourse channel`_ -* `User IRC`_ - -If you want to get involved head over to GitHub to get the source code and feel free to jump on the developer mailing lists and chat rooms: - -* `GitHub page`_ -* `Dev mailing list`_ -* `Dev IRC`_ - -Code of Conduct ---------------- - -Everyone interacting in the pip project's codebases, issue trackers, chat -rooms, and mailing lists is expected to follow the `PyPA Code of Conduct`_. - -.. _package installer: https://packaging.python.org/en/latest/current/ -.. _Python Package Index: https://pypi.org -.. _Installation: https://pip.pypa.io/en/stable/installing.html -.. _Usage: https://pip.pypa.io/en/stable/ -.. _Release notes: https://pip.pypa.io/en/stable/news.html -.. _GitHub page: https://github.com/pypa/pip -.. _Issue tracking: https://github.com/pypa/pip/issues -.. _Discourse channel: https://discuss.python.org/c/packaging -.. _Dev mailing list: https://groups.google.com/forum/#!forum/pypa-dev -.. _User IRC: https://webchat.freenode.net/?channels=%23pypa -.. _Dev IRC: https://webchat.freenode.net/?channels=%23pypa-dev -.. _PyPA Code of Conduct: https://www.pypa.io/en/latest/code-of-conduct/ - - diff --git a/venv/lib/python2.7/site-packages/pip-19.1.1.dist-info/RECORD b/venv/lib/python2.7/site-packages/pip-19.1.1.dist-info/RECORD deleted file mode 100644 index 13f9d96..0000000 --- a/venv/lib/python2.7/site-packages/pip-19.1.1.dist-info/RECORD +++ /dev/null @@ -1,618 +0,0 @@ -../../../bin/pip,sha256=BWX-_qNClSU8YbNP85Get7EaWqQA8m5XV46NUNP7m1M,281 -../../../bin/pip2,sha256=BWX-_qNClSU8YbNP85Get7EaWqQA8m5XV46NUNP7m1M,281 -../../../bin/pip2.7,sha256=BWX-_qNClSU8YbNP85Get7EaWqQA8m5XV46NUNP7m1M,281 -pip-19.1.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -pip-19.1.1.dist-info/LICENSE.txt,sha256=W6Ifuwlk-TatfRU2LR7W1JMcyMj5_y1NkRkOEJvnRDE,1090 -pip-19.1.1.dist-info/METADATA,sha256=bLFqR8At4rsCvM1hJTM98bOrT26dNZLeTLo_0PYIZCs,2892 -pip-19.1.1.dist-info/RECORD,, -pip-19.1.1.dist-info/WHEEL,sha256=HX-v9-noUkyUoxyZ1PMSuS7auUxDAR4VBdoYLqD0xws,110 -pip-19.1.1.dist-info/entry_points.txt,sha256=S_zfxY25QtQDVY1BiLAmOKSkkI5llzCKPLiYOSEupsY,98 -pip-19.1.1.dist-info/top_level.txt,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -pip/__init__.py,sha256=A9ZYTNji94NmcmoIbn-XLsEni4ac8BoiAt7guiAW27g,23 -pip/__init__.pyc,, -pip/__main__.py,sha256=L3IHqBeasELUHvwy5CT_izVEMhM12tve289qut49DvU,623 -pip/__main__.pyc,, -pip/_internal/__init__.py,sha256=Di4rpoQhA2Kx0Dm0THczf61CDOXcPokR2FIpyKkRm1Y,2870 -pip/_internal/__init__.pyc,, -pip/_internal/build_env.py,sha256=ZUpR-00pxQc-Mw750jyBVA-oWb4WHtpK63pfiTHd8qU,7392 -pip/_internal/build_env.pyc,, -pip/_internal/cache.py,sha256=PQesJm1JrjgAya3VyV6qkbnfACG23c1wQ7PaSw_0F-Y,7656 -pip/_internal/cache.pyc,, -pip/_internal/cli/__init__.py,sha256=FkHBgpxxb-_gd6r1FjnNhfMOzAUYyXoXKJ6abijfcFU,132 -pip/_internal/cli/__init__.pyc,, -pip/_internal/cli/autocompletion.py,sha256=ptvsMdGjq42pzoY4skABVF43u2xAtLJlXAulPi-A10Y,6083 -pip/_internal/cli/autocompletion.pyc,, -pip/_internal/cli/base_command.py,sha256=2SbVZ2o3KmVdeJlK4l1lP6y_ZMFZ8VkDp9ns1ByZ-xM,12629 -pip/_internal/cli/base_command.pyc,, -pip/_internal/cli/cmdoptions.py,sha256=IA1XAgTJ1oWXp1oF3CkE8mpUx8vqIysyd7hlEZk7wWE,23813 -pip/_internal/cli/cmdoptions.pyc,, -pip/_internal/cli/main_parser.py,sha256=YH_w_hApq2pyS_G5tZlbIe7g_HUIcKE820jhnv0piVA,3002 -pip/_internal/cli/main_parser.pyc,, -pip/_internal/cli/parser.py,sha256=VZKUKJPbU6I2cHPLDOikin-aCx7OvLcZ3fzYp3xytd8,9378 -pip/_internal/cli/parser.pyc,, -pip/_internal/cli/status_codes.py,sha256=F6uDG6Gj7RNKQJUDnd87QKqI16Us-t-B0wPF_4QMpWc,156 -pip/_internal/cli/status_codes.pyc,, -pip/_internal/commands/__init__.py,sha256=7fscm9bUGJInZwWY7VjH2pPC7HUWQWyjYMEIB33L9CY,2223 -pip/_internal/commands/__init__.pyc,, -pip/_internal/commands/check.py,sha256=liigNVif0iz2mBfhvsajrLZT5zM5KIvgmKvhAW91EzA,1430 -pip/_internal/commands/check.pyc,, -pip/_internal/commands/completion.py,sha256=hqvCvoxsIHjysiD7olHKTqK2lzE1_lS6LWn69kN5qyI,2929 -pip/_internal/commands/completion.pyc,, -pip/_internal/commands/configuration.py,sha256=Il76e-ERfEHtW2GbV1aTR6o-xurh-LVv2NCea7erP4s,8020 -pip/_internal/commands/configuration.pyc,, -pip/_internal/commands/download.py,sha256=XPe3Kuj9iZfXwOiJq70mYVYNZD5lJCLnGT_C61cOsKw,6623 -pip/_internal/commands/download.pyc,, -pip/_internal/commands/freeze.py,sha256=VvS3G0wrm_9BH3B7Ex5msLL_1UQTtCq5G8dDI63Iemo,3259 -pip/_internal/commands/freeze.pyc,, -pip/_internal/commands/hash.py,sha256=K1JycsD-rpjqrRcL_ijacY9UKmI82pQcLYq4kCM4Pv0,1681 -pip/_internal/commands/hash.pyc,, -pip/_internal/commands/help.py,sha256=MwBhPJpW1Dt3GfJV3V8V6kgAy_pXT0jGrZJB1wCTW-E,1090 -pip/_internal/commands/help.pyc,, -pip/_internal/commands/install.py,sha256=vSb8TfUHwz3HJ5cA-JnPP3X84ONQ0wkCztw0pHFbmsc,22841 -pip/_internal/commands/install.pyc,, -pip/_internal/commands/list.py,sha256=EtKEUotPbLCzzcWrZqEiEXi4ic00dgUOKUeNU0y7Pfg,10166 -pip/_internal/commands/list.pyc,, -pip/_internal/commands/search.py,sha256=sLZ9icKMEEGekHvzRRZMiTd1zCFIZeDptyyU1mQCYzk,4728 -pip/_internal/commands/search.pyc,, -pip/_internal/commands/show.py,sha256=bE-ucu8fAjTTENpRRKhwD3QSWR8Rss7YgKAbMJoxock,6273 -pip/_internal/commands/show.pyc,, -pip/_internal/commands/uninstall.py,sha256=h0gfPF5jylDESx_IHgF6bZME7QAEOHzQHdn65GP-jrE,2963 -pip/_internal/commands/uninstall.pyc,, -pip/_internal/commands/wheel.py,sha256=7MNPZqK9WWxZC3TgzvMBH-RPRlOFLpwq927lkzUiUjI,7167 -pip/_internal/commands/wheel.pyc,, -pip/_internal/configuration.py,sha256=xit1f8ZdnHz-AHzWAKTUa_gZzlIIM-5AgK30glB71ik,13115 -pip/_internal/configuration.pyc,, -pip/_internal/download.py,sha256=0_8jUtL4SLZe4qo8Fe66qkbO69gUG-IPbp932WOHyFs,35147 -pip/_internal/download.pyc,, -pip/_internal/exceptions.py,sha256=ryXWmEJpSHr3yXXk1efWHSzQwAjBdBJiKR5kCQvjgPA,9117 -pip/_internal/exceptions.pyc,, -pip/_internal/index.py,sha256=BO6jpJRvb_6HaS4meE8Lj_lyAX7IRP6pRof-zG-_hYw,42268 -pip/_internal/index.pyc,, -pip/_internal/locations.py,sha256=-N3f1I24gcPTdW52onPnySDoQUIn_TtPYV99WwsjxRE,6932 -pip/_internal/locations.pyc,, -pip/_internal/models/__init__.py,sha256=3DHUd_qxpPozfzouoqa9g9ts1Czr5qaHfFxbnxriepM,63 -pip/_internal/models/__init__.pyc,, -pip/_internal/models/candidate.py,sha256=_IzS-yw0h2UHfZALsZ2mxkeGNSNuNGspjSn2JfZ-ZHM,1045 -pip/_internal/models/candidate.pyc,, -pip/_internal/models/format_control.py,sha256=ap8Swa26ocSXBxIuCvaDBRZjxdKUFuwC-bfqXQHWtKw,2250 -pip/_internal/models/format_control.pyc,, -pip/_internal/models/index.py,sha256=K59A8-hVhBM20Xkahr4dTwP7OjkJyEqXH11UwHFVgqM,1060 -pip/_internal/models/index.pyc,, -pip/_internal/models/link.py,sha256=Hqu72UgH266njr2z2kTnIG-sQiPtjENDbPqXFzT-84s,4783 -pip/_internal/models/link.pyc,, -pip/_internal/operations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_internal/operations/__init__.pyc,, -pip/_internal/operations/check.py,sha256=CZHaksHKUMo58wGHGhhKlPrpcRMHObouzzyd9pMRFt8,5109 -pip/_internal/operations/check.pyc,, -pip/_internal/operations/freeze.py,sha256=_Ffl2HpoWLLHaiB1XyTjKIA3QWC8H-E1ib6xJgX_mRE,9279 -pip/_internal/operations/freeze.pyc,, -pip/_internal/operations/prepare.py,sha256=jQ6FaxA2u_MYnDQxcu6YCfmJ9sfhqrKN9vdd4-5N6lU,16931 -pip/_internal/operations/prepare.pyc,, -pip/_internal/pep425tags.py,sha256=jyBorYxepVJeHNo69TE-3UxJXsGO2XvGxveSWQDi_Wo,13128 -pip/_internal/pep425tags.pyc,, -pip/_internal/pyproject.py,sha256=OlCw7pSqST68hUF_eV-YVaqJ4I7z_ROJwvgra-2C_5I,6464 -pip/_internal/pyproject.pyc,, -pip/_internal/req/__init__.py,sha256=Y2SjAuMFsSt3dkiK8kkiQAfv8sHrjl0PAT63FKFT0tM,2364 -pip/_internal/req/__init__.pyc,, -pip/_internal/req/constructors.py,sha256=4KlO_-G89XYZW1VnzHwV34oCvR6ilmxFqSSGLgv4PEw,11399 -pip/_internal/req/constructors.pyc,, -pip/_internal/req/req_file.py,sha256=mZoQvhHZJwgljrXDH8CLXaNoUK4sM8_bRfK9Po2fM80,13714 -pip/_internal/req/req_file.pyc,, -pip/_internal/req/req_install.py,sha256=SGJLNpyZwzOL_EqfviIvAoZgxAoivxmFBN1cOU7DX9s,40061 -pip/_internal/req/req_install.pyc,, -pip/_internal/req/req_set.py,sha256=PaDc5EswLQhxBMFbuKbJ0frZbMNKocmA8OGqIWT-9EY,7860 -pip/_internal/req/req_set.pyc,, -pip/_internal/req/req_tracker.py,sha256=wBpDzSDSYwpUfW4K43NrEOCCp1r6stuubfLc65Y95EM,3129 -pip/_internal/req/req_tracker.pyc,, -pip/_internal/req/req_uninstall.py,sha256=rVOk8BRM_L9rsUUr9lmkV6Lm9N1Os7TEIDir6tT1Q7U,23105 -pip/_internal/req/req_uninstall.pyc,, -pip/_internal/resolve.py,sha256=rZDMkyhUIbaytY9KsYQVez8nl21xLXgaDt8xuHvyGMI,15128 -pip/_internal/resolve.pyc,, -pip/_internal/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_internal/utils/__init__.pyc,, -pip/_internal/utils/appdirs.py,sha256=r9i0BZLK9KcvrzI5tqlw8ehRTtSehWGERFLy7YppG3g,9398 -pip/_internal/utils/appdirs.pyc,, -pip/_internal/utils/compat.py,sha256=Q0cmYGBaKB4tV5E0CG11339YLxuCaqdUCSJd9vinMc8,8551 -pip/_internal/utils/compat.pyc,, -pip/_internal/utils/deprecation.py,sha256=HYUvfCZUxwLIFlYHeZM3VmuFhXTdlw0rk4-cC14bKw4,3080 -pip/_internal/utils/deprecation.pyc,, -pip/_internal/utils/encoding.py,sha256=tudXCoAPe9fZvNK4cmWQs2frREZ-QuGCwF_SlTyz6cI,1218 -pip/_internal/utils/encoding.pyc,, -pip/_internal/utils/filesystem.py,sha256=ojaIDvOFOtkpKme5se6X2N8ARmQxu8cxvaaI-NFqVtk,990 -pip/_internal/utils/filesystem.pyc,, -pip/_internal/utils/glibc.py,sha256=9_1wY9Lmca4xzOQDF1A6ITW_N80j_BXwN7Sx7vBqP4k,3282 -pip/_internal/utils/glibc.pyc,, -pip/_internal/utils/hashes.py,sha256=_6l8M_nqmLZjs-o2lP2rB7ZleAT05WOuqgwBa8uFYR8,3527 -pip/_internal/utils/hashes.pyc,, -pip/_internal/utils/logging.py,sha256=qSYK7Wf_oiCr1VR4qvAq_TtpY3SIKSlVDgnAeQqSjHc,11671 -pip/_internal/utils/logging.pyc,, -pip/_internal/utils/misc.py,sha256=QsYl2j5rU5Mh_CEsSf1W8GB6HvPOfioj30Emqz7mg7s,32434 -pip/_internal/utils/misc.pyc,, -pip/_internal/utils/models.py,sha256=DQYZSRhjvSdDTAaJLLCpDtxAn1S_-v_8nlNjv4T2jwY,1042 -pip/_internal/utils/models.pyc,, -pip/_internal/utils/outdated.py,sha256=sEe1l902jiOl3tArf6omqVd44s4BT9DOk3a3CXtJNNI,5868 -pip/_internal/utils/outdated.pyc,, -pip/_internal/utils/packaging.py,sha256=frr5M-ORe30rRKbH6pwqp_jkX1T8rx-UGDlj8vG5HII,2743 -pip/_internal/utils/packaging.pyc,, -pip/_internal/utils/setuptools_build.py,sha256=0blfscmNJW_iZ5DcswJeDB_PbtTEjfK9RL1R1WEDW2E,278 -pip/_internal/utils/setuptools_build.pyc,, -pip/_internal/utils/temp_dir.py,sha256=0Xq5ZlOd2OOeHwKM6hGy66gnMGAbyhio7DtjLHd7DFg,5339 -pip/_internal/utils/temp_dir.pyc,, -pip/_internal/utils/typing.py,sha256=bF73ImJzIaxLLEVwfEaSJzFGqV9LaxkQBvDULIyr1jI,1125 -pip/_internal/utils/typing.pyc,, -pip/_internal/utils/ui.py,sha256=yRqmi2V4OeTYP9SnXhuXKlyRx8xJ79AjLRgvLCZ4E1E,13812 -pip/_internal/utils/ui.pyc,, -pip/_internal/vcs/__init__.py,sha256=kgwOhkt6ddbKosZytktLydMUb_e-JpXMstJF9YpSOwM,19205 -pip/_internal/vcs/__init__.pyc,, -pip/_internal/vcs/bazaar.py,sha256=3lA6CKyrYpoJuxjTa8oTozszNcqdYILqEhKLJ41RMug,3231 -pip/_internal/vcs/bazaar.pyc,, -pip/_internal/vcs/git.py,sha256=x0PQDgzWho544gfqtE9CXoUkN34zE4YkpgrbTcWEte4,12960 -pip/_internal/vcs/git.pyc,, -pip/_internal/vcs/mercurial.py,sha256=AbH4IWdLCsjUxFnIHRvijV-7SNhfjDZJJFzQ1e_b48Q,3355 -pip/_internal/vcs/mercurial.pyc,, -pip/_internal/vcs/subversion.py,sha256=cMH4MEobSj68gaSiBD53KXVJnEbhtuUJjL8U1Kk_v70,8167 -pip/_internal/vcs/subversion.pyc,, -pip/_internal/wheel.py,sha256=-MijhN1BIuaQkb3909smA63wkbvdRrdtr1CUDxnQTqA,41189 -pip/_internal/wheel.pyc,, -pip/_vendor/__init__.py,sha256=iip2nWwH_riYqnDnM0q4BJFrWE-XWjYfxCejJKct0WM,4654 -pip/_vendor/__init__.pyc,, -pip/_vendor/appdirs.py,sha256=BENKsvcA08IpccD9345-rMrg3aXWFA1q6BFEglnHg6I,24547 -pip/_vendor/appdirs.pyc,, -pip/_vendor/cachecontrol/__init__.py,sha256=6cRPchVqkAkeUtYTSW8qCetjSqJo-GxP-n4VMVDbvmc,302 -pip/_vendor/cachecontrol/__init__.pyc,, -pip/_vendor/cachecontrol/_cmd.py,sha256=URGE0KrA87QekCG3SGPatlSPT571dZTDjNa-ZXX3pDc,1295 -pip/_vendor/cachecontrol/_cmd.pyc,, -pip/_vendor/cachecontrol/adapter.py,sha256=eBGAtVNRZgtl_Kj5JV54miqL9YND-D0JZPahwY8kFtY,4863 -pip/_vendor/cachecontrol/adapter.pyc,, -pip/_vendor/cachecontrol/cache.py,sha256=1fc4wJP8HYt1ycnJXeEw5pCpeBL2Cqxx6g9Fb0AYDWQ,805 -pip/_vendor/cachecontrol/cache.pyc,, -pip/_vendor/cachecontrol/caches/__init__.py,sha256=-gHNKYvaeD0kOk5M74eOrsSgIKUtC6i6GfbmugGweEo,86 -pip/_vendor/cachecontrol/caches/__init__.pyc,, -pip/_vendor/cachecontrol/caches/file_cache.py,sha256=8vrSzzGcdfEfICago1uSFbkumNJMGLbCdEkXsmUIExw,4177 -pip/_vendor/cachecontrol/caches/file_cache.pyc,, -pip/_vendor/cachecontrol/caches/redis_cache.py,sha256=HxelMpNCo-dYr2fiJDwM3hhhRmxUYtB5tXm1GpAAT4Y,856 -pip/_vendor/cachecontrol/caches/redis_cache.pyc,, -pip/_vendor/cachecontrol/compat.py,sha256=kHNvMRdt6s_Xwqq_9qJmr9ou3wYMOMUMxPPcwNxT8Mc,695 -pip/_vendor/cachecontrol/compat.pyc,, -pip/_vendor/cachecontrol/controller.py,sha256=U7g-YwizQ2O5NRgK_MZreF1ntM4E49C3PuF3od-Vwz4,13698 -pip/_vendor/cachecontrol/controller.pyc,, -pip/_vendor/cachecontrol/filewrapper.py,sha256=vACKO8Llzu_ZWyjV1Fxn1MA4TGU60N5N3GSrAFdAY2Q,2533 -pip/_vendor/cachecontrol/filewrapper.pyc,, -pip/_vendor/cachecontrol/heuristics.py,sha256=BFGHJ3yQcxvZizfo90LLZ04T_Z5XSCXvFotrp7Us0sc,4070 -pip/_vendor/cachecontrol/heuristics.pyc,, -pip/_vendor/cachecontrol/serialize.py,sha256=GebE34fgToyWwAsRPguh8hEPN6CqoG-5hRMXRsjVABQ,6954 -pip/_vendor/cachecontrol/serialize.pyc,, -pip/_vendor/cachecontrol/wrapper.py,sha256=sfr9YHWx-5TwNz1H5rT6QOo8ggII6v3vbEDjQFwR6wc,671 -pip/_vendor/cachecontrol/wrapper.pyc,, -pip/_vendor/certifi/__init__.py,sha256=-M1moep9D6jZnOAT0qnM1dpoEHMPage7Osv5xLRLyFg,52 -pip/_vendor/certifi/__init__.pyc,, -pip/_vendor/certifi/__main__.py,sha256=NaCn6WtWME-zzVWQ2j4zFyl8cY4knDa9CwtHNIeFPhM,53 -pip/_vendor/certifi/__main__.pyc,, -pip/_vendor/certifi/cacert.pem,sha256=OXuDPlrPiaJwm5ZEAamspo0ktiNJtyu-OGhOWGqgeic,284518 -pip/_vendor/certifi/core.py,sha256=EuFc2BsToG5O1-qsx4BSjQ1r1-7WRtH87b1WflZOWhI,218 -pip/_vendor/certifi/core.pyc,, -pip/_vendor/chardet/__init__.py,sha256=YsP5wQlsHJ2auF1RZJfypiSrCA7_bQiRm3ES_NI76-Y,1559 -pip/_vendor/chardet/__init__.pyc,, -pip/_vendor/chardet/big5freq.py,sha256=D_zK5GyzoVsRes0HkLJziltFQX0bKCLOrFe9_xDvO_8,31254 -pip/_vendor/chardet/big5freq.pyc,, -pip/_vendor/chardet/big5prober.py,sha256=kBxHbdetBpPe7xrlb-e990iot64g_eGSLd32lB7_h3M,1757 -pip/_vendor/chardet/big5prober.pyc,, -pip/_vendor/chardet/chardistribution.py,sha256=3woWS62KrGooKyqz4zQSnjFbJpa6V7g02daAibTwcl8,9411 -pip/_vendor/chardet/chardistribution.pyc,, -pip/_vendor/chardet/charsetgroupprober.py,sha256=6bDu8YIiRuScX4ca9Igb0U69TA2PGXXDej6Cc4_9kO4,3787 -pip/_vendor/chardet/charsetgroupprober.pyc,, -pip/_vendor/chardet/charsetprober.py,sha256=KSmwJErjypyj0bRZmC5F5eM7c8YQgLYIjZXintZNstg,5110 -pip/_vendor/chardet/charsetprober.pyc,, -pip/_vendor/chardet/cli/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1 -pip/_vendor/chardet/cli/__init__.pyc,, -pip/_vendor/chardet/cli/chardetect.py,sha256=DI8dlV3FBD0c0XA_y3sQ78z754DUv1J8n34RtDjOXNw,2774 -pip/_vendor/chardet/cli/chardetect.pyc,, -pip/_vendor/chardet/codingstatemachine.py,sha256=VYp_6cyyki5sHgXDSZnXW4q1oelHc3cu9AyQTX7uug8,3590 -pip/_vendor/chardet/codingstatemachine.pyc,, -pip/_vendor/chardet/compat.py,sha256=PKTzHkSbtbHDqS9PyujMbX74q1a8mMpeQTDVsQhZMRw,1134 -pip/_vendor/chardet/compat.pyc,, -pip/_vendor/chardet/cp949prober.py,sha256=TZ434QX8zzBsnUvL_8wm4AQVTZ2ZkqEEQL_lNw9f9ow,1855 -pip/_vendor/chardet/cp949prober.pyc,, -pip/_vendor/chardet/enums.py,sha256=Aimwdb9as1dJKZaFNUH2OhWIVBVd6ZkJJ_WK5sNY8cU,1661 -pip/_vendor/chardet/enums.pyc,, -pip/_vendor/chardet/escprober.py,sha256=kkyqVg1Yw3DIOAMJ2bdlyQgUFQhuHAW8dUGskToNWSc,3950 -pip/_vendor/chardet/escprober.pyc,, -pip/_vendor/chardet/escsm.py,sha256=RuXlgNvTIDarndvllNCk5WZBIpdCxQ0kcd9EAuxUh84,10510 -pip/_vendor/chardet/escsm.pyc,, -pip/_vendor/chardet/eucjpprober.py,sha256=iD8Jdp0ISRjgjiVN7f0e8xGeQJ5GM2oeZ1dA8nbSeUw,3749 -pip/_vendor/chardet/eucjpprober.pyc,, -pip/_vendor/chardet/euckrfreq.py,sha256=-7GdmvgWez4-eO4SuXpa7tBiDi5vRXQ8WvdFAzVaSfo,13546 -pip/_vendor/chardet/euckrfreq.pyc,, -pip/_vendor/chardet/euckrprober.py,sha256=MqFMTQXxW4HbzIpZ9lKDHB3GN8SP4yiHenTmf8g_PxY,1748 -pip/_vendor/chardet/euckrprober.pyc,, -pip/_vendor/chardet/euctwfreq.py,sha256=No1WyduFOgB5VITUA7PLyC5oJRNzRyMbBxaKI1l16MA,31621 -pip/_vendor/chardet/euctwfreq.pyc,, -pip/_vendor/chardet/euctwprober.py,sha256=13p6EP4yRaxqnP4iHtxHOJ6R2zxHq1_m8hTRjzVZ95c,1747 -pip/_vendor/chardet/euctwprober.pyc,, -pip/_vendor/chardet/gb2312freq.py,sha256=JX8lsweKLmnCwmk8UHEQsLgkr_rP_kEbvivC4qPOrlc,20715 -pip/_vendor/chardet/gb2312freq.pyc,, -pip/_vendor/chardet/gb2312prober.py,sha256=gGvIWi9WhDjE-xQXHvNIyrnLvEbMAYgyUSZ65HUfylw,1754 -pip/_vendor/chardet/gb2312prober.pyc,, -pip/_vendor/chardet/hebrewprober.py,sha256=c3SZ-K7hvyzGY6JRAZxJgwJ_sUS9k0WYkvMY00YBYFo,13838 -pip/_vendor/chardet/hebrewprober.pyc,, -pip/_vendor/chardet/jisfreq.py,sha256=vpmJv2Bu0J8gnMVRPHMFefTRvo_ha1mryLig8CBwgOg,25777 -pip/_vendor/chardet/jisfreq.pyc,, -pip/_vendor/chardet/jpcntx.py,sha256=PYlNqRUQT8LM3cT5FmHGP0iiscFlTWED92MALvBungo,19643 -pip/_vendor/chardet/jpcntx.pyc,, -pip/_vendor/chardet/langbulgarianmodel.py,sha256=1HqQS9Pbtnj1xQgxitJMvw8X6kKr5OockNCZWfEQrPE,12839 -pip/_vendor/chardet/langbulgarianmodel.pyc,, -pip/_vendor/chardet/langcyrillicmodel.py,sha256=LODajvsetH87yYDDQKA2CULXUH87tI223dhfjh9Zx9c,17948 -pip/_vendor/chardet/langcyrillicmodel.pyc,, -pip/_vendor/chardet/langgreekmodel.py,sha256=8YAW7bU8YwSJap0kIJSbPMw1BEqzGjWzqcqf0WgUKAA,12688 -pip/_vendor/chardet/langgreekmodel.pyc,, -pip/_vendor/chardet/langhebrewmodel.py,sha256=JSnqmE5E62tDLTPTvLpQsg5gOMO4PbdWRvV7Avkc0HA,11345 -pip/_vendor/chardet/langhebrewmodel.pyc,, -pip/_vendor/chardet/langhungarianmodel.py,sha256=RhapYSG5l0ZaO-VV4Fan5sW0WRGQqhwBM61yx3yxyOA,12592 -pip/_vendor/chardet/langhungarianmodel.pyc,, -pip/_vendor/chardet/langthaimodel.py,sha256=8l0173Gu_W6G8mxmQOTEF4ls2YdE7FxWf3QkSxEGXJQ,11290 -pip/_vendor/chardet/langthaimodel.pyc,, -pip/_vendor/chardet/langturkishmodel.py,sha256=W22eRNJsqI6uWAfwXSKVWWnCerYqrI8dZQTm_M0lRFk,11102 -pip/_vendor/chardet/langturkishmodel.pyc,, -pip/_vendor/chardet/latin1prober.py,sha256=S2IoORhFk39FEFOlSFWtgVybRiP6h7BlLldHVclNkU8,5370 -pip/_vendor/chardet/latin1prober.pyc,, -pip/_vendor/chardet/mbcharsetprober.py,sha256=AR95eFH9vuqSfvLQZN-L5ijea25NOBCoXqw8s5O9xLQ,3413 -pip/_vendor/chardet/mbcharsetprober.pyc,, -pip/_vendor/chardet/mbcsgroupprober.py,sha256=h6TRnnYq2OxG1WdD5JOyxcdVpn7dG0q-vB8nWr5mbh4,2012 -pip/_vendor/chardet/mbcsgroupprober.pyc,, -pip/_vendor/chardet/mbcssm.py,sha256=SY32wVIF3HzcjY3BaEspy9metbNSKxIIB0RKPn7tjpI,25481 -pip/_vendor/chardet/mbcssm.pyc,, -pip/_vendor/chardet/sbcharsetprober.py,sha256=LDSpCldDCFlYwUkGkwD2oFxLlPWIWXT09akH_2PiY74,5657 -pip/_vendor/chardet/sbcharsetprober.pyc,, -pip/_vendor/chardet/sbcsgroupprober.py,sha256=1IprcCB_k1qfmnxGC6MBbxELlKqD3scW6S8YIwdeyXA,3546 -pip/_vendor/chardet/sbcsgroupprober.pyc,, -pip/_vendor/chardet/sjisprober.py,sha256=IIt-lZj0WJqK4rmUZzKZP4GJlE8KUEtFYVuY96ek5MQ,3774 -pip/_vendor/chardet/sjisprober.pyc,, -pip/_vendor/chardet/universaldetector.py,sha256=qL0174lSZE442eB21nnktT9_VcAye07laFWUeUrjttY,12485 -pip/_vendor/chardet/universaldetector.pyc,, -pip/_vendor/chardet/utf8prober.py,sha256=IdD8v3zWOsB8OLiyPi-y_fqwipRFxV9Nc1eKBLSuIEw,2766 -pip/_vendor/chardet/utf8prober.pyc,, -pip/_vendor/chardet/version.py,sha256=sp3B08mrDXB-pf3K9fqJ_zeDHOCLC8RrngQyDFap_7g,242 -pip/_vendor/chardet/version.pyc,, -pip/_vendor/colorama/__init__.py,sha256=lJdY6COz9uM_pXwuk9oLr0fp8H8q2RrUqN16GKabvq4,239 -pip/_vendor/colorama/__init__.pyc,, -pip/_vendor/colorama/ansi.py,sha256=Fi0un-QLqRm-v7o_nKiOqyC8PapBJK7DLV_q9LKtTO0,2524 -pip/_vendor/colorama/ansi.pyc,, -pip/_vendor/colorama/ansitowin32.py,sha256=u8QaqdqS_xYSfNkPM1eRJLHz6JMWPodaJaP0mxgHCDc,10462 -pip/_vendor/colorama/ansitowin32.pyc,, -pip/_vendor/colorama/initialise.py,sha256=PprovDNxMTrvoNHFcL2NZjpH2XzDc8BLxLxiErfUl4k,1915 -pip/_vendor/colorama/initialise.pyc,, -pip/_vendor/colorama/win32.py,sha256=bJ8Il9jwaBN5BJ8bmN6FoYZ1QYuMKv2j8fGrXh7TJjw,5404 -pip/_vendor/colorama/win32.pyc,, -pip/_vendor/colorama/winterm.py,sha256=2y_2b7Zsv34feAsP67mLOVc-Bgq51mdYGo571VprlrM,6438 -pip/_vendor/colorama/winterm.pyc,, -pip/_vendor/distlib/__init__.py,sha256=7uthK6m96pTekk8hjlT-MybcwYmmxwP8gEOxXVg1f2s,581 -pip/_vendor/distlib/__init__.pyc,, -pip/_vendor/distlib/_backport/__init__.py,sha256=bqS_dTOH6uW9iGgd0uzfpPjo6vZ4xpPZ7kyfZJ2vNaw,274 -pip/_vendor/distlib/_backport/__init__.pyc,, -pip/_vendor/distlib/_backport/misc.py,sha256=KWecINdbFNOxSOP1fGF680CJnaC6S4fBRgEtaYTw0ig,971 -pip/_vendor/distlib/_backport/misc.pyc,, -pip/_vendor/distlib/_backport/shutil.py,sha256=VW1t3uYqUjWZH7jV-6QiimLhnldoV5uIpH4EuiT1jfw,25647 -pip/_vendor/distlib/_backport/shutil.pyc,, -pip/_vendor/distlib/_backport/sysconfig.cfg,sha256=swZKxq9RY5e9r3PXCrlvQPMsvOdiWZBTHLEbqS8LJLU,2617 -pip/_vendor/distlib/_backport/sysconfig.py,sha256=JdJ9ztRy4Hc-b5-VS74x3nUtdEIVr_OBvMsIb8O2sjc,26964 -pip/_vendor/distlib/_backport/sysconfig.pyc,, -pip/_vendor/distlib/_backport/tarfile.py,sha256=Ihp7rXRcjbIKw8COm9wSePV9ARGXbSF9gGXAMn2Q-KU,92628 -pip/_vendor/distlib/_backport/tarfile.pyc,, -pip/_vendor/distlib/compat.py,sha256=xdNZmqFN5HwF30HjRn5M415pcC2kgXRBXn767xS8v-M,41404 -pip/_vendor/distlib/compat.pyc,, -pip/_vendor/distlib/database.py,sha256=-KJH63AJ7hqjLtGCwOTrionhKr2Vsytdwkjyo8UdEco,51029 -pip/_vendor/distlib/database.pyc,, -pip/_vendor/distlib/index.py,sha256=Dd1kIV06XIdynNpKxHMMRRIKsXuoUsG7QIzntfVtZCI,21073 -pip/_vendor/distlib/index.pyc,, -pip/_vendor/distlib/locators.py,sha256=S9G2IsZp0RnMMbXGrT-gu7892pNpy1XMlUEuUHX3OI8,51828 -pip/_vendor/distlib/locators.pyc,, -pip/_vendor/distlib/manifest.py,sha256=nQEhYmgoreaBZzyFzwYsXxJARu3fo4EkunU163U16iE,14811 -pip/_vendor/distlib/manifest.pyc,, -pip/_vendor/distlib/markers.py,sha256=6Ac3cCfFBERexiESWIOXmg-apIP8l2esafNSX3KMy-8,4387 -pip/_vendor/distlib/markers.pyc,, -pip/_vendor/distlib/metadata.py,sha256=BNCnpRfFVslyZcosr4vnE_YbkRb3TNxXtk7TrDszJdc,40172 -pip/_vendor/distlib/metadata.pyc,, -pip/_vendor/distlib/resources.py,sha256=2FGv0ZHF14KXjLIlL0R991lyQQGcewOS4mJ-5n-JVnc,10766 -pip/_vendor/distlib/resources.pyc,, -pip/_vendor/distlib/scripts.py,sha256=NYqRJ2uuEuJwr_NNLzWH0m_s_YsobDFQb6HqxuQ2Sew,16638 -pip/_vendor/distlib/scripts.pyc,, -pip/_vendor/distlib/t32.exe,sha256=ftub1bsSPUCOnBn-eCtcarKTk0N0CBEP53BumkIxWJE,92672 -pip/_vendor/distlib/t64.exe,sha256=iChOG627LWTHY8-jzSwlo9SYU5a-0JHwQu4AqDz8I68,102400 -pip/_vendor/distlib/util.py,sha256=gwKL5geJKmtR4GeIUnoMAWjsPPG3tVP_mFxw_Sx-isc,59681 -pip/_vendor/distlib/util.pyc,, -pip/_vendor/distlib/version.py,sha256=_n7F6juvQGAcn769E_SHa7fOcf5ERlEVymJ_EjPRwGw,23391 -pip/_vendor/distlib/version.pyc,, -pip/_vendor/distlib/w32.exe,sha256=NPYPpt7PIjVqABEu1CzabbDyHHkJpuw-_qZq_48H0j0,89088 -pip/_vendor/distlib/w64.exe,sha256=Yb-qr1OQEzL8KRGTk-XHUZDwMSljfQeZnVoTk-K4e7E,99328 -pip/_vendor/distlib/wheel.py,sha256=gV53KDG7BgbxsdeKjnATbP47gTEJRNylcIeE1TFin1o,39880 -pip/_vendor/distlib/wheel.pyc,, -pip/_vendor/distro.py,sha256=X2So5kjrRKyMbQJ90Xgy93HU5eFtujCzKaYNeoy1k1c,43251 -pip/_vendor/distro.pyc,, -pip/_vendor/html5lib/__init__.py,sha256=Ztrn7UvF-wIFAgRBBa0ML-Gu5AffH3BPX_INJx4SaBI,1162 -pip/_vendor/html5lib/__init__.pyc,, -pip/_vendor/html5lib/_ihatexml.py,sha256=3LBtJMlzgwM8vpQiU1TvGmEEmNH72sV0yD8yS53y07A,16705 -pip/_vendor/html5lib/_ihatexml.pyc,, -pip/_vendor/html5lib/_inputstream.py,sha256=bPUWcAfJScK4xkjQQaG_HsI2BvEVbFvI0AsodDYPQj0,32552 -pip/_vendor/html5lib/_inputstream.pyc,, -pip/_vendor/html5lib/_tokenizer.py,sha256=YAaOEBD6qc5ISq9Xt9Nif1OFgcybTTfMdwqBkZhpAq4,76580 -pip/_vendor/html5lib/_tokenizer.pyc,, -pip/_vendor/html5lib/_trie/__init__.py,sha256=8VR1bcgD2OpeS2XExpu5yBhP_Q1K-lwKbBKICBPf1kU,289 -pip/_vendor/html5lib/_trie/__init__.pyc,, -pip/_vendor/html5lib/_trie/_base.py,sha256=uJHVhzif9S0MJXgy9F98iEev5evi_rgUk5BmEbUSp8c,930 -pip/_vendor/html5lib/_trie/_base.pyc,, -pip/_vendor/html5lib/_trie/datrie.py,sha256=EQpqSfkZRuTbE-DuhW7xMdVDxdZNZ0CfmnYfHA_3zxM,1178 -pip/_vendor/html5lib/_trie/datrie.pyc,, -pip/_vendor/html5lib/_trie/py.py,sha256=wXmQLrZRf4MyWNyg0m3h81m9InhLR7GJ002mIIZh-8o,1775 -pip/_vendor/html5lib/_trie/py.pyc,, -pip/_vendor/html5lib/_utils.py,sha256=ismpASeqa2jqEPQjHUj8vReAf7yIoKnvLN5fuOw6nv0,4015 -pip/_vendor/html5lib/_utils.pyc,, -pip/_vendor/html5lib/constants.py,sha256=4lmZWLtEPRLnl8NzftOoYTJdo6jpeMtP6dqQC0g_bWQ,83518 -pip/_vendor/html5lib/constants.pyc,, -pip/_vendor/html5lib/filters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/html5lib/filters/__init__.pyc,, -pip/_vendor/html5lib/filters/alphabeticalattributes.py,sha256=lViZc2JMCclXi_5gduvmdzrRxtO5Xo9ONnbHBVCsykU,919 -pip/_vendor/html5lib/filters/alphabeticalattributes.pyc,, -pip/_vendor/html5lib/filters/base.py,sha256=z-IU9ZAYjpsVsqmVt7kuWC63jR11hDMr6CVrvuao8W0,286 -pip/_vendor/html5lib/filters/base.pyc,, -pip/_vendor/html5lib/filters/inject_meta_charset.py,sha256=egDXUEHXmAG9504xz0K6ALDgYkvUrC2q15YUVeNlVQg,2945 -pip/_vendor/html5lib/filters/inject_meta_charset.pyc,, -pip/_vendor/html5lib/filters/lint.py,sha256=jk6q56xY0ojiYfvpdP-OZSm9eTqcAdRqhCoPItemPYA,3643 -pip/_vendor/html5lib/filters/lint.pyc,, -pip/_vendor/html5lib/filters/optionaltags.py,sha256=8lWT75J0aBOHmPgfmqTHSfPpPMp01T84NKu0CRedxcE,10588 -pip/_vendor/html5lib/filters/optionaltags.pyc,, -pip/_vendor/html5lib/filters/sanitizer.py,sha256=4ON02KNjuqda1lCw5_JCUZxb0BzWR5M7ON84dtJ7dm0,26248 -pip/_vendor/html5lib/filters/sanitizer.pyc,, -pip/_vendor/html5lib/filters/whitespace.py,sha256=8eWqZxd4UC4zlFGW6iyY6f-2uuT8pOCSALc3IZt7_t4,1214 -pip/_vendor/html5lib/filters/whitespace.pyc,, -pip/_vendor/html5lib/html5parser.py,sha256=g5g2ezkusHxhi7b23vK_-d6K6BfIJRbqIQmvQ9z4EgI,118963 -pip/_vendor/html5lib/html5parser.pyc,, -pip/_vendor/html5lib/serializer.py,sha256=yfcfBHse2wDs6ojxn-kieJjLT5s1ipilQJ0gL3-rJis,15758 -pip/_vendor/html5lib/serializer.pyc,, -pip/_vendor/html5lib/treeadapters/__init__.py,sha256=A0rY5gXIe4bJOiSGRO_j_tFhngRBO8QZPzPtPw5dFzo,679 -pip/_vendor/html5lib/treeadapters/__init__.pyc,, -pip/_vendor/html5lib/treeadapters/genshi.py,sha256=CH27pAsDKmu4ZGkAUrwty7u0KauGLCZRLPMzaO3M5vo,1715 -pip/_vendor/html5lib/treeadapters/genshi.pyc,, -pip/_vendor/html5lib/treeadapters/sax.py,sha256=BKS8woQTnKiqeffHsxChUqL4q2ZR_wb5fc9MJ3zQC8s,1776 -pip/_vendor/html5lib/treeadapters/sax.pyc,, -pip/_vendor/html5lib/treebuilders/__init__.py,sha256=AysSJyvPfikCMMsTVvaxwkgDieELD5dfR8FJIAuq7hY,3592 -pip/_vendor/html5lib/treebuilders/__init__.pyc,, -pip/_vendor/html5lib/treebuilders/base.py,sha256=wQGp5yy22TNG8tJ6aREe4UUeTR7A99dEz0BXVaedWb4,14579 -pip/_vendor/html5lib/treebuilders/base.pyc,, -pip/_vendor/html5lib/treebuilders/dom.py,sha256=SY3MsijXyzdNPc8aK5IQsupBoM8J67y56DgNtGvsb9g,8835 -pip/_vendor/html5lib/treebuilders/dom.pyc,, -pip/_vendor/html5lib/treebuilders/etree.py,sha256=aqIBOGj_dFYqBURIcTegGNBhAIJOw5iFDHb4jrkYH-8,12764 -pip/_vendor/html5lib/treebuilders/etree.pyc,, -pip/_vendor/html5lib/treebuilders/etree_lxml.py,sha256=9V0dXxbJYYq-Skgb5-_OL2NkVYpjioEb4CHajo0e9yI,14122 -pip/_vendor/html5lib/treebuilders/etree_lxml.pyc,, -pip/_vendor/html5lib/treewalkers/__init__.py,sha256=yhXxHpjlSqfQyUag3v8-vWjMPriFBU8YRAPNpDgBTn8,5714 -pip/_vendor/html5lib/treewalkers/__init__.pyc,, -pip/_vendor/html5lib/treewalkers/base.py,sha256=ouiOsuSzvI0KgzdWP8PlxIaSNs9falhbiinAEc_UIJY,7476 -pip/_vendor/html5lib/treewalkers/base.pyc,, -pip/_vendor/html5lib/treewalkers/dom.py,sha256=EHyFR8D8lYNnyDU9lx_IKigVJRyecUGua0mOi7HBukc,1413 -pip/_vendor/html5lib/treewalkers/dom.pyc,, -pip/_vendor/html5lib/treewalkers/etree.py,sha256=sz1o6mmE93NQ53qJFDO7HKyDtuwgK-Ay3qSFZPC6u00,4550 -pip/_vendor/html5lib/treewalkers/etree.pyc,, -pip/_vendor/html5lib/treewalkers/etree_lxml.py,sha256=sY6wfRshWTllu6n48TPWpKsQRPp-0CQrT0hj_AdzHSU,6309 -pip/_vendor/html5lib/treewalkers/etree_lxml.pyc,, -pip/_vendor/html5lib/treewalkers/genshi.py,sha256=4D2PECZ5n3ZN3qu3jMl9yY7B81jnQApBQSVlfaIuYbA,2309 -pip/_vendor/html5lib/treewalkers/genshi.pyc,, -pip/_vendor/idna/__init__.py,sha256=9Nt7xpyet3DmOrPUGooDdAwmHZZu1qUAy2EaJ93kGiQ,58 -pip/_vendor/idna/__init__.pyc,, -pip/_vendor/idna/codec.py,sha256=lvYb7yu7PhAqFaAIAdWcwgaWI2UmgseUua-1c0AsG0A,3299 -pip/_vendor/idna/codec.pyc,, -pip/_vendor/idna/compat.py,sha256=R-h29D-6mrnJzbXxymrWUW7iZUvy-26TQwZ0ij57i4U,232 -pip/_vendor/idna/compat.pyc,, -pip/_vendor/idna/core.py,sha256=JDCZZ_PLESqIgEbU8mPyoEufWwoOiIqygA17-QZIe3s,11733 -pip/_vendor/idna/core.pyc,, -pip/_vendor/idna/idnadata.py,sha256=HXaPFw6_YAJ0qppACPu0YLAULtRs3QovRM_CCZHGdY0,40899 -pip/_vendor/idna/idnadata.pyc,, -pip/_vendor/idna/intranges.py,sha256=TY1lpxZIQWEP6tNqjZkFA5hgoMWOj1OBmnUG8ihT87E,1749 -pip/_vendor/idna/intranges.pyc,, -pip/_vendor/idna/package_data.py,sha256=kIzeKKXEouXLR4srqwf9Q3zv-NffKSOz5aSDOJARPB0,21 -pip/_vendor/idna/package_data.pyc,, -pip/_vendor/idna/uts46data.py,sha256=oLyNZ1pBaiBlj9zFzLFRd_P7J8MkRcgDisjExZR_4MY,198292 -pip/_vendor/idna/uts46data.pyc,, -pip/_vendor/ipaddress.py,sha256=2OgbkeAD2rLkcXqbcvof3J5R7lRwjNLoBySyTkBtKnc,79852 -pip/_vendor/ipaddress.pyc,, -pip/_vendor/lockfile/__init__.py,sha256=Tqpz90DwKYfhPsfzVOJl84TL87pdFE5ePNHdXAxs4Tk,9371 -pip/_vendor/lockfile/__init__.pyc,, -pip/_vendor/lockfile/linklockfile.py,sha256=C7OH3H4GdK68u4FQgp8fkP2kO4fyUTSyj3X6blgfobc,2652 -pip/_vendor/lockfile/linklockfile.pyc,, -pip/_vendor/lockfile/mkdirlockfile.py,sha256=e3qgIL-etZMLsS-3ft19iW_8IQ360HNkGOqE3yBKsUw,3096 -pip/_vendor/lockfile/mkdirlockfile.pyc,, -pip/_vendor/lockfile/pidlockfile.py,sha256=ukH9uk6NFuxyVmG5QiWw4iKq3fT7MjqUguX95avYPIY,6090 -pip/_vendor/lockfile/pidlockfile.pyc,, -pip/_vendor/lockfile/sqlitelockfile.py,sha256=o2TMkMRY0iwn-iL1XMRRIFStMUkS4i3ajceeYNntKFg,5506 -pip/_vendor/lockfile/sqlitelockfile.pyc,, -pip/_vendor/lockfile/symlinklockfile.py,sha256=ABwXXmvTHvCl5viPblShL3PG-gGsLiT1roAMfDRwhi8,2616 -pip/_vendor/lockfile/symlinklockfile.pyc,, -pip/_vendor/msgpack/__init__.py,sha256=y0bk2YbzK6J2e0J_dyreN6nD7yM2IezT6m_tU2h-Mdg,1677 -pip/_vendor/msgpack/__init__.pyc,, -pip/_vendor/msgpack/_version.py,sha256=dN7wVIjbyuQIJ35B2o6gymQNDLPlj_7-uTfgCv7KErM,20 -pip/_vendor/msgpack/_version.pyc,, -pip/_vendor/msgpack/exceptions.py,sha256=lPkAi_u12NlFajDz4FELSHEdfU8hrR3zeTvKX8aQuz4,1056 -pip/_vendor/msgpack/exceptions.pyc,, -pip/_vendor/msgpack/fallback.py,sha256=h0ll8xnq12mI9PuQ9Qd_Ihtt08Sp8L0JqhG9KY8Vyjk,36411 -pip/_vendor/msgpack/fallback.pyc,, -pip/_vendor/packaging/__about__.py,sha256=Wg0-hNgTU2_lBZcGBh5pm1R9yroQ3rv-X0rig8KjA6o,744 -pip/_vendor/packaging/__about__.pyc,, -pip/_vendor/packaging/__init__.py,sha256=6enbp5XgRfjBjsI9-bn00HjHf5TH21PDMOKkJW8xw-w,562 -pip/_vendor/packaging/__init__.pyc,, -pip/_vendor/packaging/_compat.py,sha256=Ugdm-qcneSchW25JrtMIKgUxfEEBcCAz6WrEeXeqz9o,865 -pip/_vendor/packaging/_compat.pyc,, -pip/_vendor/packaging/_structures.py,sha256=pVd90XcXRGwpZRB_qdFuVEibhCHpX_bL5zYr9-N0mc8,1416 -pip/_vendor/packaging/_structures.pyc,, -pip/_vendor/packaging/markers.py,sha256=-QjvJkhSJBxBogO9J_EpPQudHaaLV3rgVYsBDqn-ZLc,8234 -pip/_vendor/packaging/markers.pyc,, -pip/_vendor/packaging/requirements.py,sha256=grcnFU8x7KD230JaFLXtWl3VClLuOmsOy4c-m55tOWs,4700 -pip/_vendor/packaging/requirements.pyc,, -pip/_vendor/packaging/specifiers.py,sha256=0ZzQpcUnvrQ6LjR-mQRLzMr8G6hdRv-mY0VSf_amFtI,27778 -pip/_vendor/packaging/specifiers.pyc,, -pip/_vendor/packaging/utils.py,sha256=VaTC0Ei7zO2xl9ARiWmz2YFLFt89PuuhLbAlXMyAGms,1520 -pip/_vendor/packaging/utils.pyc,, -pip/_vendor/packaging/version.py,sha256=Npdwnb8OHedj_2L86yiUqscujb7w_i5gmSK1PhOAFzg,11978 -pip/_vendor/packaging/version.pyc,, -pip/_vendor/pep517/__init__.py,sha256=nOY747zTld3oTdEetBG6DWxEcZXTeOQk0aHvbR-sa5w,84 -pip/_vendor/pep517/__init__.pyc,, -pip/_vendor/pep517/_in_process.py,sha256=xMY2kLutkjCti5WqTmKOLRRL3o8Ds_k-fObFyuMv1tk,6061 -pip/_vendor/pep517/_in_process.pyc,, -pip/_vendor/pep517/build.py,sha256=-n8PT-ugS1TdqoTUY1vatDQjrLtx48K_-Quu2MuQBiA,2699 -pip/_vendor/pep517/build.pyc,, -pip/_vendor/pep517/check.py,sha256=Lu7nMdYu1JVV58fE3hv-d_avTy5h0yO9LsIzAt82Clk,5885 -pip/_vendor/pep517/check.pyc,, -pip/_vendor/pep517/colorlog.py,sha256=Tk9AuYm_cLF3BKTBoSTJt9bRryn0aFojIQOwbfVUTxQ,4098 -pip/_vendor/pep517/colorlog.pyc,, -pip/_vendor/pep517/compat.py,sha256=4SFG4QN-cNj8ebSa0wV0HUtEEQWwmbok2a0uk1gYEOM,631 -pip/_vendor/pep517/compat.pyc,, -pip/_vendor/pep517/envbuild.py,sha256=9-u4KffexPMEm52rTaIjEOxsCAd2DMByxzv5H566QLw,5763 -pip/_vendor/pep517/envbuild.pyc,, -pip/_vendor/pep517/wrappers.py,sha256=9dZn-q7F5KyQKUJMie2uKwur2FG0CLXz_kLZzkJOhZc,5912 -pip/_vendor/pep517/wrappers.pyc,, -pip/_vendor/pkg_resources/__init__.py,sha256=ZVHzk7ZiFIIgE2RTJj8F7wwjdMGrAngMWtQo-rGNsm4,107910 -pip/_vendor/pkg_resources/__init__.pyc,, -pip/_vendor/pkg_resources/py31compat.py,sha256=CRk8fkiPRDLsbi5pZcKsHI__Pbmh_94L8mr9Qy9Ab2U,562 -pip/_vendor/pkg_resources/py31compat.pyc,, -pip/_vendor/progress/__init__.py,sha256=fcbQQXo5np2CoQyhSH5XprkicwLZNLePR3uIahznSO0,4857 -pip/_vendor/progress/__init__.pyc,, -pip/_vendor/progress/bar.py,sha256=QuDuVNcmXgpxtNtxO0Fq72xKigxABaVmxYGBw4J3Z_E,2854 -pip/_vendor/progress/bar.pyc,, -pip/_vendor/progress/counter.py,sha256=MznyBrvPWrOlGe4MZAlGUb9q3aODe6_aNYeAE_VNoYA,1372 -pip/_vendor/progress/counter.pyc,, -pip/_vendor/progress/spinner.py,sha256=k8JbDW94T0-WXuXfxZIFhdoNPYp3jfnpXqBnfRv5fGs,1380 -pip/_vendor/progress/spinner.pyc,, -pip/_vendor/pyparsing.py,sha256=sxGUe_YcWBB5ZoHec0m1iJtgcj4iKv_SGfdA_zVCYII,245385 -pip/_vendor/pyparsing.pyc,, -pip/_vendor/pytoml/__init__.py,sha256=W_SKx36Hsew-Fty36BOpreLm4uF4V_Tgkm_z9rIoOE8,127 -pip/_vendor/pytoml/__init__.pyc,, -pip/_vendor/pytoml/core.py,sha256=9CrLLTs1PdWjEwRnYzt_i4dhHcZvGxs_GsMlYAX3iY4,509 -pip/_vendor/pytoml/core.pyc,, -pip/_vendor/pytoml/parser.py,sha256=2tDXkldqPQJhyadXzL2rGhVbjUyBNeXXhaEfncHl2iQ,10326 -pip/_vendor/pytoml/parser.pyc,, -pip/_vendor/pytoml/test.py,sha256=2nQs4aX3XQEaaQCx6x_OJTS2Hb0_IiTZRqNOeDmLCzo,1021 -pip/_vendor/pytoml/test.pyc,, -pip/_vendor/pytoml/utils.py,sha256=JCLHx77Hu1R3F-bRgiROIiKyCzLwyebnp5P35cRJxWs,1665 -pip/_vendor/pytoml/utils.pyc,, -pip/_vendor/pytoml/writer.py,sha256=WbNNQg3sh_V-s3kt88LkNNbxEq6pPDdhRE-daJzArcI,3198 -pip/_vendor/pytoml/writer.pyc,, -pip/_vendor/requests/__init__.py,sha256=ZI8kbaEzLAxsqex3MmMPr-v24d1RfZbNAOY8fUxg2Xw,4074 -pip/_vendor/requests/__init__.pyc,, -pip/_vendor/requests/__version__.py,sha256=8KG3anaNCi-PEclPPOHJ_cv1udY_L1_njVr84gRZ9HM,436 -pip/_vendor/requests/__version__.pyc,, -pip/_vendor/requests/_internal_utils.py,sha256=Zx3PnEUccyfsB-ie11nZVAW8qClJy0gx1qNME7rgT18,1096 -pip/_vendor/requests/_internal_utils.pyc,, -pip/_vendor/requests/adapters.py,sha256=e-bmKEApNVqFdylxuMJJfiaHdlmS_zhWhIMEzlHvGuc,21548 -pip/_vendor/requests/adapters.pyc,, -pip/_vendor/requests/api.py,sha256=hWZgfD7OriCZFOnpeq0bv2pbXDl8YXfxDwAcU036qDs,6253 -pip/_vendor/requests/api.pyc,, -pip/_vendor/requests/auth.py,sha256=QB2-cSUj1jrvWZfPXttsZpyAacQgtKLVk14vQW9TpSE,10206 -pip/_vendor/requests/auth.pyc,, -pip/_vendor/requests/certs.py,sha256=nXRVq9DtGmv_1AYbwjTu9UrgAcdJv05ZvkNeaoLOZxY,465 -pip/_vendor/requests/certs.pyc,, -pip/_vendor/requests/compat.py,sha256=FZX4Q_EMKiMnhZpZ3g_gOsT-j2ca9ij2gehDx1cwYeo,1941 -pip/_vendor/requests/compat.pyc,, -pip/_vendor/requests/cookies.py,sha256=Y-bKX6TvW3FnYlE6Au0SXtVVWcaNdFvuAwQxw-G0iTI,18430 -pip/_vendor/requests/cookies.pyc,, -pip/_vendor/requests/exceptions.py,sha256=-mLam3TAx80V09EaH3H-ZxR61eAVuLRZ8zgBBSLjK44,3197 -pip/_vendor/requests/exceptions.pyc,, -pip/_vendor/requests/help.py,sha256=SJPVcoXeo7KfK4AxJN5eFVQCjr0im87tU2n7ubLsksU,3578 -pip/_vendor/requests/help.pyc,, -pip/_vendor/requests/hooks.py,sha256=QReGyy0bRcr5rkwCuObNakbYsc7EkiKeBwG4qHekr2Q,757 -pip/_vendor/requests/hooks.pyc,, -pip/_vendor/requests/models.py,sha256=6s-37iAqXVptq8z7U_LoH_pbIPrCQUm_Z8QuIGE29Q0,34275 -pip/_vendor/requests/models.pyc,, -pip/_vendor/requests/packages.py,sha256=njJmVifY4aSctuW3PP5EFRCxjEwMRDO6J_feG2dKWsI,695 -pip/_vendor/requests/packages.pyc,, -pip/_vendor/requests/sessions.py,sha256=DjbCotDW6xSAaBsjbW-L8l4N0UcwmrxVNgSrZgIjGWM,29332 -pip/_vendor/requests/sessions.pyc,, -pip/_vendor/requests/status_codes.py,sha256=XWlcpBjbCtq9sSqpH9_KKxgnLTf9Z__wCWolq21ySlg,4129 -pip/_vendor/requests/status_codes.pyc,, -pip/_vendor/requests/structures.py,sha256=zoP8qly2Jak5e89HwpqjN1z2diztI-_gaqts1raJJBc,2981 -pip/_vendor/requests/structures.pyc,, -pip/_vendor/requests/utils.py,sha256=LtPJ1db6mJff2TJSJWKi7rBpzjPS3mSOrjC9zRhoD3A,30049 -pip/_vendor/requests/utils.pyc,, -pip/_vendor/retrying.py,sha256=k3fflf5_Mm0XcIJYhB7Tj34bqCCPhUDkYbx1NvW2FPE,9972 -pip/_vendor/retrying.pyc,, -pip/_vendor/six.py,sha256=h9jch2pS86y4R36pKRS3LOYUCVFNIJMRwjZ4fJDtJ44,32452 -pip/_vendor/six.pyc,, -pip/_vendor/urllib3/__init__.py,sha256=EZviRQA_iuL_94EeJHY4JAArRXbRCkAzA0HH9iXZ15s,2722 -pip/_vendor/urllib3/__init__.pyc,, -pip/_vendor/urllib3/_collections.py,sha256=-CAKsDE-WdubAjlBSZLx7b0e7WKenaNGwWvGLDEF1TM,10746 -pip/_vendor/urllib3/_collections.pyc,, -pip/_vendor/urllib3/connection.py,sha256=KLFvknLgllcMkgJ-zUsFjCzOt9P03fDoIpTPz_vqXCw,13839 -pip/_vendor/urllib3/connection.pyc,, -pip/_vendor/urllib3/connectionpool.py,sha256=rgc_3D0VsD5VDxr4KzzA8Plee0Rmerm5WKb71FcxWu8,35097 -pip/_vendor/urllib3/connectionpool.pyc,, -pip/_vendor/urllib3/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/urllib3/contrib/__init__.pyc,, -pip/_vendor/urllib3/contrib/_appengine_environ.py,sha256=lhYXvB5_oGKSeurX7za3XhcGyERvNjXRQ3eJp2GmQ3M,717 -pip/_vendor/urllib3/contrib/_appengine_environ.pyc,, -pip/_vendor/urllib3/contrib/_securetransport/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/urllib3/contrib/_securetransport/__init__.pyc,, -pip/_vendor/urllib3/contrib/_securetransport/bindings.py,sha256=x2kLSh-ASZKsun0FxtraBuLVe3oHuth4YW6yZ5Vof-w,17560 -pip/_vendor/urllib3/contrib/_securetransport/bindings.pyc,, -pip/_vendor/urllib3/contrib/_securetransport/low_level.py,sha256=Umy5u-3Z957GirdapnicXVOpHaM4xdOZABJuJxfaeJA,12162 -pip/_vendor/urllib3/contrib/_securetransport/low_level.pyc,, -pip/_vendor/urllib3/contrib/appengine.py,sha256=VvDpkc5gf9dTXNxXmyG1mPdON_3DrYG_eW4uOqN98oQ,10938 -pip/_vendor/urllib3/contrib/appengine.pyc,, -pip/_vendor/urllib3/contrib/ntlmpool.py,sha256=5ZpMF7N9B6NEjVU-r-xjDOV_-hkNvsDoNc84J2yqauI,4459 -pip/_vendor/urllib3/contrib/ntlmpool.pyc,, -pip/_vendor/urllib3/contrib/pyopenssl.py,sha256=-kI_9y99Iwybv6Wy8IF8PugVl61BeMBEEqGwrDYNCuc,15823 -pip/_vendor/urllib3/contrib/pyopenssl.pyc,, -pip/_vendor/urllib3/contrib/securetransport.py,sha256=BqXSlChN9_hjCWgyN6JdcgvBUdc37QCCX4u3_8zE_9o,30309 -pip/_vendor/urllib3/contrib/securetransport.pyc,, -pip/_vendor/urllib3/contrib/socks.py,sha256=Iom0snbHkCuZbZ7Sle2Kueha1W0jYAJ0SyCOtePLaio,6391 -pip/_vendor/urllib3/contrib/socks.pyc,, -pip/_vendor/urllib3/exceptions.py,sha256=rFeIfBNKC8KJ61ux-MtJyJlEC9G9ggkmCeF751JwVR4,6604 -pip/_vendor/urllib3/exceptions.pyc,, -pip/_vendor/urllib3/fields.py,sha256=D_TE_SK15YatdbhWDMN0OE3X6UCJn1RTkANINCYOobE,5943 -pip/_vendor/urllib3/fields.pyc,, -pip/_vendor/urllib3/filepost.py,sha256=40CROlpRKVBpFUkD0R6wJf_PpvbcRQRFUu0OOQlFkKM,2436 -pip/_vendor/urllib3/filepost.pyc,, -pip/_vendor/urllib3/packages/__init__.py,sha256=nlChrGzkjCkmhCX9HrF_qHPUgosfsPQkVIJxiiLhk9g,109 -pip/_vendor/urllib3/packages/__init__.pyc,, -pip/_vendor/urllib3/packages/backports/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/urllib3/packages/backports/__init__.pyc,, -pip/_vendor/urllib3/packages/backports/makefile.py,sha256=so2z9BiNM8kh38Ve5tomQP_mp2_ubEqzdlCpLZKzzCI,1456 -pip/_vendor/urllib3/packages/backports/makefile.pyc,, -pip/_vendor/urllib3/packages/six.py,sha256=A6hdJZVjI3t_geebZ9BzUvwRrIXo0lfwzQlM2LcKyas,30098 -pip/_vendor/urllib3/packages/six.pyc,, -pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py,sha256=WBVbxQBojNAxfZwNavkox3BgJiMA9BJmm-_fwd0jD_o,688 -pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.pyc,, -pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py,sha256=E-9J-kAaUn76WMZ4PpzKUxM4C3yjY7mopOpbPIy3Dso,5700 -pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.pyc,, -pip/_vendor/urllib3/poolmanager.py,sha256=csE6Bh6L0FJ3iNOHk2z8KhMT8Eiq976b6pk8I6vrOC8,16853 -pip/_vendor/urllib3/poolmanager.pyc,, -pip/_vendor/urllib3/request.py,sha256=OfelFYzPnxGlU3amEz9uBLjCBOriwgJh4QC_aW9SF3U,5991 -pip/_vendor/urllib3/request.pyc,, -pip/_vendor/urllib3/response.py,sha256=ta1jp4B5PGBWzoAV1s48WLuHCRICQnK7F9m_kyK4Z8g,25609 -pip/_vendor/urllib3/response.pyc,, -pip/_vendor/urllib3/util/__init__.py,sha256=6Ran4oAVIy40Cu_oEPWnNV9bwF5rXx6G1DUZ7oehjPY,1044 -pip/_vendor/urllib3/util/__init__.pyc,, -pip/_vendor/urllib3/util/connection.py,sha256=-AyqcRTuNUHuo5ndtsU0Og_nMyCGATC-kYqOUdBHwIQ,4639 -pip/_vendor/urllib3/util/connection.pyc,, -pip/_vendor/urllib3/util/queue.py,sha256=myTX3JDHntglKQNBf3b6dasHH-uF-W59vzGSQiFdAfI,497 -pip/_vendor/urllib3/util/queue.pyc,, -pip/_vendor/urllib3/util/request.py,sha256=H5_lrHvtwl2U2BbT1UYN9HpruNc1gsNFlz2njQmhPrQ,3705 -pip/_vendor/urllib3/util/request.pyc,, -pip/_vendor/urllib3/util/response.py,sha256=028PNXDZhwBtnm2uXvnAHi_l9_AAGrAMH2Igh2AbgWg,2586 -pip/_vendor/urllib3/util/response.pyc,, -pip/_vendor/urllib3/util/retry.py,sha256=kFQTesNiwPp6ZeQo9VHeUO7b8qA-_l3BnErCAOEPo4Q,15105 -pip/_vendor/urllib3/util/retry.pyc,, -pip/_vendor/urllib3/util/ssl_.py,sha256=4qqBDM82bufhqqEd0b-99sObz95XmEVEXDVi5iAyCeE,13172 -pip/_vendor/urllib3/util/ssl_.pyc,, -pip/_vendor/urllib3/util/timeout.py,sha256=7lHNrgL5YH2cI1j-yZnzV_J8jBlRVdmFhQaNyM1_2b8,9757 -pip/_vendor/urllib3/util/timeout.pyc,, -pip/_vendor/urllib3/util/url.py,sha256=qCY_HHUXvo05wAsEERALgExtlgxLnAHSQ7ce1b-g3SM,6487 -pip/_vendor/urllib3/util/url.pyc,, -pip/_vendor/urllib3/util/wait.py,sha256=p4BZo_Ukp5JF0Dn6jro7cUfqIjnU6WFtuoA6poaV5Jk,5403 -pip/_vendor/urllib3/util/wait.pyc,, -pip/_vendor/webencodings/__init__.py,sha256=qOBJIuPy_4ByYH6W_bNgJF-qYQ2DoU-dKsDu5yRWCXg,10579 -pip/_vendor/webencodings/__init__.pyc,, -pip/_vendor/webencodings/labels.py,sha256=4AO_KxTddqGtrL9ns7kAPjb0CcN6xsCIxbK37HY9r3E,8979 -pip/_vendor/webencodings/labels.pyc,, -pip/_vendor/webencodings/mklabels.py,sha256=GYIeywnpaLnP0GSic8LFWgd0UVvO_l1Nc6YoF-87R_4,1305 -pip/_vendor/webencodings/mklabels.pyc,, -pip/_vendor/webencodings/tests.py,sha256=OtGLyjhNY1fvkW1GvLJ_FV9ZoqC9Anyjr7q3kxTbzNs,6563 -pip/_vendor/webencodings/tests.pyc,, -pip/_vendor/webencodings/x_user_defined.py,sha256=yOqWSdmpytGfUgh_Z6JYgDNhoc-BAHyyeeT15Fr42tM,4307 -pip/_vendor/webencodings/x_user_defined.pyc,, diff --git a/venv/lib/python2.7/site-packages/pip-19.1.1.dist-info/WHEEL b/venv/lib/python2.7/site-packages/pip-19.1.1.dist-info/WHEEL deleted file mode 100644 index c8240f0..0000000 --- a/venv/lib/python2.7/site-packages/pip-19.1.1.dist-info/WHEEL +++ /dev/null @@ -1,6 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.33.1) -Root-Is-Purelib: true -Tag: py2-none-any -Tag: py3-none-any - diff --git a/venv/lib/python2.7/site-packages/pip-19.1.1.dist-info/entry_points.txt b/venv/lib/python2.7/site-packages/pip-19.1.1.dist-info/entry_points.txt deleted file mode 100644 index f5809cb..0000000 --- a/venv/lib/python2.7/site-packages/pip-19.1.1.dist-info/entry_points.txt +++ /dev/null @@ -1,5 +0,0 @@ -[console_scripts] -pip = pip._internal:main -pip3 = pip._internal:main -pip3.7 = pip._internal:main - diff --git a/venv/lib/python2.7/site-packages/pip-19.1.1.dist-info/top_level.txt b/venv/lib/python2.7/site-packages/pip-19.1.1.dist-info/top_level.txt deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python2.7/site-packages/pip-19.1.1.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python2.7/site-packages/pip/__init__.py b/venv/lib/python2.7/site-packages/pip/__init__.py deleted file mode 100644 index 5d05da3..0000000 --- a/venv/lib/python2.7/site-packages/pip/__init__.py +++ /dev/null @@ -1 +0,0 @@ -__version__ = "19.1.1" diff --git a/venv/lib/python2.7/site-packages/pip/__init__.pyc b/venv/lib/python2.7/site-packages/pip/__init__.pyc deleted file mode 100644 index 3755c563935d761600bf48c3cd59045176f66cee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 215 zcmYL@VG4pk5QW!*2&2v+fv!s-2@zeO2HL z9=p@mDeGMR_ WumFK->=17(ZzX>e*{b`=pveacCo=#5 diff --git a/venv/lib/python2.7/site-packages/pip/__main__.py b/venv/lib/python2.7/site-packages/pip/__main__.py deleted file mode 100644 index 0c223f8..0000000 --- a/venv/lib/python2.7/site-packages/pip/__main__.py +++ /dev/null @@ -1,19 +0,0 @@ -from __future__ import absolute_import - -import os -import sys - -# If we are running from a wheel, add the wheel to sys.path -# This allows the usage python pip-*.whl/pip install pip-*.whl -if __package__ == '': - # __file__ is pip-*.whl/pip/__main__.py - # first dirname call strips of '/__main__.py', second strips off '/pip' - # Resulting path is the name of the wheel itself - # Add that to sys.path so we can import pip - path = os.path.dirname(os.path.dirname(__file__)) - sys.path.insert(0, path) - -from pip._internal import main as _main # isort:skip # noqa - -if __name__ == '__main__': - sys.exit(_main()) diff --git a/venv/lib/python2.7/site-packages/pip/__main__.pyc b/venv/lib/python2.7/site-packages/pip/__main__.pyc deleted file mode 100644 index 648f63a2e71e1fb80a8dfbcee3ce41999016a85b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 562 zcmYjN%T60H6g~E2faU?Ly6ift1OsXnwGu-70H}hlMyf26ae|5GQTqlGb|@dgg3s&^ z^xCANmVJEg>)flG{TcN?KkxsVVtX?FFD`)a%B12e;DB176cEvta1y0VG3FV{45o)F z!$QK}!ARWaxZnAY>|!J0EpwPGMfYO4$+3|T&0C)y+y~TslmiGeM3pDKmsBx=8DN8` zk{RI6${S5sCdCM2*%$_ZRl;_&My`9?Ia1rX6sAOTVVUqGVX z8;EE_8M1;mLWpr=x}yreiWk`;N^%Y-Rj9u}>zR+2at4EWL^C*Xpx#1OF{mM$#R*s( zFIx{4BnwFE@aqsSvQ_IvHgN1%U;nbNS8vHz9fL)@0Yp}u^#+n9q)qtE;;dC9%Sdm+ zzgft0NLG-p!e1@qc_g=xuEAd`K2hr_?v`?i@`m}j|mI-pWqrmn-(AfKWg9)T7JNVIBG9awPLPZo2msJQ*1o z#OW|s=Ac+%!|&x#W|7Q#;}@aI;;e7D*l|D0l{6Ka_Ch23xf)x26sog0i|Y+EuAFPx z8C-TauGABS4x+d>@xkGr$HQHva#a}4 zktUKuB`K>o&)OxDjY~s6Hs%JsQ>iGKI802HBt7b$N~OutX5S58hvCH23N7ztMe3e> zHImv)0O&Dl3__Wnr%%YsJDOZrGMrSP?!X8P2y}ssOMqBH84OC6GNx=_;}uXq+CoM9 z#lfY(r9;g90VPAEBVi@vE8cIKxDZ&QCZnFYpaz(sw8do^7u0{t ztf8<+?O8haLCkPy#&*~94!y5h_q8Db`aTVN%o8F_OLC29sde_7%vxF+!`dY8g;ad5 zV@w1jCPkX-vb8l8+c!xxT*iYuleUz4tgRwc{Zo&v4c98pvv@P@KSwDErD*FU+W~9o(q!Z9IHbJmG9DAD-ZHL3QXn>d(4Y%sdI<8m|b+Ig( zVzK0kRk7qOi#5^ylx%E|1;O#iQ2z&k$NRk7ykN1W3K0psTdZJ^CZ*F}lQru!P(s_m zDcwK0+8(JSiMx-t2^1<2wXF6S8?!*eahy=X)BOcYbYl26*s~W}Q63I5B$gfLDz&6J ze7<{dbhID*yz3q99UcS+KRx?y*E5{rheG%0o=|buW9rx=93B;pIpH`P$ev;7@?esy zX-yqX0p0E;@%DSy9v#C{)ZG1`B{L?l_o1>Rwn^K}t{fKkq%LU2SYBU$4=&pQoa%Lp zk%<#sG!kF<*B4KF+G7|!zOOyLo;?QK<3A01q4uTOx2 None - self.path = path - self.setup = False - self.bin_dir = get_paths( - 'nt' if os.name == 'nt' else 'posix_prefix', - vars={'base': path, 'platbase': path} - )['scripts'] - # Note: prefer distutils' sysconfig to get the - # library paths so PyPy is correctly supported. - purelib = get_python_lib(plat_specific=False, prefix=path) - platlib = get_python_lib(plat_specific=True, prefix=path) - if purelib == platlib: - self.lib_dirs = [purelib] - else: - self.lib_dirs = [purelib, platlib] - - -class BuildEnvironment(object): - """Creates and manages an isolated environment to install build deps - """ - - def __init__(self): - # type: () -> None - self._temp_dir = TempDirectory(kind="build-env") - self._temp_dir.create() - - self._prefixes = OrderedDict(( - (name, _Prefix(os.path.join(self._temp_dir.path, name))) - for name in ('normal', 'overlay') - )) - - self._bin_dirs = [] # type: List[str] - self._lib_dirs = [] # type: List[str] - for prefix in reversed(list(self._prefixes.values())): - self._bin_dirs.append(prefix.bin_dir) - self._lib_dirs.extend(prefix.lib_dirs) - - # Customize site to: - # - ensure .pth files are honored - # - prevent access to system site packages - system_sites = { - os.path.normcase(site) for site in ( - get_python_lib(plat_specific=False), - get_python_lib(plat_specific=True), - ) - } - self._site_dir = os.path.join(self._temp_dir.path, 'site') - if not os.path.exists(self._site_dir): - os.mkdir(self._site_dir) - with open(os.path.join(self._site_dir, 'sitecustomize.py'), 'w') as fp: - fp.write(textwrap.dedent( - ''' - import os, site, sys - - # First, drop system-sites related paths. - original_sys_path = sys.path[:] - known_paths = set() - for path in {system_sites!r}: - site.addsitedir(path, known_paths=known_paths) - system_paths = set( - os.path.normcase(path) - for path in sys.path[len(original_sys_path):] - ) - original_sys_path = [ - path for path in original_sys_path - if os.path.normcase(path) not in system_paths - ] - sys.path = original_sys_path - - # Second, add lib directories. - # ensuring .pth file are processed. - for path in {lib_dirs!r}: - assert not path in sys.path - site.addsitedir(path) - ''' - ).format(system_sites=system_sites, lib_dirs=self._lib_dirs)) - - def __enter__(self): - self._save_env = { - name: os.environ.get(name, None) - for name in ('PATH', 'PYTHONNOUSERSITE', 'PYTHONPATH') - } - - path = self._bin_dirs[:] - old_path = self._save_env['PATH'] - if old_path: - path.extend(old_path.split(os.pathsep)) - - pythonpath = [self._site_dir] - - os.environ.update({ - 'PATH': os.pathsep.join(path), - 'PYTHONNOUSERSITE': '1', - 'PYTHONPATH': os.pathsep.join(pythonpath), - }) - - def __exit__(self, exc_type, exc_val, exc_tb): - for varname, old_value in self._save_env.items(): - if old_value is None: - os.environ.pop(varname, None) - else: - os.environ[varname] = old_value - - def cleanup(self): - # type: () -> None - self._temp_dir.cleanup() - - def check_requirements(self, reqs): - # type: (Iterable[str]) -> Tuple[Set[Tuple[str, str]], Set[str]] - """Return 2 sets: - - conflicting requirements: set of (installed, wanted) reqs tuples - - missing requirements: set of reqs - """ - missing = set() - conflicting = set() - if reqs: - ws = WorkingSet(self._lib_dirs) - for req in reqs: - try: - if ws.find(Requirement.parse(req)) is None: - missing.add(req) - except VersionConflict as e: - conflicting.add((str(e.args[0].as_requirement()), - str(e.args[1]))) - return conflicting, missing - - def install_requirements( - self, - finder, # type: PackageFinder - requirements, # type: Iterable[str] - prefix_as_string, # type: str - message # type: Optional[str] - ): - # type: (...) -> None - prefix = self._prefixes[prefix_as_string] - assert not prefix.setup - prefix.setup = True - if not requirements: - return - args = [ - sys.executable, os.path.dirname(pip_location), 'install', - '--ignore-installed', '--no-user', '--prefix', prefix.path, - '--no-warn-script-location', - ] # type: List[str] - if logger.getEffectiveLevel() <= logging.DEBUG: - args.append('-v') - for format_control in ('no_binary', 'only_binary'): - formats = getattr(finder.format_control, format_control) - args.extend(('--' + format_control.replace('_', '-'), - ','.join(sorted(formats or {':none:'})))) - if finder.index_urls: - args.extend(['-i', finder.index_urls[0]]) - for extra_index in finder.index_urls[1:]: - args.extend(['--extra-index-url', extra_index]) - else: - args.append('--no-index') - for link in finder.find_links: - args.extend(['--find-links', link]) - for _, host, _ in finder.secure_origins: - args.extend(['--trusted-host', host]) - if finder.allow_all_prereleases: - args.append('--pre') - args.append('--') - args.extend(requirements) - with open_spinner(message) as spinner: - call_subprocess(args, spinner=spinner) - - -class NoOpBuildEnvironment(BuildEnvironment): - """A no-op drop-in replacement for BuildEnvironment - """ - - def __init__(self): - pass - - def __enter__(self): - pass - - def __exit__(self, exc_type, exc_val, exc_tb): - pass - - def cleanup(self): - pass - - def install_requirements(self, finder, requirements, prefix, message): - raise NotImplementedError() diff --git a/venv/lib/python2.7/site-packages/pip/_internal/build_env.pyc b/venv/lib/python2.7/site-packages/pip/_internal/build_env.pyc deleted file mode 100644 index fa263de0eec166bd003c04c58675b05129ee8b4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10101 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 DTJj2x diff --git a/venv/lib/python2.7/site-packages/pip/_internal/cache.py b/venv/lib/python2.7/site-packages/pip/_internal/cache.py deleted file mode 100644 index 9379343..0000000 --- a/venv/lib/python2.7/site-packages/pip/_internal/cache.py +++ /dev/null @@ -1,224 +0,0 @@ -"""Cache Management -""" - -import errno -import hashlib -import logging -import os - -from pip._vendor.packaging.utils import canonicalize_name - -from pip._internal.download import path_to_url -from pip._internal.models.link import Link -from pip._internal.utils.compat import expanduser -from pip._internal.utils.temp_dir import TempDirectory -from pip._internal.utils.typing import MYPY_CHECK_RUNNING -from pip._internal.wheel import InvalidWheelFilename, Wheel - -if MYPY_CHECK_RUNNING: - from typing import Optional, Set, List, Any - from pip._internal.index import FormatControl - -logger = logging.getLogger(__name__) - - -class Cache(object): - """An abstract class - provides cache directories for data from links - - - :param cache_dir: The root of the cache. - :param format_control: An object of FormatControl class to limit - binaries being read from the cache. - :param allowed_formats: which formats of files the cache should store. - ('binary' and 'source' are the only allowed values) - """ - - def __init__(self, cache_dir, format_control, allowed_formats): - # type: (str, FormatControl, Set[str]) -> None - super(Cache, self).__init__() - self.cache_dir = expanduser(cache_dir) if cache_dir else None - self.format_control = format_control - self.allowed_formats = allowed_formats - - _valid_formats = {"source", "binary"} - assert self.allowed_formats.union(_valid_formats) == _valid_formats - - def _get_cache_path_parts(self, link): - # type: (Link) -> List[str] - """Get parts of part that must be os.path.joined with cache_dir - """ - - # We want to generate an url to use as our cache key, we don't want to - # just re-use the URL because it might have other items in the fragment - # and we don't care about those. - key_parts = [link.url_without_fragment] - if link.hash_name is not None and link.hash is not None: - key_parts.append("=".join([link.hash_name, link.hash])) - key_url = "#".join(key_parts) - - # Encode our key url with sha224, we'll use this because it has similar - # security properties to sha256, but with a shorter total output (and - # thus less secure). However the differences don't make a lot of - # difference for our use case here. - hashed = hashlib.sha224(key_url.encode()).hexdigest() - - # We want to nest the directories some to prevent having a ton of top - # level directories where we might run out of sub directories on some - # FS. - parts = [hashed[:2], hashed[2:4], hashed[4:6], hashed[6:]] - - return parts - - def _get_candidates(self, link, package_name): - # type: (Link, Optional[str]) -> List[Any] - can_not_cache = ( - not self.cache_dir or - not package_name or - not link - ) - if can_not_cache: - return [] - - canonical_name = canonicalize_name(package_name) - formats = self.format_control.get_allowed_formats( - canonical_name - ) - if not self.allowed_formats.intersection(formats): - return [] - - root = self.get_path_for_link(link) - try: - return os.listdir(root) - except OSError as err: - if err.errno in {errno.ENOENT, errno.ENOTDIR}: - return [] - raise - - def get_path_for_link(self, link): - # type: (Link) -> str - """Return a directory to store cached items in for link. - """ - raise NotImplementedError() - - def get(self, link, package_name): - # type: (Link, Optional[str]) -> Link - """Returns a link to a cached item if it exists, otherwise returns the - passed link. - """ - raise NotImplementedError() - - def _link_for_candidate(self, link, candidate): - # type: (Link, str) -> Link - root = self.get_path_for_link(link) - path = os.path.join(root, candidate) - - return Link(path_to_url(path)) - - def cleanup(self): - # type: () -> None - pass - - -class SimpleWheelCache(Cache): - """A cache of wheels for future installs. - """ - - def __init__(self, cache_dir, format_control): - # type: (str, FormatControl) -> None - super(SimpleWheelCache, self).__init__( - cache_dir, format_control, {"binary"} - ) - - def get_path_for_link(self, link): - # type: (Link) -> str - """Return a directory to store cached wheels for link - - Because there are M wheels for any one sdist, we provide a directory - to cache them in, and then consult that directory when looking up - cache hits. - - We only insert things into the cache if they have plausible version - numbers, so that we don't contaminate the cache with things that were - not unique. E.g. ./package might have dozens of installs done for it - and build a version of 0.0...and if we built and cached a wheel, we'd - end up using the same wheel even if the source has been edited. - - :param link: The link of the sdist for which this will cache wheels. - """ - parts = self._get_cache_path_parts(link) - - # Store wheels within the root cache_dir - return os.path.join(self.cache_dir, "wheels", *parts) - - def get(self, link, package_name): - # type: (Link, Optional[str]) -> Link - candidates = [] - - for wheel_name in self._get_candidates(link, package_name): - try: - wheel = Wheel(wheel_name) - except InvalidWheelFilename: - continue - if not wheel.supported(): - # Built for a different python/arch/etc - continue - candidates.append((wheel.support_index_min(), wheel_name)) - - if not candidates: - return link - - return self._link_for_candidate(link, min(candidates)[1]) - - -class EphemWheelCache(SimpleWheelCache): - """A SimpleWheelCache that creates it's own temporary cache directory - """ - - def __init__(self, format_control): - # type: (FormatControl) -> None - self._temp_dir = TempDirectory(kind="ephem-wheel-cache") - self._temp_dir.create() - - super(EphemWheelCache, self).__init__( - self._temp_dir.path, format_control - ) - - def cleanup(self): - # type: () -> None - self._temp_dir.cleanup() - - -class WheelCache(Cache): - """Wraps EphemWheelCache and SimpleWheelCache into a single Cache - - This Cache allows for gracefully degradation, using the ephem wheel cache - when a certain link is not found in the simple wheel cache first. - """ - - def __init__(self, cache_dir, format_control): - # type: (str, FormatControl) -> None - super(WheelCache, self).__init__( - cache_dir, format_control, {'binary'} - ) - self._wheel_cache = SimpleWheelCache(cache_dir, format_control) - self._ephem_cache = EphemWheelCache(format_control) - - def get_path_for_link(self, link): - # type: (Link) -> str - return self._wheel_cache.get_path_for_link(link) - - def get_ephem_path_for_link(self, link): - # type: (Link) -> str - return self._ephem_cache.get_path_for_link(link) - - def get(self, link, package_name): - # type: (Link, Optional[str]) -> Link - retval = self._wheel_cache.get(link, package_name) - if retval is link: - retval = self._ephem_cache.get(link, package_name) - return retval - - def cleanup(self): - # type: () -> None - self._wheel_cache.cleanup() - self._ephem_cache.cleanup() diff --git a/venv/lib/python2.7/site-packages/pip/_internal/cache.pyc b/venv/lib/python2.7/site-packages/pip/_internal/cache.pyc deleted file mode 100644 index 6b6829cfd0e411b4a636533369655cc6f29b767e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9463 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 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/cli/__init__.py b/venv/lib/python2.7/site-packages/pip/_internal/cli/__init__.py deleted file mode 100644 index e589bb9..0000000 --- a/venv/lib/python2.7/site-packages/pip/_internal/cli/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -"""Subpackage containing all of pip's command line interface related code -""" - -# This file intentionally does not import submodules diff --git a/venv/lib/python2.7/site-packages/pip/_internal/cli/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_internal/cli/__init__.pyc deleted file mode 100644 index fd4e5e55a5279481fe47390be69b5e1f637c2965..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 290 zcmYL^!Ab)$5QbBGP!{YnR;$|*xB8;nvlm*O9}=N4jeJN^VaouCcg zV#;vb!{Iuu>1(rWK55aUo5tMc{hd9g1xFX*4cN%sQ7-IjUY5_DdL5)O)#!+{2jd+m YZe3C8Djv!iZ@lk=-Fkc&?;RZd0;g+Fl>h($ diff --git a/venv/lib/python2.7/site-packages/pip/_internal/cli/autocompletion.py b/venv/lib/python2.7/site-packages/pip/_internal/cli/autocompletion.py deleted file mode 100644 index 0a04199..0000000 --- a/venv/lib/python2.7/site-packages/pip/_internal/cli/autocompletion.py +++ /dev/null @@ -1,152 +0,0 @@ -"""Logic that powers autocompletion installed by ``pip completion``. -""" - -import optparse -import os -import sys - -from pip._internal.cli.main_parser import create_main_parser -from pip._internal.commands import commands_dict, get_summaries -from pip._internal.utils.misc import get_installed_distributions - - -def autocomplete(): - """Entry Point for completion of main and subcommand options. - """ - # Don't complete if user hasn't sourced bash_completion file. - if 'PIP_AUTO_COMPLETE' not in os.environ: - return - cwords = os.environ['COMP_WORDS'].split()[1:] - cword = int(os.environ['COMP_CWORD']) - try: - current = cwords[cword - 1] - except IndexError: - current = '' - - subcommands = [cmd for cmd, summary in get_summaries()] - options = [] - # subcommand - try: - subcommand_name = [w for w in cwords if w in subcommands][0] - except IndexError: - subcommand_name = None - - parser = create_main_parser() - # subcommand options - if subcommand_name: - # special case: 'help' subcommand has no options - if subcommand_name == 'help': - sys.exit(1) - # special case: list locally installed dists for show and uninstall - should_list_installed = ( - subcommand_name in ['show', 'uninstall'] and - not current.startswith('-') - ) - if should_list_installed: - installed = [] - lc = current.lower() - for dist in get_installed_distributions(local_only=True): - if dist.key.startswith(lc) and dist.key not in cwords[1:]: - installed.append(dist.key) - # if there are no dists installed, fall back to option completion - if installed: - for dist in installed: - print(dist) - sys.exit(1) - - subcommand = commands_dict[subcommand_name]() - - for opt in subcommand.parser.option_list_all: - if opt.help != optparse.SUPPRESS_HELP: - for opt_str in opt._long_opts + opt._short_opts: - options.append((opt_str, opt.nargs)) - - # filter out previously specified options from available options - prev_opts = [x.split('=')[0] for x in cwords[1:cword - 1]] - options = [(x, v) for (x, v) in options if x not in prev_opts] - # filter options by current input - options = [(k, v) for k, v in options if k.startswith(current)] - # get completion type given cwords and available subcommand options - completion_type = get_path_completion_type( - cwords, cword, subcommand.parser.option_list_all, - ) - # get completion files and directories if ``completion_type`` is - # ````, ```` or ```` - if completion_type: - options = auto_complete_paths(current, completion_type) - options = ((opt, 0) for opt in options) - for option in options: - opt_label = option[0] - # append '=' to options which require args - if option[1] and option[0][:2] == "--": - opt_label += '=' - print(opt_label) - else: - # show main parser options only when necessary - - opts = [i.option_list for i in parser.option_groups] - opts.append(parser.option_list) - opts = (o for it in opts for o in it) - if current.startswith('-'): - for opt in opts: - if opt.help != optparse.SUPPRESS_HELP: - subcommands += opt._long_opts + opt._short_opts - else: - # get completion type given cwords and all available options - completion_type = get_path_completion_type(cwords, cword, opts) - if completion_type: - subcommands = auto_complete_paths(current, completion_type) - - print(' '.join([x for x in subcommands if x.startswith(current)])) - sys.exit(1) - - -def get_path_completion_type(cwords, cword, opts): - """Get the type of path completion (``file``, ``dir``, ``path`` or None) - - :param cwords: same as the environmental variable ``COMP_WORDS`` - :param cword: same as the environmental variable ``COMP_CWORD`` - :param opts: The available options to check - :return: path completion type (``file``, ``dir``, ``path`` or None) - """ - if cword < 2 or not cwords[cword - 2].startswith('-'): - return - for opt in opts: - if opt.help == optparse.SUPPRESS_HELP: - continue - for o in str(opt).split('/'): - if cwords[cword - 2].split('=')[0] == o: - if not opt.metavar or any( - x in ('path', 'file', 'dir') - for x in opt.metavar.split('/')): - return opt.metavar - - -def auto_complete_paths(current, completion_type): - """If ``completion_type`` is ``file`` or ``path``, list all regular files - and directories starting with ``current``; otherwise only list directories - starting with ``current``. - - :param current: The word to be completed - :param completion_type: path completion type(`file`, `path` or `dir`)i - :return: A generator of regular files and/or directories - """ - directory, filename = os.path.split(current) - current_path = os.path.abspath(directory) - # Don't complete paths if they can't be accessed - if not os.access(current_path, os.R_OK): - return - filename = os.path.normcase(filename) - # list all files that start with ``filename`` - file_list = (x for x in os.listdir(current_path) - if os.path.normcase(x).startswith(filename)) - for f in file_list: - opt = os.path.join(current_path, f) - comp_file = os.path.normcase(os.path.join(directory, f)) - # complete regular files when there is not ```` after option - # complete directories when there is ````, ```` or - # ````after option - if completion_type != 'dir' and os.path.isfile(opt): - yield comp_file - elif os.path.isdir(opt): - yield os.path.join(comp_file, '') diff --git a/venv/lib/python2.7/site-packages/pip/_internal/cli/autocompletion.pyc b/venv/lib/python2.7/site-packages/pip/_internal/cli/autocompletion.pyc deleted file mode 100644 index 7336b63041b6e75f21cc3aead2e339f3484eff44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5912 zcmd5=UvnE*6+d@ZR%FMH6FZKrCQUaXP_@)nGVP?0meLZXNruGntWyl8Vzu5~+bgej z<-6-xYNcVAFchZ469X?9z6R4rJ^(NDg{MC933y?q59N2xu4OwZGw_tk+UvXb&-s6U z=Ukcpnwog^SErgD6(0lt-^G*u5{*x^j#iOxP^4%boxE?*x^d7qY2B2*Nl}S9W3)a- zir1AWDpThKt)HMyh1M(i=om%g)S0053A~r-*I;py{1eidB)=k^DdxCZ8)rd&gyvqd z6?#^-?PgXt*$;GTxqDgSC7o^*WML9pVVq`e6a~Ju(YIQyZrHUBXIrhMiSR3YmTL;c zvKcg<4%{qoI&K&{U00`puCeOb6wf7{jvM=_ zn(1(3j|ED_pf6y}7@nJW(zi=u%8aP3Xy*j!Sy3{7_f4v{4SI|vC38jjPT zLi&9ZEgZRHkTz9Tq4qdy1tnArUYMI@4#@>IFsMC2{z;yj98S;xihQP6vXjJfm_UD$ zdJiZ=Y)rCy9+PS`-=X0Y4W_7liU|xRnSj2n@)2mmMr0FX=p?nLi=`~V?rr|AVHlix zvxH8gd9omP`_As4)Y>tLcRypHv(qehm8CgFy>%LZ?-^>(VDCK|g8nqMXDK^N?K#>p zNq??-*JSXVwDUCIXkMTpsFXz>Pxk@`?F}iKya8* zgwdZGgR@8We9C*WY7u%P#UCS}=4dcS`rk(O0`EotF#@7Y{wcz#W*(3g@33F*suG^> z(hwFomq*mR^h#9KH_T$ppC-#cEs=wBF*>2xC7KMU_XBkC) zh~`$D>Atm+gmGqVCi)1{S;?lwkY)kCtaNXqKr$=o3Meg2SomaTKx5_Ziu2wF4<9%; zAKYKLckAJ;xcCJzFUh(d0FIz-z+)Rj)Uo$O}})_ZXQhZ*l) z6p~Tmxsj8^QC|js;PDh=t%)b)hoKaQwu#_X68FRb`xCV*d1Y0AS-39Ou#$41W(rGJ z0h2_~E}!7plu6dRI(!6tuRn5ieKU!Cq>TDUy?Xz3y%F#4T)Vy-U%js1xbA%~?S0?> zNMFTgt6P6qN8(s4R9MWe-QRLnct{=~eHQ50jp|+$){p0(rEWiE{omdS;-J^n@7!le zSi~}g{7?Fei=sP=JktF#URZaaujnpdgu^8IPZ67dkO|plh4#GFK7}S@!eJ&>O}=Rc z_!(p?3?Kqp;WBLp@Fu0k)K;_R51x;9KNwHBTt0oQY!b`2*YePzK8_24k|5S+Y=gH9X!fS z$sT(oGdm*C(>7#h=3>i6CKb6GK_pv3;f=BM`JX1#JGr+D4FWDq(;gZsO{?Caw1V%$U|_{*g;j)S;+>fnRM?a{YbUtxK7Z@p;57GGKeGC>k5hrqr$n zyg(dNC~m>IOw|GEUlf|25G~VW`WKFp{6fKeP;iYXVGF+cuf^KcU61fx1M@YOvBt+Z zy@wdO9b~v|1Qwq=&Z&GJkEYpLtF;+ML96u|E*pNR^A4|SwJc<0Mx$3IB-`EqD7YOf zKX5m!6vx7HQ=wj z0`P9RC&Z8UmQ@tWw|VH^abCvQSE+wFoQcmJ~J8t zH((m>&{7tDOjx_ds)(P{1a`T*3EX%p+qGI&m|{4GD#j)JG9noDn#J{th5E(P!PZ{n zYD>ZaeyF@l!H8%2b)IFr~=Op>w2z=Z7%QZ z_t8i-87I2qxoIHBUux$gkj1=Z6+4X!tr`ZtAvd4jvm~rgnM`HhLC5BbzQzgQP{%{$ zayL@Ja;_>|&kNGLa<`oaKeq2-OyG^96)v#9%LBYJOj&iQU&9nLIaDrT#^xKc6n6(c z>q{+FM6J}!GR*{}AeF4Nnb((miQ`k`@T^!>u3q+ij6biNrOk5SCqYWNe5dgRlw)%M z%o*b)V@l1bOQnmd0`RQKrI3y7IDX9!-A4KIsl;64drgD4{e)o*hrB0Z7HlGQ*!42cQ$e-I1Z+Z54Ubd7|^L8ik_oCn( YPB1C|7|bOz{*2QomQS1GKOdj_4?W*=S^xk5 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/cli/base_command.py b/venv/lib/python2.7/site-packages/pip/_internal/cli/base_command.py deleted file mode 100644 index f6108c9..0000000 --- a/venv/lib/python2.7/site-packages/pip/_internal/cli/base_command.py +++ /dev/null @@ -1,340 +0,0 @@ -"""Base Command class, and related routines""" -from __future__ import absolute_import, print_function - -import logging -import logging.config -import optparse -import os -import platform -import sys -import traceback - -from pip._internal.cli import cmdoptions -from pip._internal.cli.parser import ( - ConfigOptionParser, UpdatingDefaultsHelpFormatter, -) -from pip._internal.cli.status_codes import ( - ERROR, PREVIOUS_BUILD_DIR_ERROR, SUCCESS, UNKNOWN_ERROR, - VIRTUALENV_NOT_FOUND, -) -from pip._internal.download import PipSession -from pip._internal.exceptions import ( - BadCommand, CommandError, InstallationError, PreviousBuildDirError, - UninstallationError, -) -from pip._internal.index import PackageFinder -from pip._internal.locations import running_under_virtualenv -from pip._internal.req.constructors import ( - install_req_from_editable, install_req_from_line, -) -from pip._internal.req.req_file import parse_requirements -from pip._internal.utils.deprecation import deprecated -from pip._internal.utils.logging import BrokenStdoutLoggingError, setup_logging -from pip._internal.utils.misc import ( - get_prog, normalize_path, redact_password_from_url, -) -from pip._internal.utils.outdated import pip_version_check -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import Optional, List, Tuple, Any - from optparse import Values - from pip._internal.cache import WheelCache - from pip._internal.req.req_set import RequirementSet - -__all__ = ['Command'] - -logger = logging.getLogger(__name__) - - -class Command(object): - name = None # type: Optional[str] - usage = None # type: Optional[str] - ignore_require_venv = False # type: bool - - def __init__(self, isolated=False): - # type: (bool) -> None - parser_kw = { - 'usage': self.usage, - 'prog': '%s %s' % (get_prog(), self.name), - 'formatter': UpdatingDefaultsHelpFormatter(), - 'add_help_option': False, - 'name': self.name, - 'description': self.__doc__, - 'isolated': isolated, - } - - self.parser = ConfigOptionParser(**parser_kw) - - # Commands should add options to this option group - optgroup_name = '%s Options' % self.name.capitalize() - self.cmd_opts = optparse.OptionGroup(self.parser, optgroup_name) - - # Add the general options - gen_opts = cmdoptions.make_option_group( - cmdoptions.general_group, - self.parser, - ) - self.parser.add_option_group(gen_opts) - - def run(self, options, args): - # type: (Values, List[Any]) -> Any - raise NotImplementedError - - def _build_session(self, options, retries=None, timeout=None): - # type: (Values, Optional[int], Optional[int]) -> PipSession - session = PipSession( - cache=( - normalize_path(os.path.join(options.cache_dir, "http")) - if options.cache_dir else None - ), - retries=retries if retries is not None else options.retries, - insecure_hosts=options.trusted_hosts, - ) - - # Handle custom ca-bundles from the user - if options.cert: - session.verify = options.cert - - # Handle SSL client certificate - if options.client_cert: - session.cert = options.client_cert - - # Handle timeouts - if options.timeout or timeout: - session.timeout = ( - timeout if timeout is not None else options.timeout - ) - - # Handle configured proxies - if options.proxy: - session.proxies = { - "http": options.proxy, - "https": options.proxy, - } - - # Determine if we can prompt the user for authentication or not - session.auth.prompting = not options.no_input - - return session - - def parse_args(self, args): - # type: (List[str]) -> Tuple - # factored out for testability - return self.parser.parse_args(args) - - def main(self, args): - # type: (List[str]) -> int - options, args = self.parse_args(args) - - # Set verbosity so that it can be used elsewhere. - self.verbosity = options.verbose - options.quiet - - level_number = setup_logging( - verbosity=self.verbosity, - no_color=options.no_color, - user_log_file=options.log, - ) - - if sys.version_info[:2] == (3, 4): - deprecated( - "Python 3.4 support has been deprecated. pip 19.1 will be the " - "last one supporting it. Please upgrade your Python as Python " - "3.4 won't be maintained after March 2019 (cf PEP 429).", - replacement=None, - gone_in='19.2', - ) - elif sys.version_info[:2] == (2, 7): - message = ( - "A future version of pip will drop support for Python 2.7." - ) - if platform.python_implementation() == "CPython": - message = ( - "Python 2.7 will reach the end of its life on January " - "1st, 2020. Please upgrade your Python as Python 2.7 " - "won't be maintained after that date. " - ) + message - deprecated(message, replacement=None, gone_in=None) - - # TODO: Try to get these passing down from the command? - # without resorting to os.environ to hold these. - # This also affects isolated builds and it should. - - if options.no_input: - os.environ['PIP_NO_INPUT'] = '1' - - if options.exists_action: - os.environ['PIP_EXISTS_ACTION'] = ' '.join(options.exists_action) - - if options.require_venv and not self.ignore_require_venv: - # If a venv is required check if it can really be found - if not running_under_virtualenv(): - logger.critical( - 'Could not find an activated virtualenv (required).' - ) - sys.exit(VIRTUALENV_NOT_FOUND) - - try: - status = self.run(options, args) - # FIXME: all commands should return an exit status - # and when it is done, isinstance is not needed anymore - if isinstance(status, int): - return status - except PreviousBuildDirError as exc: - logger.critical(str(exc)) - logger.debug('Exception information:', exc_info=True) - - return PREVIOUS_BUILD_DIR_ERROR - except (InstallationError, UninstallationError, BadCommand) as exc: - logger.critical(str(exc)) - logger.debug('Exception information:', exc_info=True) - - return ERROR - except CommandError as exc: - logger.critical('%s', exc) - logger.debug('Exception information:', exc_info=True) - - return ERROR - except BrokenStdoutLoggingError: - # Bypass our logger and write any remaining messages to stderr - # because stdout no longer works. - print('ERROR: Pipe to stdout was broken', file=sys.stderr) - if level_number <= logging.DEBUG: - traceback.print_exc(file=sys.stderr) - - return ERROR - except KeyboardInterrupt: - logger.critical('Operation cancelled by user') - logger.debug('Exception information:', exc_info=True) - - return ERROR - except BaseException: - logger.critical('Exception:', exc_info=True) - - return UNKNOWN_ERROR - finally: - allow_version_check = ( - # Does this command have the index_group options? - hasattr(options, "no_index") and - # Is this command allowed to perform this check? - not (options.disable_pip_version_check or options.no_index) - ) - # Check if we're using the latest version of pip available - if allow_version_check: - session = self._build_session( - options, - retries=0, - timeout=min(5, options.timeout) - ) - with session: - pip_version_check(session, options) - - # Shutdown the logging module - logging.shutdown() - - return SUCCESS - - -class RequirementCommand(Command): - - @staticmethod - def populate_requirement_set(requirement_set, # type: RequirementSet - args, # type: List[str] - options, # type: Values - finder, # type: PackageFinder - session, # type: PipSession - name, # type: str - wheel_cache # type: Optional[WheelCache] - ): - # type: (...) -> None - """ - Marshal cmd line args into a requirement set. - """ - # NOTE: As a side-effect, options.require_hashes and - # requirement_set.require_hashes may be updated - - for filename in options.constraints: - for req_to_add in parse_requirements( - filename, - constraint=True, finder=finder, options=options, - session=session, wheel_cache=wheel_cache): - req_to_add.is_direct = True - requirement_set.add_requirement(req_to_add) - - for req in args: - req_to_add = install_req_from_line( - req, None, isolated=options.isolated_mode, - use_pep517=options.use_pep517, - wheel_cache=wheel_cache - ) - req_to_add.is_direct = True - requirement_set.add_requirement(req_to_add) - - for req in options.editables: - req_to_add = install_req_from_editable( - req, - isolated=options.isolated_mode, - use_pep517=options.use_pep517, - wheel_cache=wheel_cache - ) - req_to_add.is_direct = True - requirement_set.add_requirement(req_to_add) - - for filename in options.requirements: - for req_to_add in parse_requirements( - filename, - finder=finder, options=options, session=session, - wheel_cache=wheel_cache, - use_pep517=options.use_pep517): - req_to_add.is_direct = True - requirement_set.add_requirement(req_to_add) - # If --require-hashes was a line in a requirements file, tell - # RequirementSet about it: - requirement_set.require_hashes = options.require_hashes - - if not (args or options.editables or options.requirements): - opts = {'name': name} - if options.find_links: - raise CommandError( - 'You must give at least one requirement to %(name)s ' - '(maybe you meant "pip %(name)s %(links)s"?)' % - dict(opts, links=' '.join(options.find_links))) - else: - raise CommandError( - 'You must give at least one requirement to %(name)s ' - '(see "pip help %(name)s")' % opts) - - def _build_package_finder( - self, - options, # type: Values - session, # type: PipSession - platform=None, # type: Optional[str] - python_versions=None, # type: Optional[List[str]] - abi=None, # type: Optional[str] - implementation=None # type: Optional[str] - ): - # type: (...) -> PackageFinder - """ - Create a package finder appropriate to this requirement command. - """ - index_urls = [options.index_url] + options.extra_index_urls - if options.no_index: - logger.debug( - 'Ignoring indexes: %s', - ','.join(redact_password_from_url(url) for url in index_urls), - ) - index_urls = [] - - return PackageFinder( - find_links=options.find_links, - format_control=options.format_control, - index_urls=index_urls, - trusted_hosts=options.trusted_hosts, - allow_all_prereleases=options.pre, - session=session, - platform=platform, - versions=python_versions, - abi=abi, - implementation=implementation, - prefer_binary=options.prefer_binary, - ) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/cli/base_command.pyc b/venv/lib/python2.7/site-packages/pip/_internal/cli/base_command.pyc deleted file mode 100644 index 72caf2e63836ce28effd8a5cf9f861394d11d303..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10137 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 Pj4@3gY>YLJ{ndX0Yp_Fg diff --git a/venv/lib/python2.7/site-packages/pip/_internal/cli/cmdoptions.py b/venv/lib/python2.7/site-packages/pip/_internal/cli/cmdoptions.py deleted file mode 100644 index a09e38f..0000000 --- a/venv/lib/python2.7/site-packages/pip/_internal/cli/cmdoptions.py +++ /dev/null @@ -1,809 +0,0 @@ -""" -shared options and groups - -The principle here is to define options once, but *not* instantiate them -globally. One reason being that options with action='append' can carry state -between parses. pip parses general options twice internally, and shouldn't -pass on state. To be consistent, all options will follow this design. - -""" -from __future__ import absolute_import - -import textwrap -import warnings -from distutils.util import strtobool -from functools import partial -from optparse import SUPPRESS_HELP, Option, OptionGroup - -from pip._internal.exceptions import CommandError -from pip._internal.locations import USER_CACHE_DIR, src_prefix -from pip._internal.models.format_control import FormatControl -from pip._internal.models.index import PyPI -from pip._internal.utils.hashes import STRONG_HASHES -from pip._internal.utils.typing import MYPY_CHECK_RUNNING -from pip._internal.utils.ui import BAR_TYPES - -if MYPY_CHECK_RUNNING: - from typing import Any, Callable, Dict, Optional - from optparse import OptionParser, Values - from pip._internal.cli.parser import ConfigOptionParser - - -def raise_option_error(parser, option, msg): - """ - Raise an option parsing error using parser.error(). - - Args: - parser: an OptionParser instance. - option: an Option instance. - msg: the error text. - """ - msg = '{} error: {}'.format(option, msg) - msg = textwrap.fill(' '.join(msg.split())) - parser.error(msg) - - -def make_option_group(group, parser): - # type: (Dict[str, Any], ConfigOptionParser) -> OptionGroup - """ - Return an OptionGroup object - group -- assumed to be dict with 'name' and 'options' keys - parser -- an optparse Parser - """ - option_group = OptionGroup(parser, group['name']) - for option in group['options']: - option_group.add_option(option()) - return option_group - - -def check_install_build_global(options, check_options=None): - # type: (Values, Optional[Values]) -> None - """Disable wheels if per-setup.py call options are set. - - :param options: The OptionParser options to update. - :param check_options: The options to check, if not supplied defaults to - options. - """ - if check_options is None: - check_options = options - - def getname(n): - return getattr(check_options, n, None) - names = ["build_options", "global_options", "install_options"] - if any(map(getname, names)): - control = options.format_control - control.disallow_binaries() - warnings.warn( - 'Disabling all use of wheels due to the use of --build-options ' - '/ --global-options / --install-options.', stacklevel=2, - ) - - -def check_dist_restriction(options, check_target=False): - # type: (Values, bool) -> None - """Function for determining if custom platform options are allowed. - - :param options: The OptionParser options. - :param check_target: Whether or not to check if --target is being used. - """ - dist_restriction_set = any([ - options.python_version, - options.platform, - options.abi, - options.implementation, - ]) - - binary_only = FormatControl(set(), {':all:'}) - sdist_dependencies_allowed = ( - options.format_control != binary_only and - not options.ignore_dependencies - ) - - # Installations or downloads using dist restrictions must not combine - # source distributions and dist-specific wheels, as they are not - # guaranteed to be locally compatible. - if dist_restriction_set and sdist_dependencies_allowed: - raise CommandError( - "When restricting platform and interpreter constraints using " - "--python-version, --platform, --abi, or --implementation, " - "either --no-deps must be set, or --only-binary=:all: must be " - "set and --no-binary must not be set (or must be set to " - ":none:)." - ) - - if check_target: - if dist_restriction_set and not options.target_dir: - raise CommandError( - "Can not use any platform or abi specific options unless " - "installing via '--target'" - ) - - -########### -# options # -########### - -help_ = partial( - Option, - '-h', '--help', - dest='help', - action='help', - help='Show help.', -) # type: Callable[..., Option] - -isolated_mode = partial( - Option, - "--isolated", - dest="isolated_mode", - action="store_true", - default=False, - help=( - "Run pip in an isolated mode, ignoring environment variables and user " - "configuration." - ), -) # type: Callable[..., Option] - -require_virtualenv = partial( - Option, - # Run only if inside a virtualenv, bail if not. - '--require-virtualenv', '--require-venv', - dest='require_venv', - action='store_true', - default=False, - help=SUPPRESS_HELP -) # type: Callable[..., Option] - -verbose = partial( - Option, - '-v', '--verbose', - dest='verbose', - action='count', - default=0, - help='Give more output. Option is additive, and can be used up to 3 times.' -) # type: Callable[..., Option] - -no_color = partial( - Option, - '--no-color', - dest='no_color', - action='store_true', - default=False, - help="Suppress colored output", -) # type: Callable[..., Option] - -version = partial( - Option, - '-V', '--version', - dest='version', - action='store_true', - help='Show version and exit.', -) # type: Callable[..., Option] - -quiet = partial( - Option, - '-q', '--quiet', - dest='quiet', - action='count', - default=0, - help=( - 'Give less output. Option is additive, and can be used up to 3' - ' times (corresponding to WARNING, ERROR, and CRITICAL logging' - ' levels).' - ), -) # type: Callable[..., Option] - -progress_bar = partial( - Option, - '--progress-bar', - dest='progress_bar', - type='choice', - choices=list(BAR_TYPES.keys()), - default='on', - help=( - 'Specify type of progress to be displayed [' + - '|'.join(BAR_TYPES.keys()) + '] (default: %default)' - ), -) # type: Callable[..., Option] - -log = partial( - Option, - "--log", "--log-file", "--local-log", - dest="log", - metavar="path", - help="Path to a verbose appending log." -) # type: Callable[..., Option] - -no_input = partial( - Option, - # Don't ask for input - '--no-input', - dest='no_input', - action='store_true', - default=False, - help=SUPPRESS_HELP -) # type: Callable[..., Option] - -proxy = partial( - Option, - '--proxy', - dest='proxy', - type='str', - default='', - help="Specify a proxy in the form [user:passwd@]proxy.server:port." -) # type: Callable[..., Option] - -retries = partial( - Option, - '--retries', - dest='retries', - type='int', - default=5, - help="Maximum number of retries each connection should attempt " - "(default %default times).", -) # type: Callable[..., Option] - -timeout = partial( - Option, - '--timeout', '--default-timeout', - metavar='sec', - dest='timeout', - type='float', - default=15, - help='Set the socket timeout (default %default seconds).', -) # type: Callable[..., Option] - -skip_requirements_regex = partial( - Option, - # A regex to be used to skip requirements - '--skip-requirements-regex', - dest='skip_requirements_regex', - type='str', - default='', - help=SUPPRESS_HELP, -) # type: Callable[..., Option] - - -def exists_action(): - # type: () -> Option - return Option( - # Option when path already exist - '--exists-action', - dest='exists_action', - type='choice', - choices=['s', 'i', 'w', 'b', 'a'], - default=[], - action='append', - metavar='action', - help="Default action when a path already exists: " - "(s)witch, (i)gnore, (w)ipe, (b)ackup, (a)bort.", - ) - - -cert = partial( - Option, - '--cert', - dest='cert', - type='str', - metavar='path', - help="Path to alternate CA bundle.", -) # type: Callable[..., Option] - -client_cert = partial( - Option, - '--client-cert', - dest='client_cert', - type='str', - default=None, - metavar='path', - help="Path to SSL client certificate, a single file containing the " - "private key and the certificate in PEM format.", -) # type: Callable[..., Option] - -index_url = partial( - Option, - '-i', '--index-url', '--pypi-url', - dest='index_url', - metavar='URL', - default=PyPI.simple_url, - help="Base URL of Python Package Index (default %default). " - "This should point to a repository compliant with PEP 503 " - "(the simple repository API) or a local directory laid out " - "in the same format.", -) # type: Callable[..., Option] - - -def extra_index_url(): - return Option( - '--extra-index-url', - dest='extra_index_urls', - metavar='URL', - action='append', - default=[], - help="Extra URLs of package indexes to use in addition to " - "--index-url. Should follow the same rules as " - "--index-url.", - ) - - -no_index = partial( - Option, - '--no-index', - dest='no_index', - action='store_true', - default=False, - help='Ignore package index (only looking at --find-links URLs instead).', -) # type: Callable[..., Option] - - -def find_links(): - # type: () -> Option - return Option( - '-f', '--find-links', - dest='find_links', - action='append', - default=[], - metavar='url', - help="If a url or path to an html file, then parse for links to " - "archives. If a local path or file:// url that's a directory, " - "then look for archives in the directory listing.", - ) - - -def trusted_host(): - # type: () -> Option - return Option( - "--trusted-host", - dest="trusted_hosts", - action="append", - metavar="HOSTNAME", - default=[], - help="Mark this host as trusted, even though it does not have valid " - "or any HTTPS.", - ) - - -def constraints(): - # type: () -> Option - return Option( - '-c', '--constraint', - dest='constraints', - action='append', - default=[], - metavar='file', - help='Constrain versions using the given constraints file. ' - 'This option can be used multiple times.' - ) - - -def requirements(): - # type: () -> Option - return Option( - '-r', '--requirement', - dest='requirements', - action='append', - default=[], - metavar='file', - help='Install from the given requirements file. ' - 'This option can be used multiple times.' - ) - - -def editable(): - # type: () -> Option - return Option( - '-e', '--editable', - dest='editables', - action='append', - default=[], - metavar='path/url', - help=('Install a project in editable mode (i.e. setuptools ' - '"develop mode") from a local project path or a VCS url.'), - ) - - -src = partial( - Option, - '--src', '--source', '--source-dir', '--source-directory', - dest='src_dir', - metavar='dir', - default=src_prefix, - help='Directory to check out editable projects into. ' - 'The default in a virtualenv is "/src". ' - 'The default for global installs is "/src".' -) # type: Callable[..., Option] - - -def _get_format_control(values, option): - # type: (Values, Option) -> Any - """Get a format_control object.""" - return getattr(values, option.dest) - - -def _handle_no_binary(option, opt_str, value, parser): - # type: (Option, str, str, OptionParser) -> None - existing = _get_format_control(parser.values, option) - FormatControl.handle_mutual_excludes( - value, existing.no_binary, existing.only_binary, - ) - - -def _handle_only_binary(option, opt_str, value, parser): - # type: (Option, str, str, OptionParser) -> None - existing = _get_format_control(parser.values, option) - FormatControl.handle_mutual_excludes( - value, existing.only_binary, existing.no_binary, - ) - - -def no_binary(): - # type: () -> Option - format_control = FormatControl(set(), set()) - return Option( - "--no-binary", dest="format_control", action="callback", - callback=_handle_no_binary, type="str", - default=format_control, - help="Do not use binary packages. Can be supplied multiple times, and " - "each time adds to the existing value. Accepts either :all: to " - "disable all binary packages, :none: to empty the set, or one or " - "more package names with commas between them. Note that some " - "packages are tricky to compile and may fail to install when " - "this option is used on them.", - ) - - -def only_binary(): - # type: () -> Option - format_control = FormatControl(set(), set()) - return Option( - "--only-binary", dest="format_control", action="callback", - callback=_handle_only_binary, type="str", - default=format_control, - help="Do not use source packages. Can be supplied multiple times, and " - "each time adds to the existing value. Accepts either :all: to " - "disable all source packages, :none: to empty the set, or one or " - "more package names with commas between them. Packages without " - "binary distributions will fail to install when this option is " - "used on them.", - ) - - -platform = partial( - Option, - '--platform', - dest='platform', - metavar='platform', - default=None, - help=("Only use wheels compatible with . " - "Defaults to the platform of the running system."), -) # type: Callable[..., Option] - - -python_version = partial( - Option, - '--python-version', - dest='python_version', - metavar='python_version', - default=None, - help=("Only use wheels compatible with Python " - "interpreter version . If not specified, then the " - "current system interpreter minor version is used. A major " - "version (e.g. '2') can be specified to match all " - "minor revs of that major version. A minor version " - "(e.g. '34') can also be specified."), -) # type: Callable[..., Option] - - -implementation = partial( - Option, - '--implementation', - dest='implementation', - metavar='implementation', - default=None, - help=("Only use wheels compatible with Python " - "implementation , e.g. 'pp', 'jy', 'cp', " - " or 'ip'. If not specified, then the current " - "interpreter implementation is used. Use 'py' to force " - "implementation-agnostic wheels."), -) # type: Callable[..., Option] - - -abi = partial( - Option, - '--abi', - dest='abi', - metavar='abi', - default=None, - help=("Only use wheels compatible with Python " - "abi , e.g. 'pypy_41'. If not specified, then the " - "current interpreter abi tag is used. Generally " - "you will need to specify --implementation, " - "--platform, and --python-version when using " - "this option."), -) # type: Callable[..., Option] - - -def prefer_binary(): - # type: () -> Option - return Option( - "--prefer-binary", - dest="prefer_binary", - action="store_true", - default=False, - help="Prefer older binary packages over newer source packages." - ) - - -cache_dir = partial( - Option, - "--cache-dir", - dest="cache_dir", - default=USER_CACHE_DIR, - metavar="dir", - help="Store the cache data in ." -) # type: Callable[..., Option] - - -def no_cache_dir_callback(option, opt, value, parser): - """ - Process a value provided for the --no-cache-dir option. - - This is an optparse.Option callback for the --no-cache-dir option. - """ - # The value argument will be None if --no-cache-dir is passed via the - # command-line, since the option doesn't accept arguments. However, - # the value can be non-None if the option is triggered e.g. by an - # environment variable, like PIP_NO_CACHE_DIR=true. - if value is not None: - # Then parse the string value to get argument error-checking. - try: - strtobool(value) - except ValueError as exc: - raise_option_error(parser, option=option, msg=str(exc)) - - # Originally, setting PIP_NO_CACHE_DIR to a value that strtobool() - # converted to 0 (like "false" or "no") caused cache_dir to be disabled - # rather than enabled (logic would say the latter). Thus, we disable - # the cache directory not just on values that parse to True, but (for - # backwards compatibility reasons) also on values that parse to False. - # In other words, always set it to False if the option is provided in - # some (valid) form. - parser.values.cache_dir = False - - -no_cache = partial( - Option, - "--no-cache-dir", - dest="cache_dir", - action="callback", - callback=no_cache_dir_callback, - help="Disable the cache.", -) # type: Callable[..., Option] - -no_deps = partial( - Option, - '--no-deps', '--no-dependencies', - dest='ignore_dependencies', - action='store_true', - default=False, - help="Don't install package dependencies.", -) # type: Callable[..., Option] - -build_dir = partial( - Option, - '-b', '--build', '--build-dir', '--build-directory', - dest='build_dir', - metavar='dir', - help='Directory to unpack packages into and build in. Note that ' - 'an initial build still takes place in a temporary directory. ' - 'The location of temporary directories can be controlled by setting ' - 'the TMPDIR environment variable (TEMP on Windows) appropriately. ' - 'When passed, build directories are not cleaned in case of failures.' -) # type: Callable[..., Option] - -ignore_requires_python = partial( - Option, - '--ignore-requires-python', - dest='ignore_requires_python', - action='store_true', - help='Ignore the Requires-Python information.' -) # type: Callable[..., Option] - -no_build_isolation = partial( - Option, - '--no-build-isolation', - dest='build_isolation', - action='store_false', - default=True, - help='Disable isolation when building a modern source distribution. ' - 'Build dependencies specified by PEP 518 must be already installed ' - 'if this option is used.' -) # type: Callable[..., Option] - - -def no_use_pep517_callback(option, opt, value, parser): - """ - Process a value provided for the --no-use-pep517 option. - - This is an optparse.Option callback for the no_use_pep517 option. - """ - # Since --no-use-pep517 doesn't accept arguments, the value argument - # will be None if --no-use-pep517 is passed via the command-line. - # However, the value can be non-None if the option is triggered e.g. - # by an environment variable, for example "PIP_NO_USE_PEP517=true". - if value is not None: - msg = """A value was passed for --no-use-pep517, - probably using either the PIP_NO_USE_PEP517 environment variable - or the "no-use-pep517" config file option. Use an appropriate value - of the PIP_USE_PEP517 environment variable or the "use-pep517" - config file option instead. - """ - raise_option_error(parser, option=option, msg=msg) - - # Otherwise, --no-use-pep517 was passed via the command-line. - parser.values.use_pep517 = False - - -use_pep517 = partial( - Option, - '--use-pep517', - dest='use_pep517', - action='store_true', - default=None, - help='Use PEP 517 for building source distributions ' - '(use --no-use-pep517 to force legacy behaviour).' -) # type: Any - -no_use_pep517 = partial( - Option, - '--no-use-pep517', - dest='use_pep517', - action='callback', - callback=no_use_pep517_callback, - default=None, - help=SUPPRESS_HELP -) # type: Any - -install_options = partial( - Option, - '--install-option', - dest='install_options', - action='append', - metavar='options', - help="Extra arguments to be supplied to the setup.py install " - "command (use like --install-option=\"--install-scripts=/usr/local/" - "bin\"). Use multiple --install-option options to pass multiple " - "options to setup.py install. If you are using an option with a " - "directory path, be sure to use absolute path.", -) # type: Callable[..., Option] - -global_options = partial( - Option, - '--global-option', - dest='global_options', - action='append', - metavar='options', - help="Extra global options to be supplied to the setup.py " - "call before the install command.", -) # type: Callable[..., Option] - -no_clean = partial( - Option, - '--no-clean', - action='store_true', - default=False, - help="Don't clean up build directories." -) # type: Callable[..., Option] - -pre = partial( - Option, - '--pre', - action='store_true', - default=False, - help="Include pre-release and development versions. By default, " - "pip only finds stable versions.", -) # type: Callable[..., Option] - -disable_pip_version_check = partial( - Option, - "--disable-pip-version-check", - dest="disable_pip_version_check", - action="store_true", - default=False, - help="Don't periodically check PyPI to determine whether a new version " - "of pip is available for download. Implied with --no-index.", -) # type: Callable[..., Option] - - -# Deprecated, Remove later -always_unzip = partial( - Option, - '-Z', '--always-unzip', - dest='always_unzip', - action='store_true', - help=SUPPRESS_HELP, -) # type: Callable[..., Option] - - -def _merge_hash(option, opt_str, value, parser): - # type: (Option, str, str, OptionParser) -> None - """Given a value spelled "algo:digest", append the digest to a list - pointed to in a dict by the algo name.""" - if not parser.values.hashes: - parser.values.hashes = {} - try: - algo, digest = value.split(':', 1) - except ValueError: - parser.error('Arguments to %s must be a hash name ' - 'followed by a value, like --hash=sha256:abcde...' % - opt_str) - if algo not in STRONG_HASHES: - parser.error('Allowed hash algorithms for %s are %s.' % - (opt_str, ', '.join(STRONG_HASHES))) - parser.values.hashes.setdefault(algo, []).append(digest) - - -hash = partial( - Option, - '--hash', - # Hash values eventually end up in InstallRequirement.hashes due to - # __dict__ copying in process_line(). - dest='hashes', - action='callback', - callback=_merge_hash, - type='string', - help="Verify that the package's archive matches this " - 'hash before installing. Example: --hash=sha256:abcdef...', -) # type: Callable[..., Option] - - -require_hashes = partial( - Option, - '--require-hashes', - dest='require_hashes', - action='store_true', - default=False, - help='Require a hash to check each requirement against, for ' - 'repeatable installs. This option is implied when any package in a ' - 'requirements file has a --hash option.', -) # type: Callable[..., Option] - - -########## -# groups # -########## - -general_group = { - 'name': 'General Options', - 'options': [ - help_, - isolated_mode, - require_virtualenv, - verbose, - version, - quiet, - log, - no_input, - proxy, - retries, - timeout, - skip_requirements_regex, - exists_action, - trusted_host, - cert, - client_cert, - cache_dir, - no_cache, - disable_pip_version_check, - no_color, - ] -} # type: Dict[str, Any] - -index_group = { - 'name': 'Package Index Options', - 'options': [ - index_url, - extra_index_url, - no_index, - find_links, - ] -} # type: Dict[str, Any] diff --git a/venv/lib/python2.7/site-packages/pip/_internal/cli/cmdoptions.pyc b/venv/lib/python2.7/site-packages/pip/_internal/cli/cmdoptions.pyc deleted file mode 100644 index b63981ebbd9cab856cd3b368b8addec0c8023138..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21201 zcmdU1>0=$$b-zzfmMtN#V2oJ@5h9uBJz*9D!geiWW2<0U8F_&R#C|Rr3y2yF-)D}_J5}>8Rl7?y?^dT_e+U~+tt-_x%MFkbB6%jDFAn=@NVe`VE3r2 z1B10m2j;2pUV$9j3>l4}!@*j`LEfjr4+tdYi9s>RyJhpx=eR&t9pr?7VcG!e9r^(o zddh))NQILES#gl)sw%5^(7{Zp@Iiq&c+H>>$)E=vqabsXglYJFLPZDm*H^{)!5Zsc=TVeo9>( zEY}V>uvq~(?pEN?OymL0n1$J~69V?M%V^8)sS z13RO_1)0)^1>P6aQsE`(JeT=sna^&S zOrfrB8LVNC+VbI?3NOn8HfUWQut!(q0o$}852sz{uSlOCl|E4#v|xd+%7o_~*lPmz zF#$u_0sFXsopE5F5U|$;3}pxG4FOwlU{?j~O#wsM0sEwYflfXplk^?@TLS-SLPopf zD=Z(Ad|Ti_OP>+=vkv~V4jw%HIsO+JO8Yf|Kj*+cufi_~b z;g?nTj=+DVXAWNl^2@ag4)SXP@O9TACix8vTCP3k0De;dz9|5|B`X2}1MFKeH<0mf z%UWJ=@ZT2r-*FvwaP_+a|Dpr?y&f>Lhfc^0`V1FWDbqDsR-MLZxV=dnUK)Lp^1Nidx&@h; zh5VCDU|GcjD*R^^{);*kL1#f9LD4{iK=MPRL%c$CLM%e$L5e-8BFLuWDuU=as-i^| zf#9%)DYbHo3csrk)mEgxADRA+sR+{JDHYACl|j?KO4+nH@vpE`^zo8XBYHK+qtMG* zMVzJD3)0YA$+LD#kBppMjl5PKr;WIkMBZwYM_#PGBJ;v%IZmU_H(A<LN&sI4B~oSdE$^D@nE#B*{kAJA=>iD9~BzEk$v3bhI89t6tFHOpc5P ztyYwV<6a|3@tfxx9(paJk)^0ukD}CT1-XuN)oaBq`|PbmX_N;^r@vx7ZeY%75#=ez zpOoe4)vTR_>3A{H3bghx73sL@oy{;QuK_f~x`@&O;7PZ$^%yV9S(0Sym^Ba)MmkY*;1AzrfMsyunHh5nJDw??I;${ zEiCva78mQMPCUC%458+XY)x@f=kX->$8<4@%Gs>h#I~Kt^DLhjKt-_w#ks{3etmXk z_SA{`@j1U3L6y!M^;V9(yJ9}(a8GA>Gbm=Ww8-7G22s7Ru`t&KT0HBYnLk-SHM4l? z#GoCfxJ7_VFjL7coT>gEiV+Y0{2nl%$ujCKn-%4xh>=gLBA`&G@D#gLmEA<6d$#31U_EaN@ry9-B z%s^LL8wCk8=SI~{W!>x!YBi^=hWC{2E;UGO++6+&y&T3vVTeTtXTKqsD`TVz5X}DL zFWstMGgJeDDqF%SUAkLc03|I7BkQ-&iy@V$Xy<8nlZAD?Z0TauC;xL9%NCw z2}un33MmwVFFcWl<7v>0#zk_C+x3lmYte?5?+yCpd!a{p_ZEa{1VFZtT@(~IwgX`@ zpZh9;AqYc@CBv<3kcs(s5`<)Ak!Wh~Ld6Z<-rbl&Gg#~Fu1u_oN=*@?w%%OYUAo2W zFIU6;EgwT`8xNnxPHt0c+f=@nyZW|L@IA3*%O#46Pbta(Y&AGP98@c1ZZ|lmfMCFX z*l|dalFBcMoIvZKdUeo>kP%4Vq59O?y<(XGA`j4R`_-w;4fTziX^U zjWxT`+I(&4fgecgB&P!-h~J7 z5YSAXfzwG5N{D$Q+)0Ql5tKR9AwQbW(#S}40;T4W%BgR{LU1=kl-T)_iJr!+G=+vL ziMC#9$BE+|Eqd43Iu6TX5LoHu>U4z94G~aNaJ$>kC)u*2h_DU2DHD-y8!8nUsN%M3 z3Jh-s>Z@{M((RAY`bE%KOQOqB0!x#7z~%VkC`3{R(8?6%O^ANl4Mru@VFl45D9C3a z2$p6~eJM_ZJdU&|jP)Q-F@G&v$d?H+ntv~g11uguAsT~-(;|LsudsEtHuZMQ z&d`_J9>Sux+FKefjg*G)BU*!tCC)JDLce#%!kbf8z}GTmMn(d6>AfiP`EgXzPYz_2}i5OQTzdO1tn^^iE|}%-2d~HA;-F4mY$A87wtKt?{5WUB1Otc&luv$}6ZD zzA5a2P_&nOsW&r71HwZFV6%$6ZOlcd{1?&Wx8ZZc*N(-Ub)S0t6jlRwnUoc!m*YH3 z$uAx({g{@Hi7J3xg%RPhwR7R6sz}&MC66w(<2A-0aM=UXrb>5Kin04Z&nKtd(agTz+K+`W2^#s)G)B&XQY~T!=lKr4Ugcoj9fpQn0QCK=O(QuankgrU+6%?!5L*)V< zIDx>k6y}*2l^`Np>7kA|1%Wy0kQcjsSjUwO**^0`%ZpJV{89Qa3b*ipOTMx}Zlh~2 zD)|Mn5Nvs^*TZ8kNqZGFn9MW-O;t-?PpdiJ2sMuPo z9vXsUSI0RmCmBQnqi6ad6pImz0xVl+jWs@+KCd&jjxf`Z1h`+u(`$$pSSdjnr17$X z$Od_nZBQX1YorY?XltNJ{?Tm_Yi4<0-Nf(t)_POxjQ}uu28m?GL~{( z$|WfSe~xhUM}(aWCHfawc>;xg9>sBkeH&7xdjZ*v$P=Ti3Bs`9hG!-)?M>(dh&D7< zC%uXIfT(OdtsjV6kcksZ2jD`qTX+f%ERoWT?M{B~Dph&95t`NK4vxTe)I_)%C=bv` zAA-Sd{#u3EKon8zv@C?C$7mp&eM%g1RRJSZ1T3iAM#LD*5phq7@A;a%zi{HT@P6R* zKy1ZU3}fm_rJW~MsVkkipv=UW+X=lo~&5ApY@00tvo$m|PZ{31@&SPNDn zZ;l^a%U%Z%6KAB`ihve_fkpu4Q7h9ij0MCiG8o7);{7IEwQyp=d-TDFy$Ru8F%cnJ zI?yu(c0XoVeQ@ViB z15H5_o%WKL7m%f>f(hovu6oe;IEuh3?WqDJ9#@^W#c0xf!0#)bleoqvj6F#fq#dAO ztQyv1X$cfIlPtWe6@h38&(Ddt=|>-&AQ<$Zk!+3Jf-|BDly(|ck~m${2Icf;Aj1w+ zJJdm*73%m99)28kkTiOPIL_)8CrDQF#?V@psCn;bhD2x`a|U&p!Df=6+!ba6(;4~u zUDV7igU(Syf)}Yv<017{izZHzAP^?0H6BUIj4g*}SnE$PGXigW=eemXrh zB|Y=}Y#at`myv9zM4j~Mx^jHg!*Nha!0!7@nqLCq{0=D%lo57u#MIg7|BDzfmMUBv zP)}G{&2(Wln8agi>#Ws1do0^aWB=5d#k2D>r%&_^_smk^cw5}|z0_JnW& zd=)fh?Uhw8F1#>i$<;66!AfMQc2a}I+B17oP;Xa1o4)3t3W=3_Qpb>}0I`-_9bG;!;E>-yVf!wE>G5ad-VI&0^R$cilUQh|yUU&OVt!dSWD z_%aUzHDWIi^lQNRaR)&gQNn}_9d)s8QOGE6kx@Y5h}e2}G%yj-b+I$Xv&IfHLMArH z(J2f!*8c@f4Rg+c?t}r+FTZNE5d?xIk6GF8 z7Ub80fxuOqUnEhz*=9Jjju1uCW|Wuhh&Gytw*1tZ)4I0o`xXYmOXT@?Cnuu;n)L!|dW>Zn_Q$i%@s&LR zvz{}&9iDCR7|dlK^c!3z2rU6h8esIR#m%PS;Ha85bsM^ArqPI6FzD=YojHbsY~^7# zvoC0MY#M&jp0iN|GuDalGdhNnlVd%cz|m5d69nh#%gMHhdms$bgx&A56Y*uU>dj}8 z0txq3XPB>BryQ#C)N&0&K-?pO0<%+MK+RyoTMpuc^;R~UxSeMqQLnJq4@j!C5!Jw6L^~rs-jsgNK!QjO1RPQlXK?`g=m3 zp913FH}v^BCi8FCqfZxJO-x#Z{{#Rvh1wa$rx@R}XcR{64>;YN0%jnD#_q|Jynr3Yk}OLw(o}@v7HBrmNUW52o8Un(i0@5=Re=Y z&N=+`<$ZXE`@1`e$d0VB)f%7l#xHKLZ19;%Vmxk*zbh2?;Mw-*pBJ)NX|5}P*jH;+nH)>d7C)lDRkar=#X0% zT?#e9Dn6drZ;w>;el6V(4SX0&|(h%`#P8|1fV zQVpCONAz{YQ;|3Nxsuwl$ixy6c2e&lIW>S}@eb3~taj}Dtr$Y~s*VTbzagD%ZCK@J z)W!}Puc$$GTj|23Ging_>)MFQpHU@vTO}B-aKK>D(rQJ5za-@X_G)RM1nB2dK_-2) zAyvm-GbNQ6)^DSb%4rf4>}upiX+r6pLc_cGhUKt87l39Fu|2VZOpf zlO*iw8IxY(?BSo*4-?$P1@@T=G(WKorKD-nW;W?k=V{uW;4K6H9=3{c%>@|$@iTbp z`Y;k+z+}2^jMTuJ?9$SWAftk*8cdoYwU9pWWITqk4sDH$BJRJVw6k>Iu+1!C%8es0 zvDqZRa@-p8qP5uUvJh-;o;~w3Z{7T}Bbb4{55@5e*MK^9wzKMclgDiO&63UEkQ`A< z?j|Ld1il+xxfETz+fWbPb(2#{n4{RmealW{7*J&jK0nnhAi^2@C@lu?1|G0yh?QeM`YQ$KETwNJi`e$j=_2HOL8@txe~d(CZW(Jd1z}UN!-LVxf~B&Hx`s0 z$9MLSk%Z!#6cAl;ias^L9vHYTBMk&&cGsl2p+ycn&2Dz<=nb2Uxn;^|{Z+g>lI%bk z{Uo2tQKm#laVNw|{a*XJ>OCcU-%Eg93yu3Br|SnF@8pNNG!E-35_2>uA&L53#jb>9 za7836?IB9oL6NYygN_VkgsmV!Ax9;D8A1|aD@ssGPr3VmkX9Wx2|HQEKcn=7K~rf( ztw#?&_VbHRhz@j9-_#AIr+yGTHe<#2I-GGsZz6a_cz1`N?A&Dll`bJ5KwF;MW5Wfc zlZCm3`uv$XF4EP3cFq|w)oYR)I~`dqF$UV{jx)x?C1gCxA%ZPMuBsH{)^sbKaKgTbwvXD3# zHP;Q+E{vb{kw{0qWK=KIs%m6(XsEQmY=ib)%=uqJqy7krbC5lT*B%q{>9Fs0xK?`; z=)#x>-M+fUdJ?S!jSWPGaO4}~v;fI!CMT?qQmoTw8QEUz@GF>$$vnB2QyT+;o1_yY z(&M%m^Vy*_dLw3dB|XT|46hTpAdN#gG;3WGm;{LwS5pM*qOC>RrZ!q~8zklK^^DGE$;vy5#a z@5~|=3hJx_I?s7&@FgT!Z!VQEKkUv3$_;uDh^9GU57taZwLQXyqJV}s=RcE@mCXnj zgbZ>aJsjvT3Ss?ajB^KOgH%joD^+-((zaFPps8T$q;0LE)g}JdrB#2lvld)ai!)qI z1Tv8J#mi*KBU_l`Cb-Ka5)J|VF~JMYjhlp|M=^ICn*K8MxlE9DHEe|xsh{w2=a@wX z{UsYN(i)42u2}o4X3fALSr0aJrJcS4@}wJLD(X@pUIg_U<=E^o?DzNaK$~CgfE|=tm<4qkm1IMli+KCpBls#Y-wPGL2wNls- z6cOynV+6YjrH^|xF-u_)+*9rfm;1XnTmodR=vDa!Qjs}p=o-CQmuV8?id-So5&Vw@ z9(wf9bg^IU4$IlTeYa;6cq=0cK0PY9DLQtzo+*76nEv}8Exbh>M z67rIV|5+BKYo9ilPYO2o7ox(lg-A`g>1>>;Hwf3!RFVkF2}sWdbvIaXaUu0)gbPwQ z71OK#L2X54rUpmh2$f5BmbT+2+9;yt!=>9x?iL6jeV!l7IvA zftzi88>Whx)G`xb}2O2BZ;G?WEF`Zjf$yUNqx?nMo=MRGaF zrf|qw;8uSNaMth!xyW#!Nh3t$K&L0=!wXiB^`mj@Lb^cmXoO$^MVg%%&WXg|wmJtw zg)t)$9+KhAJ5ilnOpMmkwMp>d_^3B)a#oorWgDTgS3|V#VcK%HV8M1cN1^1JCm>JE zacjLEW{rAXXs}*i#=$MF(bSpBt^9o~9wsCYbhUH+y$Yuuhh2=&o4ZvUvLC|vf7)k=#itom+;g(4+x2&8fkjOF46@1nt9}@>QbQKPsy`M6H$6acK4rT2a@Xsp9s4}b5n8wK zM5#}6$|oiI^u&Fpf%`l!y$+_3q+J!H=Kd`N6GQiYKG93`A7k-0i&+#Be&g+_x_^?d z?AXzDH{rs6hVZ9Z%(FOyLgWjjusra#zQ`zlfdJ=OFhAd~v3QBa%Pf{yG+01mDSr)x zk!lhXWkR=~upwj7VsVKD@3c$ymw$y%ub_}n4-!92cEKlE&GQyHhcgG>JjjqU1)q+f z#EB)q=QE1re;$R))Rnl4Bo)A}hHI+*FA(I51Yrp6EN_buHE0$qr{3{>{Vx-eR<(pp z`|NUK+tMuS3`FN&W)2(3e}|ubg~c}s!;wfwJ|&6tX8&(5b-DU4=@3GS=DjP-<>`h5 zy2xaQ!6nG%K1vqX-vVpnE}sbTUAWVC=fJMgt@vwyaBpD@?>Co+cMNYI-8VW}hS)br ze8Xiv+l0%3;VpO@aOr)ft^duXX7;xAJ`W8H4|RJ)szuow}$Rp9NyI(Wpht>?;W!=ymfecAM_ycV18J?(~dekgr9Br*|n*6Vx>E?;l8(R zeQ(3VH}$;_4&TxDF4%UfGI%qi595ZW8^hFhFg-N9uiNI<=2|zey| ConfigOptionParser - """Creates and returns the main parser for pip's CLI - """ - - parser_kw = { - 'usage': '\n%prog [options]', - 'add_help_option': False, - 'formatter': UpdatingDefaultsHelpFormatter(), - 'name': 'global', - 'prog': get_prog(), - } - - parser = ConfigOptionParser(**parser_kw) - parser.disable_interspersed_args() - - pip_pkg_dir = os.path.abspath(os.path.join( - os.path.dirname(__file__), "..", "..", - )) - parser.version = 'pip %s from %s (python %s)' % ( - __version__, pip_pkg_dir, sys.version[:3], - ) - - # add the general options - gen_opts = cmdoptions.make_option_group(cmdoptions.general_group, parser) - parser.add_option_group(gen_opts) - - # so the help formatter knows - parser.main = True # type: ignore - - # create command listing for description - command_summaries = get_summaries() - description = [''] + ['%-27s %s' % (i, j) for i, j in command_summaries] - parser.description = '\n'.join(description) - - return parser - - -def parse_command(args): - # type: (List[str]) -> Tuple[str, List[str]] - parser = create_main_parser() - - # Note: parser calls disable_interspersed_args(), so the result of this - # call is to split the initial args into the general options before the - # subcommand and everything else. - # For example: - # args: ['--timeout=5', 'install', '--user', 'INITools'] - # general_options: ['--timeout==5'] - # args_else: ['install', '--user', 'INITools'] - general_options, args_else = parser.parse_args(args) - - # --version - if general_options.version: - sys.stdout.write(parser.version) # type: ignore - sys.stdout.write(os.linesep) - sys.exit() - - # pip || pip help -> print_help() - if not args_else or (args_else[0] == 'help' and len(args_else) == 1): - parser.print_help() - sys.exit() - - # the subcommand name - cmd_name = args_else[0] - - if cmd_name not in commands_dict: - guess = get_similar_commands(cmd_name) - - msg = ['unknown command "%s"' % cmd_name] - if guess: - msg.append('maybe you meant "%s"' % guess) - - raise CommandError(' - '.join(msg)) - - # all the args without the subcommand - cmd_args = args[:] - cmd_args.remove(cmd_name) - - return cmd_name, cmd_args diff --git a/venv/lib/python2.7/site-packages/pip/_internal/cli/main_parser.pyc b/venv/lib/python2.7/site-packages/pip/_internal/cli/main_parser.pyc deleted file mode 100644 index 7a6b998d57cfd465f363e8828353141c84346e8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2974 zcmc&$-EtH~6h1SvKiSQ0$PWpGLTZXKxLB1es1>yeDXaiu36UD$f>oTF>~uD>nLoOF z^Ft*U8gG38U&e><2`nGMOE2_0-4j6Yp55)9)2Dk*pFZb&U$6I9xBcOdGtY)peOx?m zp{YO6#Y6-24#h5|4hs)}len zY8#ZcDVwIjG-VwcbSUf6plj!vl+I9gh6ZQsc#6_l%I0V=XU8o{=P6sD!2&sAf#h$- zk2a-eDO;q$B4tZ7SRyBfo&1B(X3v2gJ&i65_k>hQ zk%ysGwxJwmaZze0RgZ(L=h1Bx`F1k;)~FvETlzhypOkULyWSSt(InOCo=D5Ph0G$Y zh3t9!b{E~S$TIk)!Z;afeHNOL(4k7QB#mTvI%}4ii3yg=L@4W12kSSig*#Ff(rTwF zE2S((R>OWic>3^ZxN+~!#y4T`WOMWD&9Cek>X>^xDN~_qknSf+n_~^7h_nbfM4=6l zal(kFewm8n-5O{cXsUzwCH1Pr);03y(Yki%1X7LGV@x%maE+o#>&FO#M@K}z5FI;o z-I&N?|9@Xin zLEA1Z{ovB`-|5_OlZ$gaMMq8chfOVV|EM>^QCa8kn0P8vgi`2<%+;GUXezc$$`6#k zasTVKkB_>5SKBL`N&iMw4LAMosv>-b;1EqzgwkLXL~$JMpw2=&uUpUo1-9liCux)x zTTyB zmg55Nurf}hahwf@;dTORVE~!S2yPuJv#Nq_V9-2=i7eU`RaC-}EGA`zs9eY>tu(V( z#}Tx_tCYO?V>z*rVlV_8M#B)XP(zs*-1pcW6K)HYaChH?y8;gL38EU7yCdLSYF<4O zIq#%2yH{m4RHyI;WB?@7kAwFi_t0#oN=W@uCVRkVe=m~#?IMj4%l?al{^7@RE8pL} zzWzMFwk|(eAAY6|K966>Yxs=H{^LH}SWUo*QJSvm>kmfZLspq)(~?JNf0!oy*MPrP z9tO-bT#M=oI;wk46W=yk*XuZKciy?=dd`K~BE~JR>--65ZWkII?ZKvT=mpnOhV zVjWPy&@te$pmb^Mk{ob4!31Lf4KM{=IG}`66+#PQI8}iJz!$hG0OgK4;RkN9Wn2xr zu=FdZ#ezKcDh-PAi@-i0j|}fNN&d}zf+02o`axlkm%t0)0g!>$x4FacTxjOL@Gq~Z%Vr{r4!4AVSWNs(M7g#T9^UX*{T|nrNgX&7CCImv!CP>N zC-|B&WvX;sOtiu7zD%?T&hZTUlP0-PqBIVPgG3vYr6RZXBtU5hCt#QaOh(3DRF)!- z12zzF(HNx^S+OT9Qg}JzKHzFH)CD*gC|1m7u*54u0WL9s!QC4g=<_zCiBQTolc~|m zX@22d1BEa3TWA(2ZmYEjI4t1X^{xUiU9atSoQ~Ud8qQhwyaxceJrg62Rv5;`5QN6@ zx9Qsv(A!t(c|Z=+i;e>j@P>KFC-ePB>(^b diff --git a/venv/lib/python2.7/site-packages/pip/_internal/cli/parser.py b/venv/lib/python2.7/site-packages/pip/_internal/cli/parser.py deleted file mode 100644 index e1eaac4..0000000 --- a/venv/lib/python2.7/site-packages/pip/_internal/cli/parser.py +++ /dev/null @@ -1,261 +0,0 @@ -"""Base option parser setup""" -from __future__ import absolute_import - -import logging -import optparse -import sys -import textwrap -from distutils.util import strtobool - -from pip._vendor.six import string_types - -from pip._internal.cli.status_codes import UNKNOWN_ERROR -from pip._internal.configuration import Configuration, ConfigurationError -from pip._internal.utils.compat import get_terminal_size - -logger = logging.getLogger(__name__) - - -class PrettyHelpFormatter(optparse.IndentedHelpFormatter): - """A prettier/less verbose help formatter for optparse.""" - - def __init__(self, *args, **kwargs): - # help position must be aligned with __init__.parseopts.description - kwargs['max_help_position'] = 30 - kwargs['indent_increment'] = 1 - kwargs['width'] = get_terminal_size()[0] - 2 - optparse.IndentedHelpFormatter.__init__(self, *args, **kwargs) - - def format_option_strings(self, option): - return self._format_option_strings(option, ' <%s>', ', ') - - def _format_option_strings(self, option, mvarfmt=' <%s>', optsep=', '): - """ - Return a comma-separated list of option strings and metavars. - - :param option: tuple of (short opt, long opt), e.g: ('-f', '--format') - :param mvarfmt: metavar format string - evaluated as mvarfmt % metavar - :param optsep: separator - """ - opts = [] - - if option._short_opts: - opts.append(option._short_opts[0]) - if option._long_opts: - opts.append(option._long_opts[0]) - if len(opts) > 1: - opts.insert(1, optsep) - - if option.takes_value(): - metavar = option.metavar or option.dest.lower() - opts.append(mvarfmt % metavar.lower()) - - return ''.join(opts) - - def format_heading(self, heading): - if heading == 'Options': - return '' - return heading + ':\n' - - def format_usage(self, usage): - """ - Ensure there is only one newline between usage and the first heading - if there is no description. - """ - msg = '\nUsage: %s\n' % self.indent_lines(textwrap.dedent(usage), " ") - return msg - - def format_description(self, description): - # leave full control over description to us - if description: - if hasattr(self.parser, 'main'): - label = 'Commands' - else: - label = 'Description' - # some doc strings have initial newlines, some don't - description = description.lstrip('\n') - # some doc strings have final newlines and spaces, some don't - description = description.rstrip() - # dedent, then reindent - description = self.indent_lines(textwrap.dedent(description), " ") - description = '%s:\n%s\n' % (label, description) - return description - else: - return '' - - def format_epilog(self, epilog): - # leave full control over epilog to us - if epilog: - return epilog - else: - return '' - - def indent_lines(self, text, indent): - new_lines = [indent + line for line in text.split('\n')] - return "\n".join(new_lines) - - -class UpdatingDefaultsHelpFormatter(PrettyHelpFormatter): - """Custom help formatter for use in ConfigOptionParser. - - This is updates the defaults before expanding them, allowing - them to show up correctly in the help listing. - """ - - def expand_default(self, option): - if self.parser is not None: - self.parser._update_defaults(self.parser.defaults) - return optparse.IndentedHelpFormatter.expand_default(self, option) - - -class CustomOptionParser(optparse.OptionParser): - - def insert_option_group(self, idx, *args, **kwargs): - """Insert an OptionGroup at a given position.""" - group = self.add_option_group(*args, **kwargs) - - self.option_groups.pop() - self.option_groups.insert(idx, group) - - return group - - @property - def option_list_all(self): - """Get a list of all options, including those in option groups.""" - res = self.option_list[:] - for i in self.option_groups: - res.extend(i.option_list) - - return res - - -class ConfigOptionParser(CustomOptionParser): - """Custom option parser which updates its defaults by checking the - configuration files and environmental variables""" - - def __init__(self, *args, **kwargs): - self.name = kwargs.pop('name') - - isolated = kwargs.pop("isolated", False) - self.config = Configuration(isolated) - - assert self.name - optparse.OptionParser.__init__(self, *args, **kwargs) - - def check_default(self, option, key, val): - try: - return option.check_value(key, val) - except optparse.OptionValueError as exc: - print("An error occurred during configuration: %s" % exc) - sys.exit(3) - - def _get_ordered_configuration_items(self): - # Configuration gives keys in an unordered manner. Order them. - override_order = ["global", self.name, ":env:"] - - # Pool the options into different groups - section_items = {name: [] for name in override_order} - for section_key, val in self.config.items(): - # ignore empty values - if not val: - logger.debug( - "Ignoring configuration key '%s' as it's value is empty.", - section_key - ) - continue - - section, key = section_key.split(".", 1) - if section in override_order: - section_items[section].append((key, val)) - - # Yield each group in their override order - for section in override_order: - for key, val in section_items[section]: - yield key, val - - def _update_defaults(self, defaults): - """Updates the given defaults with values from the config files and - the environ. Does a little special handling for certain types of - options (lists).""" - - # Accumulate complex default state. - self.values = optparse.Values(self.defaults) - late_eval = set() - # Then set the options with those values - for key, val in self._get_ordered_configuration_items(): - # '--' because configuration supports only long names - option = self.get_option('--' + key) - - # Ignore options not present in this parser. E.g. non-globals put - # in [global] by users that want them to apply to all applicable - # commands. - if option is None: - continue - - if option.action in ('store_true', 'store_false', 'count'): - try: - val = strtobool(val) - except ValueError: - error_msg = invalid_config_error_message( - option.action, key, val - ) - self.error(error_msg) - - elif option.action == 'append': - val = val.split() - val = [self.check_default(option, key, v) for v in val] - elif option.action == 'callback': - late_eval.add(option.dest) - opt_str = option.get_opt_string() - val = option.convert_value(opt_str, val) - # From take_action - args = option.callback_args or () - kwargs = option.callback_kwargs or {} - option.callback(option, opt_str, val, self, *args, **kwargs) - else: - val = self.check_default(option, key, val) - - defaults[option.dest] = val - - for key in late_eval: - defaults[key] = getattr(self.values, key) - self.values = None - return defaults - - def get_default_values(self): - """Overriding to make updating the defaults after instantiation of - the option parser possible, _update_defaults() does the dirty work.""" - if not self.process_default_values: - # Old, pre-Optik 1.5 behaviour. - return optparse.Values(self.defaults) - - # Load the configuration, or error out in case of an error - try: - self.config.load() - except ConfigurationError as err: - self.exit(UNKNOWN_ERROR, str(err)) - - defaults = self._update_defaults(self.defaults.copy()) # ours - for option in self._get_all_options(): - default = defaults.get(option.dest) - if isinstance(default, string_types): - opt_str = option.get_opt_string() - defaults[option.dest] = option.check_value(opt_str, default) - return optparse.Values(defaults) - - def error(self, msg): - self.print_usage(sys.stderr) - self.exit(UNKNOWN_ERROR, "%s\n" % msg) - - -def invalid_config_error_message(action, key, val): - """Returns a better error message when invalid configuration option - is provided.""" - if action in ('store_true', 'store_false'): - return ("{0} is not a valid value for {1} option, " - "please specify a boolean value like yes/no, " - "true/false or 1/0 instead.").format(val, key) - - return ("{0} is not a valid value for {1} option, " - "please specify a numerical value like 1/0 " - "instead.").format(val, key) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/cli/parser.pyc b/venv/lib/python2.7/site-packages/pip/_internal/cli/parser.pyc deleted file mode 100644 index 9ce8ffe1590785d5ce1e4171ddd1144b9578e43c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11559 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 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/completion.py b/venv/lib/python2.7/site-packages/pip/_internal/commands/completion.py deleted file mode 100644 index 2fcdd39..0000000 --- a/venv/lib/python2.7/site-packages/pip/_internal/commands/completion.py +++ /dev/null @@ -1,94 +0,0 @@ -from __future__ import absolute_import - -import sys -import textwrap - -from pip._internal.cli.base_command import Command -from pip._internal.utils.misc import get_prog - -BASE_COMPLETION = """ -# pip %(shell)s completion start%(script)s# pip %(shell)s completion end -""" - -COMPLETION_SCRIPTS = { - 'bash': """ - _pip_completion() - { - COMPREPLY=( $( COMP_WORDS="${COMP_WORDS[*]}" \\ - COMP_CWORD=$COMP_CWORD \\ - PIP_AUTO_COMPLETE=1 $1 ) ) - } - complete -o default -F _pip_completion %(prog)s - """, - 'zsh': """ - function _pip_completion { - local words cword - read -Ac words - read -cn cword - reply=( $( COMP_WORDS="$words[*]" \\ - COMP_CWORD=$(( cword-1 )) \\ - PIP_AUTO_COMPLETE=1 $words[1] ) ) - } - compctl -K _pip_completion %(prog)s - """, - 'fish': """ - function __fish_complete_pip - set -lx COMP_WORDS (commandline -o) "" - set -lx COMP_CWORD ( \\ - math (contains -i -- (commandline -t) $COMP_WORDS)-1 \\ - ) - set -lx PIP_AUTO_COMPLETE 1 - string split \\ -- (eval $COMP_WORDS[1]) - end - complete -fa "(__fish_complete_pip)" -c %(prog)s - """, -} - - -class CompletionCommand(Command): - """A helper command to be used for command completion.""" - name = 'completion' - summary = 'A helper command used for command completion.' - ignore_require_venv = True - - def __init__(self, *args, **kw): - super(CompletionCommand, self).__init__(*args, **kw) - - cmd_opts = self.cmd_opts - - cmd_opts.add_option( - '--bash', '-b', - action='store_const', - const='bash', - dest='shell', - help='Emit completion code for bash') - cmd_opts.add_option( - '--zsh', '-z', - action='store_const', - const='zsh', - dest='shell', - help='Emit completion code for zsh') - cmd_opts.add_option( - '--fish', '-f', - action='store_const', - const='fish', - dest='shell', - help='Emit completion code for fish') - - self.parser.insert_option_group(0, cmd_opts) - - def run(self, options, args): - """Prints the completion code of the given shell""" - shells = COMPLETION_SCRIPTS.keys() - shell_options = ['--' + shell for shell in sorted(shells)] - if options.shell in shells: - script = textwrap.dedent( - COMPLETION_SCRIPTS.get(options.shell, '') % { - 'prog': get_prog(), - } - ) - print(BASE_COMPLETION % {'script': script, 'shell': options.shell}) - else: - sys.stderr.write( - 'ERROR: You must pass %s\n' % ' or '.join(shell_options) - ) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/completion.pyc b/venv/lib/python2.7/site-packages/pip/_internal/commands/completion.pyc deleted file mode 100644 index 88c1a48d529417899784409ec1aa571ad5ac11d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3577 zcmd5;U2oeq6s2UxiJhcPKera^z@;f57f{@+gRu?EkTlJ~ny{f@ovx9tz?T*`@^Ce0pK*`hAV%gf8db1zx?XR>zxw@Vv7>pvxY7Zwy5J3DC%e)V<8kP zEEr|YV2lM-d}=HhXU$fX1rtn+u(rX1N%lKqnEOQwohDneF2RowFS863>M{y%QzlWa zgd6tKBva3eo>BBHCB2>(2Svje8ahI`X_j>4kEqn{@-$5OJxgwhD5^{DC%rThDokQ7 zm6s{>_*s~$y1YPB#6e9?!I>KGKQ64g16x-8r030vM5;?G&sLq~)u%7!Ek0xEs{6}| z^LTB3dgcvv7PXi6H;$(Ht5ZXdr|N&T@)C`mpBcy(k6C@P>Ms7gzT(n=r_1Zh^K*P= zj@S9X-J_E^`>PS$PIw^NULGlKf5+chDWD{9>r#(XWnjGN$u0S47@c+=`x@eR2M>c2 zCB7H&-6RXJEA%<>g!4>z0k;?ZqWesTAD=TKjrPw0S=$G^??rcj<@}6g6?Sc4RDU0| z=Ym>HGq-U8w!VtE{nLNoNwIhUICsy7(`|=x>zH?f&>g~tb1AT8(cTcvxP@({_=v)o zcDBx^r{6zB(~Dc@ti0!`EwU9WFN`I(LvGve*j9C35L5HJ4h&E8dB8bh^s%dF(ByNc z{Zm;OceqTWQ1Mq>Pb+pnoT0g1&TR~gQ>-3`&VbTwk560fS@`PH-1g7mG~ukSU^A9Z z@&zOU(nq6yC^tP?K-&Bqf?$*_kt``qB6A||A!U{+#kG(COO)b}7K5@D#+b8ajbNC3 zh+>f=H>Dz@+(a{QmGDi$b14GeP6o~W)gX1vsv5=(>e4>X%tZ!#@}7cs9Pi2kJoy`f z!rx$r$i^n?n(Pp=$^K-_KvTEGj!NvX#JXi#A(n?#VLeFnMT##nJQDm{vuyPB#wpDY z^d{*j=<8h?*1ODtsUf{9LwZ*WJvcDJx`6T;`2hduWLmSX!|Ug=g3`8i9x_SXRMg_> z9HeN4QYD!{+{98T!d*)a1)I)bf#|pEQ$jb^1fuW}ETu_FVII{GgeA(e%HRdtU_y*#kVCw6Wem0<+

$=vR}yzQvA4C^8TaP}#1q z><?9kNeiy<691RVoM#(Bdpm`JKjw-ZMA*_SRW!5b0AcUGXzyBe=!&H@ZYpjc~ z(YL1V1UnodH)yPZz*)1Za8`%=D)OR|Ty2Rn>`dCaxfAXP+;ZsRQ?SgYy()H=&TvhI z;`ZZAklBw>EIZDM^EH2w zO_OC??90M7ZfYXXwlyV{*i*Zim+Hx?@%iz5V@IkG-BitkX&0y1gXGBdXH!T{lR4$h2jor5k0A!zJ6- zjq6!1is(E)Ki2SGZaur5$wiilYv(w?waBfpU l4t*%-Xf}LP?Ekm45=mh&1?o(gQ^r)eVwS3-MRt*3E diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/configuration.py b/venv/lib/python2.7/site-packages/pip/_internal/commands/configuration.py deleted file mode 100644 index 950e205..0000000 --- a/venv/lib/python2.7/site-packages/pip/_internal/commands/configuration.py +++ /dev/null @@ -1,253 +0,0 @@ -import logging -import os -import subprocess - -from pip._internal.cli.base_command import Command -from pip._internal.cli.status_codes import ERROR, SUCCESS -from pip._internal.configuration import Configuration, kinds -from pip._internal.exceptions import PipError -from pip._internal.locations import running_under_virtualenv, site_config_file -from pip._internal.utils.deprecation import deprecated -from pip._internal.utils.misc import get_prog - -logger = logging.getLogger(__name__) - - -class ConfigurationCommand(Command): - """Manage local and global configuration. - - Subcommands: - - list: List the active configuration (or from the file specified) - edit: Edit the configuration file in an editor - get: Get the value associated with name - set: Set the name=value - unset: Unset the value associated with name - - If none of --user, --global and --site are passed, a virtual - environment configuration file is used if one is active and the file - exists. Otherwise, all modifications happen on the to the user file by - default. - """ - - name = 'config' - usage = """ - %prog [] list - %prog [] [--editor ] edit - - %prog [] get name - %prog [] set name value - %prog [] unset name - """ - - summary = "Manage local and global configuration." - - def __init__(self, *args, **kwargs): - super(ConfigurationCommand, self).__init__(*args, **kwargs) - - self.configuration = None - - self.cmd_opts.add_option( - '--editor', - dest='editor', - action='store', - default=None, - help=( - 'Editor to use to edit the file. Uses VISUAL or EDITOR ' - 'environment variables if not provided.' - ) - ) - - self.cmd_opts.add_option( - '--global', - dest='global_file', - action='store_true', - default=False, - help='Use the system-wide configuration file only' - ) - - self.cmd_opts.add_option( - '--user', - dest='user_file', - action='store_true', - default=False, - help='Use the user configuration file only' - ) - - self.cmd_opts.add_option( - '--site', - dest='site_file', - action='store_true', - default=False, - help='Use the current environment configuration file only' - ) - - self.cmd_opts.add_option( - '--venv', - dest='venv_file', - action='store_true', - default=False, - help=( - '[Deprecated] Use the current environment configuration ' - 'file in a virtual environment only' - ) - ) - - self.parser.insert_option_group(0, self.cmd_opts) - - def run(self, options, args): - handlers = { - "list": self.list_values, - "edit": self.open_in_editor, - "get": self.get_name, - "set": self.set_name_value, - "unset": self.unset_name - } - - # Determine action - if not args or args[0] not in handlers: - logger.error("Need an action ({}) to perform.".format( - ", ".join(sorted(handlers))) - ) - return ERROR - - action = args[0] - - # Determine which configuration files are to be loaded - # Depends on whether the command is modifying. - try: - load_only = self._determine_file( - options, need_value=(action in ["get", "set", "unset", "edit"]) - ) - except PipError as e: - logger.error(e.args[0]) - return ERROR - - # Load a new configuration - self.configuration = Configuration( - isolated=options.isolated_mode, load_only=load_only - ) - self.configuration.load() - - # Error handling happens here, not in the action-handlers. - try: - handlers[action](options, args[1:]) - except PipError as e: - logger.error(e.args[0]) - return ERROR - - return SUCCESS - - def _determine_file(self, options, need_value): - # Convert legacy venv_file option to site_file or error - if options.venv_file and not options.site_file: - if running_under_virtualenv(): - options.site_file = True - deprecated( - "The --venv option has been deprecated.", - replacement="--site", - gone_in="19.3", - ) - else: - raise PipError( - "Legacy --venv option requires a virtual environment. " - "Use --site instead." - ) - - file_options = [key for key, value in ( - (kinds.USER, options.user_file), - (kinds.GLOBAL, options.global_file), - (kinds.SITE, options.site_file), - ) if value] - - if not file_options: - if not need_value: - return None - # Default to user, unless there's a site file. - elif os.path.exists(site_config_file): - return kinds.SITE - else: - return kinds.USER - elif len(file_options) == 1: - return file_options[0] - - raise PipError( - "Need exactly one file to operate upon " - "(--user, --site, --global) to perform." - ) - - def list_values(self, options, args): - self._get_n_args(args, "list", n=0) - - for key, value in sorted(self.configuration.items()): - logger.info("%s=%r", key, value) - - def get_name(self, options, args): - key = self._get_n_args(args, "get [name]", n=1) - value = self.configuration.get_value(key) - - logger.info("%s", value) - - def set_name_value(self, options, args): - key, value = self._get_n_args(args, "set [name] [value]", n=2) - self.configuration.set_value(key, value) - - self._save_configuration() - - def unset_name(self, options, args): - key = self._get_n_args(args, "unset [name]", n=1) - self.configuration.unset_value(key) - - self._save_configuration() - - def open_in_editor(self, options, args): - editor = self._determine_editor(options) - - fname = self.configuration.get_file_to_edit() - if fname is None: - raise PipError("Could not determine appropriate file.") - - try: - subprocess.check_call([editor, fname]) - except subprocess.CalledProcessError as e: - raise PipError( - "Editor Subprocess exited with exit code {}" - .format(e.returncode) - ) - - def _get_n_args(self, args, example, n): - """Helper to make sure the command got the right number of arguments - """ - if len(args) != n: - msg = ( - 'Got unexpected number of arguments, expected {}. ' - '(example: "{} config {}")' - ).format(n, get_prog(), example) - raise PipError(msg) - - if n == 1: - return args[0] - else: - return args - - def _save_configuration(self): - # We successfully ran a modifying command. Need to save the - # configuration. - try: - self.configuration.save() - except Exception: - logger.error( - "Unable to save configuration. Please report this as a bug.", - exc_info=1 - ) - raise PipError("Internal Error.") - - def _determine_editor(self, options): - if options.editor is not None: - return options.editor - elif "VISUAL" in os.environ: - return os.environ["VISUAL"] - elif "EDITOR" in os.environ: - return os.environ["EDITOR"] - else: - raise PipError("Could not determine editor to use.") diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/configuration.pyc b/venv/lib/python2.7/site-packages/pip/_internal/commands/configuration.pyc deleted file mode 100644 index b7ab753de8b14670b7a24fb7a8a94674ee137542..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8747 zcmdT}&u<&Y6`oyElt@dKEIW3T0`bP@T0w0$nAXh!vptHyEFn^lcj z+dHYEIn_I%8Yk@Yl#1q6@1$y+RE}0^ZwwnG|q4z z_3AO~Df|!qR;v!0*(7euNw3$6gR0Ap3EWnE|F$nf^?S?9EA_e^ni1N#6Ltq_D+`lY zh&RJHFqYXA2=0Xal{8IK`^xj^Ne6Kp#@*&14s_bw3e#-Rigdh{&0)}lnQpcdGHrIk zNLxk~j0C!$>UJyB!I*hhXU%?^bhA?+SeCc)rQ~}U9U?dP4*6sA3gWRx#>0Yy3M#)raMjEp! zI4+Gj<=3mTT+9`S_`_D*>S`}a+O5cg*u8F)tf6UzkZ-3}sd)KceX!QH2V|~}d!x`~ zSG`-fd)d17TJ0>{())RM)g<*gY0?u43fD7z-3~jU4qhIy*FgwIE4T~UzEybgQW#^I z9_f;F^cqg$s&_-%m$q8b0BbNNX@@*8?@^eodvU9$NA!mD^_-p~Z^=ue@j)yU_xL3X z`4XO^mu_~vIEl5FbiBpIfzjy&eCOh%WEU5yUS2EJULUK|!3D47&{ZkNF##BdYT>3Geh{tlxY4mIoMGdH3es+rGEg*0x${*jkG~2Gfd@%!3wh zg@F!g`C6?ZXY^RMDGnmz0n6f=Svt_>RXk!cncD1_O!pQafy-g0oW#+Np%GcI$jWHa z?1ZoR?jA<${R$357U3WsjHYK^+ryzfNK+!p-W?x;t$UWVMVH7Wv0<0=37+o1tA~E@ z0i`M%{hHi~+(W$Ew-Qbpg1M?vn&QUIps!P39;qtLW*CQAvni*(3gpY^{rBx4BVD@} zGyyq)8a%WDc^InDd#wo8Pl5MaDI}VmL^A}!ry1V?S+koagMO8ED-#(Vb)?ZsyGGvJ ze8grI1WIn^5n4!y&Gwbx zv-BeVy8WfQOZ~9Fhy`T8-(7fOXr#g)*XiwS4D&9{-i-* z$|z|#Ecu2`ipGnx5i2lf`I?58N1$Ud(5pV)eVMohtLP+YuVxUssSBRyc?{B~_%pGA z&?FJV9-BCW}1mv78&7-P%qhQnN7m8Kz3$8}rY2GUb1L8t)TY?3NT zWj<`ANtY_);3p6HdT55i+EUQ?qNLk}$#GK6$Xx7-dumw$Z6r{A5*m!@z~{O%hO5m$ z!z6lPtObsIa`3;+8#g3?Fx+|*5svm>U^ll!A@~$nmFn$#xQQ#VR&RufY-Jr$R0Qkw zxmEua(s6oyGz?zU1?kHgmSkSXO*sXpl7D83XPjwZK+&xf3&4N{ch))OOcYAabM8!` z;4C=u?246Byu6linSbL(n?P#xp)?#djaKH;7Sihq(_*;kP?iV6lBbUAJOrr(C@`~M zI4Xu_Lu@dS}~F~Oq>2mW;licnYSLlpt2KU-++uswdtz#AACggv{2`2 z%X|&1B{Ok4s}kJZMF73HNRQ`P-9T_`yfuyRc%1*$#4u9bk6LZbI6Zgb;)1DQUHB*1 zh*;C5E4A0m`{=x-yRG)l0q&`OI0#e39EbWv30v@nWDWEax)s#Kjx9{w0$YIzy$zIz zb|fQ^ECE0PLq%4sy+I#=eRZ6Vkl8pd*@r3Bc`)=(^Y$EX)DW?syNGOjdIf89G%4x7 zS4V2j+*j=N#;x1$ynV|j6B(`Fyu0Er@QJ3E80ln0FVtF66QA-Dy+#UN<%D9L{+n#k z>SSzF?+9L4jGIO`cbPlwqvDO?^wS z&ZJv$=A9|G;D}Wc(0GYe*3qE5#T_nGoG!9~r>^5{U(T}#q!1hELOS8VfX<4#g#|DK~0SbmRvH*h-|@aZ!){~a!|SLK{`&mAK7>mWE(?u=<9{9)!M0SllC z>bU__6wDfBI3i+0*Tx4L)4H1Xx@8 zIH^#%kM%4kgD8;F#3&H-8*4D2O0f!Ma z2%selVDf4$Zws_O$3npqOgD+pc}RV_ZJVRs!> z&_Qnv)F@WN#SbKo9o1)r-3^crV!e$bJ$2_0`U}vjeDv{d&8s2~?e!yl)jRiiH?LPg z$IiVxj#*bNI;>!|q6R+Qo~Y6u{N>?GewOnS-zkA$&vcK722kFA#buZ&ssds<#B;Om zG@`k-gC1TZG!CA0S7o#V8OC-948MYMv)%7B#1iz2;{nIXbksa z7A$$*bZ5E1hrif(cOup9on43*kR~yftUx33UJL@2tm;T@H=Q(GqFDz*)!mt#)0?|Ifx%)QUAha4+2@x zB(7t;+$x=q=ws6sj+){cnk?ZAkmNOGi_K<`wDa<>)S74o1A|{KW!MbxlW}S*qW%vs zN9Zi>G^#^w~b(^9X?k!7Lv67uQlBY)+0YezlcU@w&a$kaJl6-%CDAR zDwp!lYf_Y+Ng|NYe!*i4S;}Ox8>(`9~A$K4i)Ka zU_glDDWes0AdN(tnObYo*LF; VrV(CDyK~NIe0ZO8=G@uBe*p~tEeZet diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/download.py b/venv/lib/python2.7/site-packages/pip/_internal/commands/download.py deleted file mode 100644 index a57e4bc..0000000 --- a/venv/lib/python2.7/site-packages/pip/_internal/commands/download.py +++ /dev/null @@ -1,176 +0,0 @@ -from __future__ import absolute_import - -import logging -import os - -from pip._internal.cli import cmdoptions -from pip._internal.cli.base_command import RequirementCommand -from pip._internal.operations.prepare import RequirementPreparer -from pip._internal.req import RequirementSet -from pip._internal.req.req_tracker import RequirementTracker -from pip._internal.resolve import Resolver -from pip._internal.utils.filesystem import check_path_owner -from pip._internal.utils.misc import ensure_dir, normalize_path -from pip._internal.utils.temp_dir import TempDirectory - -logger = logging.getLogger(__name__) - - -class DownloadCommand(RequirementCommand): - """ - Download packages from: - - - PyPI (and other indexes) using requirement specifiers. - - VCS project urls. - - Local project directories. - - Local or remote source archives. - - pip also supports downloading from "requirements files", which provide - an easy way to specify a whole environment to be downloaded. - """ - name = 'download' - - usage = """ - %prog [options] [package-index-options] ... - %prog [options] -r [package-index-options] ... - %prog [options] ... - %prog [options] ... - %prog [options] ...""" - - summary = 'Download packages.' - - def __init__(self, *args, **kw): - super(DownloadCommand, self).__init__(*args, **kw) - - cmd_opts = self.cmd_opts - - cmd_opts.add_option(cmdoptions.constraints()) - cmd_opts.add_option(cmdoptions.requirements()) - cmd_opts.add_option(cmdoptions.build_dir()) - cmd_opts.add_option(cmdoptions.no_deps()) - cmd_opts.add_option(cmdoptions.global_options()) - cmd_opts.add_option(cmdoptions.no_binary()) - cmd_opts.add_option(cmdoptions.only_binary()) - cmd_opts.add_option(cmdoptions.prefer_binary()) - cmd_opts.add_option(cmdoptions.src()) - cmd_opts.add_option(cmdoptions.pre()) - cmd_opts.add_option(cmdoptions.no_clean()) - cmd_opts.add_option(cmdoptions.require_hashes()) - cmd_opts.add_option(cmdoptions.progress_bar()) - cmd_opts.add_option(cmdoptions.no_build_isolation()) - cmd_opts.add_option(cmdoptions.use_pep517()) - cmd_opts.add_option(cmdoptions.no_use_pep517()) - - cmd_opts.add_option( - '-d', '--dest', '--destination-dir', '--destination-directory', - dest='download_dir', - metavar='dir', - default=os.curdir, - help=("Download packages into

."), - ) - - cmd_opts.add_option(cmdoptions.platform()) - cmd_opts.add_option(cmdoptions.python_version()) - cmd_opts.add_option(cmdoptions.implementation()) - cmd_opts.add_option(cmdoptions.abi()) - - index_opts = cmdoptions.make_option_group( - cmdoptions.index_group, - self.parser, - ) - - self.parser.insert_option_group(0, index_opts) - self.parser.insert_option_group(0, cmd_opts) - - def run(self, options, args): - options.ignore_installed = True - # editable doesn't really make sense for `pip download`, but the bowels - # of the RequirementSet code require that property. - options.editables = [] - - if options.python_version: - python_versions = [options.python_version] - else: - python_versions = None - - cmdoptions.check_dist_restriction(options) - - options.src_dir = os.path.abspath(options.src_dir) - options.download_dir = normalize_path(options.download_dir) - - ensure_dir(options.download_dir) - - with self._build_session(options) as session: - finder = self._build_package_finder( - options=options, - session=session, - platform=options.platform, - python_versions=python_versions, - abi=options.abi, - implementation=options.implementation, - ) - build_delete = (not (options.no_clean or options.build_dir)) - if options.cache_dir and not check_path_owner(options.cache_dir): - logger.warning( - "The directory '%s' or its parent directory is not owned " - "by the current user and caching wheels has been " - "disabled. check the permissions and owner of that " - "directory. If executing pip with sudo, you may want " - "sudo's -H flag.", - options.cache_dir, - ) - options.cache_dir = None - - with RequirementTracker() as req_tracker, TempDirectory( - options.build_dir, delete=build_delete, kind="download" - ) as directory: - - requirement_set = RequirementSet( - require_hashes=options.require_hashes, - ) - self.populate_requirement_set( - requirement_set, - args, - options, - finder, - session, - self.name, - None - ) - - preparer = RequirementPreparer( - build_dir=directory.path, - src_dir=options.src_dir, - download_dir=options.download_dir, - wheel_download_dir=None, - progress_bar=options.progress_bar, - build_isolation=options.build_isolation, - req_tracker=req_tracker, - ) - - resolver = Resolver( - preparer=preparer, - finder=finder, - session=session, - wheel_cache=None, - use_user_site=False, - upgrade_strategy="to-satisfy-only", - force_reinstall=False, - ignore_dependencies=options.ignore_dependencies, - ignore_requires_python=False, - ignore_installed=True, - isolated=options.isolated_mode, - ) - resolver.resolve(requirement_set) - - downloaded = ' '.join([ - req.name for req in requirement_set.successfully_downloaded - ]) - if downloaded: - logger.info('Successfully downloaded %s', downloaded) - - # Clean up - if not options.no_clean: - requirement_set.cleanup_files() - - return requirement_set diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/download.pyc b/venv/lib/python2.7/site-packages/pip/_internal/commands/download.pyc deleted file mode 100644 index 6ffee843154b91d7f7dcd3557e8ea3505c9ee2c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5692 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 IMr*zO9}}Z)!2kdN diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/freeze.py b/venv/lib/python2.7/site-packages/pip/_internal/commands/freeze.py deleted file mode 100644 index dc9c53a..0000000 --- a/venv/lib/python2.7/site-packages/pip/_internal/commands/freeze.py +++ /dev/null @@ -1,96 +0,0 @@ -from __future__ import absolute_import - -import sys - -from pip._internal.cache import WheelCache -from pip._internal.cli.base_command import Command -from pip._internal.models.format_control import FormatControl -from pip._internal.operations.freeze import freeze -from pip._internal.utils.compat import stdlib_pkgs - -DEV_PKGS = {'pip', 'setuptools', 'distribute', 'wheel'} - - -class FreezeCommand(Command): - """ - Output installed packages in requirements format. - - packages are listed in a case-insensitive sorted order. - """ - name = 'freeze' - usage = """ - %prog [options]""" - summary = 'Output installed packages in requirements format.' - log_streams = ("ext://sys.stderr", "ext://sys.stderr") - - def __init__(self, *args, **kw): - super(FreezeCommand, self).__init__(*args, **kw) - - self.cmd_opts.add_option( - '-r', '--requirement', - dest='requirements', - action='append', - default=[], - metavar='file', - help="Use the order in the given requirements file and its " - "comments when generating output. This option can be " - "used multiple times.") - self.cmd_opts.add_option( - '-f', '--find-links', - dest='find_links', - action='append', - default=[], - metavar='URL', - help='URL for finding packages, which will be added to the ' - 'output.') - self.cmd_opts.add_option( - '-l', '--local', - dest='local', - action='store_true', - default=False, - help='If in a virtualenv that has global access, do not output ' - 'globally-installed packages.') - self.cmd_opts.add_option( - '--user', - dest='user', - action='store_true', - default=False, - help='Only output packages installed in user-site.') - self.cmd_opts.add_option( - '--all', - dest='freeze_all', - action='store_true', - help='Do not skip these packages in the output:' - ' %s' % ', '.join(DEV_PKGS)) - self.cmd_opts.add_option( - '--exclude-editable', - dest='exclude_editable', - action='store_true', - help='Exclude editable package from output.') - - self.parser.insert_option_group(0, self.cmd_opts) - - def run(self, options, args): - format_control = FormatControl(set(), set()) - wheel_cache = WheelCache(options.cache_dir, format_control) - skip = set(stdlib_pkgs) - if not options.freeze_all: - skip.update(DEV_PKGS) - - freeze_kwargs = dict( - requirement=options.requirements, - find_links=options.find_links, - local_only=options.local, - user_only=options.user, - skip_regex=options.skip_requirements_regex, - isolated=options.isolated_mode, - wheel_cache=wheel_cache, - skip=skip, - exclude_editable=options.exclude_editable, - ) - - try: - for line in freeze(**freeze_kwargs): - sys.stdout.write(line + '\n') - finally: - wheel_cache.cleanup() diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/freeze.pyc b/venv/lib/python2.7/site-packages/pip/_internal/commands/freeze.pyc deleted file mode 100644 index 7fa6c1363add9f9b21d3912d8946eab7cb70e2dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3677 zcmd5EXQ{2q{(&?cQ}nn#*>UENi!Wy?WB`QVrSNI-Lm7^S?z-4 zQrHgzSbcb;hmQK%KKEzzFZDO{5A@s%Ql{;^ z@w#t!NpDcGN#jl5?vcJg#TJdX&|ar(gR)J^F3=1iFH*Kes!NlAvWxV0qBEkuj4$y5 z9``R{aXG%!4^X(vD3U!}>BgxzFY3y;hrVYMJx^y!>HA4KQ{L8t?S54hNtt=WMHs%W zOp&fV0(mOGsMrM#?_4r^U}IRYn6p{lI|x{Wnl`9dfwzl6{>VLoXFOPn=HnW2o0)_4Wimn#Uv+qJ2t;a{uT5x4A^4&@c>ZowE>rfuG^Sxb-)$Mc4WX+8Soa*02VN_ zufcU~CH8gkyYYtK+jJJJ`rQ=2TT4GgdWW)iY2GE*gDYJ>3)(ATeArFYmEV zb7Wb_AOR8J#7X_Q|7*bb&@vAP#xkaZ!3swlA8e+qb6cpabXdnplB9gTzFOC+%&;o< zpCpZTQZJNC4iY1ACb?EpnJHb{Q+PhHDs(gDsl;sK#uOZTov0WYB5T7OtWA-@LSH0T z8BSHHOycr#8dgI5Vff=Lx1pyV$XkYcDr_tWTVPRnjYuvp6!;{Yo><=5U@*zcY@qXU z-{&zmW8Y-5J&C@vU;4kCH6eHNl*^>K6CTd;bQT`wTJwBKmSI9y`Q7<-`T4YEhz0{) zrHK}e@HNpAR~Z#M(S{01VUniG+B;!Zg=OUy z2rN4FF=y>-8ZfkcZi4{;@rS|{dk3~hr9NH;SZ)jRF9YCk*mVF6P(#bwHW)x&MD)B? z#%M~U2YxYjKd*WJIOCOgD~Nm%-nIhDozU(`Ky{SrCQ}2Is8)=cnpo~9!oE|rr+Pu-P6AhK; zOqf@BDee!x`cwSFw|{&r)UOl6XkLW_%cOCO!SU2oP2Fey$Y`tdL@J5FCBp36KkTC< zDQu0}s5bdQ;?xK^Gn!Nyif2bJjz-6yn7#6F|L(o#<;VBTr}xs&?9u1h3-d94ruFE@ z5w4@69rGJ>twk7TJ+Muwi{1y@N?_;cFkFpx|a}BiIPKi%+lp zN^7OBhx)nK`G|IK<-Fc&rMz**mVvpyi#h&-idX70(QA~@q0=@23`jO)=|q(2bdA*< zP(k5NJJQu5`yHKhUMgQuA_TM>N{^9HHXi~Ci72pKV4>#GuQ)nn6 z&ELXk3jQpL%CCioj>{Fjj2Hw-7D@NGLbkaL*f^>~rKmGB>?LQ=SiA|P+cuB|b1Wp&)ilNnRwacMZHRt{F)yL~v+MV)FG9=h)>dmfSbSPL?f(J47J&Ky diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/hash.py b/venv/lib/python2.7/site-packages/pip/_internal/commands/hash.py deleted file mode 100644 index 423440e..0000000 --- a/venv/lib/python2.7/site-packages/pip/_internal/commands/hash.py +++ /dev/null @@ -1,57 +0,0 @@ -from __future__ import absolute_import - -import hashlib -import logging -import sys - -from pip._internal.cli.base_command import Command -from pip._internal.cli.status_codes import ERROR -from pip._internal.utils.hashes import FAVORITE_HASH, STRONG_HASHES -from pip._internal.utils.misc import read_chunks - -logger = logging.getLogger(__name__) - - -class HashCommand(Command): - """ - Compute a hash of a local package archive. - - These can be used with --hash in a requirements file to do repeatable - installs. - - """ - name = 'hash' - usage = '%prog [options] ...' - summary = 'Compute hashes of package archives.' - ignore_require_venv = True - - def __init__(self, *args, **kw): - super(HashCommand, self).__init__(*args, **kw) - self.cmd_opts.add_option( - '-a', '--algorithm', - dest='algorithm', - choices=STRONG_HASHES, - action='store', - default=FAVORITE_HASH, - help='The hash algorithm to use: one of %s' % - ', '.join(STRONG_HASHES)) - self.parser.insert_option_group(0, self.cmd_opts) - - def run(self, options, args): - if not args: - self.parser.print_usage(sys.stderr) - return ERROR - - algorithm = options.algorithm - for path in args: - logger.info('%s:\n--hash=%s:%s', - path, algorithm, _hash_of_file(path, algorithm)) - - -def _hash_of_file(path, algorithm): - """Return the hash digest of a file.""" - with open(path, 'rb') as archive: - hash = hashlib.new(algorithm) - for chunk in read_chunks(archive): - hash.update(chunk) - return hash.hexdigest() diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/hash.pyc b/venv/lib/python2.7/site-packages/pip/_internal/commands/hash.pyc deleted file mode 100644 index f204a1f02bcb2c89ad60da64be8f2bf722bc92a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2783 zcmc&#Yi}Dx6urBCBzBS}ZBYsc&=wlWLbcths47*dQrbX~XaeIv!6;g-cgOZR`^wC0 z9##4Qh0pLu_;>sP&Yg7Dg-QmIA5P0`UmNbf4D@vF`~p*s=j%;i`Ur+Z#K;3J zFhp`d4|oDMAlcw7hYJ+dZDNZQHLTGhG3Ye0S^tTq?csxW6v)gAyeZ!3=;mhGyUj@B^qo6mY_BkZDlV zWZr-=21bjbHbqM`Ti_|MYW>V@*xidX!{jnMhbQ=Fnh!e6f^E%&=mwfA+wBI)Bv(K! zwK+#p8`HwX|$S!EZB*Xna4;V&nU^6Q+@mQfR}ggUEIekl>OD#@Gfi z%j3+3TLel=Wo}{uMTW(jvEHAkyev8w8?;Quc4wd_+Au`>M;)|e8=b-G7b-psjO-r< zsz1(?NGjcbbKF09phnrz{{4ps*}aGAi-+MOef(wgM%}|_QuKHGMO<{}4C|WvuO|Kv zJY*kaW~9o3q#stNSNEAmz2Zcy;guiZ(eI%l=L4sOZ*%^wIoF+#gXcOhM$b2~atH$) z(jVKxqxKFV6=nd04%rRBu~~!O*66s)3t#MQ(Azq52^0d^PV019W6Uc9yg93rbI_&N zmOhNiw&u7t^y7AQ%)WxTp*zeO!GT)A08p9nON}FII7od`aYq|qrUd&Dyu(%~$tM%k zh3gk*kk z{(4MrU6#p8Ai-lM?`;Cw;4iu__HHtTL0jl0Xv<7L=+W!f5Y8We;bABvYoFyILn5Rp zRpyy""" - summary = 'Show help for commands.' - ignore_require_venv = True - - def run(self, options, args): - from pip._internal.commands import commands_dict, get_similar_commands - - try: - # 'pip help' with no args is handled by pip.__init__.parseopt() - cmd_name = args[0] # the command we need help for - except IndexError: - return SUCCESS - - if cmd_name not in commands_dict: - guess = get_similar_commands(cmd_name) - - msg = ['unknown command "%s"' % cmd_name] - if guess: - msg.append('maybe you meant "%s"' % guess) - - raise CommandError(' - '.join(msg)) - - command = commands_dict[cmd_name]() - command.parser.print_help() - - return SUCCESS diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/help.pyc b/venv/lib/python2.7/site-packages/pip/_internal/commands/help.pyc deleted file mode 100644 index 62b07d64039cf629a5a35a2153fcf9eeac5ef3b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1651 zcmc&!?P}ac6ul#@w2td_O`Ez2lp+FwrQlUUi%B5_Qxj-^G!$)0+l4a7t64?1zA`hi zcf;)R1Il1gdLFbX(1>J={KUcL_f`TC>zpr zyo2ovJTw*wX6hpL2SGv;M#Yz*ujm|Hh}v zqs@TCYM<5)^!-ghKhz)4!1{EtOZo{3A%JB1<2s-x&x($$%YR!tXGDy?lF zV8NoJXuONJ<-)W@JCQ|gm9EorvfVjhPziUD<;-vDOf6lTBn~1+)3#N0mhgtIjOPt@ z;Xs>eqqJMsYWO4#=@>3@gMrc%18LvLqXZ6*^gi$F*BO9D+fq-^#M*cpD+?}==t8h7>U5! z6MNoBgyODu5ATuJE5OX8<0Yk&NXn|ox>CVpQKZb8Ip+Lf+_3LVit=;Vboi$A%7tI* zPT3FPEb_Y1N^14GEAYNl^=0xA{I}Y?D}fTG!ITaE-Goph^!o8dF9$c5l#9-G04@_) zWIx65kFG3>$ysXDw(%49=l9=vD532PGBaiRX1({X{nT=<`sQ=(>rlRXu`CPqwC{#z O%+Rpoz&jB5`F{b~41`4h diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/install.py b/venv/lib/python2.7/site-packages/pip/_internal/commands/install.py deleted file mode 100644 index c13da44..0000000 --- a/venv/lib/python2.7/site-packages/pip/_internal/commands/install.py +++ /dev/null @@ -1,587 +0,0 @@ -from __future__ import absolute_import - -import errno -import logging -import operator -import os -import shutil -from optparse import SUPPRESS_HELP - -from pip._vendor import pkg_resources - -from pip._internal.cache import WheelCache -from pip._internal.cli import cmdoptions -from pip._internal.cli.base_command import RequirementCommand -from pip._internal.cli.status_codes import ERROR -from pip._internal.exceptions import ( - CommandError, InstallationError, PreviousBuildDirError, -) -from pip._internal.locations import distutils_scheme, virtualenv_no_global -from pip._internal.operations.check import check_install_conflicts -from pip._internal.operations.prepare import RequirementPreparer -from pip._internal.req import RequirementSet, install_given_reqs -from pip._internal.req.req_tracker import RequirementTracker -from pip._internal.resolve import Resolver -from pip._internal.utils.filesystem import check_path_owner -from pip._internal.utils.misc import ( - ensure_dir, get_installed_version, - protect_pip_from_modification_on_windows, -) -from pip._internal.utils.temp_dir import TempDirectory -from pip._internal.wheel import WheelBuilder - -logger = logging.getLogger(__name__) - - -def is_wheel_installed(): - """ - Return whether the wheel package is installed. - """ - try: - import wheel # noqa: F401 - except ImportError: - return False - - return True - - -def build_wheels(builder, pep517_requirements, legacy_requirements, session): - """ - Build wheels for requirements, depending on whether wheel is installed. - """ - # We don't build wheels for legacy requirements if wheel is not installed. - should_build_legacy = is_wheel_installed() - - # Always build PEP 517 requirements - build_failures = builder.build( - pep517_requirements, - session=session, autobuilding=True - ) - - if should_build_legacy: - # We don't care about failures building legacy - # requirements, as we'll fall through to a direct - # install for those. - builder.build( - legacy_requirements, - session=session, autobuilding=True - ) - - return build_failures - - -class InstallCommand(RequirementCommand): - """ - Install packages from: - - - PyPI (and other indexes) using requirement specifiers. - - VCS project urls. - - Local project directories. - - Local or remote source archives. - - pip also supports installing from "requirements files", which provide - an easy way to specify a whole environment to be installed. - """ - name = 'install' - - usage = """ - %prog [options] [package-index-options] ... - %prog [options] -r [package-index-options] ... - %prog [options] [-e] ... - %prog [options] [-e] ... - %prog [options] ...""" - - summary = 'Install packages.' - - def __init__(self, *args, **kw): - super(InstallCommand, self).__init__(*args, **kw) - - cmd_opts = self.cmd_opts - - cmd_opts.add_option(cmdoptions.requirements()) - cmd_opts.add_option(cmdoptions.constraints()) - cmd_opts.add_option(cmdoptions.no_deps()) - cmd_opts.add_option(cmdoptions.pre()) - - cmd_opts.add_option(cmdoptions.editable()) - cmd_opts.add_option( - '-t', '--target', - dest='target_dir', - metavar='dir', - default=None, - help='Install packages into . ' - 'By default this will not replace existing files/folders in ' - '. Use --upgrade to replace existing packages in ' - 'with new versions.' - ) - cmd_opts.add_option(cmdoptions.platform()) - cmd_opts.add_option(cmdoptions.python_version()) - cmd_opts.add_option(cmdoptions.implementation()) - cmd_opts.add_option(cmdoptions.abi()) - - cmd_opts.add_option( - '--user', - dest='use_user_site', - action='store_true', - help="Install to the Python user install directory for your " - "platform. Typically ~/.local/, or %APPDATA%\\Python on " - "Windows. (See the Python documentation for site.USER_BASE " - "for full details.)") - cmd_opts.add_option( - '--no-user', - dest='use_user_site', - action='store_false', - help=SUPPRESS_HELP) - cmd_opts.add_option( - '--root', - dest='root_path', - metavar='dir', - default=None, - help="Install everything relative to this alternate root " - "directory.") - cmd_opts.add_option( - '--prefix', - dest='prefix_path', - metavar='dir', - default=None, - help="Installation prefix where lib, bin and other top-level " - "folders are placed") - - cmd_opts.add_option(cmdoptions.build_dir()) - - cmd_opts.add_option(cmdoptions.src()) - - cmd_opts.add_option( - '-U', '--upgrade', - dest='upgrade', - action='store_true', - help='Upgrade all specified packages to the newest available ' - 'version. The handling of dependencies depends on the ' - 'upgrade-strategy used.' - ) - - cmd_opts.add_option( - '--upgrade-strategy', - dest='upgrade_strategy', - default='only-if-needed', - choices=['only-if-needed', 'eager'], - help='Determines how dependency upgrading should be handled ' - '[default: %default]. ' - '"eager" - dependencies are upgraded regardless of ' - 'whether the currently installed version satisfies the ' - 'requirements of the upgraded package(s). ' - '"only-if-needed" - are upgraded only when they do not ' - 'satisfy the requirements of the upgraded package(s).' - ) - - cmd_opts.add_option( - '--force-reinstall', - dest='force_reinstall', - action='store_true', - help='Reinstall all packages even if they are already ' - 'up-to-date.') - - cmd_opts.add_option( - '-I', '--ignore-installed', - dest='ignore_installed', - action='store_true', - help='Ignore the installed packages (reinstalling instead).') - - cmd_opts.add_option(cmdoptions.ignore_requires_python()) - cmd_opts.add_option(cmdoptions.no_build_isolation()) - cmd_opts.add_option(cmdoptions.use_pep517()) - cmd_opts.add_option(cmdoptions.no_use_pep517()) - - cmd_opts.add_option(cmdoptions.install_options()) - cmd_opts.add_option(cmdoptions.global_options()) - - cmd_opts.add_option( - "--compile", - action="store_true", - dest="compile", - default=True, - help="Compile Python source files to bytecode", - ) - - cmd_opts.add_option( - "--no-compile", - action="store_false", - dest="compile", - help="Do not compile Python source files to bytecode", - ) - - cmd_opts.add_option( - "--no-warn-script-location", - action="store_false", - dest="warn_script_location", - default=True, - help="Do not warn when installing scripts outside PATH", - ) - cmd_opts.add_option( - "--no-warn-conflicts", - action="store_false", - dest="warn_about_conflicts", - default=True, - help="Do not warn about broken dependencies", - ) - - cmd_opts.add_option(cmdoptions.no_binary()) - cmd_opts.add_option(cmdoptions.only_binary()) - cmd_opts.add_option(cmdoptions.prefer_binary()) - cmd_opts.add_option(cmdoptions.no_clean()) - cmd_opts.add_option(cmdoptions.require_hashes()) - cmd_opts.add_option(cmdoptions.progress_bar()) - - index_opts = cmdoptions.make_option_group( - cmdoptions.index_group, - self.parser, - ) - - self.parser.insert_option_group(0, index_opts) - self.parser.insert_option_group(0, cmd_opts) - - def run(self, options, args): - cmdoptions.check_install_build_global(options) - upgrade_strategy = "to-satisfy-only" - if options.upgrade: - upgrade_strategy = options.upgrade_strategy - - if options.build_dir: - options.build_dir = os.path.abspath(options.build_dir) - - cmdoptions.check_dist_restriction(options, check_target=True) - - if options.python_version: - python_versions = [options.python_version] - else: - python_versions = None - - options.src_dir = os.path.abspath(options.src_dir) - install_options = options.install_options or [] - if options.use_user_site: - if options.prefix_path: - raise CommandError( - "Can not combine '--user' and '--prefix' as they imply " - "different installation locations" - ) - if virtualenv_no_global(): - raise InstallationError( - "Can not perform a '--user' install. User site-packages " - "are not visible in this virtualenv." - ) - install_options.append('--user') - install_options.append('--prefix=') - - target_temp_dir = TempDirectory(kind="target") - if options.target_dir: - options.ignore_installed = True - options.target_dir = os.path.abspath(options.target_dir) - if (os.path.exists(options.target_dir) and not - os.path.isdir(options.target_dir)): - raise CommandError( - "Target path exists but is not a directory, will not " - "continue." - ) - - # Create a target directory for using with the target option - target_temp_dir.create() - install_options.append('--home=' + target_temp_dir.path) - - global_options = options.global_options or [] - - with self._build_session(options) as session: - finder = self._build_package_finder( - options=options, - session=session, - platform=options.platform, - python_versions=python_versions, - abi=options.abi, - implementation=options.implementation, - ) - build_delete = (not (options.no_clean or options.build_dir)) - wheel_cache = WheelCache(options.cache_dir, options.format_control) - - if options.cache_dir and not check_path_owner(options.cache_dir): - logger.warning( - "The directory '%s' or its parent directory is not owned " - "by the current user and caching wheels has been " - "disabled. check the permissions and owner of that " - "directory. If executing pip with sudo, you may want " - "sudo's -H flag.", - options.cache_dir, - ) - options.cache_dir = None - - with RequirementTracker() as req_tracker, TempDirectory( - options.build_dir, delete=build_delete, kind="install" - ) as directory: - requirement_set = RequirementSet( - require_hashes=options.require_hashes, - check_supported_wheels=not options.target_dir, - ) - - try: - self.populate_requirement_set( - requirement_set, args, options, finder, session, - self.name, wheel_cache - ) - preparer = RequirementPreparer( - build_dir=directory.path, - src_dir=options.src_dir, - download_dir=None, - wheel_download_dir=None, - progress_bar=options.progress_bar, - build_isolation=options.build_isolation, - req_tracker=req_tracker, - ) - - resolver = Resolver( - preparer=preparer, - finder=finder, - session=session, - wheel_cache=wheel_cache, - use_user_site=options.use_user_site, - upgrade_strategy=upgrade_strategy, - force_reinstall=options.force_reinstall, - ignore_dependencies=options.ignore_dependencies, - ignore_requires_python=options.ignore_requires_python, - ignore_installed=options.ignore_installed, - isolated=options.isolated_mode, - use_pep517=options.use_pep517 - ) - resolver.resolve(requirement_set) - - protect_pip_from_modification_on_windows( - modifying_pip=requirement_set.has_requirement("pip") - ) - - # Consider legacy and PEP517-using requirements separately - legacy_requirements = [] - pep517_requirements = [] - for req in requirement_set.requirements.values(): - if req.use_pep517: - pep517_requirements.append(req) - else: - legacy_requirements.append(req) - - wheel_builder = WheelBuilder( - finder, preparer, wheel_cache, - build_options=[], global_options=[], - ) - - build_failures = build_wheels( - builder=wheel_builder, - pep517_requirements=pep517_requirements, - legacy_requirements=legacy_requirements, - session=session, - ) - - # If we're using PEP 517, we cannot do a direct install - # so we fail here. - if build_failures: - raise InstallationError( - "Could not build wheels for {} which use" - " PEP 517 and cannot be installed directly".format( - ", ".join(r.name for r in build_failures))) - - to_install = resolver.get_installation_order( - requirement_set - ) - - # Consistency Checking of the package set we're installing. - should_warn_about_conflicts = ( - not options.ignore_dependencies and - options.warn_about_conflicts - ) - if should_warn_about_conflicts: - self._warn_about_conflicts(to_install) - - # Don't warn about script install locations if - # --target has been specified - warn_script_location = options.warn_script_location - if options.target_dir: - warn_script_location = False - - installed = install_given_reqs( - to_install, - install_options, - global_options, - root=options.root_path, - home=target_temp_dir.path, - prefix=options.prefix_path, - pycompile=options.compile, - warn_script_location=warn_script_location, - use_user_site=options.use_user_site, - ) - - lib_locations = get_lib_location_guesses( - user=options.use_user_site, - home=target_temp_dir.path, - root=options.root_path, - prefix=options.prefix_path, - isolated=options.isolated_mode, - ) - working_set = pkg_resources.WorkingSet(lib_locations) - - reqs = sorted(installed, key=operator.attrgetter('name')) - items = [] - for req in reqs: - item = req.name - try: - installed_version = get_installed_version( - req.name, working_set=working_set - ) - if installed_version: - item += '-' + installed_version - except Exception: - pass - items.append(item) - installed = ' '.join(items) - if installed: - logger.info('Successfully installed %s', installed) - except EnvironmentError as error: - show_traceback = (self.verbosity >= 1) - - message = create_env_error_message( - error, show_traceback, options.use_user_site, - ) - logger.error(message, exc_info=show_traceback) - - return ERROR - except PreviousBuildDirError: - options.no_clean = True - raise - finally: - # Clean up - if not options.no_clean: - requirement_set.cleanup_files() - wheel_cache.cleanup() - - if options.target_dir: - self._handle_target_dir( - options.target_dir, target_temp_dir, options.upgrade - ) - return requirement_set - - def _handle_target_dir(self, target_dir, target_temp_dir, upgrade): - ensure_dir(target_dir) - - # Checking both purelib and platlib directories for installed - # packages to be moved to target directory - lib_dir_list = [] - - with target_temp_dir: - # Checking both purelib and platlib directories for installed - # packages to be moved to target directory - scheme = distutils_scheme('', home=target_temp_dir.path) - purelib_dir = scheme['purelib'] - platlib_dir = scheme['platlib'] - data_dir = scheme['data'] - - if os.path.exists(purelib_dir): - lib_dir_list.append(purelib_dir) - if os.path.exists(platlib_dir) and platlib_dir != purelib_dir: - lib_dir_list.append(platlib_dir) - if os.path.exists(data_dir): - lib_dir_list.append(data_dir) - - for lib_dir in lib_dir_list: - for item in os.listdir(lib_dir): - if lib_dir == data_dir: - ddir = os.path.join(data_dir, item) - if any(s.startswith(ddir) for s in lib_dir_list[:-1]): - continue - target_item_dir = os.path.join(target_dir, item) - if os.path.exists(target_item_dir): - if not upgrade: - logger.warning( - 'Target directory %s already exists. Specify ' - '--upgrade to force replacement.', - target_item_dir - ) - continue - if os.path.islink(target_item_dir): - logger.warning( - 'Target directory %s already exists and is ' - 'a link. Pip will not automatically replace ' - 'links, please remove if replacement is ' - 'desired.', - target_item_dir - ) - continue - if os.path.isdir(target_item_dir): - shutil.rmtree(target_item_dir) - else: - os.remove(target_item_dir) - - shutil.move( - os.path.join(lib_dir, item), - target_item_dir - ) - - def _warn_about_conflicts(self, to_install): - try: - package_set, _dep_info = check_install_conflicts(to_install) - except Exception: - logger.error("Error checking for conflicts.", exc_info=True) - return - missing, conflicting = _dep_info - - # NOTE: There is some duplication here from pip check - for project_name in missing: - version = package_set[project_name][0] - for dependency in missing[project_name]: - logger.critical( - "%s %s requires %s, which is not installed.", - project_name, version, dependency[1], - ) - - for project_name in conflicting: - version = package_set[project_name][0] - for dep_name, dep_version, req in conflicting[project_name]: - logger.critical( - "%s %s has requirement %s, but you'll have %s %s which is " - "incompatible.", - project_name, version, req, dep_name, dep_version, - ) - - -def get_lib_location_guesses(*args, **kwargs): - scheme = distutils_scheme('', *args, **kwargs) - return [scheme['purelib'], scheme['platlib']] - - -def create_env_error_message(error, show_traceback, using_user_site): - """Format an error message for an EnvironmentError - - It may occur anytime during the execution of the install command. - """ - parts = [] - - # Mention the error if we are not going to show a traceback - parts.append("Could not install packages due to an EnvironmentError") - if not show_traceback: - parts.append(": ") - parts.append(str(error)) - else: - parts.append(".") - - # Spilt the error indication from a helper message (if any) - parts[-1] += "\n" - - # Suggest useful actions to the user: - # (1) using user site-packages or (2) verifying the permissions - if error.errno == errno.EACCES: - user_option_part = "Consider using the `--user` option" - permissions_part = "Check the permissions" - - if not using_user_site: - parts.extend([ - user_option_part, " or ", - permissions_part.lower(), - ]) - else: - parts.append(permissions_part) - parts.append(".\n") - - return "".join(parts).strip() + "\n" diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/install.pyc b/venv/lib/python2.7/site-packages/pip/_internal/commands/install.pyc deleted file mode 100644 index af69e6ac965fc2ffefa300f6b48d66f50a708e07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16064 zcmc&*U2GiJbw0DZT#6J)Q9qPK{dr7@)=Jhc<$uSPWyz8p%W-6SC|k}t>Uy{{B$u4s zS0z2}GKf zR4uWX&qa@x4kzl_x4@mWZ$&X2JP@0FNdPtfxQk{|J zVW}QAb>k8ok>*jU9+l>-RA)`;UI~s#^SD%xoBV_XC!~2&swYi;Qi4;`d_t;ENYj?8 zZAzykcv6~kQk^sTeG;6O<{7D;G5Ki;=B4?RRG%{W{Sus&W=X0gX`YknIcc7k>UmRl zK!T^Gc|ocdO#Yw*WocHVS`o|7%ld-&7v%xu|BQHtE6F~5+~qh7I*DIvG}~d6+%h$js9Ab{ zanZT4v{ZZR#yg9H;`YXBE%M{A6V?6L6py3zoi*PNuDSI!e^6F$dSN?hgsrsQ0km`c zd!0t)H~m&}Eo?U3mS@_Jpzem_yz7*xf5`+sY5k2T0%QA8aI+OBZVy1cjN;y)Q#>Z>KNhfIpaV-XOO+Pt=!uyRV>9~R4x?gLBwbdY8b_2u5 z5!9kxeWTVeqt)tRYb9vZlXMaX(O_s27`^RAeq;um+F7~eCkZE=ky>rs_gj$Oy+;e= zcI4JKKuQ;9kCMXT+|Nol8^c=LP1b7RW(zecEiQoHiaU{C^Dr|?Wz|oz8TeieG-3!X zDWRqvg^6EJYVAh5wi1QSS~K(-D~-B}wHCH&n~jziZl)|!6K?y>HUx`KVbnF;aeZ{j zRqB3JM_$M`*YVmFSdVi^bf;-OXfQ;2=+HVKg~XDLafz@`EGvOhewgH;nVd%aGCt!r z{&W1K6SeHkH9uMNBO4#4{lIQRK<=tmdlQUN3q@}TXLy-3|u#WwoF znm64b_7gU|9d(ShI!BSCY|JOVhtxtlYTS1df8o9xEv$rr2N5oOX=|bTT(sQU+<4~2 zd##HvM$f-ke>vXzjQ6GJBK})#FWg>$T+1nQ<>Z;quhte>q`z2^#E)8TuuwO;A1|aW zEA6h)l(?px57zDsc!{~dQpj7=)}%F(tCRU+`m4fz8<|9Rf3G0hBI}lHL-6>*H0K0z zeqiN#BeGqP=*_GFEcng_R!d}iBwLO5KvPAlOKcV(wpYT)h5~1MIKE(ee%o((jn=9i z4wlR;*Y0IXMnN_9W7S3~k=seaW$s)MP%Usya4uXZEq0D0RpMl|tCsmu!d=+*+b=xx z61P*I8!Zp~Rkz;VQSO{10d|Vl!cO4TlupgGOt@=J!HU}mu#4iyt_u{6VM!$!UnJ`^ zB{DLWFIq)wU%pu2zteeT|E4iksmavc$j01}Z(Kpw>qz)GIiM8y>dN!f#yO7j8YehT z>VlpWIHpH5F)ChB6MMuP)x?-MOC_46_$KJ8YNW$v`x5E_gYwF_)|KtW?&3|m1QTzE zx{qO3{4GB|XLn+%%h1BvaoexM2w{(z?Oe7$xVB`&RIS76*qtcom%kI%T^NG22Ifx9 zQp10!fvRZ}md-XumF-6LHJD#CQ|_=OZ5V>kjyr80e0_sL&NvHuZiqijtP%L}+y!id zMtzOL-*0%nQgU0i@5Wtw)9u;`=;=(lwu`1=;M+K38d2Edfye4)7%#I{ndMTwPRru? zOtQ8;k3m-LkJ1zLu6=2UpMktC+aIMy5k?2%E%)13Dn^vMDV3ug#LVRWKZHIi`{3(- zJ?^guR_e0-<3~0ff*ni9!|Z?Sb17XpYQaLkaXjP@^wqCYr^3^A(D1)|1*-b*I9XsB zaq7Sj+SvdC*Q#Cpry=9FHbYMUZB-kFVcmAvtpk?DhN|~#^?_aN9z>&zUHGINVrEyP!$XZYf&DvKW6^<~Met$axsuxK5W~kH zn?A$GwfcmL?xc99#KZRqS%pc18111Uy(hKl+z_SH!*e?$-n_PWYN*B8p|QvyCi<{C z9NJwpv%3hBf4Jk3-9<-t7I~$N6^P&*=a@hcnAiE?c|EO-uv(@OsxJ)Bt2|U)8KSW; zOylBEBZL+Gfu0>|#Q8(^4^QLx?xGXBi%#w?I<>p#iL8iY*}4IrRQF_#do}fC=4Ab} zc+b&!L7{Hieo4lbFX;xtzEW{9yInnx>2S~{bc$g2nbww zcyK})Dnx3GJ%7dR1g77bAGG7&LFKNa4!&GyUqYYD75j}Y+#u})XBA%0W+MpfR+!+7 zYX@!}r@$7%5ItIWj%5BMj)IKB`>}7A%boUWA zcG`B;4eTNYv@yK|K4G(B-|n^%Lnl{P5if!&bbwuY18tX znXS;#PbCtCVUn;R6E&V9@oPhK_8~#c*LWoiFz@Rc=vumg`t0x|*mod5S@Y zVFS0&hJ^Q0{SH5D;r>VOY zdrqm&+2sKhPLR@0dGxURR^7g!@xMrBM2}J9iD1w4Q&HH{_CP6#KO2_bGV-?Ym zzot}%#MWPxQhW{!?UVvJ+sO^<$%Kj?rY2O|Vn&10iRJi7$5OYcT*i*A`{l?_r=UoX zmLY1&T+vq{e<#bqSMEpOu?;P4*^L#B3`ZAobA!ltJ+4JL3CkWdqGD9`W~vd5)fS9R z78hfs31*nWL8u$QfWn*FQYSSKaNqWo`uuUh*#P67tE3wPQFR;k)u@q4$7ewkVG+wS zo0did>e8!E-UT2M;)Gz-RW8Glq=e!M3a%Szr$zrKjoFOGrW>`&aXo6ZlQPYr+FgQA ztN<9ridt5o0bV*1>&FNSq-` zCxYjyfgkjkMXR9_!m8=YQ8182to$07F)LDFLz&_jjh2f8h-Vk~dY0!A&SL`yc-n%} zNBerU>I?28Ga4Jq^7&!r^D7(qp;J~fizr9^Yjb=W72J) zPJw%*c62Gx9P47lez2kmI9D-{C6SFy=XKUnGKMPkp@iJy#M7M182@AZ#{YniShKmY z+(Ao!@Ndx?!!LhEN3v3rM~NaUT9>xbbS|q$i~PadLF5gM(UGiX!WtdR(xbp>()yus z*(>{D3-dEbf%c9TDR1Ok%O~;&tvZ$WG=90AuU)|me-#UeDA&M#j9w9IGOV>2??xp} zXrS8y!iPe@fbXQ??)qq2f^Mj)6$EWaYY(#o4-uOJt7SLfwwu~|Tvjmvn(D0%67=7T zlF~x(YG_Sp<4I}%maGB+2L1>lQxg5RCiY46w~RMEIPsQz&C-E2NQ}NO*nJ3-`{jTo z5sM*eMv0YX5UL|XZV`bZl4ekD^@>V+Mxt+6;G8o$ypuZwYlgd-to%sY1?5rGN~dyk zP&mO-@JT_Wd~Rd1vkYD`X2yj@MLCl4#F-wG_NNvn4iQ73$4L>@pZsN^2jQXwVeDQO zA~@eh7&oayBA%UMtb^E`L=fRlYl5*-v8Pi)sMP+Uu1G;9dgGEHXhPFD{hrp)N$H{_ zdMlTlNoz6o1oQK#Dve1gz@YbiOPg#vFT3^80(T_?lY|7O#1dY9Ab^{^ONgJ)zS{6c}L*QJMLIU-S1;A&oxZQ?q* z?^u0Rdf85ie!h^r!7R7rHMYY>-G<6Mt0b>$46mESdtOVhYLF_3+z{_Y*~X%0OZFgN z?9EE@rg$%D11uuqf77>5txqIdwFffNJ0{6zW&JJL266!tbzG90vJFLgS(3M9{d3}B zNjQ6}cS2X|q-?Fp_6aP~$Jru1Exl9Hy(q~$x@Le|upU4?&joxlm)ZMZzXeb%5E zXEjhp#zfJ`YK(;-3?3gMqQ(lGBtq<|JVwTvP3LwcR)PtRk7bE+(F2p z+z&Yz-;ksGjkv*Z89}?^0)so`Vb~>&L=2m+sh_j~pGdKnbeaSnZYwf{*c=FsVneaL z+yVEo4&@F|2HZGgSQ6Z3Ku8^gR->R$F0X}6|21`>Q!i6*xt!0UQUki3{&DQQjS7db zMErexZX;?O;5ldK78n_7IeKsUHs7$%yg|lZbn}9P7gAG1J5TlN}e+DWDQ~dxz zIu>ZzXH?OM>BoB&Ti03xJFGynp?81?yLmmtt850^$(lPfaK*m40_pg5+~0#TuWS_Z ziaTC-!3O+fH*x2(2~QZeI9_-*w##qXD}lROQE_`d!Ux|u%W2=iM}2*xaOtHFZpIC} z&gWQ9u_7i=Y>WUk>l%Vfa(9dBY?C?6=xZ@^18II4K&$Gp6*n%N}iB5dad6y*&8}w4Y3$gK@ z-$YjUmo=UX!XaYWr+iv2pA#_mJZ)7-AlK@y4Q!TUcGj zy4&JL8NT95wJ7K+9B{#|GZbUYz~A@^etGo{BXW02dg_*~i+o_+!+A|im#xz$DFq~3 zZqqjpE!e$s5w|)J^5YIPbjx2_^;`Z{JG%T;@T8M1ns7;xM>5atsta#ygNALqPm*MoNs~5X2@byqZlSib%>@LHPo#^d55twNSmcw1y6@G%@Ep9;#(Vp(FpGG zUWOO|FYleV_<56`HGcT6z-ak%OmWjWoT5WTRsp$fz9?`=*Ez?J>N#UnV=5JrXv7TT zSy%`5gndp;){r=j*t1s#d<~Npr8d20ww_wbfmL*P{5W}18N)|+qwf4E`rQuO9iRt(1~Cxf=2GhVI^2|MN1P3&7_sZ# zciK#GqwBuS_Bh|`_-3P1c6^J4H$o1lsfGxacX%A?&JXzQYS(j7cTB948W8mdZz<^h^6UL-Po%8inHi6sOJhV-Wc4x zo7X>FR)F2hArAPivSn1K#&=*opPAK~;0l>aR*to4s-r8R`NsggC>jDk#6B~mM|_FfMLwAZIekF$ zV^u&IN=*tDkjg#0@Uin1(xgGexCZ5iyVW$dg(-!s`UEm~&-oU+aa)0bO+8ipWt^H>j&iW5{)mOYY_yR$cRDsUCNb<4>o|AMFn7>a^b$OG|WsD{uJZ!GdMOGF5%0#d+XkQzY> z4;}F21C2pKail09=CY1n16Zlw0xv)S4SmXB7S$VhO`FzQr65$lHE<}j{!T_uvuv?d zu`tB-yH8m_akfrcie_-(NE!9h8GWz_g3986?45gm zEqCsCBJX{O&r*p>a0`nMtJlRxcYPZ#^IfVrM z%tHe|^Jn#G!y~;-j)%v_co)WqLw!!?KFZYXN}tB+ShVpdm&fyFbf@e2ADDFNdNzK9 z|6;msX{6adBJ6p@TT;8~dDeycz#07j~Wq5SP#<-%xdq1yIQXh#o z6%H55Az#h|ez2tCV22nD3E+?NH2pOeP!rr%*ZG7^et{)C+8Z&)cCfWfK3?NvajlA) zN#q-s-EgGZMb=8ROXgHR$JFofLyuW84IXzG75)yMoTx7Y?-;&6o!nGs)vwgN(Ob>$ zK|OU>Gj#1zLe3wNGM%c_OW-NVMyhxkBRPMC+Q*}U&hKLAf2QWWjf7a^g<@_rKLbmS zADmy))+zkr-`pflwh5d8Hco^Yl<<7X=Xl-0biQCx)46FasdM*I&UA3DT><_7LZS;W zKRW`xh!;ZmKM(M2zW=WLwe(#%-u0Oi0gFZ;%!3vA5Y~>J3cQNg`W&t2^}E-E2L#~h zqRi@XF)CYtSM^+&y?)mgo)xgedW4`6&j4WcI7A*4U@6;j=iYmAXX^tVE!XefdIU8< zn0l;$+SBqyAa!E`Q%`ej$bzOJ3rlM(VG)G?0))RQG=WPcD#NY#B);m%8YG2~2*dII zwQt4wDq1w~EAe@Ju+i~<>J2iTy`V)pi_`nY69*2gsYPg~a39 zRlkm*$FT+CGh_n((_#2X2dxqKSd-Qid?@;5vzk7p`$&&Somfq$h1+@B#u~%L4q}p; z%A*GKs$Q!ZU||IH9SwJ=U~vb3juUnD+SK_r3Up^XWMm)>O+6+<^AtF_Nk$oA7x%(^ zj27WekNxu4zmC0JN0}b>1^oN&l~i!B6|e$0_TdG61DHFuIUb7UWS0NHH^j5iCH4a{Fi#v7 zsLlK*Bv#=mna%{EUMZ|ATvEEI|_sCL-8#ewjK5r^21AoKTSlv$JKsAdfd>8;QFaK{Q3LA%YK-lQoO&U!g z;hl)~luxNrz!~q{6p-$}*XNZ4|6a|!s@Jzl1CTVerNGYh50v1lbo2$`Be+lx?G;-+ z$%^sQaC*vkJcsW!JQl(8o(R}##?Qy*2IONqg=}ZojDMl_FqE!pKoDO?sEn&h>mO_w zkBANspt%g&08~p=xpDQ{wHr&C^tTe=ZdxCNo4^3nZ=#hTqSrQ7{aeU7e}a#CB+BN{ z6H_(@#EpkN+@!=ZvsWZ6)xsh0A1@^%{hPGMx{ZDtoSx@4;sVG>5k{3^>*3sFe!8G; z3LFyt97N4@uJjUGrM7jYgFjS*Z6)?7&cCsOrj)24me2W3mO^dC`5RX4!3T?oNyol< zlcc9zqg}z-gTJ|p3>rqi7NC6vN1pj>u}WQU2Dp9-jyzNuGz_B42xnJSWf>kdUVy3U zI$WOQ(d`iJB%K&7;bbf5r2yGZdVU79#Rj(JgbX%zWY^gJyEo&abEc0N*tB>s z6b0yErp#LCipaL}K;&XD4Hd(kY0mNE@)q zcNBwmzDLp;+>o>)y!v8Kj|qoLJ~*&6^>~hP-36D7Q*xPxFD6Jlotr>xV15_@Oe1FC d&x!nD{nvbvFQ7EHFF!UhHhcI-^8K-q{{if2eUtzI diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/list.py b/venv/lib/python2.7/site-packages/pip/_internal/commands/list.py deleted file mode 100644 index d70782d..0000000 --- a/venv/lib/python2.7/site-packages/pip/_internal/commands/list.py +++ /dev/null @@ -1,302 +0,0 @@ -from __future__ import absolute_import - -import json -import logging - -from pip._vendor import six -from pip._vendor.six.moves import zip_longest - -from pip._internal.cli import cmdoptions -from pip._internal.cli.base_command import Command -from pip._internal.exceptions import CommandError -from pip._internal.index import PackageFinder -from pip._internal.utils.misc import ( - dist_is_editable, get_installed_distributions, -) -from pip._internal.utils.packaging import get_installer - -logger = logging.getLogger(__name__) - - -class ListCommand(Command): - """ - List installed packages, including editables. - - Packages are listed in a case-insensitive sorted order. - """ - name = 'list' - usage = """ - %prog [options]""" - summary = 'List installed packages.' - - def __init__(self, *args, **kw): - super(ListCommand, self).__init__(*args, **kw) - - cmd_opts = self.cmd_opts - - cmd_opts.add_option( - '-o', '--outdated', - action='store_true', - default=False, - help='List outdated packages') - cmd_opts.add_option( - '-u', '--uptodate', - action='store_true', - default=False, - help='List uptodate packages') - cmd_opts.add_option( - '-e', '--editable', - action='store_true', - default=False, - help='List editable projects.') - cmd_opts.add_option( - '-l', '--local', - action='store_true', - default=False, - help=('If in a virtualenv that has global access, do not list ' - 'globally-installed packages.'), - ) - self.cmd_opts.add_option( - '--user', - dest='user', - action='store_true', - default=False, - help='Only output packages installed in user-site.') - - cmd_opts.add_option( - '--pre', - action='store_true', - default=False, - help=("Include pre-release and development versions. By default, " - "pip only finds stable versions."), - ) - - cmd_opts.add_option( - '--format', - action='store', - dest='list_format', - default="columns", - choices=('columns', 'freeze', 'json'), - help="Select the output format among: columns (default), freeze, " - "or json", - ) - - cmd_opts.add_option( - '--not-required', - action='store_true', - dest='not_required', - help="List packages that are not dependencies of " - "installed packages.", - ) - - cmd_opts.add_option( - '--exclude-editable', - action='store_false', - dest='include_editable', - help='Exclude editable package from output.', - ) - cmd_opts.add_option( - '--include-editable', - action='store_true', - dest='include_editable', - help='Include editable package from output.', - default=True, - ) - index_opts = cmdoptions.make_option_group( - cmdoptions.index_group, self.parser - ) - - self.parser.insert_option_group(0, index_opts) - self.parser.insert_option_group(0, cmd_opts) - - def _build_package_finder(self, options, index_urls, session): - """ - Create a package finder appropriate to this list command. - """ - return PackageFinder( - find_links=options.find_links, - index_urls=index_urls, - allow_all_prereleases=options.pre, - trusted_hosts=options.trusted_hosts, - session=session, - ) - - def run(self, options, args): - if options.outdated and options.uptodate: - raise CommandError( - "Options --outdated and --uptodate cannot be combined.") - - packages = get_installed_distributions( - local_only=options.local, - user_only=options.user, - editables_only=options.editable, - include_editables=options.include_editable, - ) - - # get_not_required must be called firstly in order to find and - # filter out all dependencies correctly. Otherwise a package - # can't be identified as requirement because some parent packages - # could be filtered out before. - if options.not_required: - packages = self.get_not_required(packages, options) - - if options.outdated: - packages = self.get_outdated(packages, options) - elif options.uptodate: - packages = self.get_uptodate(packages, options) - - self.output_package_listing(packages, options) - - def get_outdated(self, packages, options): - return [ - dist for dist in self.iter_packages_latest_infos(packages, options) - if dist.latest_version > dist.parsed_version - ] - - def get_uptodate(self, packages, options): - return [ - dist for dist in self.iter_packages_latest_infos(packages, options) - if dist.latest_version == dist.parsed_version - ] - - def get_not_required(self, packages, options): - dep_keys = set() - for dist in packages: - dep_keys.update(requirement.key for requirement in dist.requires()) - return {pkg for pkg in packages if pkg.key not in dep_keys} - - def iter_packages_latest_infos(self, packages, options): - index_urls = [options.index_url] + options.extra_index_urls - if options.no_index: - logger.debug('Ignoring indexes: %s', ','.join(index_urls)) - index_urls = [] - - with self._build_session(options) as session: - finder = self._build_package_finder(options, index_urls, session) - - for dist in packages: - typ = 'unknown' - all_candidates = finder.find_all_candidates(dist.key) - if not options.pre: - # Remove prereleases - all_candidates = [candidate for candidate in all_candidates - if not candidate.version.is_prerelease] - - evaluator = finder.candidate_evaluator - best_candidate = evaluator.get_best_candidate(all_candidates) - if best_candidate is None: - continue - - remote_version = best_candidate.version - if best_candidate.location.is_wheel: - typ = 'wheel' - else: - typ = 'sdist' - # This is dirty but makes the rest of the code much cleaner - dist.latest_version = remote_version - dist.latest_filetype = typ - yield dist - - def output_package_listing(self, packages, options): - packages = sorted( - packages, - key=lambda dist: dist.project_name.lower(), - ) - if options.list_format == 'columns' and packages: - data, header = format_for_columns(packages, options) - self.output_package_listing_columns(data, header) - elif options.list_format == 'freeze': - for dist in packages: - if options.verbose >= 1: - logger.info("%s==%s (%s)", dist.project_name, - dist.version, dist.location) - else: - logger.info("%s==%s", dist.project_name, dist.version) - elif options.list_format == 'json': - logger.info(format_for_json(packages, options)) - - def output_package_listing_columns(self, data, header): - # insert the header first: we need to know the size of column names - if len(data) > 0: - data.insert(0, header) - - pkg_strings, sizes = tabulate(data) - - # Create and add a separator. - if len(data) > 0: - pkg_strings.insert(1, " ".join(map(lambda x: '-' * x, sizes))) - - for val in pkg_strings: - logger.info(val) - - -def tabulate(vals): - # From pfmoore on GitHub: - # https://github.com/pypa/pip/issues/3651#issuecomment-216932564 - assert len(vals) > 0 - - sizes = [0] * max(len(x) for x in vals) - for row in vals: - sizes = [max(s, len(str(c))) for s, c in zip_longest(sizes, row)] - - result = [] - for row in vals: - display = " ".join([str(c).ljust(s) if c is not None else '' - for s, c in zip_longest(sizes, row)]) - result.append(display) - - return result, sizes - - -def format_for_columns(pkgs, options): - """ - Convert the package data into something usable - by output_package_listing_columns. - """ - running_outdated = options.outdated - # Adjust the header for the `pip list --outdated` case. - if running_outdated: - header = ["Package", "Version", "Latest", "Type"] - else: - header = ["Package", "Version"] - - data = [] - if options.verbose >= 1 or any(dist_is_editable(x) for x in pkgs): - header.append("Location") - if options.verbose >= 1: - header.append("Installer") - - for proj in pkgs: - # if we're working on the 'outdated' list, separate out the - # latest_version and type - row = [proj.project_name, proj.version] - - if running_outdated: - row.append(proj.latest_version) - row.append(proj.latest_filetype) - - if options.verbose >= 1 or dist_is_editable(proj): - row.append(proj.location) - if options.verbose >= 1: - row.append(get_installer(proj)) - - data.append(row) - - return data, header - - -def format_for_json(packages, options): - data = [] - for dist in packages: - info = { - 'name': dist.project_name, - 'version': six.text_type(dist.version), - } - if options.verbose >= 1: - info['location'] = dist.location - info['installer'] = get_installer(dist) - if options.outdated: - info['latest_version'] = six.text_type(dist.latest_version) - info['latest_filetype'] = dist.latest_filetype - data.append(info) - return json.dumps(data) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/list.pyc b/venv/lib/python2.7/site-packages/pip/_internal/commands/list.pyc deleted file mode 100644 index e8ca0e56230c8a308faa8c33132c4f9ec0f9422d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11121 zcmd5?TWloRS^lfr-FEvnzRb*CW;4{1IO$!+?TrE>vdj+Nok`Fti+3omV&aWcDt8^X z+pg|v*QxfjhcOaN6cQe|1|FhF2qaLDctX4p3Gs%+8{!3cL9?7txsype$Z%%gSTzOiOdFd_4 z?t&}NNU|usE3$jVl^c>QNpD$pm!-ENyDP4CR+3feU6tLd;+d)(T@!O%o?y2xNjxWJ zP7XYY=jH1nPei`5`?ACfEbP7_@uFs4mH3KgZt!T^%_SVWi%*&!lKcviXy2yEFgIbh zH%PO5%e9bDwmWi#ITRjs2Vs)-JI3a&au${CUYri{ZrZo5ZW?v>(q1p>$F5?2Qt^c> zOEXuyfZ7L9`#9>DFLwK}$(j|^&Z+r-&UkTDtVnA2^cO zTc~R%!?@e;_$3`|YgUI8WV3#h89%{z6Qj2u`R&M>b|*adJ-{g9j^eRFTKX zSL9bjJX9T3<-977!MdO-NDVrJ$jH|u2Zce~X$-4+MGsIGG<~MW?8P1+Fi87MkA;gp z7RmC@_E>T~bVJ(dxn5sShj|=>Z{eGIOWED-x8O6%!p7GvVmULNPA6k>?;bZ7U&9KJaLgR=1a4@r;nZ!V}eW+AFHm4>@2R+lz{ZlMM#oO}VJ41tB z!!3W%9r!61K7d}eKDG@VI_Ya?be)4V>qR*Pu((gvmQ)O3(Lw^YVHJ8fxaJSjF6g7o zaF7}E$mm&*EH>~S`fg*B?Hoik<%!)ye$<1>c-t@L@|(p*-?-(wX>LJ3`8v&_?hLfY ziBE>z46H{jgNm@Muy;|RS6^yMca2nqytLR146I4N-8I%vdFRhx+lnq@M%1rny<{OJ zfMe|g@QhJY6Cbo~<#vtpSLQQO(M%l(en!uLXjYp%6v(IJw{fEb&y?xSu>vr~| zx7$B%N1u-$WpCk6XRz_n1_YrL+x7gjKivr*uu4A=CO26>N;cXKs@M(kers?RyoM!x ze0GFHyjLoXO5JOCb^M*i_h00yu1$MljQcx1RpzvQT$gMnGYS(6>%$^4Q1-~c7}aQMpGa-H$-A*%LZX(RVB=n9Ku92kLU>d~ zn9Pp`(4QbP8}k$r)wNFj71VLqfivh;QL%(cw}0%I$=%#AOKg4(s{x^<4@0CObXTFe zY);ezlR>Z&9;Uz_s#Gi#E|{yyqXyh>@CN&l0WmnB4s~smI~`Ggl;BNN1nX?acWK1%vo`SQwSFHNUYtnwdU3PJKsa#G0QtY@ z2}A(&0BT}4z!rDo3Qbv~(3BZ~D48PALViZFM2$b-fYuNWR5=w}vDPma(BP@oo8<<+ zr>%3(jfJ|IpH$LUa!j^me+ZNY87Dk2@?k!T;<6Szjw1l{?J;${}nl& zl5CavuT|t^73||-x*QWAKwa_a>8fk-Uf?0pZ%^65}VZgYV*d zF)^x}XrbYP!FwX|Es@cWP&eJ*`y?6an_x2-K##t)V=HvJ4{eEm-pP{e{E}!;q$1x? zZe-K8^4M0J{6^%#&u-$Qyn}D|7UkTTR*^4zCs4RlZjL*ds!2LFXD&*?(XF=>3>CnX zc>GdHYNo`9; zx+qa_k2xMYxR1mc=;MwH<;1DLfs`?PfIv=7 zM&Ea$_$P7>?13uus1b5Jt~30A!RN?h*;%oFs#akJg8Q>u~j zht5@ccxX)GoGrB}9ImKkjDi(Cm{FcZuw3+%6dCiP`l+i?HcZk^2fh-aNo@9q9W_%& zDI618x&l)c_&9irtI)wx=uK=5EERV(dZMx!wAf=BNogF(9SEXMFu0B%4-3s{lnf(; za&mgA#4-Ccw&M=EpRKg-B!!qs13)|nrd2Yinb81pVVDoPh}NDBjN-9?dL|f~;R#}Q zAp}LqYKl~wV3;2K>9Z+iCtIS9o9vr(dS=h8%1kdsD7!=isJS%vK#lSDumN@7#9M{< zzT!11D?m{T@CjCsU+``KSzYnwy*mD%M-Bfkd*#qj zTPp65#be-tfE|#+hd_qnT#>IT{4WB6kYy*%5dQvem4l~r@Sn-(i4*S!lyy!Fm!l@f zHOYR5=$ZZolms$ku}24Q7i>0jWpuOSh*IdwQX*WlW$LI@Y|UGY{cK2mjao)W;{!~iFNU{lB-y_q%g zu7jga*2un2_Rwi8c+UY;}1YWgN9!e!G+xiiFAxRX27GvAMdfSZ+&ut~WW-K{<{YxiTv+1MeJS z-M{DB+(45|srCU8d*vfOZ)Ld(5CYpn8lK>zvQsY_DC-72j-BviiekWsj6(LoaVO;S zVINUQlFoJ?!SWFz!X#eq;g7M2zvY%_$OLv`wX#xO@tUv_O^ThKJ5;5HuL$6t1zjfFLBWQy?b(AA&3QgjBV8Yz0X__Y(>Xd10<*Dsuv2;CAbaf zU7g&K9ZW#v+;ejp&Pl1SJwNm3CNpC;NcV9=vcH*3PP2>fF2aIvQKxj3KVlJBe2l_T z^iF9uH&qG%iQf)Prb+q4$ykR3k)ct6YjVK#(3K4 z{a0+KaC(Ci6rmeec=@iS`asB8e~O?&--||p!Um;Co~b$sKIQ}@TXKY;wW=OO z$?>-2R1)P2+QJ5B?8lK=`cT!Wa~#?_0&jVI86``?Sr{bI*`<;zIK@W(37@@+M5-@W zJ^_pOE@Wu|fb)HCxzZ*fxLux4C1?};LJJ2D2B!mGeu{!Ke#Gy<@j_r3@9|pMQJ_h7 zckdCXRPbm&RzcI>PEfAEqWG5`s}%$%BY5qAUtvrg;zX2MZ6khRQ8bVK(23CRDmn%7 z#4<=BNLW~%*X*y<5rw#-p0DG0@`hvT$}e2T{tMMAx^qVtd#f``6a3Vs){6OvT6Ijh z^C?}$EqU_m5I^j#>co#o)`m#*CFWk*hjZedO3Q~B;v{&Vczm%b0P7*0QK)Ua-0G11 z@)@}dj^g=61Is0PD}LRNC4Y=4OCiMSJ z8_eKng*H&D`9bNy@-p5po`o|7(E;PvL4rgjIqIJU-(bxF6UDuo%zcds53Mjb;5-v$ z08n9FxOoZn2&VUOh2ysZ1s?%nh|-_VN$^dM$9H+&DTG@71D}i9)%ehPt-`4PnzsZ1 zyi{4JuAsC86mmo1@%2ifBB&V0D&mh(pvYHb^j#;O-=7%_k??L8 z0p8NAcfCSCiJ^?^V2x$3`5IaaEP61^hxlz!NdHmPOI0<*SQo^>q3`aXh2Ts-PP0JC zNMMI|`LeQwpB%P&>8Y{KDleDK<&%A@opjw#6mGt#skM)v%0MmZFAxJVY0enGt}vbg zKmIW8xl-Q-H8l2g4-MVvlk^LQ<9CONZS}gg?eqazDd#U4o}R;Xb1ELkSB;@u12q1D zhW~<}!yxCf5aX(W4k(rZi9gW}n!5ymrJD1O^Dyr6w)A;$sWK0rc?k*vpZ>jGU8-EE MUjOUHN@MLm0iu8h$N&HU diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/search.py b/venv/lib/python2.7/site-packages/pip/_internal/commands/search.py deleted file mode 100644 index c157a31..0000000 --- a/venv/lib/python2.7/site-packages/pip/_internal/commands/search.py +++ /dev/null @@ -1,135 +0,0 @@ -from __future__ import absolute_import - -import logging -import sys -import textwrap -from collections import OrderedDict - -from pip._vendor import pkg_resources -from pip._vendor.packaging.version import parse as parse_version -# NOTE: XMLRPC Client is not annotated in typeshed as on 2017-07-17, which is -# why we ignore the type on this import -from pip._vendor.six.moves import xmlrpc_client # type: ignore - -from pip._internal.cli.base_command import Command -from pip._internal.cli.status_codes import NO_MATCHES_FOUND, SUCCESS -from pip._internal.download import PipXmlrpcTransport -from pip._internal.exceptions import CommandError -from pip._internal.models.index import PyPI -from pip._internal.utils.compat import get_terminal_size -from pip._internal.utils.logging import indent_log - -logger = logging.getLogger(__name__) - - -class SearchCommand(Command): - """Search for PyPI packages whose name or summary contains .""" - name = 'search' - usage = """ - %prog [options] """ - summary = 'Search PyPI for packages.' - ignore_require_venv = True - - def __init__(self, *args, **kw): - super(SearchCommand, self).__init__(*args, **kw) - self.cmd_opts.add_option( - '-i', '--index', - dest='index', - metavar='URL', - default=PyPI.pypi_url, - help='Base URL of Python Package Index (default %default)') - - self.parser.insert_option_group(0, self.cmd_opts) - - def run(self, options, args): - if not args: - raise CommandError('Missing required argument (search query).') - query = args - pypi_hits = self.search(query, options) - hits = transform_hits(pypi_hits) - - terminal_width = None - if sys.stdout.isatty(): - terminal_width = get_terminal_size()[0] - - print_results(hits, terminal_width=terminal_width) - if pypi_hits: - return SUCCESS - return NO_MATCHES_FOUND - - def search(self, query, options): - index_url = options.index - with self._build_session(options) as session: - transport = PipXmlrpcTransport(index_url, session) - pypi = xmlrpc_client.ServerProxy(index_url, transport) - hits = pypi.search({'name': query, 'summary': query}, 'or') - return hits - - -def transform_hits(hits): - """ - The list from pypi is really a list of versions. We want a list of - packages with the list of versions stored inline. This converts the - list from pypi into one we can use. - """ - packages = OrderedDict() - for hit in hits: - name = hit['name'] - summary = hit['summary'] - version = hit['version'] - - if name not in packages.keys(): - packages[name] = { - 'name': name, - 'summary': summary, - 'versions': [version], - } - else: - packages[name]['versions'].append(version) - - # if this is the highest version, replace summary and score - if version == highest_version(packages[name]['versions']): - packages[name]['summary'] = summary - - return list(packages.values()) - - -def print_results(hits, name_column_width=None, terminal_width=None): - if not hits: - return - if name_column_width is None: - name_column_width = max([ - len(hit['name']) + len(highest_version(hit.get('versions', ['-']))) - for hit in hits - ]) + 4 - - installed_packages = [p.project_name for p in pkg_resources.working_set] - for hit in hits: - name = hit['name'] - summary = hit['summary'] or '' - latest = highest_version(hit.get('versions', ['-'])) - if terminal_width is not None: - target_width = terminal_width - name_column_width - 5 - if target_width > 10: - # wrap and indent summary to fit terminal - summary = textwrap.wrap(summary, target_width) - summary = ('\n' + ' ' * (name_column_width + 3)).join(summary) - - line = '%-*s - %s' % (name_column_width, - '%s (%s)' % (name, latest), summary) - try: - logger.info(line) - if name in installed_packages: - dist = pkg_resources.get_distribution(name) - with indent_log(): - if dist.version == latest: - logger.info('INSTALLED: %s (latest)', dist.version) - else: - logger.info('INSTALLED: %s', dist.version) - logger.info('LATEST: %s', latest) - except UnicodeEncodeError: - pass - - -def highest_version(versions): - return max(versions, key=parse_version) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/search.pyc b/venv/lib/python2.7/site-packages/pip/_internal/commands/search.pyc deleted file mode 100644 index 1f286028f82a957bc8b1642f5c6f6434217299db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5521 zcmc&&TT>g!6+R;g3CUn#Y=iM-8E3;rIE&b=bzF(#aqohpj zvYk_+xI)P|wa0CLjN&RKHELh5{W8T9luS~4()KG9U!e}UpzO0H4+n(a?eJV(iOYG1egNs4b!a+BIO$x#LB z-6Hi7y~RoADZEIkPCE{Tb^3l8XSvz5BNs68EDu$#!nLSlEOQdf{$AJ5mCgovM`_C*V|I{h zbtZL`#CgBtcj8E;!^ss$t!7CQq+z1~+DxI@eC9uWw6*%n^_KtTvlp9dhNW6BR#(?s zExXz@7|)~rD_L+W4^qv$v||$(8!ow?=UHyKC7yBo{E6*dLa(cgZ&aQ{X%PE5dNbT; z4MR~HVuya5bq$}crGmV(J6!V}?pRlkSAe@mAQZF=-J^w;aUnn$6b)fEsAG@6_ zH9?eW_rd-^<;M@3rpznJmi0#=ddazBp_0;86pgyo$qhKcIsH%H6IU*xaT!@bY% z?WdpJ%kSRn{8S(PEPRuHhQDrqd26{J^`Tj9f;e6>pFi#T&zU6;4hHjpaV&SNf$C+8 zs%HP#o54$OzS5S;4^;j<&yJ1-Aq^SkYxI7^%_l6#wtFLe}G4Gj3wCmG%j)4aUHRVp+95|!XL8F^Zg_X2Qhc~guWkU9pCqU3|as@&rk#8==NxbFhtB>_5y9_&v^ST52Wm~$MYVHwDW@dabyh&>zvbFV--#PP}@yCCzi z#7kTYn6M+x4CrI`N?2S7|6I@@~}KMJ57t%IQRo zcOV}AAczOZgvD#H<=W^!%;dx`!bzX)!@Cce^R{jmdsxS#*;P@w>P$K{{uHL2qEo@= zO7Uv(x^vaWcXk2n#01*^hNb{#UE^TgVrL7TjZ>~TQS8dt+V)S_mvdkj=*|I8=r9^> z$|!gTis7I!g#X#E3$*Vt1q{!^W>O^WP^Dx6Yuj}W1VC-CLM)hZAUN9Mta5F8!(m&p z??HaR)ELe6|Hhdpy#N1u=_!&3Yy*3*Qazb-i|4r4!`q^7 zVHBe<>Zy+LCG>NwHYhX>^Pn##{f_8mNYdD#Q5JULclhK{x|2!C%Ee>|CPvDir~74XjuRnjMtfN$N|MDfyfC7(=4NzAQ7$)K%z@T;`bz zv0D?h$*BzTT5L)dlfAO%6oU78-o9o52Mh4%2WU7gEIAYKGDYVX@Hg|~d8V8j;9W$j zIPKg@bb9Ae6-0 zaAooSxH{@6`#Xo!Y3BL|639zctecX7+w%NF85lA|u ...""" - summary = 'Show information about installed packages.' - ignore_require_venv = True - - def __init__(self, *args, **kw): - super(ShowCommand, self).__init__(*args, **kw) - self.cmd_opts.add_option( - '-f', '--files', - dest='files', - action='store_true', - default=False, - help='Show the full list of installed files for each package.') - - self.parser.insert_option_group(0, self.cmd_opts) - - def run(self, options, args): - if not args: - logger.warning('ERROR: Please provide a package name or names.') - return ERROR - query = args - - results = search_packages_info(query) - if not print_results( - results, list_files=options.files, verbose=options.verbose): - return ERROR - return SUCCESS - - -def search_packages_info(query): - """ - Gather details from installed distributions. Print distribution name, - version, location, and installed files. Installed files requires a - pip generated 'installed-files.txt' in the distributions '.egg-info' - directory. - """ - installed = {} - for p in pkg_resources.working_set: - installed[canonicalize_name(p.project_name)] = p - - query_names = [canonicalize_name(name) for name in query] - - for dist in [installed[pkg] for pkg in query_names if pkg in installed]: - package = { - 'name': dist.project_name, - 'version': dist.version, - 'location': dist.location, - 'requires': [dep.project_name for dep in dist.requires()], - } - file_list = None - metadata = None - if isinstance(dist, pkg_resources.DistInfoDistribution): - # RECORDs should be part of .dist-info metadatas - if dist.has_metadata('RECORD'): - lines = dist.get_metadata_lines('RECORD') - paths = [l.split(',')[0] for l in lines] - paths = [os.path.join(dist.location, p) for p in paths] - file_list = [os.path.relpath(p, dist.location) for p in paths] - - if dist.has_metadata('METADATA'): - metadata = dist.get_metadata('METADATA') - else: - # Otherwise use pip's log for .egg-info's - if dist.has_metadata('installed-files.txt'): - paths = dist.get_metadata_lines('installed-files.txt') - paths = [os.path.join(dist.egg_info, p) for p in paths] - file_list = [os.path.relpath(p, dist.location) for p in paths] - - if dist.has_metadata('PKG-INFO'): - metadata = dist.get_metadata('PKG-INFO') - - if dist.has_metadata('entry_points.txt'): - entry_points = dist.get_metadata_lines('entry_points.txt') - package['entry_points'] = entry_points - - if dist.has_metadata('INSTALLER'): - for line in dist.get_metadata_lines('INSTALLER'): - if line.strip(): - package['installer'] = line.strip() - break - - # @todo: Should pkg_resources.Distribution have a - # `get_pkg_info` method? - feed_parser = FeedParser() - feed_parser.feed(metadata) - pkg_info_dict = feed_parser.close() - for key in ('metadata-version', 'summary', - 'home-page', 'author', 'author-email', 'license'): - package[key] = pkg_info_dict.get(key) - - # It looks like FeedParser cannot deal with repeated headers - classifiers = [] - for line in metadata.splitlines(): - if line.startswith('Classifier: '): - classifiers.append(line[len('Classifier: '):]) - package['classifiers'] = classifiers - - if file_list: - package['files'] = sorted(file_list) - yield package - - -def print_results(distributions, list_files=False, verbose=False): - """ - Print the informations from installed distributions found. - """ - results_printed = False - for i, dist in enumerate(distributions): - results_printed = True - if i > 0: - logger.info("---") - - name = dist.get('name', '') - required_by = [ - pkg.project_name for pkg in pkg_resources.working_set - if name in [required.name for required in pkg.requires()] - ] - - logger.info("Name: %s", name) - logger.info("Version: %s", dist.get('version', '')) - logger.info("Summary: %s", dist.get('summary', '')) - logger.info("Home-page: %s", dist.get('home-page', '')) - logger.info("Author: %s", dist.get('author', '')) - logger.info("Author-email: %s", dist.get('author-email', '')) - logger.info("License: %s", dist.get('license', '')) - logger.info("Location: %s", dist.get('location', '')) - logger.info("Requires: %s", ', '.join(dist.get('requires', []))) - logger.info("Required-by: %s", ', '.join(required_by)) - - if verbose: - logger.info("Metadata-Version: %s", - dist.get('metadata-version', '')) - logger.info("Installer: %s", dist.get('installer', '')) - logger.info("Classifiers:") - for classifier in dist.get('classifiers', []): - logger.info(" %s", classifier) - logger.info("Entry-points:") - for entry in dist.get('entry_points', []): - logger.info(" %s", entry.strip()) - if list_files: - logger.info("Files:") - for line in dist.get('files', []): - logger.info(" %s", line.strip()) - if "files" not in dist: - logger.info("Cannot locate installed-files.txt") - return results_printed diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/show.pyc b/venv/lib/python2.7/site-packages/pip/_internal/commands/show.pyc deleted file mode 100644 index 8b33528a9c10ca336311bdcf99518a7055f4c814..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6435 zcmc&&OLH5?5$;`pAPMj#(jrY+me;l{AvOWZWrucHj3b7mY?Wn7St??M2@Nl?18~8` zF0iwpNEeZ+lyyzcKIfQQjydJ%i;p?wMF}v^Qe- z@)Q=RJxY6{raeO87`4Y~Z``yC6c(vnqP>!7k5V{6?Md33r1li;O_8N+YE6@xp|3Fe z74pYOm8fBnKTgkxz9Ra~-Yoe=ZtTsGdWk=NiJn2dtE}fvc>*>B_)^(IkxrxV4s;y$ zQdJAuoj6Ii4W$UmJ*E6dUZPcE`XwSK4%6L3iDY;wY$lVeqA@MP6GO z(kMt9al7qBe%VGn9YL|>x)0ryNjtyZ*x1_HNlRQmjGtz#=dNcRe|Z)ash4)ZA84>S?!AplJ#Kfxz>89+?FFH8 zs61aKj*(xLVQHQg*_v zQ+DLTyO`{AR8o8_IzwO}Y-~D1-KIYgS?Frzs0G)-pKvBTiTVin1@cFEjSyG}sjuw3 zuokEV&lXt{hCvud{Z5(Z+Sa_Pm4@cktW+97sI*w?<5w2jbny~+b+$C+z|tw)TuYOl zk}&X9!|R2q3_Mg}M}Ghwu|9>v8@(`e!a!q<8beDXg4xZE^6H0!m8zQH9)kdxUiUgG zaap^R`)aiy3es9l8uhkcgZs6pCpE*q4-ghDGXsUOw` z`xjnn#HpNL2^_{J7y?ea9E|QYE?8ihhr9DAL}<1(-39JoQn#m)Qz2#JU+DT`If#;8 zbQ?c<76oBxC#}3yuqUjX^$Kcbwl52Ob}Ry)dup|I?Ds-$vh!*+Kdz(Bi^W`GYft0c z6SD3hu3$HlAM=)#t=%_%+6FG%PXpwoJfc|g0U!VY+35P6>VT)F{COb=N zvb9!N8oIH)c-Cp^kJ8yF4`4BW;nRDik0bkK>W@oVQUg2p%+Gv&raxmBB+0&k!|zewFxJNkOS1AAb=qVT`~Y5u5cvqP$V^Z%>% zpXXI8KChZIq1uJ+C1Fqly`!5EF5#->BFZp)VfM%qLIaoc_Cb(lh?^#G;0bUT%pzioz3#p z5QfTH_n$ULa(|9ae$L}tFPr#U9%!*h{#8-6m^+)J)-_fweI@IB4T7w0F^A7CsI1^T zt(}ci@U@X^N}@_gd>Dg}VjP9uriLy6u; z8c2eJp5Uaa^N0^{XSh>x#*#=vj?l=>OHLTq1>G$7m z9IBb3ayAcimBv65!5;3`#zS`#AdYBBfQ_(xw)J>@bN%tU&M=9=su#Lx&XA8j{kU>} z``$xI{whk7(^@Bn=a5@Z(v+_O!=33kI__`pJYIkBV9S-(!01FIAS-yjmwJ^3J3OkEkG{G8M|NLafUeP3C?YCr3aJH6T70ser^ifG91jom^(zcbI>P ziwe^P*5Jk<*)-7Ns;I66d2AwF?;`;CcM!HB@X*t>fhj5HYq;#ZqZS4cATy&3joU;j z05UdMx`XW@Q?_^kN5PT+By%Ubd02{s2O`kG9T5f{IxYv0NNC_jCzI4eKq)~G7%yhX zv_=a9(Y++qPXo*%PVID5z4J7RYmP;j$5W~D3j=&ww87-vRsQ8O0zZL1xqsER&~Xoi79is&Fdc^ftmkz?bVJ5EM4+OPH7h@Ns`V7k;8I3VaVd$U*CG88kDN4^iW14ItfDB*~+&{B+VKAdy z{6QF^L8{RPh$zp5AsVi-hK9_0nFjP@Xp`TiA(b22^ml2oxbBYbv&%6G~)5#f3hh2&!c z9yo9F8IZjI{W#*l6GJcZP5zb~tT{zgDiw3Kp-z%;w{de?b>7mNPrD}uhj3eRhji|k zi$sm2o*yj?e=5u&m5~_@mR=`)#ChFwm#GTj4{Ze{3CF-r38gA5l* zFDEqVb>Ex^wG3HQIk{X8!Rg!>71u>)Lwf)XFdGQ0c$>8^9Jg+fG1I(ZKMxr@xe*j64^ zvqyp&UVZRJV=`jky3BKni(fJ07>W$@`I4{(joQJf zAkS3pn;0+ACa;mMAW#lUmt|h8<%?QS3B)z?F7y$@D$T1ggQp~3)EW8C+ta!Eo8$NY E2Wttw^Z)<= diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/uninstall.py b/venv/lib/python2.7/site-packages/pip/_internal/commands/uninstall.py deleted file mode 100644 index 0cd6f54..0000000 --- a/venv/lib/python2.7/site-packages/pip/_internal/commands/uninstall.py +++ /dev/null @@ -1,78 +0,0 @@ -from __future__ import absolute_import - -from pip._vendor.packaging.utils import canonicalize_name - -from pip._internal.cli.base_command import Command -from pip._internal.exceptions import InstallationError -from pip._internal.req import parse_requirements -from pip._internal.req.constructors import install_req_from_line -from pip._internal.utils.misc import protect_pip_from_modification_on_windows - - -class UninstallCommand(Command): - """ - Uninstall packages. - - pip is able to uninstall most installed packages. Known exceptions are: - - - Pure distutils packages installed with ``python setup.py install``, which - leave behind no metadata to determine what files were installed. - - Script wrappers installed by ``python setup.py develop``. - """ - name = 'uninstall' - usage = """ - %prog [options] ... - %prog [options] -r ...""" - summary = 'Uninstall packages.' - - def __init__(self, *args, **kw): - super(UninstallCommand, self).__init__(*args, **kw) - self.cmd_opts.add_option( - '-r', '--requirement', - dest='requirements', - action='append', - default=[], - metavar='file', - help='Uninstall all the packages listed in the given requirements ' - 'file. This option can be used multiple times.', - ) - self.cmd_opts.add_option( - '-y', '--yes', - dest='yes', - action='store_true', - help="Don't ask for confirmation of uninstall deletions.") - - self.parser.insert_option_group(0, self.cmd_opts) - - def run(self, options, args): - with self._build_session(options) as session: - reqs_to_uninstall = {} - for name in args: - req = install_req_from_line( - name, isolated=options.isolated_mode, - ) - if req.name: - reqs_to_uninstall[canonicalize_name(req.name)] = req - for filename in options.requirements: - for req in parse_requirements( - filename, - options=options, - session=session): - if req.name: - reqs_to_uninstall[canonicalize_name(req.name)] = req - if not reqs_to_uninstall: - raise InstallationError( - 'You must give at least one requirement to %(name)s (see ' - '"pip help %(name)s")' % dict(name=self.name) - ) - - protect_pip_from_modification_on_windows( - modifying_pip="pip" in reqs_to_uninstall - ) - - for req in reqs_to_uninstall.values(): - uninstall_pathset = req.uninstall( - auto_confirm=options.yes, verbose=self.verbosity > 0, - ) - if uninstall_pathset: - uninstall_pathset.commit() diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/uninstall.pyc b/venv/lib/python2.7/site-packages/pip/_internal/commands/uninstall.pyc deleted file mode 100644 index 59ececb73a89aa1f7a4d01ef9b2a2aec79f82941..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3344 zcmd5;ZEqVz5T3JRJ5HLu0-`O@Riz4pu+5t)s7i_2B7q8}I7OjG)#Y-xwl}%A?C!-$ zm3)ArO7H>x9{+iAz>B{ILE zli(XrN|XgO3@G4njnW!rbsEsQrjb=e{)N_s_EYB}TSnT* zP|KZ4X_?8~8b9|c=9E|C*>I$bEKF5CGt*&JU0500uvDd=&Wc2h;1Zh&@tvwXDW=Ar zh4AAE_8FP=Zu6C|Tfu4V#oST&G2YwN4Xi z<~CMY68Ox`h%$<|qp>u-B{u;lg)$=AOr@}esE*tbSz)Z0`6iQNHE}O5rn!)Nu`GE* z(ADyWU#u%0R9cEe8CzMEnz`1Ag{I0*#KuOsZzn}AjI>qREBB8CHa6Z9(}{{F&N(4c z8SP53DJKY-$P1B48zqsA*w;i_sWXHg8j%$vl}aO~5)RDW?zv^UVlCFHv|_5GvXt5! z3y97A7dVs1U6~f;#)j9oZNzdO8S_0xGxx3`*JJTx;Un=_+?+-Cmgx1ot`Pr~>1uKF zB(9v}PQhHj$}h-N%vfMO>HIbvJO0Da2&UYj2*5M?( z&P1lA*@EP8yuf5(C-N9{DR2nrs@%OEt6iCkllEQYdqO;%fB`;-0_6j66P1Bt1`kxp z#84Rs<9E1k8nD{!?qf%s6aHVqzp;guq1BaijJ;drZ(9+WZ80jeh>Lurbml66C`Kn} zmPl-fY1H!tjyG@Ff~kPifg3Jj7=|iWHViEf;w%Z_uQwbeZg3PtSGcrgD1io2Tb9IR zIMzi~cGzVXKqJ$U>qL5NEGKV!%GHZpV+?xzQmfs_%08ms9~Ef=>hz!N_4hy0oB4G6 zgX=r_``7iy*W*vj-lxeE{XRb9vj4D;qSBpluxmf~W*k1?SMG;xfVFv)_G4d-O@GcT z)Pcb(u=@snh8qel25mge+0&{Yjas#scf!Qv!{N>Vj7+ovJq_rOUT|3FbK`J< z_HHvf?moUjhYd#?pc{kLR#A$-^O)|^HI>wHOv zE!z8>fZKx>vkXgtXa`_LP`ms18Xd3r?1d{nqn&58zB8tE7&CtokPen2yWri7UKG3r z<39(KBW2*Lqc5bln>ZYUVDBFLxwV7=9Qy3Y;xf~lHwG@Z-BMum5^XO)u6Bs2MbdwB zyLFm1gPp$#-}QAc`MVz+ojIWQ9nKWaSmfVRa#rLVC5<$OLHjjC9~Bjtg2RFdCQyh` zvoR`Amrsz53-+}RpU3YQ(J@krt9SAuPzj6}%pBi5)PH2VAZObDAV7 zwgawHu0ribDfm5L4i5OT;Z6o`TiJal!mw7h!^j+5kiwUuVIr5zk zZikq1q31&90>Scgxv-4v1ZU>UC#rY0%KLE76+8;ggQY7$Jvd)$2bY4gGtRDnzi**m z$8)g`iTVY+xm;@o9S)=0Z0Ig(C~lm9kh4;y5<{+jVVD$g82Sit1}lT>i$`IF`<(VQ zW6;CYaadgMr4=#un_+6WX|_?mu<>TCec^t`VbgDOR9W1Xur&ygy^IF%?u9s|l0x_V zO#p`$9=i&NFxjBr(*mD2%Na{Kyoa>w^Ik8Ot4zgGhC9QI#e1XDe* v&ERy4am*Rdr00z|PkWg%v7?MTz5XXTaX7o_k#&p7Zn!|4t>FPw-BbSu8<$fj diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/wheel.py b/venv/lib/python2.7/site-packages/pip/_internal/commands/wheel.py deleted file mode 100644 index cd72a3d..0000000 --- a/venv/lib/python2.7/site-packages/pip/_internal/commands/wheel.py +++ /dev/null @@ -1,186 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import absolute_import - -import logging -import os - -from pip._internal.cache import WheelCache -from pip._internal.cli import cmdoptions -from pip._internal.cli.base_command import RequirementCommand -from pip._internal.exceptions import CommandError, PreviousBuildDirError -from pip._internal.operations.prepare import RequirementPreparer -from pip._internal.req import RequirementSet -from pip._internal.req.req_tracker import RequirementTracker -from pip._internal.resolve import Resolver -from pip._internal.utils.temp_dir import TempDirectory -from pip._internal.wheel import WheelBuilder - -logger = logging.getLogger(__name__) - - -class WheelCommand(RequirementCommand): - """ - Build Wheel archives for your requirements and dependencies. - - Wheel is a built-package format, and offers the advantage of not - recompiling your software during every install. For more details, see the - wheel docs: https://wheel.readthedocs.io/en/latest/ - - Requirements: setuptools>=0.8, and wheel. - - 'pip wheel' uses the bdist_wheel setuptools extension from the wheel - package to build individual wheels. - - """ - - name = 'wheel' - usage = """ - %prog [options] ... - %prog [options] -r ... - %prog [options] [-e] ... - %prog [options] [-e] ... - %prog [options] ...""" - - summary = 'Build wheels from your requirements.' - - def __init__(self, *args, **kw): - super(WheelCommand, self).__init__(*args, **kw) - - cmd_opts = self.cmd_opts - - cmd_opts.add_option( - '-w', '--wheel-dir', - dest='wheel_dir', - metavar='dir', - default=os.curdir, - help=("Build wheels into , where the default is the " - "current working directory."), - ) - cmd_opts.add_option(cmdoptions.no_binary()) - cmd_opts.add_option(cmdoptions.only_binary()) - cmd_opts.add_option(cmdoptions.prefer_binary()) - cmd_opts.add_option( - '--build-option', - dest='build_options', - metavar='options', - action='append', - help="Extra arguments to be supplied to 'setup.py bdist_wheel'.", - ) - cmd_opts.add_option(cmdoptions.no_build_isolation()) - cmd_opts.add_option(cmdoptions.use_pep517()) - cmd_opts.add_option(cmdoptions.no_use_pep517()) - cmd_opts.add_option(cmdoptions.constraints()) - cmd_opts.add_option(cmdoptions.editable()) - cmd_opts.add_option(cmdoptions.requirements()) - cmd_opts.add_option(cmdoptions.src()) - cmd_opts.add_option(cmdoptions.ignore_requires_python()) - cmd_opts.add_option(cmdoptions.no_deps()) - cmd_opts.add_option(cmdoptions.build_dir()) - cmd_opts.add_option(cmdoptions.progress_bar()) - - cmd_opts.add_option( - '--global-option', - dest='global_options', - action='append', - metavar='options', - help="Extra global options to be supplied to the setup.py " - "call before the 'bdist_wheel' command.") - - cmd_opts.add_option( - '--pre', - action='store_true', - default=False, - help=("Include pre-release and development versions. By default, " - "pip only finds stable versions."), - ) - - cmd_opts.add_option(cmdoptions.no_clean()) - cmd_opts.add_option(cmdoptions.require_hashes()) - - index_opts = cmdoptions.make_option_group( - cmdoptions.index_group, - self.parser, - ) - - self.parser.insert_option_group(0, index_opts) - self.parser.insert_option_group(0, cmd_opts) - - def run(self, options, args): - cmdoptions.check_install_build_global(options) - - index_urls = [options.index_url] + options.extra_index_urls - if options.no_index: - logger.debug('Ignoring indexes: %s', ','.join(index_urls)) - index_urls = [] - - if options.build_dir: - options.build_dir = os.path.abspath(options.build_dir) - - options.src_dir = os.path.abspath(options.src_dir) - - with self._build_session(options) as session: - finder = self._build_package_finder(options, session) - build_delete = (not (options.no_clean or options.build_dir)) - wheel_cache = WheelCache(options.cache_dir, options.format_control) - - with RequirementTracker() as req_tracker, TempDirectory( - options.build_dir, delete=build_delete, kind="wheel" - ) as directory: - - requirement_set = RequirementSet( - require_hashes=options.require_hashes, - ) - - try: - self.populate_requirement_set( - requirement_set, args, options, finder, session, - self.name, wheel_cache - ) - - preparer = RequirementPreparer( - build_dir=directory.path, - src_dir=options.src_dir, - download_dir=None, - wheel_download_dir=options.wheel_dir, - progress_bar=options.progress_bar, - build_isolation=options.build_isolation, - req_tracker=req_tracker, - ) - - resolver = Resolver( - preparer=preparer, - finder=finder, - session=session, - wheel_cache=wheel_cache, - use_user_site=False, - upgrade_strategy="to-satisfy-only", - force_reinstall=False, - ignore_dependencies=options.ignore_dependencies, - ignore_requires_python=options.ignore_requires_python, - ignore_installed=True, - isolated=options.isolated_mode, - use_pep517=options.use_pep517 - ) - resolver.resolve(requirement_set) - - # build wheels - wb = WheelBuilder( - finder, preparer, wheel_cache, - build_options=options.build_options or [], - global_options=options.global_options or [], - no_clean=options.no_clean, - ) - build_failures = wb.build( - requirement_set.requirements.values(), session=session, - ) - if len(build_failures) != 0: - raise CommandError( - "Failed to build one or more wheels" - ) - except PreviousBuildDirError: - options.no_clean = True - raise - finally: - if not options.no_clean: - requirement_set.cleanup_files() - wheel_cache.cleanup() diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/wheel.pyc b/venv/lib/python2.7/site-packages/pip/_internal/commands/wheel.pyc deleted file mode 100644 index 04ffb6b3937f6c9848fb08a261f69b5ad907e767..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6127 zcmd5=-*X&C5$?T{bUNwu!@p!XijyV8NCe%T4a6iVV~m}o2m~jrT@`X6wY9pPJMC$2 zcQZ39Sw?yQ^GyB)-g%{pD*g%n7>eSJ;_IG0`OXUAG3b2bnVy-R>7JhN>$&Rop2WlFEmc!PQyuHB;aDvdX(w@IF=(dZhfm*^R+*`j!bRFeiC z#jErOqGv>(_FiWD9__5b_5@$r@laT9MtdetORK_UT;$q5bUjPx`D9<@lK7kw@_4q_q2xYD-e9F)nSsC=6;!^@w-M@z@`aUX(ICu~{95rw~;sp^jM=@e&p5i(7es6)|d8srgc(k*C zY347`vgG4Wmh)vHKhpjE7CAWgOXEnU@a+N*mwqD?f@4qs;PveBfuf6(#URJ}#0p$%bxalMn0>eDBAl zW}$)ukNqSwHcHcu|2}p&&beFJC`rw(ZyCUmo6~!3E zU7aNFs;rwvRvFuMwoJtlrW$3-!sdBu?*8~@=PhT6)8mG37fIoZVB0SZ9LM(U#fh<@ z+ro1VzItL+W)QaiK<8r_DPv^A6PMXsd>F&fI5|w>GD@BPiL>oIPEY2Uf1)Oneg8(G z^P&G)buB*k?@XPWZwl2<28q&l{Z6OzUuLxR%p`PV011rxC6Y?iDT-ZWQXcOSnZ1g8xUTEK=OW{5j7JwGA3A zGRgt{rbHO>qG)MW6femF%d$X=VH1GK+Sj0JTKn?sJYKMMUbJ#vw0d3y-7juy{k-VH zdC|r5qD$vRm(Po?%!=Z5vHHTqUN{%F!)h#WW_5f?x-W~@H>4YCy!w=Xug|&$H4hE*Nc+fe2({Z1Z|ykI zb`I?rz+s!Hh&W_%1FbP2=`hl^&O<6$tOik;TA8-5(!zX*&Y2iaGF<*U7=L${uRNfQ z!K9k!175k=FSQ28`A4}vU{u6#M^C!1eU2r1Yv~?vb{;2c_8XDky@!1 zjO^xZNZ)&6bp$pTmQ1Kv8K|UuQx-*;yY!TPtS9|)3mDuXD#ef|twgO^t-r1hQ+HD^U!pz?>eC6BiLMzKTgaOH_(CSi| zPtp7!>!)R`fI+IQRjMMRDrP%WX=B9EKmW zNWO>?t8^Bn-71<*mADkg!4}r+;A?(^g1l?BW^KW1dJFh8y+-|##~*IFPow4}FO--w z`84WhwK-@y05J*@aw$D1Q?r3VlOW_rw>LurFFuQF>wG)MXu6OI)6 z95t9tF@u42NX)Jo$(WFjQLmq3uPZeAE^8URL8I?Mb+yZ9o_D%Rc9%|&haezcp@TZ<&uX?! z@vAKPy~k($Np_v)Y=;h(NdLCxc^)>5O@?dqdtiY_zy1V-%)4GA^QRgw)8#chY;$x| zYEUABel=4Hjr$1VhvqWM4;ZDGHswkyWcW7>QbD3!f!r8uV3hy?$TbcaSc98f?4l4b z1KtVEGknGQQI_UWECPnyDhrqr2W_6nH|a$zX1D^bftKX4D4+)rm)E9jhB*d^#R!Ur z1+$SroLi&MFJb|3MsIv|XcBCF9iz))sH0egjN(=ekA;(M-ZmfsGdONDb;y>$qJ4(! z3W*#{Ivk&V55f>;#B;w69 z9}eM7M*LXql|wn?QJ!RSw81Noi-_MC;&c2Y!S&z{_pG9*_AogM{vDwbRd2V@otPLN za8Suc<)kD+Sc!WPhu~PN^E64Bq9gd)&nao@Krg%TtL7J1Y1o4`cUMHfdq?qdhrFr*(jkEYZzIeRHHP zKGbEFViV>mZ^c^yZ#TVbUbEKpwrZQTi{3@>`juLX>fWYT2TQl=b<`KUHE#tB-jp1G zOMK24eZuUM-d1g;UiVs00bqs?$-VP&DVuz+u^d3Q%L zb!XwAvbo7PJG;u)2uyU@evxgT4AVA(K z0cTq7&d=yqPx{LJ#yNGl{B!DZJTWA5Ic0I`HMQoE*<~mlnUmbu50^WV91h6GoXGC0H*2BbOL~^PwPfZ~%qDM_lkZ{T~F5 fT!cF=^zSk)8Mb-7*23*s_xQ6RrK_*k*6RNO=8E4a diff --git a/venv/lib/python2.7/site-packages/pip/_internal/configuration.py b/venv/lib/python2.7/site-packages/pip/_internal/configuration.py deleted file mode 100644 index b199fa7..0000000 --- a/venv/lib/python2.7/site-packages/pip/_internal/configuration.py +++ /dev/null @@ -1,384 +0,0 @@ -"""Configuration management setup - -Some terminology: -- name - As written in config files. -- value - Value associated with a name -- key - Name combined with it's section (section.name) -- variant - A single word describing where the configuration key-value pair came from -""" - -import locale -import logging -import os - -from pip._vendor.six.moves import configparser - -from pip._internal.exceptions import ( - ConfigurationError, ConfigurationFileCouldNotBeLoaded, -) -from pip._internal.locations import ( - global_config_files, legacy_config_file, new_config_file, site_config_file, -) -from pip._internal.utils.misc import ensure_dir, enum -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import ( - Any, Dict, Iterable, List, NewType, Optional, Tuple - ) - - RawConfigParser = configparser.RawConfigParser # Shorthand - Kind = NewType("Kind", str) - -logger = logging.getLogger(__name__) - - -# NOTE: Maybe use the optionx attribute to normalize keynames. -def _normalize_name(name): - # type: (str) -> str - """Make a name consistent regardless of source (environment or file) - """ - name = name.lower().replace('_', '-') - if name.startswith('--'): - name = name[2:] # only prefer long opts - return name - - -def _disassemble_key(name): - # type: (str) -> List[str] - return name.split(".", 1) - - -# The kinds of configurations there are. -kinds = enum( - USER="user", # User Specific - GLOBAL="global", # System Wide - SITE="site", # [Virtual] Environment Specific - ENV="env", # from PIP_CONFIG_FILE - ENV_VAR="env-var", # from Environment Variables -) - - -class Configuration(object): - """Handles management of configuration. - - Provides an interface to accessing and managing configuration files. - - This class converts provides an API that takes "section.key-name" style - keys and stores the value associated with it as "key-name" under the - section "section". - - This allows for a clean interface wherein the both the section and the - key-name are preserved in an easy to manage form in the configuration files - and the data stored is also nice. - """ - - def __init__(self, isolated, load_only=None): - # type: (bool, Kind) -> None - super(Configuration, self).__init__() - - _valid_load_only = [kinds.USER, kinds.GLOBAL, kinds.SITE, None] - if load_only not in _valid_load_only: - raise ConfigurationError( - "Got invalid value for load_only - should be one of {}".format( - ", ".join(map(repr, _valid_load_only[:-1])) - ) - ) - self.isolated = isolated # type: bool - self.load_only = load_only # type: Optional[Kind] - - # The order here determines the override order. - self._override_order = [ - kinds.GLOBAL, kinds.USER, kinds.SITE, kinds.ENV, kinds.ENV_VAR - ] - - self._ignore_env_names = ["version", "help"] - - # Because we keep track of where we got the data from - self._parsers = { - variant: [] for variant in self._override_order - } # type: Dict[Kind, List[Tuple[str, RawConfigParser]]] - self._config = { - variant: {} for variant in self._override_order - } # type: Dict[Kind, Dict[str, Any]] - self._modified_parsers = [] # type: List[Tuple[str, RawConfigParser]] - - def load(self): - # type: () -> None - """Loads configuration from configuration files and environment - """ - self._load_config_files() - if not self.isolated: - self._load_environment_vars() - - def get_file_to_edit(self): - # type: () -> Optional[str] - """Returns the file with highest priority in configuration - """ - assert self.load_only is not None, \ - "Need to be specified a file to be editing" - - try: - return self._get_parser_to_modify()[0] - except IndexError: - return None - - def items(self): - # type: () -> Iterable[Tuple[str, Any]] - """Returns key-value pairs like dict.items() representing the loaded - configuration - """ - return self._dictionary.items() - - def get_value(self, key): - # type: (str) -> Any - """Get a value from the configuration. - """ - try: - return self._dictionary[key] - except KeyError: - raise ConfigurationError("No such key - {}".format(key)) - - def set_value(self, key, value): - # type: (str, Any) -> None - """Modify a value in the configuration. - """ - self._ensure_have_load_only() - - fname, parser = self._get_parser_to_modify() - - if parser is not None: - section, name = _disassemble_key(key) - - # Modify the parser and the configuration - if not parser.has_section(section): - parser.add_section(section) - parser.set(section, name, value) - - self._config[self.load_only][key] = value - self._mark_as_modified(fname, parser) - - def unset_value(self, key): - # type: (str) -> None - """Unset a value in the configuration. - """ - self._ensure_have_load_only() - - if key not in self._config[self.load_only]: - raise ConfigurationError("No such key - {}".format(key)) - - fname, parser = self._get_parser_to_modify() - - if parser is not None: - section, name = _disassemble_key(key) - - # Remove the key in the parser - modified_something = False - if parser.has_section(section): - # Returns whether the option was removed or not - modified_something = parser.remove_option(section, name) - - if modified_something: - # name removed from parser, section may now be empty - section_iter = iter(parser.items(section)) - try: - val = next(section_iter) - except StopIteration: - val = None - - if val is None: - parser.remove_section(section) - - self._mark_as_modified(fname, parser) - else: - raise ConfigurationError( - "Fatal Internal error [id=1]. Please report as a bug." - ) - - del self._config[self.load_only][key] - - def save(self): - # type: () -> None - """Save the current in-memory state. - """ - self._ensure_have_load_only() - - for fname, parser in self._modified_parsers: - logger.info("Writing to %s", fname) - - # Ensure directory exists. - ensure_dir(os.path.dirname(fname)) - - with open(fname, "w") as f: - parser.write(f) - - # - # Private routines - # - - def _ensure_have_load_only(self): - # type: () -> None - if self.load_only is None: - raise ConfigurationError("Needed a specific file to be modifying.") - logger.debug("Will be working with %s variant only", self.load_only) - - @property - def _dictionary(self): - # type: () -> Dict[str, Any] - """A dictionary representing the loaded configuration. - """ - # NOTE: Dictionaries are not populated if not loaded. So, conditionals - # are not needed here. - retval = {} - - for variant in self._override_order: - retval.update(self._config[variant]) - - return retval - - def _load_config_files(self): - # type: () -> None - """Loads configuration from configuration files - """ - config_files = dict(self._iter_config_files()) - if config_files[kinds.ENV][0:1] == [os.devnull]: - logger.debug( - "Skipping loading configuration files due to " - "environment's PIP_CONFIG_FILE being os.devnull" - ) - return - - for variant, files in config_files.items(): - for fname in files: - # If there's specific variant set in `load_only`, load only - # that variant, not the others. - if self.load_only is not None and variant != self.load_only: - logger.debug( - "Skipping file '%s' (variant: %s)", fname, variant - ) - continue - - parser = self._load_file(variant, fname) - - # Keeping track of the parsers used - self._parsers[variant].append((fname, parser)) - - def _load_file(self, variant, fname): - # type: (Kind, str) -> RawConfigParser - logger.debug("For variant '%s', will try loading '%s'", variant, fname) - parser = self._construct_parser(fname) - - for section in parser.sections(): - items = parser.items(section) - self._config[variant].update(self._normalized_keys(section, items)) - - return parser - - def _construct_parser(self, fname): - # type: (str) -> RawConfigParser - parser = configparser.RawConfigParser() - # If there is no such file, don't bother reading it but create the - # parser anyway, to hold the data. - # Doing this is useful when modifying and saving files, where we don't - # need to construct a parser. - if os.path.exists(fname): - try: - parser.read(fname) - except UnicodeDecodeError: - # See https://github.com/pypa/pip/issues/4963 - raise ConfigurationFileCouldNotBeLoaded( - reason="contains invalid {} characters".format( - locale.getpreferredencoding(False) - ), - fname=fname, - ) - except configparser.Error as error: - # See https://github.com/pypa/pip/issues/4893 - raise ConfigurationFileCouldNotBeLoaded(error=error) - return parser - - def _load_environment_vars(self): - # type: () -> None - """Loads configuration from environment variables - """ - self._config[kinds.ENV_VAR].update( - self._normalized_keys(":env:", self._get_environ_vars()) - ) - - def _normalized_keys(self, section, items): - # type: (str, Iterable[Tuple[str, Any]]) -> Dict[str, Any] - """Normalizes items to construct a dictionary with normalized keys. - - This routine is where the names become keys and are made the same - regardless of source - configuration files or environment. - """ - normalized = {} - for name, val in items: - key = section + "." + _normalize_name(name) - normalized[key] = val - return normalized - - def _get_environ_vars(self): - # type: () -> Iterable[Tuple[str, str]] - """Returns a generator with all environmental vars with prefix PIP_""" - for key, val in os.environ.items(): - should_be_yielded = ( - key.startswith("PIP_") and - key[4:].lower() not in self._ignore_env_names - ) - if should_be_yielded: - yield key[4:].lower(), val - - # XXX: This is patched in the tests. - def _iter_config_files(self): - # type: () -> Iterable[Tuple[Kind, List[str]]] - """Yields variant and configuration files associated with it. - - This should be treated like items of a dictionary. - """ - # SMELL: Move the conditions out of this function - - # environment variables have the lowest priority - config_file = os.environ.get('PIP_CONFIG_FILE', None) - if config_file is not None: - yield kinds.ENV, [config_file] - else: - yield kinds.ENV, [] - - # at the base we have any global configuration - yield kinds.GLOBAL, list(global_config_files) - - # per-user configuration next - should_load_user_config = not self.isolated and not ( - config_file and os.path.exists(config_file) - ) - if should_load_user_config: - # The legacy config file is overridden by the new config file - yield kinds.USER, [legacy_config_file, new_config_file] - - # finally virtualenv configuration first trumping others - yield kinds.SITE, [site_config_file] - - def _get_parser_to_modify(self): - # type: () -> Tuple[str, RawConfigParser] - # Determine which parser to modify - parsers = self._parsers[self.load_only] - if not parsers: - # This should not happen if everything works correctly. - raise ConfigurationError( - "Fatal Internal error [id=2]. Please report as a bug." - ) - - # Use the highest priority parser. - return parsers[-1] - - # XXX: This is patched in the tests. - def _mark_as_modified(self, fname, parser): - # type: (str, RawConfigParser) -> None - file_parser_tuple = (fname, parser) - if file_parser_tuple not in self._modified_parsers: - self._modified_parsers.append(file_parser_tuple) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/configuration.pyc b/venv/lib/python2.7/site-packages/pip/_internal/configuration.pyc deleted file mode 100644 index fe73003e328098273d5db63c452f9a2d9e106e2c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13105 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 bool - """ - Return whether it looks like pip is running under CI. - """ - # We don't use the method of checking for a tty (e.g. using isatty()) - # because some CI systems mimic a tty (e.g. Travis CI). Thus that - # method doesn't provide definitive information in either direction. - return any(name in os.environ for name in CI_ENVIRONMENT_VARIABLES) - - -def user_agent(): - """ - Return a string representing the user agent. - """ - data = { - "installer": {"name": "pip", "version": pip.__version__}, - "python": platform.python_version(), - "implementation": { - "name": platform.python_implementation(), - }, - } - - if data["implementation"]["name"] == 'CPython': - data["implementation"]["version"] = platform.python_version() - elif data["implementation"]["name"] == 'PyPy': - if sys.pypy_version_info.releaselevel == 'final': - pypy_version_info = sys.pypy_version_info[:3] - else: - pypy_version_info = sys.pypy_version_info - data["implementation"]["version"] = ".".join( - [str(x) for x in pypy_version_info] - ) - elif data["implementation"]["name"] == 'Jython': - # Complete Guess - data["implementation"]["version"] = platform.python_version() - elif data["implementation"]["name"] == 'IronPython': - # Complete Guess - data["implementation"]["version"] = platform.python_version() - - if sys.platform.startswith("linux"): - from pip._vendor import distro - distro_infos = dict(filter( - lambda x: x[1], - zip(["name", "version", "id"], distro.linux_distribution()), - )) - libc = dict(filter( - lambda x: x[1], - zip(["lib", "version"], libc_ver()), - )) - if libc: - distro_infos["libc"] = libc - if distro_infos: - data["distro"] = distro_infos - - if sys.platform.startswith("darwin") and platform.mac_ver()[0]: - data["distro"] = {"name": "macOS", "version": platform.mac_ver()[0]} - - if platform.system(): - data.setdefault("system", {})["name"] = platform.system() - - if platform.release(): - data.setdefault("system", {})["release"] = platform.release() - - if platform.machine(): - data["cpu"] = platform.machine() - - if HAS_TLS: - data["openssl_version"] = ssl.OPENSSL_VERSION - - setuptools_version = get_installed_version("setuptools") - if setuptools_version is not None: - data["setuptools_version"] = setuptools_version - - # Use None rather than False so as not to give the impression that - # pip knows it is not being run under CI. Rather, it is a null or - # inconclusive result. Also, we include some value rather than no - # value to make it easier to know that the check has been run. - data["ci"] = True if looks_like_ci() else None - - user_data = os.environ.get("PIP_USER_AGENT_USER_DATA") - if user_data is not None: - data["user_data"] = user_data - - return "{data[installer][name]}/{data[installer][version]} {json}".format( - data=data, - json=json.dumps(data, separators=(",", ":"), sort_keys=True), - ) - - -class MultiDomainBasicAuth(AuthBase): - - def __init__(self, prompting=True): - # type: (bool) -> None - self.prompting = prompting - self.passwords = {} # type: Dict[str, AuthInfo] - - def __call__(self, req): - parsed = urllib_parse.urlparse(req.url) - - # Split the credentials from the netloc. - netloc, url_user_password = split_auth_from_netloc(parsed.netloc) - - # Set the url of the request to the url without any credentials - req.url = urllib_parse.urlunparse(parsed[:1] + (netloc,) + parsed[2:]) - - # Use any stored credentials that we have for this netloc - username, password = self.passwords.get(netloc, (None, None)) - - # Use the credentials embedded in the url if we have none stored - if username is None: - username, password = url_user_password - - # Get creds from netrc if we still don't have them - if username is None and password is None: - netrc_auth = get_netrc_auth(req.url) - username, password = netrc_auth if netrc_auth else (None, None) - - if username or password: - # Store the username and password - self.passwords[netloc] = (username, password) - - # Send the basic auth with this request - req = HTTPBasicAuth(username or "", password or "")(req) - - # Attach a hook to handle 401 responses - req.register_hook("response", self.handle_401) - - return req - - def handle_401(self, resp, **kwargs): - # We only care about 401 responses, anything else we want to just - # pass through the actual response - if resp.status_code != 401: - return resp - - # We are not able to prompt the user so simply return the response - if not self.prompting: - return resp - - parsed = urllib_parse.urlparse(resp.url) - - # Prompt the user for a new username and password - username = six.moves.input("User for %s: " % parsed.netloc) - password = getpass.getpass("Password: ") - - # Store the new username and password to use for future requests - if username or password: - self.passwords[parsed.netloc] = (username, password) - - # Consume content and release the original connection to allow our new - # request to reuse the same one. - resp.content - resp.raw.release_conn() - - # Add our new username and password to the request - req = HTTPBasicAuth(username or "", password or "")(resp.request) - req.register_hook("response", self.warn_on_401) - - # Send our new request - new_resp = resp.connection.send(req, **kwargs) - new_resp.history.append(resp) - - return new_resp - - def warn_on_401(self, resp, **kwargs): - # warn user that they provided incorrect credentials - if resp.status_code == 401: - logger.warning('401 Error, Credentials not correct for %s', - resp.request.url) - - -class LocalFSAdapter(BaseAdapter): - - def send(self, request, stream=None, timeout=None, verify=None, cert=None, - proxies=None): - pathname = url_to_path(request.url) - - resp = Response() - resp.status_code = 200 - resp.url = request.url - - try: - stats = os.stat(pathname) - except OSError as exc: - resp.status_code = 404 - resp.raw = exc - else: - modified = email.utils.formatdate(stats.st_mtime, usegmt=True) - content_type = mimetypes.guess_type(pathname)[0] or "text/plain" - resp.headers = CaseInsensitiveDict({ - "Content-Type": content_type, - "Content-Length": stats.st_size, - "Last-Modified": modified, - }) - - resp.raw = open(pathname, "rb") - resp.close = resp.raw.close - - return resp - - def close(self): - pass - - -class SafeFileCache(FileCache): - """ - A file based cache which is safe to use even when the target directory may - not be accessible or writable. - """ - - def __init__(self, *args, **kwargs): - super(SafeFileCache, self).__init__(*args, **kwargs) - - # Check to ensure that the directory containing our cache directory - # is owned by the user current executing pip. If it does not exist - # we will check the parent directory until we find one that does exist. - # If it is not owned by the user executing pip then we will disable - # the cache and log a warning. - if not check_path_owner(self.directory): - logger.warning( - "The directory '%s' or its parent directory is not owned by " - "the current user and the cache has been disabled. Please " - "check the permissions and owner of that directory. If " - "executing pip with sudo, you may want sudo's -H flag.", - self.directory, - ) - - # Set our directory to None to disable the Cache - self.directory = None - - def get(self, *args, **kwargs): - # If we don't have a directory, then the cache should be a no-op. - if self.directory is None: - return - - try: - return super(SafeFileCache, self).get(*args, **kwargs) - except (LockError, OSError, IOError): - # We intentionally silence this error, if we can't access the cache - # then we can just skip caching and process the request as if - # caching wasn't enabled. - pass - - def set(self, *args, **kwargs): - # If we don't have a directory, then the cache should be a no-op. - if self.directory is None: - return - - try: - return super(SafeFileCache, self).set(*args, **kwargs) - except (LockError, OSError, IOError): - # We intentionally silence this error, if we can't access the cache - # then we can just skip caching and process the request as if - # caching wasn't enabled. - pass - - def delete(self, *args, **kwargs): - # If we don't have a directory, then the cache should be a no-op. - if self.directory is None: - return - - try: - return super(SafeFileCache, self).delete(*args, **kwargs) - except (LockError, OSError, IOError): - # We intentionally silence this error, if we can't access the cache - # then we can just skip caching and process the request as if - # caching wasn't enabled. - pass - - -class InsecureHTTPAdapter(HTTPAdapter): - - def cert_verify(self, conn, url, verify, cert): - conn.cert_reqs = 'CERT_NONE' - conn.ca_certs = None - - -class PipSession(requests.Session): - - timeout = None # type: Optional[int] - - def __init__(self, *args, **kwargs): - retries = kwargs.pop("retries", 0) - cache = kwargs.pop("cache", None) - insecure_hosts = kwargs.pop("insecure_hosts", []) - - super(PipSession, self).__init__(*args, **kwargs) - - # Attach our User Agent to the request - self.headers["User-Agent"] = user_agent() - - # Attach our Authentication handler to the session - self.auth = MultiDomainBasicAuth() - - # Create our urllib3.Retry instance which will allow us to customize - # how we handle retries. - retries = urllib3.Retry( - # Set the total number of retries that a particular request can - # have. - total=retries, - - # A 503 error from PyPI typically means that the Fastly -> Origin - # connection got interrupted in some way. A 503 error in general - # is typically considered a transient error so we'll go ahead and - # retry it. - # A 500 may indicate transient error in Amazon S3 - # A 520 or 527 - may indicate transient error in CloudFlare - status_forcelist=[500, 503, 520, 527], - - # Add a small amount of back off between failed requests in - # order to prevent hammering the service. - backoff_factor=0.25, - ) - - # We want to _only_ cache responses on securely fetched origins. We do - # this because we can't validate the response of an insecurely fetched - # origin, and we don't want someone to be able to poison the cache and - # require manual eviction from the cache to fix it. - if cache: - secure_adapter = CacheControlAdapter( - cache=SafeFileCache(cache, use_dir_lock=True), - max_retries=retries, - ) - else: - secure_adapter = HTTPAdapter(max_retries=retries) - - # Our Insecure HTTPAdapter disables HTTPS validation. It does not - # support caching (see above) so we'll use it for all http:// URLs as - # well as any https:// host that we've marked as ignoring TLS errors - # for. - insecure_adapter = InsecureHTTPAdapter(max_retries=retries) - - self.mount("https://", secure_adapter) - self.mount("http://", insecure_adapter) - - # Enable file:// urls - self.mount("file://", LocalFSAdapter()) - - # We want to use a non-validating adapter for any requests which are - # deemed insecure. - for host in insecure_hosts: - self.mount("https://{}/".format(host), insecure_adapter) - - def request(self, method, url, *args, **kwargs): - # Allow setting a default timeout on a session - kwargs.setdefault("timeout", self.timeout) - - # Dispatch the actual request - return super(PipSession, self).request(method, url, *args, **kwargs) - - -def get_file_content(url, comes_from=None, session=None): - # type: (str, Optional[str], Optional[PipSession]) -> Tuple[str, Text] - """Gets the content of a file; it may be a filename, file: URL, or - http: URL. Returns (location, content). Content is unicode. - - :param url: File path or url. - :param comes_from: Origin description of requirements. - :param session: Instance of pip.download.PipSession. - """ - if session is None: - raise TypeError( - "get_file_content() missing 1 required keyword argument: 'session'" - ) - - match = _scheme_re.search(url) - if match: - scheme = match.group(1).lower() - if (scheme == 'file' and comes_from and - comes_from.startswith('http')): - raise InstallationError( - 'Requirements file %s references URL %s, which is local' - % (comes_from, url)) - if scheme == 'file': - path = url.split(':', 1)[1] - path = path.replace('\\', '/') - match = _url_slash_drive_re.match(path) - if match: - path = match.group(1) + ':' + path.split('|', 1)[1] - path = urllib_parse.unquote(path) - if path.startswith('/'): - path = '/' + path.lstrip('/') - url = path - else: - # FIXME: catch some errors - resp = session.get(url) - resp.raise_for_status() - return resp.url, resp.text - try: - with open(url, 'rb') as f: - content = auto_decode(f.read()) - except IOError as exc: - raise InstallationError( - 'Could not open requirements file: %s' % str(exc) - ) - return url, content - - -_scheme_re = re.compile(r'^(http|https|file):', re.I) -_url_slash_drive_re = re.compile(r'/*([a-z])\|', re.I) - - -def is_url(name): - # type: (Union[str, Text]) -> bool - """Returns true if the name looks like a URL""" - if ':' not in name: - return False - scheme = name.split(':', 1)[0].lower() - return scheme in ['http', 'https', 'file', 'ftp'] + vcs.all_schemes - - -def url_to_path(url): - # type: (str) -> str - """ - Convert a file: URL to a path. - """ - assert url.startswith('file:'), ( - "You can only turn file: urls into filenames (not %r)" % url) - - _, netloc, path, _, _ = urllib_parse.urlsplit(url) - - if not netloc or netloc == 'localhost': - # According to RFC 8089, same as empty authority. - netloc = '' - elif sys.platform == 'win32': - # If we have a UNC path, prepend UNC share notation. - netloc = '\\\\' + netloc - else: - raise ValueError( - 'non-local file URIs are not supported on this platform: %r' - % url - ) - - path = urllib_request.url2pathname(netloc + path) - return path - - -def path_to_url(path): - # type: (Union[str, Text]) -> str - """ - Convert a path to a file: URL. The path will be made absolute and have - quoted path parts. - """ - path = os.path.normpath(os.path.abspath(path)) - url = urllib_parse.urljoin('file:', urllib_request.pathname2url(path)) - return url - - -def is_archive_file(name): - # type: (str) -> bool - """Return True if `name` is a considered as an archive file.""" - ext = splitext(name)[1].lower() - if ext in ARCHIVE_EXTENSIONS: - return True - return False - - -def unpack_vcs_link(link, location): - vcs_backend = _get_used_vcs_backend(link) - vcs_backend.unpack(location) - - -def _get_used_vcs_backend(link): - for backend in vcs.backends: - if link.scheme in backend.schemes: - vcs_backend = backend(link.url) - return vcs_backend - - -def is_vcs_url(link): - # type: (Link) -> bool - return bool(_get_used_vcs_backend(link)) - - -def is_file_url(link): - # type: (Link) -> bool - return link.url.lower().startswith('file:') - - -def is_dir_url(link): - # type: (Link) -> bool - """Return whether a file:// Link points to a directory. - - ``link`` must not have any other scheme but file://. Call is_file_url() - first. - - """ - link_path = url_to_path(link.url_without_fragment) - return os.path.isdir(link_path) - - -def _progress_indicator(iterable, *args, **kwargs): - return iterable - - -def _download_url( - resp, # type: Response - link, # type: Link - content_file, # type: IO - hashes, # type: Hashes - progress_bar # type: str -): - # type: (...) -> None - try: - total_length = int(resp.headers['content-length']) - except (ValueError, KeyError, TypeError): - total_length = 0 - - cached_resp = getattr(resp, "from_cache", False) - if logger.getEffectiveLevel() > logging.INFO: - show_progress = False - elif cached_resp: - show_progress = False - elif total_length > (40 * 1000): - show_progress = True - elif not total_length: - show_progress = True - else: - show_progress = False - - show_url = link.show_url - - def resp_read(chunk_size): - try: - # Special case for urllib3. - for chunk in resp.raw.stream( - chunk_size, - # We use decode_content=False here because we don't - # want urllib3 to mess with the raw bytes we get - # from the server. If we decompress inside of - # urllib3 then we cannot verify the checksum - # because the checksum will be of the compressed - # file. This breakage will only occur if the - # server adds a Content-Encoding header, which - # depends on how the server was configured: - # - Some servers will notice that the file isn't a - # compressible file and will leave the file alone - # and with an empty Content-Encoding - # - Some servers will notice that the file is - # already compressed and will leave the file - # alone and will add a Content-Encoding: gzip - # header - # - Some servers won't notice anything at all and - # will take a file that's already been compressed - # and compress it again and set the - # Content-Encoding: gzip header - # - # By setting this not to decode automatically we - # hope to eliminate problems with the second case. - decode_content=False): - yield chunk - except AttributeError: - # Standard file-like object. - while True: - chunk = resp.raw.read(chunk_size) - if not chunk: - break - yield chunk - - def written_chunks(chunks): - for chunk in chunks: - content_file.write(chunk) - yield chunk - - progress_indicator = _progress_indicator - - if link.netloc == PyPI.netloc: - url = show_url - else: - url = link.url_without_fragment - - if show_progress: # We don't show progress on cached responses - progress_indicator = DownloadProgressProvider(progress_bar, - max=total_length) - if total_length: - logger.info("Downloading %s (%s)", url, format_size(total_length)) - else: - logger.info("Downloading %s", url) - elif cached_resp: - logger.info("Using cached %s", url) - else: - logger.info("Downloading %s", url) - - logger.debug('Downloading from URL %s', link) - - downloaded_chunks = written_chunks( - progress_indicator( - resp_read(CONTENT_CHUNK_SIZE), - CONTENT_CHUNK_SIZE - ) - ) - if hashes: - hashes.check_against_chunks(downloaded_chunks) - else: - consume(downloaded_chunks) - - -def _copy_file(filename, location, link): - copy = True - download_location = os.path.join(location, link.filename) - if os.path.exists(download_location): - response = ask_path_exists( - 'The file %s exists. (i)gnore, (w)ipe, (b)ackup, (a)abort' % - display_path(download_location), ('i', 'w', 'b', 'a')) - if response == 'i': - copy = False - elif response == 'w': - logger.warning('Deleting %s', display_path(download_location)) - os.remove(download_location) - elif response == 'b': - dest_file = backup_dir(download_location) - logger.warning( - 'Backing up %s to %s', - display_path(download_location), - display_path(dest_file), - ) - shutil.move(download_location, dest_file) - elif response == 'a': - sys.exit(-1) - if copy: - shutil.copy(filename, download_location) - logger.info('Saved %s', display_path(download_location)) - - -def unpack_http_url( - link, # type: Link - location, # type: str - download_dir=None, # type: Optional[str] - session=None, # type: Optional[PipSession] - hashes=None, # type: Optional[Hashes] - progress_bar="on" # type: str -): - # type: (...) -> None - if session is None: - raise TypeError( - "unpack_http_url() missing 1 required keyword argument: 'session'" - ) - - with TempDirectory(kind="unpack") as temp_dir: - # If a download dir is specified, is the file already downloaded there? - already_downloaded_path = None - if download_dir: - already_downloaded_path = _check_download_dir(link, - download_dir, - hashes) - - if already_downloaded_path: - from_path = already_downloaded_path - content_type = mimetypes.guess_type(from_path)[0] - else: - # let's download to a tmp dir - from_path, content_type = _download_http_url(link, - session, - temp_dir.path, - hashes, - progress_bar) - - # unpack the archive to the build dir location. even when only - # downloading archives, they have to be unpacked to parse dependencies - unpack_file(from_path, location, content_type, link) - - # a download dir is specified; let's copy the archive there - if download_dir and not already_downloaded_path: - _copy_file(from_path, download_dir, link) - - if not already_downloaded_path: - os.unlink(from_path) - - -def unpack_file_url( - link, # type: Link - location, # type: str - download_dir=None, # type: Optional[str] - hashes=None # type: Optional[Hashes] -): - # type: (...) -> None - """Unpack link into location. - - If download_dir is provided and link points to a file, make a copy - of the link file inside download_dir. - """ - link_path = url_to_path(link.url_without_fragment) - - # If it's a url to a local directory - if is_dir_url(link): - if os.path.isdir(location): - rmtree(location) - shutil.copytree(link_path, location, symlinks=True) - if download_dir: - logger.info('Link is a directory, ignoring download_dir') - return - - # If --require-hashes is off, `hashes` is either empty, the - # link's embedded hash, or MissingHashes; it is required to - # match. If --require-hashes is on, we are satisfied by any - # hash in `hashes` matching: a URL-based or an option-based - # one; no internet-sourced hash will be in `hashes`. - if hashes: - hashes.check_against_path(link_path) - - # If a download dir is specified, is the file already there and valid? - already_downloaded_path = None - if download_dir: - already_downloaded_path = _check_download_dir(link, - download_dir, - hashes) - - if already_downloaded_path: - from_path = already_downloaded_path - else: - from_path = link_path - - content_type = mimetypes.guess_type(from_path)[0] - - # unpack the archive to the build dir location. even when only downloading - # archives, they have to be unpacked to parse dependencies - unpack_file(from_path, location, content_type, link) - - # a download dir is specified and not already downloaded - if download_dir and not already_downloaded_path: - _copy_file(from_path, download_dir, link) - - -class PipXmlrpcTransport(xmlrpc_client.Transport): - """Provide a `xmlrpclib.Transport` implementation via a `PipSession` - object. - """ - - def __init__(self, index_url, session, use_datetime=False): - xmlrpc_client.Transport.__init__(self, use_datetime) - index_parts = urllib_parse.urlparse(index_url) - self._scheme = index_parts.scheme - self._session = session - - def request(self, host, handler, request_body, verbose=False): - parts = (self._scheme, host, handler, None, None, None) - url = urllib_parse.urlunparse(parts) - try: - headers = {'Content-Type': 'text/xml'} - response = self._session.post(url, data=request_body, - headers=headers, stream=True) - response.raise_for_status() - self.verbose = verbose - return self.parse_response(response.raw) - except requests.HTTPError as exc: - logger.critical( - "HTTP error %s while getting %s", - exc.response.status_code, url, - ) - raise - - -def unpack_url( - link, # type: Optional[Link] - location, # type: Optional[str] - download_dir=None, # type: Optional[str] - only_download=False, # type: bool - session=None, # type: Optional[PipSession] - hashes=None, # type: Optional[Hashes] - progress_bar="on" # type: str -): - # type: (...) -> None - """Unpack link. - If link is a VCS link: - if only_download, export into download_dir and ignore location - else unpack into location - for other types of link: - - unpack into location - - if download_dir, copy the file into download_dir - - if only_download, mark location for deletion - - :param hashes: A Hashes object, one of whose embedded hashes must match, - or HashMismatch will be raised. If the Hashes is empty, no matches are - required, and unhashable types of requirements (like VCS ones, which - would ordinarily raise HashUnsupported) are allowed. - """ - # non-editable vcs urls - if is_vcs_url(link): - unpack_vcs_link(link, location) - - # file urls - elif is_file_url(link): - unpack_file_url(link, location, download_dir, hashes=hashes) - - # http urls - else: - if session is None: - session = PipSession() - - unpack_http_url( - link, - location, - download_dir, - session, - hashes=hashes, - progress_bar=progress_bar - ) - if only_download: - write_delete_marker_file(location) - - -def _download_http_url( - link, # type: Link - session, # type: PipSession - temp_dir, # type: str - hashes, # type: Hashes - progress_bar # type: str -): - # type: (...) -> Tuple[str, str] - """Download link url into temp_dir using provided session""" - target_url = link.url.split('#', 1)[0] - try: - resp = session.get( - target_url, - # We use Accept-Encoding: identity here because requests - # defaults to accepting compressed responses. This breaks in - # a variety of ways depending on how the server is configured. - # - Some servers will notice that the file isn't a compressible - # file and will leave the file alone and with an empty - # Content-Encoding - # - Some servers will notice that the file is already - # compressed and will leave the file alone and will add a - # Content-Encoding: gzip header - # - Some servers won't notice anything at all and will take - # a file that's already been compressed and compress it again - # and set the Content-Encoding: gzip header - # By setting this to request only the identity encoding We're - # hoping to eliminate the third case. Hopefully there does not - # exist a server which when given a file will notice it is - # already compressed and that you're not asking for a - # compressed file and will then decompress it before sending - # because if that's the case I don't think it'll ever be - # possible to make this work. - headers={"Accept-Encoding": "identity"}, - stream=True, - ) - resp.raise_for_status() - except requests.HTTPError as exc: - logger.critical( - "HTTP error %s while getting %s", exc.response.status_code, link, - ) - raise - - content_type = resp.headers.get('content-type', '') - filename = link.filename # fallback - # Have a look at the Content-Disposition header for a better guess - content_disposition = resp.headers.get('content-disposition') - if content_disposition: - type, params = cgi.parse_header(content_disposition) - # We use ``or`` here because we don't want to use an "empty" value - # from the filename param. - filename = params.get('filename') or filename - ext = splitext(filename)[1] - if not ext: - ext = mimetypes.guess_extension(content_type) - if ext: - filename += ext - if not ext and link.url != resp.url: - ext = os.path.splitext(resp.url)[1] - if ext: - filename += ext - file_path = os.path.join(temp_dir, filename) - with open(file_path, 'wb') as content_file: - _download_url(resp, link, content_file, hashes, progress_bar) - return file_path, content_type - - -def _check_download_dir(link, download_dir, hashes): - # type: (Link, str, Hashes) -> Optional[str] - """ Check download_dir for previously downloaded file with correct hash - If a correct file is found return its path else None - """ - download_path = os.path.join(download_dir, link.filename) - if os.path.exists(download_path): - # If already downloaded, does its hash match? - logger.info('File was already downloaded %s', download_path) - if hashes: - try: - hashes.check_against_path(download_path) - except HashMismatch: - logger.warning( - 'Previously-downloaded file %s has bad hash. ' - 'Re-downloading.', - download_path - ) - os.unlink(download_path) - return None - return download_path - return None diff --git a/venv/lib/python2.7/site-packages/pip/_internal/download.pyc b/venv/lib/python2.7/site-packages/pip/_internal/download.pyc deleted file mode 100644 index 070c7671df96872275c77e4c05009fb7ac4e11b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28623 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 B)fNB% diff --git a/venv/lib/python2.7/site-packages/pip/_internal/exceptions.py b/venv/lib/python2.7/site-packages/pip/_internal/exceptions.py deleted file mode 100644 index 7b291a1..0000000 --- a/venv/lib/python2.7/site-packages/pip/_internal/exceptions.py +++ /dev/null @@ -1,274 +0,0 @@ -"""Exceptions used throughout package""" -from __future__ import absolute_import - -from itertools import chain, groupby, repeat - -from pip._vendor.six import iteritems - -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import Optional - from pip._internal.req.req_install import InstallRequirement - - -class PipError(Exception): - """Base pip exception""" - - -class ConfigurationError(PipError): - """General exception in configuration""" - - -class InstallationError(PipError): - """General exception during installation""" - - -class UninstallationError(PipError): - """General exception during uninstallation""" - - -class DistributionNotFound(InstallationError): - """Raised when a distribution cannot be found to satisfy a requirement""" - - -class RequirementsFileParseError(InstallationError): - """Raised when a general error occurs parsing a requirements file line.""" - - -class BestVersionAlreadyInstalled(PipError): - """Raised when the most up-to-date version of a package is already - installed.""" - - -class BadCommand(PipError): - """Raised when virtualenv or a command is not found""" - - -class CommandError(PipError): - """Raised when there is an error in command-line arguments""" - - -class PreviousBuildDirError(PipError): - """Raised when there's a previous conflicting build directory""" - - -class InvalidWheelFilename(InstallationError): - """Invalid wheel filename.""" - - -class UnsupportedWheel(InstallationError): - """Unsupported wheel.""" - - -class HashErrors(InstallationError): - """Multiple HashError instances rolled into one for reporting""" - - def __init__(self): - self.errors = [] - - def append(self, error): - self.errors.append(error) - - def __str__(self): - lines = [] - self.errors.sort(key=lambda e: e.order) - for cls, errors_of_cls in groupby(self.errors, lambda e: e.__class__): - lines.append(cls.head) - lines.extend(e.body() for e in errors_of_cls) - if lines: - return '\n'.join(lines) - - def __nonzero__(self): - return bool(self.errors) - - def __bool__(self): - return self.__nonzero__() - - -class HashError(InstallationError): - """ - A failure to verify a package against known-good hashes - - :cvar order: An int sorting hash exception classes by difficulty of - recovery (lower being harder), so the user doesn't bother fretting - about unpinned packages when he has deeper issues, like VCS - dependencies, to deal with. Also keeps error reports in a - deterministic order. - :cvar head: A section heading for display above potentially many - exceptions of this kind - :ivar req: The InstallRequirement that triggered this error. This is - pasted on after the exception is instantiated, because it's not - typically available earlier. - - """ - req = None # type: Optional[InstallRequirement] - head = '' - - def body(self): - """Return a summary of me for display under the heading. - - This default implementation simply prints a description of the - triggering requirement. - - :param req: The InstallRequirement that provoked this error, with - populate_link() having already been called - - """ - return ' %s' % self._requirement_name() - - def __str__(self): - return '%s\n%s' % (self.head, self.body()) - - def _requirement_name(self): - """Return a description of the requirement that triggered me. - - This default implementation returns long description of the req, with - line numbers - - """ - return str(self.req) if self.req else 'unknown package' - - -class VcsHashUnsupported(HashError): - """A hash was provided for a version-control-system-based requirement, but - we don't have a method for hashing those.""" - - order = 0 - head = ("Can't verify hashes for these requirements because we don't " - "have a way to hash version control repositories:") - - -class DirectoryUrlHashUnsupported(HashError): - """A hash was provided for a version-control-system-based requirement, but - we don't have a method for hashing those.""" - - order = 1 - head = ("Can't verify hashes for these file:// requirements because they " - "point to directories:") - - -class HashMissing(HashError): - """A hash was needed for a requirement but is absent.""" - - order = 2 - head = ('Hashes are required in --require-hashes mode, but they are ' - 'missing from some requirements. Here is a list of those ' - 'requirements along with the hashes their downloaded archives ' - 'actually had. Add lines like these to your requirements files to ' - 'prevent tampering. (If you did not enable --require-hashes ' - 'manually, note that it turns on automatically when any package ' - 'has a hash.)') - - def __init__(self, gotten_hash): - """ - :param gotten_hash: The hash of the (possibly malicious) archive we - just downloaded - """ - self.gotten_hash = gotten_hash - - def body(self): - # Dodge circular import. - from pip._internal.utils.hashes import FAVORITE_HASH - - package = None - if self.req: - # In the case of URL-based requirements, display the original URL - # seen in the requirements file rather than the package name, - # so the output can be directly copied into the requirements file. - package = (self.req.original_link if self.req.original_link - # In case someone feeds something downright stupid - # to InstallRequirement's constructor. - else getattr(self.req, 'req', None)) - return ' %s --hash=%s:%s' % (package or 'unknown package', - FAVORITE_HASH, - self.gotten_hash) - - -class HashUnpinned(HashError): - """A requirement had a hash specified but was not pinned to a specific - version.""" - - order = 3 - head = ('In --require-hashes mode, all requirements must have their ' - 'versions pinned with ==. These do not:') - - -class HashMismatch(HashError): - """ - Distribution file hash values don't match. - - :ivar package_name: The name of the package that triggered the hash - mismatch. Feel free to write to this after the exception is raise to - improve its error message. - - """ - order = 4 - head = ('THESE PACKAGES DO NOT MATCH THE HASHES FROM THE REQUIREMENTS ' - 'FILE. If you have updated the package versions, please update ' - 'the hashes. Otherwise, examine the package contents carefully; ' - 'someone may have tampered with them.') - - def __init__(self, allowed, gots): - """ - :param allowed: A dict of algorithm names pointing to lists of allowed - hex digests - :param gots: A dict of algorithm names pointing to hashes we - actually got from the files under suspicion - """ - self.allowed = allowed - self.gots = gots - - def body(self): - return ' %s:\n%s' % (self._requirement_name(), - self._hash_comparison()) - - def _hash_comparison(self): - """ - Return a comparison of actual and expected hash values. - - Example:: - - Expected sha256 abcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcde - or 123451234512345123451234512345123451234512345 - Got bcdefbcdefbcdefbcdefbcdefbcdefbcdefbcdefbcdef - - """ - def hash_then_or(hash_name): - # For now, all the decent hashes have 6-char names, so we can get - # away with hard-coding space literals. - return chain([hash_name], repeat(' or')) - - lines = [] - for hash_name, expecteds in iteritems(self.allowed): - prefix = hash_then_or(hash_name) - lines.extend((' Expected %s %s' % (next(prefix), e)) - for e in expecteds) - lines.append(' Got %s\n' % - self.gots[hash_name].hexdigest()) - prefix = ' or' - return '\n'.join(lines) - - -class UnsupportedPythonVersion(InstallationError): - """Unsupported python version according to Requires-Python package - metadata.""" - - -class ConfigurationFileCouldNotBeLoaded(ConfigurationError): - """When there are errors while loading a configuration file - """ - - def __init__(self, reason="could not be loaded", fname=None, error=None): - super(ConfigurationFileCouldNotBeLoaded, self).__init__(error) - self.reason = reason - self.fname = fname - self.error = error - - def __str__(self): - if self.fname is not None: - message_part = " in {}.".format(self.fname) - else: - assert self.error is not None - message_part = ".\n{}\n".format(self.error.message) - return "Configuration file {}{}".format(self.reason, message_part) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/exceptions.pyc b/venv/lib/python2.7/site-packages/pip/_internal/exceptions.pyc deleted file mode 100644 index 44f6df06caa564aee7df94c68a7cf2b948096562..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16273 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 V{tZ>GPmfKGjo{xnj?c%2{uj4_6QckC diff --git a/venv/lib/python2.7/site-packages/pip/_internal/index.py b/venv/lib/python2.7/site-packages/pip/_internal/index.py deleted file mode 100644 index ff614b3..0000000 --- a/venv/lib/python2.7/site-packages/pip/_internal/index.py +++ /dev/null @@ -1,1108 +0,0 @@ -"""Routines related to PyPI, indexes""" -from __future__ import absolute_import - -import cgi -import itertools -import logging -import mimetypes -import os -import posixpath -import re -import sys -from collections import namedtuple - -from pip._vendor import html5lib, requests, six -from pip._vendor.distlib.compat import unescape -from pip._vendor.packaging import specifiers -from pip._vendor.packaging.utils import canonicalize_name -from pip._vendor.packaging.version import parse as parse_version -from pip._vendor.requests.exceptions import HTTPError, RetryError, SSLError -from pip._vendor.six.moves.urllib import parse as urllib_parse -from pip._vendor.six.moves.urllib import request as urllib_request - -from pip._internal.download import HAS_TLS, is_url, path_to_url, url_to_path -from pip._internal.exceptions import ( - BestVersionAlreadyInstalled, DistributionNotFound, InvalidWheelFilename, - UnsupportedWheel, -) -from pip._internal.models.candidate import InstallationCandidate -from pip._internal.models.format_control import FormatControl -from pip._internal.models.index import PyPI -from pip._internal.models.link import Link -from pip._internal.pep425tags import get_supported -from pip._internal.utils.compat import ipaddress -from pip._internal.utils.logging import indent_log -from pip._internal.utils.misc import ( - ARCHIVE_EXTENSIONS, SUPPORTED_EXTENSIONS, WHEEL_EXTENSION, normalize_path, - redact_password_from_url, -) -from pip._internal.utils.packaging import check_requires_python -from pip._internal.utils.typing import MYPY_CHECK_RUNNING -from pip._internal.wheel import Wheel - -if MYPY_CHECK_RUNNING: - from logging import Logger - from typing import ( - Tuple, Optional, Any, List, Union, Callable, Set, Sequence, - Iterable, MutableMapping - ) - from pip._vendor.packaging.version import _BaseVersion - from pip._vendor.requests import Response - from pip._internal.pep425tags import Pep425Tag - from pip._internal.req import InstallRequirement - from pip._internal.download import PipSession - - SecureOrigin = Tuple[str, str, Optional[str]] - BuildTag = Tuple[Any, ...] # either empty tuple or Tuple[int, str] - CandidateSortingKey = Tuple[int, _BaseVersion, BuildTag, Optional[int]] - - -__all__ = ['FormatControl', 'FoundCandidates', 'PackageFinder'] - - -SECURE_ORIGINS = [ - # protocol, hostname, port - # Taken from Chrome's list of secure origins (See: http://bit.ly/1qrySKC) - ("https", "*", "*"), - ("*", "localhost", "*"), - ("*", "127.0.0.0/8", "*"), - ("*", "::1/128", "*"), - ("file", "*", None), - # ssh is always secure. - ("ssh", "*", "*"), -] # type: List[SecureOrigin] - - -logger = logging.getLogger(__name__) - - -def _match_vcs_scheme(url): - # type: (str) -> Optional[str] - """Look for VCS schemes in the URL. - - Returns the matched VCS scheme, or None if there's no match. - """ - from pip._internal.vcs import VcsSupport - for scheme in VcsSupport.schemes: - if url.lower().startswith(scheme) and url[len(scheme)] in '+:': - return scheme - return None - - -def _is_url_like_archive(url): - # type: (str) -> bool - """Return whether the URL looks like an archive. - """ - filename = Link(url).filename - for bad_ext in ARCHIVE_EXTENSIONS: - if filename.endswith(bad_ext): - return True - return False - - -class _NotHTML(Exception): - def __init__(self, content_type, request_desc): - # type: (str, str) -> None - super(_NotHTML, self).__init__(content_type, request_desc) - self.content_type = content_type - self.request_desc = request_desc - - -def _ensure_html_header(response): - # type: (Response) -> None - """Check the Content-Type header to ensure the response contains HTML. - - Raises `_NotHTML` if the content type is not text/html. - """ - content_type = response.headers.get("Content-Type", "") - if not content_type.lower().startswith("text/html"): - raise _NotHTML(content_type, response.request.method) - - -class _NotHTTP(Exception): - pass - - -def _ensure_html_response(url, session): - # type: (str, PipSession) -> None - """Send a HEAD request to the URL, and ensure the response contains HTML. - - Raises `_NotHTTP` if the URL is not available for a HEAD request, or - `_NotHTML` if the content type is not text/html. - """ - scheme, netloc, path, query, fragment = urllib_parse.urlsplit(url) - if scheme not in {'http', 'https'}: - raise _NotHTTP() - - resp = session.head(url, allow_redirects=True) - resp.raise_for_status() - - _ensure_html_header(resp) - - -def _get_html_response(url, session): - # type: (str, PipSession) -> Response - """Access an HTML page with GET, and return the response. - - This consists of three parts: - - 1. If the URL looks suspiciously like an archive, send a HEAD first to - check the Content-Type is HTML, to avoid downloading a large file. - Raise `_NotHTTP` if the content type cannot be determined, or - `_NotHTML` if it is not HTML. - 2. Actually perform the request. Raise HTTP exceptions on network failures. - 3. Check the Content-Type header to make sure we got HTML, and raise - `_NotHTML` otherwise. - """ - if _is_url_like_archive(url): - _ensure_html_response(url, session=session) - - logger.debug('Getting page %s', redact_password_from_url(url)) - - resp = session.get( - url, - headers={ - "Accept": "text/html", - # We don't want to blindly returned cached data for - # /simple/, because authors generally expecting that - # twine upload && pip install will function, but if - # they've done a pip install in the last ~10 minutes - # it won't. Thus by setting this to zero we will not - # blindly use any cached data, however the benefit of - # using max-age=0 instead of no-cache, is that we will - # still support conditional requests, so we will still - # minimize traffic sent in cases where the page hasn't - # changed at all, we will just always incur the round - # trip for the conditional GET now instead of only - # once per 10 minutes. - # For more information, please see pypa/pip#5670. - "Cache-Control": "max-age=0", - }, - ) - resp.raise_for_status() - - # The check for archives above only works if the url ends with - # something that looks like an archive. However that is not a - # requirement of an url. Unless we issue a HEAD request on every - # url we cannot know ahead of time for sure if something is HTML - # or not. However we can check after we've downloaded it. - _ensure_html_header(resp) - - return resp - - -def _handle_get_page_fail( - link, # type: Link - reason, # type: Union[str, Exception] - meth=None # type: Optional[Callable[..., None]] -): - # type: (...) -> None - if meth is None: - meth = logger.debug - meth("Could not fetch URL %s: %s - skipping", link, reason) - - -def _get_html_page(link, session=None): - # type: (Link, Optional[PipSession]) -> Optional[HTMLPage] - if session is None: - raise TypeError( - "_get_html_page() missing 1 required keyword argument: 'session'" - ) - - url = link.url.split('#', 1)[0] - - # Check for VCS schemes that do not support lookup as web pages. - vcs_scheme = _match_vcs_scheme(url) - if vcs_scheme: - logger.debug('Cannot look at %s URL %s', vcs_scheme, link) - return None - - # Tack index.html onto file:// URLs that point to directories - scheme, _, path, _, _, _ = urllib_parse.urlparse(url) - if (scheme == 'file' and os.path.isdir(urllib_request.url2pathname(path))): - # add trailing slash if not present so urljoin doesn't trim - # final segment - if not url.endswith('/'): - url += '/' - url = urllib_parse.urljoin(url, 'index.html') - logger.debug(' file: URL is directory, getting %s', url) - - try: - resp = _get_html_response(url, session=session) - except _NotHTTP: - logger.debug( - 'Skipping page %s because it looks like an archive, and cannot ' - 'be checked by HEAD.', link, - ) - except _NotHTML as exc: - logger.debug( - 'Skipping page %s because the %s request got Content-Type: %s', - link, exc.request_desc, exc.content_type, - ) - except HTTPError as exc: - _handle_get_page_fail(link, exc) - except RetryError as exc: - _handle_get_page_fail(link, exc) - except SSLError as exc: - reason = "There was a problem confirming the ssl certificate: " - reason += str(exc) - _handle_get_page_fail(link, reason, meth=logger.info) - except requests.ConnectionError as exc: - _handle_get_page_fail(link, "connection error: %s" % exc) - except requests.Timeout: - _handle_get_page_fail(link, "timed out") - else: - return HTMLPage(resp.content, resp.url, resp.headers) - return None - - -class CandidateEvaluator(object): - - def __init__( - self, - valid_tags, # type: List[Pep425Tag] - prefer_binary=False # type: bool - - ): - # type: (...) -> None - self._prefer_binary = prefer_binary - self._valid_tags = valid_tags - - def is_wheel_supported(self, wheel): - # type: (Wheel) -> bool - return wheel.supported(self._valid_tags) - - def _sort_key(self, candidate): - # type: (InstallationCandidate) -> CandidateSortingKey - """ - Function used to generate link sort key for link tuples. - The greater the return value, the more preferred it is. - If not finding wheels, then sorted by version only. - If finding wheels, then the sort order is by version, then: - 1. existing installs - 2. wheels ordered via Wheel.support_index_min(self._valid_tags) - 3. source archives - If prefer_binary was set, then all wheels are sorted above sources. - Note: it was considered to embed this logic into the Link - comparison operators, but then different sdist links - with the same version, would have to be considered equal - """ - support_num = len(self._valid_tags) - build_tag = tuple() # type: BuildTag - binary_preference = 0 - if candidate.location.is_wheel: - # can raise InvalidWheelFilename - wheel = Wheel(candidate.location.filename) - if not wheel.supported(self._valid_tags): - raise UnsupportedWheel( - "%s is not a supported wheel for this platform. It " - "can't be sorted." % wheel.filename - ) - if self._prefer_binary: - binary_preference = 1 - pri = -(wheel.support_index_min(self._valid_tags)) - if wheel.build_tag is not None: - match = re.match(r'^(\d+)(.*)$', wheel.build_tag) - build_tag_groups = match.groups() - build_tag = (int(build_tag_groups[0]), build_tag_groups[1]) - else: # sdist - pri = -(support_num) - return (binary_preference, candidate.version, build_tag, pri) - - def get_best_candidate(self, candidates): - # type: (List[InstallationCandidate]) -> InstallationCandidate - """ - Return the best candidate per the instance's sort order, or None if - no candidates are given. - """ - if not candidates: - return None - - return max(candidates, key=self._sort_key) - - -class FoundCandidates(object): - """A collection of candidates, returned by `PackageFinder.find_candidates`. - - This class is only intended to be instantiated by PackageFinder through - the `from_specifier()` constructor. - - Arguments: - - * `candidates`: A sequence of all available candidates found. - * `specifier`: Specifier to filter applicable versions. - * `prereleases`: Whether prereleases should be accounted. Pass None to - infer from the specifier. - * `evaluator`: A CandidateEvaluator object to sort applicable candidates - by order of preference. - """ - - def __init__( - self, - candidates, # type: List[InstallationCandidate] - versions, # type: Set[str] - evaluator, # type: CandidateEvaluator - ): - # type: (...) -> None - self._candidates = candidates - self._evaluator = evaluator - self._versions = versions - - @classmethod - def from_specifier( - cls, - candidates, # type: List[InstallationCandidate] - specifier, # type: specifiers.BaseSpecifier - prereleases, # type: Optional[bool] - evaluator, # type: CandidateEvaluator - ): - # type: (...) -> FoundCandidates - versions = { - str(v) for v in specifier.filter( - # We turn the version object into a str here because otherwise - # when we're debundled but setuptools isn't, Python will see - # packaging.version.Version and - # pkg_resources._vendor.packaging.version.Version as different - # types. This way we'll use a str as a common data interchange - # format. If we stop using the pkg_resources provided specifier - # and start using our own, we can drop the cast to str(). - (str(c.version) for c in candidates), - prereleases=prereleases, - ) - } - return cls(candidates, versions, evaluator) - - def iter_all(self): - # type: () -> Iterable[InstallationCandidate] - """Iterate through all candidates. - """ - return iter(self._candidates) - - def iter_applicable(self): - # type: () -> Iterable[InstallationCandidate] - """Iterate through candidates matching the versions associated with - this instance. - """ - # Again, converting version to str to deal with debundling. - return (c for c in self.iter_all() if str(c.version) in self._versions) - - def get_best(self): - # type: () -> Optional[InstallationCandidate] - """Return the best candidate available, or None if no applicable - candidates are found. - """ - candidates = list(self.iter_applicable()) - return self._evaluator.get_best_candidate(candidates) - - -class PackageFinder(object): - """This finds packages. - - This is meant to match easy_install's technique for looking for - packages, by reading pages and looking for appropriate links. - """ - - def __init__( - self, - find_links, # type: List[str] - index_urls, # type: List[str] - allow_all_prereleases=False, # type: bool - trusted_hosts=None, # type: Optional[Iterable[str]] - session=None, # type: Optional[PipSession] - format_control=None, # type: Optional[FormatControl] - platform=None, # type: Optional[str] - versions=None, # type: Optional[List[str]] - abi=None, # type: Optional[str] - implementation=None, # type: Optional[str] - prefer_binary=False # type: bool - ): - # type: (...) -> None - """Create a PackageFinder. - - :param format_control: A FormatControl object or None. Used to control - the selection of source packages / binary packages when consulting - the index and links. - :param platform: A string or None. If None, searches for packages - that are supported by the current system. Otherwise, will find - packages that can be built on the platform passed in. These - packages will only be downloaded for distribution: they will - not be built locally. - :param versions: A list of strings or None. This is passed directly - to pep425tags.py in the get_supported() method. - :param abi: A string or None. This is passed directly - to pep425tags.py in the get_supported() method. - :param implementation: A string or None. This is passed directly - to pep425tags.py in the get_supported() method. - :param prefer_binary: Whether to prefer an old, but valid, binary - dist over a new source dist. - """ - if session is None: - raise TypeError( - "PackageFinder() missing 1 required keyword argument: " - "'session'" - ) - - # Build find_links. If an argument starts with ~, it may be - # a local file relative to a home directory. So try normalizing - # it and if it exists, use the normalized version. - # This is deliberately conservative - it might be fine just to - # blindly normalize anything starting with a ~... - self.find_links = [] # type: List[str] - for link in find_links: - if link.startswith('~'): - new_link = normalize_path(link) - if os.path.exists(new_link): - link = new_link - self.find_links.append(link) - - self.index_urls = index_urls - - # These are boring links that have already been logged somehow: - self.logged_links = set() # type: Set[Link] - - self.format_control = format_control or FormatControl(set(), set()) - - # Domains that we won't emit warnings for when not using HTTPS - self.secure_origins = [ - ("*", host, "*") - for host in (trusted_hosts if trusted_hosts else []) - ] # type: List[SecureOrigin] - - # Do we want to allow _all_ pre-releases? - self.allow_all_prereleases = allow_all_prereleases - - # The Session we'll use to make requests - self.session = session - - # The valid tags to check potential found wheel candidates against - valid_tags = get_supported( - versions=versions, - platform=platform, - abi=abi, - impl=implementation, - ) - self.candidate_evaluator = CandidateEvaluator( - valid_tags=valid_tags, prefer_binary=prefer_binary, - ) - - # If we don't have TLS enabled, then WARN if anyplace we're looking - # relies on TLS. - if not HAS_TLS: - for link in itertools.chain(self.index_urls, self.find_links): - parsed = urllib_parse.urlparse(link) - if parsed.scheme == "https": - logger.warning( - "pip is configured with locations that require " - "TLS/SSL, however the ssl module in Python is not " - "available." - ) - break - - def get_formatted_locations(self): - # type: () -> str - lines = [] - if self.index_urls and self.index_urls != [PyPI.simple_url]: - lines.append( - "Looking in indexes: {}".format(", ".join( - redact_password_from_url(url) for url in self.index_urls)) - ) - if self.find_links: - lines.append( - "Looking in links: {}".format(", ".join(self.find_links)) - ) - return "\n".join(lines) - - @staticmethod - def _sort_locations(locations, expand_dir=False): - # type: (Sequence[str], bool) -> Tuple[List[str], List[str]] - """ - Sort locations into "files" (archives) and "urls", and return - a pair of lists (files,urls) - """ - files = [] - urls = [] - - # puts the url for the given file path into the appropriate list - def sort_path(path): - url = path_to_url(path) - if mimetypes.guess_type(url, strict=False)[0] == 'text/html': - urls.append(url) - else: - files.append(url) - - for url in locations: - - is_local_path = os.path.exists(url) - is_file_url = url.startswith('file:') - - if is_local_path or is_file_url: - if is_local_path: - path = url - else: - path = url_to_path(url) - if os.path.isdir(path): - if expand_dir: - path = os.path.realpath(path) - for item in os.listdir(path): - sort_path(os.path.join(path, item)) - elif is_file_url: - urls.append(url) - else: - logger.warning( - "Path '{0}' is ignored: " - "it is a directory.".format(path), - ) - elif os.path.isfile(path): - sort_path(path) - else: - logger.warning( - "Url '%s' is ignored: it is neither a file " - "nor a directory.", url, - ) - elif is_url(url): - # Only add url with clear scheme - urls.append(url) - else: - logger.warning( - "Url '%s' is ignored. It is either a non-existing " - "path or lacks a specific scheme.", url, - ) - - return files, urls - - def _validate_secure_origin(self, logger, location): - # type: (Logger, Link) -> bool - # Determine if this url used a secure transport mechanism - parsed = urllib_parse.urlparse(str(location)) - origin = (parsed.scheme, parsed.hostname, parsed.port) - - # The protocol to use to see if the protocol matches. - # Don't count the repository type as part of the protocol: in - # cases such as "git+ssh", only use "ssh". (I.e., Only verify against - # the last scheme.) - protocol = origin[0].rsplit('+', 1)[-1] - - # Determine if our origin is a secure origin by looking through our - # hardcoded list of secure origins, as well as any additional ones - # configured on this PackageFinder instance. - for secure_origin in (SECURE_ORIGINS + self.secure_origins): - if protocol != secure_origin[0] and secure_origin[0] != "*": - continue - - try: - # We need to do this decode dance to ensure that we have a - # unicode object, even on Python 2.x. - addr = ipaddress.ip_address( - origin[1] - if ( - isinstance(origin[1], six.text_type) or - origin[1] is None - ) - else origin[1].decode("utf8") - ) - network = ipaddress.ip_network( - secure_origin[1] - if isinstance(secure_origin[1], six.text_type) - # setting secure_origin[1] to proper Union[bytes, str] - # creates problems in other places - else secure_origin[1].decode("utf8") # type: ignore - ) - except ValueError: - # We don't have both a valid address or a valid network, so - # we'll check this origin against hostnames. - if (origin[1] and - origin[1].lower() != secure_origin[1].lower() and - secure_origin[1] != "*"): - continue - else: - # We have a valid address and network, so see if the address - # is contained within the network. - if addr not in network: - continue - - # Check to see if the port patches - if (origin[2] != secure_origin[2] and - secure_origin[2] != "*" and - secure_origin[2] is not None): - continue - - # If we've gotten here, then this origin matches the current - # secure origin and we should return True - return True - - # If we've gotten to this point, then the origin isn't secure and we - # will not accept it as a valid location to search. We will however - # log a warning that we are ignoring it. - logger.warning( - "The repository located at %s is not a trusted or secure host and " - "is being ignored. If this repository is available via HTTPS we " - "recommend you use HTTPS instead, otherwise you may silence " - "this warning and allow it anyway with '--trusted-host %s'.", - parsed.hostname, - parsed.hostname, - ) - - return False - - def _get_index_urls_locations(self, project_name): - # type: (str) -> List[str] - """Returns the locations found via self.index_urls - - Checks the url_name on the main (first in the list) index and - use this url_name to produce all locations - """ - - def mkurl_pypi_url(url): - loc = posixpath.join( - url, - urllib_parse.quote(canonicalize_name(project_name))) - # For maximum compatibility with easy_install, ensure the path - # ends in a trailing slash. Although this isn't in the spec - # (and PyPI can handle it without the slash) some other index - # implementations might break if they relied on easy_install's - # behavior. - if not loc.endswith('/'): - loc = loc + '/' - return loc - - return [mkurl_pypi_url(url) for url in self.index_urls] - - def find_all_candidates(self, project_name): - # type: (str) -> List[Optional[InstallationCandidate]] - """Find all available InstallationCandidate for project_name - - This checks index_urls and find_links. - All versions found are returned as an InstallationCandidate list. - - See _link_package_versions for details on which files are accepted - """ - index_locations = self._get_index_urls_locations(project_name) - index_file_loc, index_url_loc = self._sort_locations(index_locations) - fl_file_loc, fl_url_loc = self._sort_locations( - self.find_links, expand_dir=True, - ) - - file_locations = (Link(url) for url in itertools.chain( - index_file_loc, fl_file_loc, - )) - - # We trust every url that the user has given us whether it was given - # via --index-url or --find-links. - # We want to filter out any thing which does not have a secure origin. - url_locations = [ - link for link in itertools.chain( - (Link(url) for url in index_url_loc), - (Link(url) for url in fl_url_loc), - ) - if self._validate_secure_origin(logger, link) - ] - - logger.debug('%d location(s) to search for versions of %s:', - len(url_locations), project_name) - - for location in url_locations: - logger.debug('* %s', location) - - canonical_name = canonicalize_name(project_name) - formats = self.format_control.get_allowed_formats(canonical_name) - search = Search(project_name, canonical_name, formats) - find_links_versions = self._package_versions( - # We trust every directly linked archive in find_links - (Link(url, '-f') for url in self.find_links), - search - ) - - page_versions = [] - for page in self._get_pages(url_locations, project_name): - logger.debug('Analyzing links from page %s', page.url) - with indent_log(): - page_versions.extend( - self._package_versions(page.iter_links(), search) - ) - - file_versions = self._package_versions(file_locations, search) - if file_versions: - file_versions.sort(reverse=True) - logger.debug( - 'Local files found: %s', - ', '.join([ - url_to_path(candidate.location.url) - for candidate in file_versions - ]) - ) - - # This is an intentional priority ordering - return file_versions + find_links_versions + page_versions - - def find_candidates( - self, - project_name, # type: str - specifier=None, # type: Optional[specifiers.BaseSpecifier] - ): - """Find matches for the given project and specifier. - - If given, `specifier` should implement `filter` to allow version - filtering (e.g. ``packaging.specifiers.SpecifierSet``). - - Returns a `FoundCandidates` instance. - """ - if specifier is None: - specifier = specifiers.SpecifierSet() - return FoundCandidates.from_specifier( - self.find_all_candidates(project_name), - specifier=specifier, - prereleases=(self.allow_all_prereleases or None), - evaluator=self.candidate_evaluator, - ) - - def find_requirement(self, req, upgrade): - # type: (InstallRequirement, bool) -> Optional[Link] - """Try to find a Link matching req - - Expects req, an InstallRequirement and upgrade, a boolean - Returns a Link if found, - Raises DistributionNotFound or BestVersionAlreadyInstalled otherwise - """ - candidates = self.find_candidates(req.name, req.specifier) - best_candidate = candidates.get_best() - - installed_version = None # type: Optional[_BaseVersion] - if req.satisfied_by is not None: - installed_version = parse_version(req.satisfied_by.version) - - def _format_versions(cand_iter): - # This repeated parse_version and str() conversion is needed to - # handle different vendoring sources from pip and pkg_resources. - # If we stop using the pkg_resources provided specifier and start - # using our own, we can drop the cast to str(). - return ", ".join(sorted( - {str(c.version) for c in cand_iter}, - key=parse_version, - )) or "none" - - if installed_version is None and best_candidate is None: - logger.critical( - 'Could not find a version that satisfies the requirement %s ' - '(from versions: %s)', - req, - _format_versions(candidates.iter_all()), - ) - - raise DistributionNotFound( - 'No matching distribution found for %s' % req - ) - - best_installed = False - if installed_version and ( - best_candidate is None or - best_candidate.version <= installed_version): - best_installed = True - - if not upgrade and installed_version is not None: - if best_installed: - logger.debug( - 'Existing installed version (%s) is most up-to-date and ' - 'satisfies requirement', - installed_version, - ) - else: - logger.debug( - 'Existing installed version (%s) satisfies requirement ' - '(most up-to-date version is %s)', - installed_version, - best_candidate.version, - ) - return None - - if best_installed: - # We have an existing version, and its the best version - logger.debug( - 'Installed version (%s) is most up-to-date (past versions: ' - '%s)', - installed_version, - _format_versions(candidates.iter_applicable()), - ) - raise BestVersionAlreadyInstalled - - logger.debug( - 'Using version %s (newest of versions: %s)', - best_candidate.version, - _format_versions(candidates.iter_applicable()), - ) - return best_candidate.location - - def _get_pages(self, locations, project_name): - # type: (Iterable[Link], str) -> Iterable[HTMLPage] - """ - Yields (page, page_url) from the given locations, skipping - locations that have errors. - """ - seen = set() # type: Set[Link] - for location in locations: - if location in seen: - continue - seen.add(location) - - page = _get_html_page(location, session=self.session) - if page is None: - continue - - yield page - - _py_version_re = re.compile(r'-py([123]\.?[0-9]?)$') - - def _sort_links(self, links): - # type: (Iterable[Link]) -> List[Link] - """ - Returns elements of links in order, non-egg links first, egg links - second, while eliminating duplicates - """ - eggs, no_eggs = [], [] - seen = set() # type: Set[Link] - for link in links: - if link not in seen: - seen.add(link) - if link.egg_fragment: - eggs.append(link) - else: - no_eggs.append(link) - return no_eggs + eggs - - def _package_versions( - self, - links, # type: Iterable[Link] - search # type: Search - ): - # type: (...) -> List[Optional[InstallationCandidate]] - result = [] - for link in self._sort_links(links): - v = self._link_package_versions(link, search) - if v is not None: - result.append(v) - return result - - def _log_skipped_link(self, link, reason): - # type: (Link, str) -> None - if link not in self.logged_links: - logger.debug('Skipping link %s; %s', link, reason) - self.logged_links.add(link) - - def _link_package_versions(self, link, search): - # type: (Link, Search) -> Optional[InstallationCandidate] - """Return an InstallationCandidate or None""" - version = None - if link.egg_fragment: - egg_info = link.egg_fragment - ext = link.ext - else: - egg_info, ext = link.splitext() - if not ext: - self._log_skipped_link(link, 'not a file') - return None - if ext not in SUPPORTED_EXTENSIONS: - self._log_skipped_link( - link, 'unsupported archive format: %s' % ext, - ) - return None - if "binary" not in search.formats and ext == WHEEL_EXTENSION: - self._log_skipped_link( - link, 'No binaries permitted for %s' % search.supplied, - ) - return None - if "macosx10" in link.path and ext == '.zip': - self._log_skipped_link(link, 'macosx10 one') - return None - if ext == WHEEL_EXTENSION: - try: - wheel = Wheel(link.filename) - except InvalidWheelFilename: - self._log_skipped_link(link, 'invalid wheel filename') - return None - if canonicalize_name(wheel.name) != search.canonical: - self._log_skipped_link( - link, 'wrong project name (not %s)' % search.supplied) - return None - - if not self.candidate_evaluator.is_wheel_supported(wheel): - self._log_skipped_link( - link, 'it is not compatible with this Python') - return None - - version = wheel.version - - # This should be up by the search.ok_binary check, but see issue 2700. - if "source" not in search.formats and ext != WHEEL_EXTENSION: - self._log_skipped_link( - link, 'No sources permitted for %s' % search.supplied, - ) - return None - - if not version: - version = _egg_info_matches(egg_info, search.canonical) - if not version: - self._log_skipped_link( - link, 'Missing project version for %s' % search.supplied) - return None - - match = self._py_version_re.search(version) - if match: - version = version[:match.start()] - py_version = match.group(1) - if py_version != sys.version[:3]: - self._log_skipped_link( - link, 'Python version is incorrect') - return None - try: - support_this_python = check_requires_python(link.requires_python) - except specifiers.InvalidSpecifier: - logger.debug("Package %s has an invalid Requires-Python entry: %s", - link.filename, link.requires_python) - support_this_python = True - - if not support_this_python: - logger.debug("The package %s is incompatible with the python " - "version in use. Acceptable python versions are: %s", - link, link.requires_python) - return None - logger.debug('Found link %s, version: %s', link, version) - - return InstallationCandidate(search.supplied, version, link) - - -def _find_name_version_sep(egg_info, canonical_name): - # type: (str, str) -> int - """Find the separator's index based on the package's canonical name. - - `egg_info` must be an egg info string for the given package, and - `canonical_name` must be the package's canonical name. - - This function is needed since the canonicalized name does not necessarily - have the same length as the egg info's name part. An example:: - - >>> egg_info = 'foo__bar-1.0' - >>> canonical_name = 'foo-bar' - >>> _find_name_version_sep(egg_info, canonical_name) - 8 - """ - # Project name and version must be separated by one single dash. Find all - # occurrences of dashes; if the string in front of it matches the canonical - # name, this is the one separating the name and version parts. - for i, c in enumerate(egg_info): - if c != "-": - continue - if canonicalize_name(egg_info[:i]) == canonical_name: - return i - raise ValueError("{} does not match {}".format(egg_info, canonical_name)) - - -def _egg_info_matches(egg_info, canonical_name): - # type: (str, str) -> Optional[str] - """Pull the version part out of a string. - - :param egg_info: The string to parse. E.g. foo-2.1 - :param canonical_name: The canonicalized name of the package this - belongs to. - """ - try: - version_start = _find_name_version_sep(egg_info, canonical_name) + 1 - except ValueError: - return None - version = egg_info[version_start:] - if not version: - return None - return version - - -def _determine_base_url(document, page_url): - """Determine the HTML document's base URL. - - This looks for a ```` tag in the HTML document. If present, its href - attribute denotes the base URL of anchor tags in the document. If there is - no such tag (or if it does not have a valid href attribute), the HTML - file's URL is used as the base URL. - - :param document: An HTML document representation. The current - implementation expects the result of ``html5lib.parse()``. - :param page_url: The URL of the HTML document. - """ - for base in document.findall(".//base"): - href = base.get("href") - if href is not None: - return href - return page_url - - -def _get_encoding_from_headers(headers): - """Determine if we have any encoding information in our headers. - """ - if headers and "Content-Type" in headers: - content_type, params = cgi.parse_header(headers["Content-Type"]) - if "charset" in params: - return params['charset'] - return None - - -def _clean_link(url): - # type: (str) -> str - """Makes sure a link is fully encoded. That is, if a ' ' shows up in - the link, it will be rewritten to %20 (while not over-quoting - % or other characters).""" - # Split the URL into parts according to the general structure - # `scheme://netloc/path;parameters?query#fragment`. Note that the - # `netloc` can be empty and the URI will then refer to a local - # filesystem path. - result = urllib_parse.urlparse(url) - # In both cases below we unquote prior to quoting to make sure - # nothing is double quoted. - if result.netloc == "": - # On Windows the path part might contain a drive letter which - # should not be quoted. On Linux where drive letters do not - # exist, the colon should be quoted. We rely on urllib.request - # to do the right thing here. - path = urllib_request.pathname2url( - urllib_request.url2pathname(result.path)) - else: - # In addition to the `/` character we protect `@` so that - # revision strings in VCS URLs are properly parsed. - path = urllib_parse.quote(urllib_parse.unquote(result.path), safe="/@") - return urllib_parse.urlunparse(result._replace(path=path)) - - -class HTMLPage(object): - """Represents one page, along with its URL""" - - def __init__(self, content, url, headers=None): - # type: (bytes, str, MutableMapping[str, str]) -> None - self.content = content - self.url = url - self.headers = headers - - def __str__(self): - return redact_password_from_url(self.url) - - def iter_links(self): - # type: () -> Iterable[Link] - """Yields all links in the page""" - document = html5lib.parse( - self.content, - transport_encoding=_get_encoding_from_headers(self.headers), - namespaceHTMLElements=False, - ) - base_url = _determine_base_url(document, self.url) - for anchor in document.findall(".//a"): - if anchor.get("href"): - href = anchor.get("href") - url = _clean_link(urllib_parse.urljoin(base_url, href)) - pyrequire = anchor.get('data-requires-python') - pyrequire = unescape(pyrequire) if pyrequire else None - yield Link(url, self.url, requires_python=pyrequire) - - -Search = namedtuple('Search', 'supplied canonical formats') -"""Capture key aspects of a search. - -:attribute supplied: The user supplied package. -:attribute canonical: The canonical package name. -:attribute formats: The formats allowed for this package. Should be a set - with 'binary' or 'source' or both in it. -""" diff --git a/venv/lib/python2.7/site-packages/pip/_internal/index.pyc b/venv/lib/python2.7/site-packages/pip/_internal/index.pyc deleted file mode 100644 index 8583d4f5c5e761303a289df3d13bc678745ac4f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36283 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 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/locations.py b/venv/lib/python2.7/site-packages/pip/_internal/locations.py deleted file mode 100644 index 10860f7..0000000 --- a/venv/lib/python2.7/site-packages/pip/_internal/locations.py +++ /dev/null @@ -1,211 +0,0 @@ -"""Locations where we look for configs, install stuff, etc""" -from __future__ import absolute_import - -import os -import os.path -import platform -import site -import sys -import sysconfig -from distutils import sysconfig as distutils_sysconfig -from distutils.command.install import SCHEME_KEYS # type: ignore - -from pip._internal.utils import appdirs -from pip._internal.utils.compat import WINDOWS, expanduser -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import Any, Union, Dict, List, Optional - - -# Application Directories -USER_CACHE_DIR = appdirs.user_cache_dir("pip") - - -DELETE_MARKER_MESSAGE = '''\ -This file is placed here by pip to indicate the source was put -here by pip. - -Once this package is successfully installed this source code will be -deleted (unless you remove this file). -''' -PIP_DELETE_MARKER_FILENAME = 'pip-delete-this-directory.txt' - - -def write_delete_marker_file(directory): - # type: (str) -> None - """ - Write the pip delete marker file into this directory. - """ - filepath = os.path.join(directory, PIP_DELETE_MARKER_FILENAME) - with open(filepath, 'w') as marker_fp: - marker_fp.write(DELETE_MARKER_MESSAGE) - - -def running_under_virtualenv(): - # type: () -> bool - """ - Return True if we're running inside a virtualenv, False otherwise. - - """ - if hasattr(sys, 'real_prefix'): - return True - elif sys.prefix != getattr(sys, "base_prefix", sys.prefix): - return True - - return False - - -def virtualenv_no_global(): - # type: () -> bool - """ - Return True if in a venv and no system site packages. - """ - # this mirrors the logic in virtualenv.py for locating the - # no-global-site-packages.txt file - site_mod_dir = os.path.dirname(os.path.abspath(site.__file__)) - no_global_file = os.path.join(site_mod_dir, 'no-global-site-packages.txt') - if running_under_virtualenv() and os.path.isfile(no_global_file): - return True - else: - return False - - -if running_under_virtualenv(): - src_prefix = os.path.join(sys.prefix, 'src') -else: - # FIXME: keep src in cwd for now (it is not a temporary folder) - try: - src_prefix = os.path.join(os.getcwd(), 'src') - except OSError: - # In case the current working directory has been renamed or deleted - sys.exit( - "The folder you are executing pip from can no longer be found." - ) - -# under macOS + virtualenv sys.prefix is not properly resolved -# it is something like /path/to/python/bin/.. -# Note: using realpath due to tmp dirs on OSX being symlinks -src_prefix = os.path.abspath(src_prefix) - -# FIXME doesn't account for venv linked to global site-packages - -site_packages = sysconfig.get_path("purelib") # type: Optional[str] - -# This is because of a bug in PyPy's sysconfig module, see -# https://bitbucket.org/pypy/pypy/issues/2506/sysconfig-returns-incorrect-paths -# for more information. -if platform.python_implementation().lower() == "pypy": - site_packages = distutils_sysconfig.get_python_lib() -try: - # Use getusersitepackages if this is present, as it ensures that the - # value is initialised properly. - user_site = site.getusersitepackages() -except AttributeError: - user_site = site.USER_SITE -user_dir = expanduser('~') -if WINDOWS: - bin_py = os.path.join(sys.prefix, 'Scripts') - bin_user = os.path.join(user_site, 'Scripts') - # buildout uses 'bin' on Windows too? - if not os.path.exists(bin_py): - bin_py = os.path.join(sys.prefix, 'bin') - bin_user = os.path.join(user_site, 'bin') - - config_basename = 'pip.ini' - - legacy_storage_dir = os.path.join(user_dir, 'pip') - legacy_config_file = os.path.join( - legacy_storage_dir, - config_basename, - ) -else: - bin_py = os.path.join(sys.prefix, 'bin') - bin_user = os.path.join(user_site, 'bin') - - config_basename = 'pip.conf' - - legacy_storage_dir = os.path.join(user_dir, '.pip') - legacy_config_file = os.path.join( - legacy_storage_dir, - config_basename, - ) - # Forcing to use /usr/local/bin for standard macOS framework installs - # Also log to ~/Library/Logs/ for use with the Console.app log viewer - if sys.platform[:6] == 'darwin' and sys.prefix[:16] == '/System/Library/': - bin_py = '/usr/local/bin' - -global_config_files = [ - os.path.join(path, config_basename) - for path in appdirs.site_config_dirs('pip') -] - -site_config_file = os.path.join(sys.prefix, config_basename) -new_config_file = os.path.join(appdirs.user_config_dir("pip"), config_basename) - - -def distutils_scheme(dist_name, user=False, home=None, root=None, - isolated=False, prefix=None): - # type:(str, bool, str, str, bool, str) -> dict - """ - Return a distutils install scheme - """ - from distutils.dist import Distribution - - scheme = {} - - if isolated: - extra_dist_args = {"script_args": ["--no-user-cfg"]} - else: - extra_dist_args = {} - dist_args = {'name': dist_name} # type: Dict[str, Union[str, List[str]]] - dist_args.update(extra_dist_args) - - d = Distribution(dist_args) - # Ignoring, typeshed issue reported python/typeshed/issues/2567 - d.parse_config_files() - # NOTE: Ignoring type since mypy can't find attributes on 'Command' - i = d.get_command_obj('install', create=True) # type: Any - assert i is not None - # NOTE: setting user or home has the side-effect of creating the home dir - # or user base for installations during finalize_options() - # ideally, we'd prefer a scheme class that has no side-effects. - assert not (user and prefix), "user={} prefix={}".format(user, prefix) - i.user = user or i.user - if user: - i.prefix = "" - i.prefix = prefix or i.prefix - i.home = home or i.home - i.root = root or i.root - i.finalize_options() - for key in SCHEME_KEYS: - scheme[key] = getattr(i, 'install_' + key) - - # install_lib specified in setup.cfg should install *everything* - # into there (i.e. it takes precedence over both purelib and - # platlib). Note, i.install_lib is *always* set after - # finalize_options(); we only want to override here if the user - # has explicitly requested it hence going back to the config - - # Ignoring, typeshed issue reported python/typeshed/issues/2567 - if 'install_lib' in d.get_option_dict('install'): # type: ignore - scheme.update(dict(purelib=i.install_lib, platlib=i.install_lib)) - - if running_under_virtualenv(): - scheme['headers'] = os.path.join( - sys.prefix, - 'include', - 'site', - 'python' + sys.version[:3], - dist_name, - ) - - if root is not None: - path_no_drive = os.path.splitdrive( - os.path.abspath(scheme["headers"]))[1] - scheme["headers"] = os.path.join( - root, - path_no_drive[1:], - ) - - return scheme diff --git a/venv/lib/python2.7/site-packages/pip/_internal/locations.pyc b/venv/lib/python2.7/site-packages/pip/_internal/locations.pyc deleted file mode 100644 index b9dcbb01e50acf99e6936d2d62e1270419479aaf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5685 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 Lig None - self.project = project - self.version = parse_version(version) # type: _BaseVersion - self.location = location - - super(InstallationCandidate, self).__init__( - key=(self.project, self.version, self.location), - defining_class=InstallationCandidate - ) - - def __repr__(self): - # type: () -> str - return "".format( - self.project, self.version, self.location, - ) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/models/candidate.pyc b/venv/lib/python2.7/site-packages/pip/_internal/models/candidate.pyc deleted file mode 100644 index bd80f56c6e5613dde5f856c696849eac0b7f9994..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1709 zcmd5+ZExH}5FXnXCzrHM2p|Ck>6%Y2qUThgh)7WcIUyRAoGPb{6iaAj?7hgz`la4Y z$c69$9sigg0MG2+QAFF%?ds<7?9S}&>@zbL{B?Kr%Rlb@oYQ;+_z(yYO_Dy8WQ~Dy z7eO58m(b$2E3c4|_$uq-Nuvtf8{b^V)33W<>R&G&@4T$Hce-zO@^AI^ZgJCXW1O|| z^SCYBM{|B3na4+G;u$YlK^R7Mb*AE~DWuZzziAn^(}a20fM||}{JyvD_5Drn6EEjt zVByGZZa#+suIEHM(ie2k0x;~uVXPkl_ug1%(QgmB-@h8X!iW2g9OeuaQf21<^l$*l zI^bOsHBV`WQWxSr0@BP2`Joqa@y^Y4R!JcYce@av`%>|gYf6Zs$%U|dCm&$p)q||| zj?&M}bLKTGp&$DFwQ`C6ju|Taqb0VPY>&BpOup^8_kvGb274~?`}}Ne P`^(?(Hc%-*@5A69N0yfr diff --git a/venv/lib/python2.7/site-packages/pip/_internal/models/format_control.py b/venv/lib/python2.7/site-packages/pip/_internal/models/format_control.py deleted file mode 100644 index 53138e4..0000000 --- a/venv/lib/python2.7/site-packages/pip/_internal/models/format_control.py +++ /dev/null @@ -1,73 +0,0 @@ -from pip._vendor.packaging.utils import canonicalize_name - -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import Optional, Set, FrozenSet - - -class FormatControl(object): - """Helper for managing formats from which a package can be installed. - """ - - def __init__(self, no_binary=None, only_binary=None): - # type: (Optional[Set], Optional[Set]) -> None - if no_binary is None: - no_binary = set() - if only_binary is None: - only_binary = set() - - self.no_binary = no_binary - self.only_binary = only_binary - - def __eq__(self, other): - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - return not self.__eq__(other) - - def __repr__(self): - return "{}({}, {})".format( - self.__class__.__name__, - self.no_binary, - self.only_binary - ) - - @staticmethod - def handle_mutual_excludes(value, target, other): - # type: (str, Optional[Set], Optional[Set]) -> None - new = value.split(',') - while ':all:' in new: - other.clear() - target.clear() - target.add(':all:') - del new[:new.index(':all:') + 1] - # Without a none, we want to discard everything as :all: covers it - if ':none:' not in new: - return - for name in new: - if name == ':none:': - target.clear() - continue - name = canonicalize_name(name) - other.discard(name) - target.add(name) - - def get_allowed_formats(self, canonical_name): - # type: (str) -> FrozenSet - result = {"binary", "source"} - if canonical_name in self.only_binary: - result.discard('source') - elif canonical_name in self.no_binary: - result.discard('binary') - elif ':all:' in self.only_binary: - result.discard('source') - elif ':all:' in self.no_binary: - result.discard('binary') - return frozenset(result) - - def disallow_binaries(self): - # type: () -> None - self.handle_mutual_excludes( - ':all:', self.no_binary, self.only_binary, - ) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/models/format_control.pyc b/venv/lib/python2.7/site-packages/pip/_internal/models/format_control.pyc deleted file mode 100644 index e585c6c61a9933afd11bd752ab53bfcc645ea44f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3380 zcmd5;TW=dh6h6C~*h!i+p;VNMpnd?!KpVHBs!D_^MCb(&rrJGTG^fxN z_(oI_4I>&v6!AQ!DyCsVgM=cTkbNM#5~^lsI7@?B8n$TAqG6i`ZHf%um?1q!+YuGB z^or<=Xmc=6MT<7NZTv_151wv>k$(qWo|)Q|c~+GtTA6I9gXjuGKW{$SRO^o)tpB9a zr~Up9{YPEa*3Y5)W#r4+WR>TY4ek9rejnQUL>rzh@vOGP%&*tR+q%lJAP?{V4$W<% z)5K=N%0W!UoO~mC71Lmb?S}F&uSjIjV!L>y&DJ%h!AoKpuP;#1mJOFE-RQD9?h(4j zx*BQQ*{*G8n3-&+G&?+jX0Ees>tW|`x6F4tS!a~xd)bcez#*M2-6@UpSyky`b)kbN zXT7<_XzOV1A-Yphes7NK`{W~b^&}#M;1uQ%@%pXldMxV^of4^-H}D|gZ5!h8es=~3 zdhYtQ(c)Lv_|?>Et2CKC_Lm^8O?BMNLp=B$r>pIh1Cz4lU9`}-1B`kjTOMRy_YN}K z+peoZTh}`|>K%V&x6I+*?YsNt)?It&Zhp@leO;W`TX=Rxyy|>7|AD|k8*bAw24z!umH!r z5Z9vLi_hI7h-C|vD#{#3cKOY80iB;kSNmOUFNWbQ(Nga#bqyoOdeZ+Gdl}2;#-2sA zI7I@RnzHn@i77kqB3Wm&QXfL6sdcO~HwL4G@;U|}GY%yJih)4>MIzG~I!h2)_DtV# z2wzURFDExTFDIXOIhdYZ7!W1QqEudG&MDP^iit|8Hvlg#6IWr8NY`U``A1b7Tcm?U)clqv8up}iK_Z6*x(@C;{wbKV$%XkvaN!cKhQ z-Y^GiUb_RvLoaw-m(GS{c#@b>Rhaq~6; zgtukyhNQ2)M5W199BWsPZLVJfLUu`tNQ)M+#27b4$-PIO zuXB(*<0$3AM^a+C%p>-@=eJR$`7$4BzgrinIE3$2`Wd>{2zlEqkaFOpBIWv~6}RH$ zh4}=Z_VU&FrGA%<_aC7{akZ)rv?*%48tPG$tE*#QRxa=%XI$Adt-gYA)gOg9=U5QtKlIzL8Q$-8K diff --git a/venv/lib/python2.7/site-packages/pip/_internal/models/index.py b/venv/lib/python2.7/site-packages/pip/_internal/models/index.py deleted file mode 100644 index ead1efb..0000000 --- a/venv/lib/python2.7/site-packages/pip/_internal/models/index.py +++ /dev/null @@ -1,31 +0,0 @@ -from pip._vendor.six.moves.urllib import parse as urllib_parse - - -class PackageIndex(object): - """Represents a Package Index and provides easier access to endpoints - """ - - def __init__(self, url, file_storage_domain): - # type: (str, str) -> None - super(PackageIndex, self).__init__() - self.url = url - self.netloc = urllib_parse.urlsplit(url).netloc - self.simple_url = self._url_for_path('simple') - self.pypi_url = self._url_for_path('pypi') - - # This is part of a temporary hack used to block installs of PyPI - # packages which depend on external urls only necessary until PyPI can - # block such packages themselves - self.file_storage_domain = file_storage_domain - - def _url_for_path(self, path): - # type: (str) -> str - return urllib_parse.urljoin(self.url, path) - - -PyPI = PackageIndex( - 'https://pypi.org/', file_storage_domain='files.pythonhosted.org' -) -TestPyPI = PackageIndex( - 'https://test.pypi.org/', file_storage_domain='test-files.pythonhosted.org' -) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/models/index.pyc b/venv/lib/python2.7/site-packages/pip/_internal/models/index.pyc deleted file mode 100644 index 907ddb35890f1ee8dbfc7fe8b667b3e200cae01b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1555 zcmc&!!EVz)5S_J?v!Ypn_;2XdIBp15zPP z1?3_AB)TE`GH#J-QI4lgd53O<7`MGss8eH=dx+I2 z%`VcJIw^Ct`kM{geZaI4gd!T_YRG`oLIUHEkPqQtD2fUjfIrs#^;SqF=@&lR&41&1! zdl`~z(Y#IA-Uym^*hqRg2O3_st38 zZ~_dRy{wf?O|HZi-JBw;0ctnOcx6M!4^^i zs!Nb4eL)f=W>R{*5L*(X?@J6GE`am@WVsLU+(U1s-j z#9e7YyF0JS^U6Avvw=Ul^K!~MSlqhWr|@Fc!T(){eNXu_SfSSja*3ZqWd>HS28(Km zyU+;uyb_#K(;b{_HJPi-H6JEdFj|jJJOgLAi8uESuFvLe(*f@oXv>^G4)^y%@hAwz EA3Q93 None - """ - url: - url of the resource pointed to (href of the link) - comes_from: - instance of HTMLPage where the link was found, or string. - requires_python: - String containing the `Requires-Python` metadata field, specified - in PEP 345. This may be specified by a data-requires-python - attribute in the HTML link tag, as described in PEP 503. - """ - - # url can be a UNC windows share - if url.startswith('\\\\'): - url = path_to_url(url) - - self.url = url - self.comes_from = comes_from - self.requires_python = requires_python if requires_python else None - - super(Link, self).__init__( - key=(self.url), - defining_class=Link - ) - - def __str__(self): - if self.requires_python: - rp = ' (requires-python:%s)' % self.requires_python - else: - rp = '' - if self.comes_from: - return '%s (from %s)%s' % (redact_password_from_url(self.url), - self.comes_from, rp) - else: - return redact_password_from_url(str(self.url)) - - def __repr__(self): - return '' % self - - @property - def filename(self): - # type: () -> str - _, netloc, path, _, _ = urllib_parse.urlsplit(self.url) - name = posixpath.basename(path.rstrip('/')) or netloc - name = urllib_parse.unquote(name) - assert name, ('URL %r produced no filename' % self.url) - return name - - @property - def scheme(self): - # type: () -> str - return urllib_parse.urlsplit(self.url)[0] - - @property - def netloc(self): - # type: () -> str - return urllib_parse.urlsplit(self.url)[1] - - @property - def path(self): - # type: () -> str - return urllib_parse.unquote(urllib_parse.urlsplit(self.url)[2]) - - def splitext(self): - # type: () -> Tuple[str, str] - return splitext(posixpath.basename(self.path.rstrip('/'))) - - @property - def ext(self): - # type: () -> str - return self.splitext()[1] - - @property - def url_without_fragment(self): - # type: () -> str - scheme, netloc, path, query, fragment = urllib_parse.urlsplit(self.url) - return urllib_parse.urlunsplit((scheme, netloc, path, query, None)) - - _egg_fragment_re = re.compile(r'[#&]egg=([^&]*)') - - @property - def egg_fragment(self): - # type: () -> Optional[str] - match = self._egg_fragment_re.search(self.url) - if not match: - return None - return match.group(1) - - _subdirectory_fragment_re = re.compile(r'[#&]subdirectory=([^&]*)') - - @property - def subdirectory_fragment(self): - # type: () -> Optional[str] - match = self._subdirectory_fragment_re.search(self.url) - if not match: - return None - return match.group(1) - - _hash_re = re.compile( - r'(sha1|sha224|sha384|sha256|sha512|md5)=([a-f0-9]+)' - ) - - @property - def hash(self): - # type: () -> Optional[str] - match = self._hash_re.search(self.url) - if match: - return match.group(2) - return None - - @property - def hash_name(self): - # type: () -> Optional[str] - match = self._hash_re.search(self.url) - if match: - return match.group(1) - return None - - @property - def show_url(self): - # type: () -> Optional[str] - return posixpath.basename(self.url.split('#', 1)[0].split('?', 1)[0]) - - @property - def is_wheel(self): - # type: () -> bool - return self.ext == WHEEL_EXTENSION - - @property - def is_artifact(self): - # type: () -> bool - """ - Determines if this points to an actual artifact (e.g. a tarball) or if - it points to an "abstract" thing like a path or a VCS location. - """ - from pip._internal.vcs import vcs - - if self.scheme in vcs.all_schemes: - return False - - return True diff --git a/venv/lib/python2.7/site-packages/pip/_internal/models/link.pyc b/venv/lib/python2.7/site-packages/pip/_internal/models/link.pyc deleted file mode 100644 index 7b3b25f33f1d6c4b91c79b196ebc2cc1651681e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7361 zcmd5>TYD478J?AF`GB#_v4K*uNopb}wmCOR32C7&@B|chZPKDZH*4+4TD%9bGr~BJ zxoAl*d()fV_UT=JM}Ja(K>NPmSdvZY>7um-J3EJ+neX_{H=nD2Jv@2g*V9j1YUfwQ z`^R|9Ur@yO@2OO&=AiDWrYHRsl~z<%Rm~CQ@w=)@M^#o+&6;bEsB}zawD-6xcuQf*K+slHX}wNj6pCrJBB{Sf#_{)S(p?xAW&QFNoyXxHR$ zH?p137GbYU>*U|gp!mhTrKJbq(l1w+8Y}m|XxMkqSL!%w*{~ZKvssjJ*e;8Vv+Otq zO*c)feresh$IwUx$IFkyJNK6Ed>#gm8jbsnyKZx? z^+nevMINO>?P{-^YN=5U^Brj(>o-qH^LW2`S_Lchla$zJC<5Irwb8jXe&ma>#C{6-`cyc&mZR1NX zS@r8+XU_bx%=y~Sw2k7(Mt(cdDfTg4-AYi82iuVSB=?t>mi?>Ot}pnjoy7QAwB@hq z;n)7!7BtO;=KEyLJF@ny6Iqb8*0Y)`Qkdl28H<(nIqZ#>U0-6*f!XnkZ}ejI;OUczs^ySTd8O}g`9Drq`zFF#xl zm)Ru`$gsKu?k#3TtW&c{n_1{?1w>QvPEw<$XS|upgg4=xs2oMvq9`auQZMfI1Qq%P z5c?EQ0argsPpi>qP+=GRa7jGJc~O<#==$M}?W#JtVk;B}`(zN~E3txqai@kkfzq${ z<-21YpUj!_76ZyqlXJ$e3uvHs&WK-%Fr8SbK9RC$AKp+W8v)nF&Y-@#k3t8Y0CGZ5 z6^55k6@C=tJzJ@vobjeBBKf}bMe;nBoWM`62r~^sh~Paw8&PJRfIYzPllb~K*nr?ot7zbOfRCB)qQtS{&y{|+EaF}ZD3TX|wp8a) zrt4(FPN4t_q{$jW6GS%R)98?h#Mu{>&@D{zlCh4AuOTww5;##{Xhh zISuczTEfd48io!}?O1Ta*`k%;3~IsmSP&Z}65Dq>rv6N;qceS%HR6V<{-bC98y+c- z1IuIZeNguR&zs!QRRnja6Q@CzyYQTPgm3j#N$CiBJ5|1i<^j`ZFbA4`j^|BY=~=?- zyQqLmAjE)CK+gblhTH~359hU<9Gqpr*|JCAqjn%nI3RUj;&Cj$NrW*?o93`ty`| zm(pB8ZQwk8kPxHd@oyP!hS*|AMClGpqocCbaS<{FEOJ~gi(YqE2*)L|$hJEBDNY6l zyE#}#+c0cU)e~OL8}SS?8x*DKt;M)~wQNyt{SRe&3fqOd_u4JoU=gE3u?7r0hY}4g zvx#TFA`1pTZzcUX2lhzy3aK=m=<+s-D_5@Zb@d~8UAcaPt?QSsY-jQH^N@8k-@Y{e z@zWptmo{A1Y01C{2mbDELhElNa?ptlld7;2nGRyzUE-x=1HlG<>abzI#Y^udrLXYb zCC$UbE8c(P+W$f<1J@3&lk1_i9Yk?3XcxsXp#JS!WkP-^HGw(W@-M2IfE3|Pc;%QS(0nxCrkz+5hh7M!yI6g`$%{9qSQy$DQTnb z*Y(2sf*<+FL#;(=dY)Olq&-+Jv3sY#AFbhLiHYxXZKUkdWJ6;*uZo-+`Cr~y@o|BS zc*`6n#Ux=bx{zq)EU1^To#6efH0KUE)0!obE6ir;T z!ceeW5@i8T*x+=3F7gIQ_SvoALw1wlVfZIeb0F3~&+lnih;XM5SxC7uVQCot)he~h%;||k6V;iCnNj|m7(rQ^ zsmzS?K`N_?+Biq#4*>3#bQe?Y85Ck|FLWLkfZs5c9T{B diff --git a/venv/lib/python2.7/site-packages/pip/_internal/operations/__init__.py b/venv/lib/python2.7/site-packages/pip/_internal/operations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/operations/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_internal/operations/__init__.pyc deleted file mode 100644 index 6fd3d66b30165daef7f85cee5eeb7238f9f5f87b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 203 zcmZ9GK?=e!5Je-p5JAsTggOf zX|@Q}QZ_!J Tuple[PackageSet, bool] - """Converts a list of distributions into a PackageSet. - """ - # Default to using all packages installed on the system - if kwargs == {}: - kwargs = {"local_only": False, "skip": ()} - - package_set = {} - problems = False - for dist in get_installed_distributions(**kwargs): - name = canonicalize_name(dist.project_name) - try: - package_set[name] = PackageDetails(dist.version, dist.requires()) - except RequirementParseError as e: - # Don't crash on broken metadata - logging.warning("Error parsing requirements for %s: %s", name, e) - problems = True - return package_set, problems - - -def check_package_set(package_set, should_ignore=None): - # type: (PackageSet, Optional[Callable[[str], bool]]) -> CheckResult - """Check if a package set is consistent - - If should_ignore is passed, it should be a callable that takes a - package name and returns a boolean. - """ - if should_ignore is None: - def should_ignore(name): - return False - - missing = dict() - conflicting = dict() - - for package_name in package_set: - # Info about dependencies of package_name - missing_deps = set() # type: Set[Missing] - conflicting_deps = set() # type: Set[Conflicting] - - if should_ignore(package_name): - continue - - for req in package_set[package_name].requires: - name = canonicalize_name(req.project_name) # type: str - - # Check if it's missing - if name not in package_set: - missed = True - if req.marker is not None: - missed = req.marker.evaluate() - if missed: - missing_deps.add((name, req)) - continue - - # Check if there's a conflict - version = package_set[name].version # type: str - if not req.specifier.contains(version, prereleases=True): - conflicting_deps.add((name, version, req)) - - if missing_deps: - missing[package_name] = sorted(missing_deps, key=str) - if conflicting_deps: - conflicting[package_name] = sorted(conflicting_deps, key=str) - - return missing, conflicting - - -def check_install_conflicts(to_install): - # type: (List[InstallRequirement]) -> Tuple[PackageSet, CheckResult] - """For checking if the dependency graph would be consistent after \ - installing given requirements - """ - # Start from the current state - package_set, _ = create_package_set_from_installed() - # Install packages - would_be_installed = _simulate_installation_of(to_install, package_set) - - # Only warn about directly-dependent packages; create a whitelist of them - whitelist = _create_whitelist(would_be_installed, package_set) - - return ( - package_set, - check_package_set( - package_set, should_ignore=lambda name: name not in whitelist - ) - ) - - -def _simulate_installation_of(to_install, package_set): - # type: (List[InstallRequirement], PackageSet) -> Set[str] - """Computes the version of packages after installing to_install. - """ - - # Keep track of packages that were installed - installed = set() - - # Modify it as installing requirement_set would (assuming no errors) - for inst_req in to_install: - dist = make_abstract_dist(inst_req).dist() - name = canonicalize_name(dist.key) - package_set[name] = PackageDetails(dist.version, dist.requires()) - - installed.add(name) - - return installed - - -def _create_whitelist(would_be_installed, package_set): - # type: (Set[str], PackageSet) -> Set[str] - packages_affected = set(would_be_installed) - - for package_name in package_set: - if package_name in packages_affected: - continue - - for req in package_set[package_name].requires: - if canonicalize_name(req.name) in packages_affected: - packages_affected.add(package_name) - break - - return packages_affected diff --git a/venv/lib/python2.7/site-packages/pip/_internal/operations/check.pyc b/venv/lib/python2.7/site-packages/pip/_internal/operations/check.pyc deleted file mode 100644 index ecd126e0a23bc05e70c5d141f7e1a704865944d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4985 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 Iterator[str] - find_links = find_links or [] - skip_match = None - - if skip_regex: - skip_match = re.compile(skip_regex).search - - for link in find_links: - yield '-f %s' % link - installations = {} # type: Dict[str, FrozenRequirement] - for dist in get_installed_distributions(local_only=local_only, - skip=(), - user_only=user_only): - try: - req = FrozenRequirement.from_dist(dist) - except RequirementParseError: - logger.warning( - "Could not parse requirement: %s", - dist.project_name - ) - continue - if exclude_editable and req.editable: - continue - installations[req.name] = req - - if requirement: - # the options that don't get turned into an InstallRequirement - # should only be emitted once, even if the same option is in multiple - # requirements files, so we need to keep track of what has been emitted - # so that we don't emit it again if it's seen again - emitted_options = set() # type: Set[str] - # keep track of which files a requirement is in so that we can - # give an accurate warning if a requirement appears multiple times. - req_files = collections.defaultdict(list) # type: Dict[str, List[str]] - for req_file_path in requirement: - with open(req_file_path) as req_file: - for line in req_file: - if (not line.strip() or - line.strip().startswith('#') or - (skip_match and skip_match(line)) or - line.startswith(( - '-r', '--requirement', - '-Z', '--always-unzip', - '-f', '--find-links', - '-i', '--index-url', - '--pre', - '--trusted-host', - '--process-dependency-links', - '--extra-index-url'))): - line = line.rstrip() - if line not in emitted_options: - emitted_options.add(line) - yield line - continue - - if line.startswith('-e') or line.startswith('--editable'): - if line.startswith('-e'): - line = line[2:].strip() - else: - line = line[len('--editable'):].strip().lstrip('=') - line_req = install_req_from_editable( - line, - isolated=isolated, - wheel_cache=wheel_cache, - ) - else: - line_req = install_req_from_line( - COMMENT_RE.sub('', line).strip(), - isolated=isolated, - wheel_cache=wheel_cache, - ) - - if not line_req.name: - logger.info( - "Skipping line in requirement file [%s] because " - "it's not clear what it would install: %s", - req_file_path, line.strip(), - ) - logger.info( - " (add #egg=PackageName to the URL to avoid" - " this warning)" - ) - elif line_req.name not in installations: - # either it's not installed, or it is installed - # but has been processed already - if not req_files[line_req.name]: - logger.warning( - "Requirement file [%s] contains %s, but " - "package %r is not installed", - req_file_path, - COMMENT_RE.sub('', line).strip(), line_req.name - ) - else: - req_files[line_req.name].append(req_file_path) - else: - yield str(installations[line_req.name]).rstrip() - del installations[line_req.name] - req_files[line_req.name].append(req_file_path) - - # Warn about requirements that were included multiple times (in a - # single requirements file or in different requirements files). - for name, files in six.iteritems(req_files): - if len(files) > 1: - logger.warning("Requirement %s included multiple times [%s]", - name, ', '.join(sorted(set(files)))) - - yield( - '## The following requirements were added by ' - 'pip freeze:' - ) - for installation in sorted( - installations.values(), key=lambda x: x.name.lower()): - if canonicalize_name(installation.name) not in skip: - yield str(installation).rstrip() - - -def get_requirement_info(dist): - # type: (Distribution) -> RequirementInfo - """ - Compute and return values (req, editable, comments) for use in - FrozenRequirement.from_dist(). - """ - if not dist_is_editable(dist): - return (None, False, []) - - location = os.path.normcase(os.path.abspath(dist.location)) - - from pip._internal.vcs import vcs, RemoteNotFoundError - vc_type = vcs.get_backend_type(location) - - if not vc_type: - req = dist.as_requirement() - logger.debug( - 'No VCS found for editable requirement {!r} in: {!r}', req, - location, - ) - comments = [ - '# Editable install with no version control ({})'.format(req) - ] - return (location, True, comments) - - try: - req = vc_type.get_src_requirement(location, dist.project_name) - except RemoteNotFoundError: - req = dist.as_requirement() - comments = [ - '# Editable {} install with no remote ({})'.format( - vc_type.__name__, req, - ) - ] - return (location, True, comments) - - except BadCommand: - logger.warning( - 'cannot determine version of editable source in %s ' - '(%s command not found in path)', - location, - vc_type.name, - ) - return (None, True, []) - - except InstallationError as exc: - logger.warning( - "Error when trying to get requirement for VCS system %s, " - "falling back to uneditable format", exc - ) - else: - if req is not None: - return (req, True, []) - - logger.warning( - 'Could not determine repository location of %s', location - ) - comments = ['## !! Could not determine repository location'] - - return (None, False, comments) - - -class FrozenRequirement(object): - def __init__(self, name, req, editable, comments=()): - # type: (str, Union[str, Requirement], bool, Iterable[str]) -> None - self.name = name - self.req = req - self.editable = editable - self.comments = comments - - @classmethod - def from_dist(cls, dist): - # type: (Distribution) -> FrozenRequirement - req, editable, comments = get_requirement_info(dist) - if req is None: - req = dist.as_requirement() - - return cls(dist.project_name, req, editable, comments=comments) - - def __str__(self): - req = self.req - if self.editable: - req = '-e %s' % req - return '\n'.join(list(self.comments) + [str(req)]) + '\n' diff --git a/venv/lib/python2.7/site-packages/pip/_internal/operations/freeze.pyc b/venv/lib/python2.7/site-packages/pip/_internal/operations/freeze.pyc deleted file mode 100644 index 4d2f4ae87f2c2a4b2f1bbfa21ea878aedf8ada4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7528 zcmdT}OLH7Ya?b7s0nQKufB*p!d^Sjt8frNJwNl8ILXsH*DKBjiq8pU3niW0K=&k{J z(2rqP4Ib3Y!KQ9HDEtfT2=8rUWB-6J_F=F4A9hdcn_~|?*pBd*Su?;;-0+oa%uKVo zDl029D=YKMqW6bd^{u~~c^c91uZn-~-6PWf;t<97I+PM+4mBNe_}!({rKT%mXnWN3 zM(qh|PK?^8sCi1-9;K6%O;K~o&Yz(4G-VZPR_yyJN~@Heq2?L;K1t~`Wi@KnD4U_? zjP0GGbe6I?YR*x1mYQd6?`cZsDO;fCf_<-0dXBP1YA#Z?M9n4JTcz|oWf!PiO%WtXUViL%SoyiC~@YF?r2DmAZCc8!|XDD$c5Q?^3Q70Rwt^Sb3a zP3aBF-k|0i_Pr*0+@$7B%5G8f7S{4fT_Saz)SIMkQQM{EWmPA2nLC!-9xXR-Q%bynjNAv<#zQYzC|Eg7f<>x%bGxRMiw?^?SeM{85OYt13x2f$=e3pA&5PjABF;Cd6 zFJLDV-qkvGlFTd~;kGW)o>8qN>lUTiup=HubaH54&f+Bs^CC~8FioDTRvu=`4lQCR zP|tcvsWO$D$6=|}gR(5jx{DFRp7TiEv4-6JMGjV02G(e6SE+P8jCPgP zXc~R@$HX;f&@pEGh*v(3AMbK>4;%PzSiSF1w?aEa12_bp73xn=*&yRk$K^IWtmAP% z-0tu^)8BtOOM@yO^L~|%e(wzCsXtGhdFC;#zjlsaItvs}GAr(^Q2B_T7#;Rt4hY`h*YbOrbxy<( zcKsRJg9Zx@8lA=AEGB{p7x>HCSPl!q@Rz~?48a5pEAIGc`5PXM7wMW66C&r=c)nR0 zP8be!&QrX^3_xKnFhz`QM5INVRdELkl)pu0naoA%T%vecM01Dgze?O+pw2XDEl zruZTokwp`8z3@o35CfNZRaVT-z&5e|zjphxWP6tNuY?J<`!X~6qXJmc7Zc$0-(yod zSB87X3z)0o1R~fn7VU`HzjW9$r1PVbHD8*zwFRgDo1Z@WPue=^M1#n&YYJI?*5YcyCQ^9J>o*uY@WKP?vf&SU*#4@ZhU`_99ch2N~-#ChJ( z93dKQ|E89xnihz~ts+m4B(&(gq$`o9r&TH4`Woohi(VT0d13r+h{)_CvW`Oa2h54H zzzxlzx>4#H|I-*Fu>(y#BLiW25FY79FMpnN?MPd5NNP0NNgg*4jrX+ePc%oSMg!gI zu+b}1D|@3`sv$2^_OwxPW4F*oUlihQSwu?fMy$FD^YZ9u$dZ#rqoEE>8IExjnU&@^ ziNRr>NF?d7QXfflO_16`tRs=~fWv7k;&^I6L3#_1P1voQPKE+=>f1Z!5M)$Wn_ z(}!u8ZO7rq{|FKEu|#z~1=jQbe;pzTED}C8id-2!Jf%XW26`y6E}Y*?vS#q~XgA=K zCIIf!vUslYG53_XBY2I$RNyfoPfUxQ9Uvg)H}q`7mcl{rsK^M26swL-Z?M8MdAbH* z;t&$S^FYcwA@8wjhj7`LaTL2t%6N+#*s)yvhQVA{0wnghH2NShyCO_!N0>W&R#r(d zN92^DfSUme8!#}la`d)^eUi5eAq~46oa~q>19nZ(K7r@pmuVsI6mTUm9Y7+Y4>$M2 zw5N2yHm);96Me?clgP}0v?YNwxB!}fBcoLYVG6K#M;!)Nc;G4zFv3-ba+Hq|ZooMD zWJ(sAXm@C;d=J^{7)D$FmLc9XQ3>KmNuaXCK<-u{*j9^%7;AAn)WT%+*6N0^FWYO> zGg{2TTaKy>=k3;V2D3ca4~EB31bO|(oA<~bcFwl?pYWjRX=l=%bQay3Q*$PrS^R2_ z=PbyZ=TzM(={xIAo~n4W=;dF{S#;(>iO4thsW{X4)ST1ccolRD?lo|l#An*`oD2B3 z;#KhU+&QdR^=3U@(Q`fLx_92a;8dOK6PLla;@t91dy~#(tRnH1ZO?XHzXz$mheIN_ zA;bb(=w*tlgi{UdkHT^jTiltT&M9_nZUCYq4o?Y=0d@rR!57uLRN@1dvMLRLZ-DfH z#!(f3g62h*^W!~P05%90!bfPw

W;lf-8mp;YxuAN6VmIV4j$_Ae^DstDGmyIhozSWQPS?WHisq zU>@)l%LbdwjchVu&I|qLjx)er#BjzGp%CG+B)^E71VFkBtV zSt60O`cT(8$1%N!N7ct4D&a1QZ6DPzvZ?8nxo;zbU&k@ID{6fk`M2~1 zeB{F7mH4}Q9DD1xSA_({8p4c#Ar5%^kv3ct1}ZCz+9=GYMK6z~_}1^Bf1~ifT;Iex z=#|w*Qj8~j|C^O^0O;_6H1rzg-S8g_ffxEEr}`XkfkOO!BxHnbXpx(;Nd5XZgWLM{ z%X7YAb}vuEEdnI8)Q>?Og*ii-SRuYI4L$VBCnXuN#eJyj; zRVcZ^O><-)l@kHuOc5ql+r1shdDbc-(37&K#0Qy`E~A&GvJoVSv;-8iS^?`2+~Egf zf`9{Dog-cFkRLze$BBfj+I}R01%HLMuo@j7No>fHuRp__gJ`V%n9*SKcJXuc>re5Z zNn{9j#a(h{kpqx>@R{=F-5RpMGIGZ>dgr|wvXRXURg7>>@|-gs&qUsED{jE2EMj*2 z$3F4NJuJY+RJa~QjF-FFZ*i}PD@3#%Tb{~2t;=m((gvG#-hzk?&p&1(8HUYhqjn1o z+yfD{5M2@c(U9vTZpaEFa4&l)+sK;}tnverP@Nfzb7+;e?MDBA0tBxg^tZ4}iD|Wd z2VpcjA-NUg;ffQnRagne4q_elPR_rQEWgI38qyk`$eMCDzIU3+yF7}EH_n}|TyF_I zZs6FOvK`1(FFa>c;`fF%mDmt@+@AU1Z@I;%#@di$e3WW?IR3;;7`z4H{vAJSI&Tq< zJ?jc|Ve_$KVmdwmobF*33kq-_c1^Az9a=&cu2uj}U^pCTrjvV1#2agCB;NDD8lX78 zS!Z($uS*oiSO@RbI&YGM2kU`8q0X7TQmdM2c-{AzexR;fcJhqQ4RSau0zV9FFT(!3) zn7E1yf1DV0LEMY}fM{ys)ISD}B57!#zx$f~S)!w$0tU7$f0dObL#}2cv1ueB58t`^3Tph|JRb1> z0tH-527J{P@PB^<0v9=BNz#5x~Y`N2_6ge|uDnn0Z7Ps3jYSA1xX*vA}H^aps%xm?-dcruQo!|1ZE1+jjr} diff --git a/venv/lib/python2.7/site-packages/pip/_internal/operations/prepare.py b/venv/lib/python2.7/site-packages/pip/_internal/operations/prepare.py deleted file mode 100644 index 077a985..0000000 --- a/venv/lib/python2.7/site-packages/pip/_internal/operations/prepare.py +++ /dev/null @@ -1,426 +0,0 @@ -"""Prepares a distribution for installation -""" - -import logging -import os - -from pip._vendor import pkg_resources, requests - -from pip._internal.build_env import BuildEnvironment -from pip._internal.download import ( - is_dir_url, is_file_url, is_vcs_url, unpack_url, url_to_path, -) -from pip._internal.exceptions import ( - DirectoryUrlHashUnsupported, HashUnpinned, InstallationError, - PreviousBuildDirError, VcsHashUnsupported, -) -from pip._internal.utils.compat import expanduser -from pip._internal.utils.hashes import MissingHashes -from pip._internal.utils.logging import indent_log -from pip._internal.utils.misc import display_path, normalize_path -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import Any, Optional - from pip._internal.req.req_install import InstallRequirement - from pip._internal.index import PackageFinder - from pip._internal.download import PipSession - from pip._internal.req.req_tracker import RequirementTracker - -logger = logging.getLogger(__name__) - - -def make_abstract_dist(req): - # type: (InstallRequirement) -> DistAbstraction - """Factory to make an abstract dist object. - - Preconditions: Either an editable req with a source_dir, or satisfied_by or - a wheel link, or a non-editable req with a source_dir. - - :return: A concrete DistAbstraction. - """ - if req.editable: - return IsSDist(req) - elif req.link and req.link.is_wheel: - return IsWheel(req) - else: - return IsSDist(req) - - -class DistAbstraction(object): - """Abstracts out the wheel vs non-wheel Resolver.resolve() logic. - - The requirements for anything installable are as follows: - - we must be able to determine the requirement name - (or we can't correctly handle the non-upgrade case). - - we must be able to generate a list of run-time dependencies - without installing any additional packages (or we would - have to either burn time by doing temporary isolated installs - or alternatively violate pips 'don't start installing unless - all requirements are available' rule - neither of which are - desirable). - - for packages with setup requirements, we must also be able - to determine their requirements without installing additional - packages (for the same reason as run-time dependencies) - - we must be able to create a Distribution object exposing the - above metadata. - """ - - def __init__(self, req): - # type: (InstallRequirement) -> None - self.req = req # type: InstallRequirement - - def dist(self): - # type: () -> Any - """Return a setuptools Dist object.""" - raise NotImplementedError - - def prep_for_dist(self, finder, build_isolation): - # type: (PackageFinder, bool) -> Any - """Ensure that we can get a Dist for this requirement.""" - raise NotImplementedError - - -class IsWheel(DistAbstraction): - - def dist(self): - # type: () -> pkg_resources.Distribution - return list(pkg_resources.find_distributions( - self.req.source_dir))[0] - - def prep_for_dist(self, finder, build_isolation): - # type: (PackageFinder, bool) -> Any - # FIXME:https://github.com/pypa/pip/issues/1112 - pass - - -class IsSDist(DistAbstraction): - - def dist(self): - return self.req.get_dist() - - def _raise_conflicts(self, conflicting_with, conflicting_reqs): - conflict_messages = [ - '%s is incompatible with %s' % (installed, wanted) - for installed, wanted in sorted(conflicting_reqs) - ] - raise InstallationError( - "Some build dependencies for %s conflict with %s: %s." % ( - self.req, conflicting_with, ', '.join(conflict_messages)) - ) - - def install_backend_dependencies(self, finder): - # type: (PackageFinder) -> None - """ - Install any extra build dependencies that the backend requests. - - :param finder: a PackageFinder object. - """ - req = self.req - with req.build_env: - # We need to have the env active when calling the hook. - req.spin_message = "Getting requirements to build wheel" - reqs = req.pep517_backend.get_requires_for_build_wheel() - conflicting, missing = req.build_env.check_requirements(reqs) - if conflicting: - self._raise_conflicts("the backend dependencies", conflicting) - req.build_env.install_requirements( - finder, missing, 'normal', - "Installing backend dependencies" - ) - - def prep_for_dist(self, finder, build_isolation): - # type: (PackageFinder, bool) -> None - # Prepare for building. We need to: - # 1. Load pyproject.toml (if it exists) - # 2. Set up the build environment - - self.req.load_pyproject_toml() - should_isolate = self.req.use_pep517 and build_isolation - - if should_isolate: - # Isolate in a BuildEnvironment and install the build-time - # requirements. - self.req.build_env = BuildEnvironment() - self.req.build_env.install_requirements( - finder, self.req.pyproject_requires, 'overlay', - "Installing build dependencies" - ) - conflicting, missing = self.req.build_env.check_requirements( - self.req.requirements_to_check - ) - if conflicting: - self._raise_conflicts("PEP 517/518 supported requirements", - conflicting) - if missing: - logger.warning( - "Missing build requirements in pyproject.toml for %s.", - self.req, - ) - logger.warning( - "The project does not specify a build backend, and " - "pip cannot fall back to setuptools without %s.", - " and ".join(map(repr, sorted(missing))) - ) - - # Install any extra build dependencies that the backend requests. - # This must be done in a second pass, as the pyproject.toml - # dependencies must be installed before we can call the backend. - self.install_backend_dependencies(finder=finder) - - self.req.prepare_metadata() - self.req.assert_source_matches_version() - - -class Installed(DistAbstraction): - - def dist(self): - # type: () -> pkg_resources.Distribution - return self.req.satisfied_by - - def prep_for_dist(self, finder, build_isolation): - # type: (PackageFinder, bool) -> Any - pass - - -class RequirementPreparer(object): - """Prepares a Requirement - """ - - def __init__( - self, - build_dir, # type: str - download_dir, # type: Optional[str] - src_dir, # type: str - wheel_download_dir, # type: Optional[str] - progress_bar, # type: str - build_isolation, # type: bool - req_tracker # type: RequirementTracker - ): - # type: (...) -> None - super(RequirementPreparer, self).__init__() - - self.src_dir = src_dir - self.build_dir = build_dir - self.req_tracker = req_tracker - - # Where still packed archives should be written to. If None, they are - # not saved, and are deleted immediately after unpacking. - self.download_dir = download_dir - - # Where still-packed .whl files should be written to. If None, they are - # written to the download_dir parameter. Separate to download_dir to - # permit only keeping wheel archives for pip wheel. - if wheel_download_dir: - wheel_download_dir = normalize_path(wheel_download_dir) - self.wheel_download_dir = wheel_download_dir - - # NOTE - # download_dir and wheel_download_dir overlap semantically and may - # be combined if we're willing to have non-wheel archives present in - # the wheelhouse output by 'pip wheel'. - - self.progress_bar = progress_bar - - # Is build isolation allowed? - self.build_isolation = build_isolation - - @property - def _download_should_save(self): - # type: () -> bool - # TODO: Modify to reduce indentation needed - if self.download_dir: - self.download_dir = expanduser(self.download_dir) - if os.path.exists(self.download_dir): - return True - else: - logger.critical('Could not find download directory') - raise InstallationError( - "Could not find or access download directory '%s'" - % display_path(self.download_dir)) - return False - - def prepare_linked_requirement( - self, - req, # type: InstallRequirement - session, # type: PipSession - finder, # type: PackageFinder - upgrade_allowed, # type: bool - require_hashes # type: bool - ): - # type: (...) -> DistAbstraction - """Prepare a requirement that would be obtained from req.link - """ - # TODO: Breakup into smaller functions - if req.link and req.link.scheme == 'file': - path = url_to_path(req.link.url) - logger.info('Processing %s', display_path(path)) - else: - logger.info('Collecting %s', req) - - with indent_log(): - # @@ if filesystem packages are not marked - # editable in a req, a non deterministic error - # occurs when the script attempts to unpack the - # build directory - req.ensure_has_source_dir(self.build_dir) - # If a checkout exists, it's unwise to keep going. version - # inconsistencies are logged later, but do not fail the - # installation. - # FIXME: this won't upgrade when there's an existing - # package unpacked in `req.source_dir` - # package unpacked in `req.source_dir` - if os.path.exists(os.path.join(req.source_dir, 'setup.py')): - raise PreviousBuildDirError( - "pip can't proceed with requirements '%s' due to a" - " pre-existing build directory (%s). This is " - "likely due to a previous installation that failed" - ". pip is being responsible and not assuming it " - "can delete this. Please delete it and try again." - % (req, req.source_dir) - ) - req.populate_link(finder, upgrade_allowed, require_hashes) - - # We can't hit this spot and have populate_link return None. - # req.satisfied_by is None here (because we're - # guarded) and upgrade has no impact except when satisfied_by - # is not None. - # Then inside find_requirement existing_applicable -> False - # If no new versions are found, DistributionNotFound is raised, - # otherwise a result is guaranteed. - assert req.link - link = req.link - - # Now that we have the real link, we can tell what kind of - # requirements we have and raise some more informative errors - # than otherwise. (For example, we can raise VcsHashUnsupported - # for a VCS URL rather than HashMissing.) - if require_hashes: - # We could check these first 2 conditions inside - # unpack_url and save repetition of conditions, but then - # we would report less-useful error messages for - # unhashable requirements, complaining that there's no - # hash provided. - if is_vcs_url(link): - raise VcsHashUnsupported() - elif is_file_url(link) and is_dir_url(link): - raise DirectoryUrlHashUnsupported() - if not req.original_link and not req.is_pinned: - # Unpinned packages are asking for trouble when a new - # version is uploaded. This isn't a security check, but - # it saves users a surprising hash mismatch in the - # future. - # - # file:/// URLs aren't pinnable, so don't complain - # about them not being pinned. - raise HashUnpinned() - - hashes = req.hashes(trust_internet=not require_hashes) - if require_hashes and not hashes: - # Known-good hashes are missing for this requirement, so - # shim it with a facade object that will provoke hash - # computation and then raise a HashMissing exception - # showing the user what the hash should be. - hashes = MissingHashes() - - try: - download_dir = self.download_dir - # We always delete unpacked sdists after pip ran. - autodelete_unpacked = True - if req.link.is_wheel and self.wheel_download_dir: - # when doing 'pip wheel` we download wheels to a - # dedicated dir. - download_dir = self.wheel_download_dir - if req.link.is_wheel: - if download_dir: - # When downloading, we only unpack wheels to get - # metadata. - autodelete_unpacked = True - else: - # When installing a wheel, we use the unpacked - # wheel. - autodelete_unpacked = False - unpack_url( - req.link, req.source_dir, - download_dir, autodelete_unpacked, - session=session, hashes=hashes, - progress_bar=self.progress_bar - ) - except requests.HTTPError as exc: - logger.critical( - 'Could not install requirement %s because of error %s', - req, - exc, - ) - raise InstallationError( - 'Could not install requirement %s because of HTTP ' - 'error %s for URL %s' % - (req, exc, req.link) - ) - abstract_dist = make_abstract_dist(req) - with self.req_tracker.track(req): - abstract_dist.prep_for_dist(finder, self.build_isolation) - if self._download_should_save: - # Make a .zip of the source_dir we already created. - if not req.link.is_artifact: - req.archive(self.download_dir) - return abstract_dist - - def prepare_editable_requirement( - self, - req, # type: InstallRequirement - require_hashes, # type: bool - use_user_site, # type: bool - finder # type: PackageFinder - ): - # type: (...) -> DistAbstraction - """Prepare an editable requirement - """ - assert req.editable, "cannot prepare a non-editable req as editable" - - logger.info('Obtaining %s', req) - - with indent_log(): - if require_hashes: - raise InstallationError( - 'The editable requirement %s cannot be installed when ' - 'requiring hashes, because there is no single file to ' - 'hash.' % req - ) - req.ensure_has_source_dir(self.src_dir) - req.update_editable(not self._download_should_save) - - abstract_dist = make_abstract_dist(req) - with self.req_tracker.track(req): - abstract_dist.prep_for_dist(finder, self.build_isolation) - - if self._download_should_save: - req.archive(self.download_dir) - req.check_if_exists(use_user_site) - - return abstract_dist - - def prepare_installed_requirement(self, req, require_hashes, skip_reason): - # type: (InstallRequirement, bool, Optional[str]) -> DistAbstraction - """Prepare an already-installed requirement - """ - assert req.satisfied_by, "req should have been satisfied but isn't" - assert skip_reason is not None, ( - "did not get skip reason skipped but req.satisfied_by " - "is set to %r" % (req.satisfied_by,) - ) - logger.info( - 'Requirement %s: %s (%s)', - skip_reason, req, req.satisfied_by.version - ) - with indent_log(): - if require_hashes: - logger.debug( - 'Since it is already installed, we are trusting this ' - 'package without checking its hash. To ensure a ' - 'completely repeatable environment, install into an ' - 'empty virtualenv.' - ) - abstract_dist = Installed(req) - - return abstract_dist diff --git a/venv/lib/python2.7/site-packages/pip/_internal/operations/prepare.pyc b/venv/lib/python2.7/site-packages/pip/_internal/operations/prepare.pyc deleted file mode 100644 index 8ebc28a680fe384c0e090bf0ba4f401f68aafa74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13680 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 Optional[str] - try: - return sysconfig.get_config_var(var) - except IOError as e: # Issue #1074 - warnings.warn("{}".format(e), RuntimeWarning) - return None - - -def get_abbr_impl(): - # type: () -> str - """Return abbreviated implementation name.""" - if hasattr(sys, 'pypy_version_info'): - pyimpl = 'pp' - elif sys.platform.startswith('java'): - pyimpl = 'jy' - elif sys.platform == 'cli': - pyimpl = 'ip' - else: - pyimpl = 'cp' - return pyimpl - - -def get_impl_ver(): - # type: () -> str - """Return implementation version.""" - impl_ver = get_config_var("py_version_nodot") - if not impl_ver or get_abbr_impl() == 'pp': - impl_ver = ''.join(map(str, get_impl_version_info())) - return impl_ver - - -def get_impl_version_info(): - # type: () -> Tuple[int, ...] - """Return sys.version_info-like tuple for use in decrementing the minor - version.""" - if get_abbr_impl() == 'pp': - # as per https://github.com/pypa/pip/issues/2882 - # attrs exist only on pypy - return (sys.version_info[0], - sys.pypy_version_info.major, # type: ignore - sys.pypy_version_info.minor) # type: ignore - else: - return sys.version_info[0], sys.version_info[1] - - -def get_impl_tag(): - # type: () -> str - """ - Returns the Tag for this specific implementation. - """ - return "{}{}".format(get_abbr_impl(), get_impl_ver()) - - -def get_flag(var, fallback, expected=True, warn=True): - # type: (str, Callable[..., bool], Union[bool, int], bool) -> bool - """Use a fallback method for determining SOABI flags if the needed config - var is unset or unavailable.""" - val = get_config_var(var) - if val is None: - if warn: - logger.debug("Config variable '%s' is unset, Python ABI tag may " - "be incorrect", var) - return fallback() - return val == expected - - -def get_abi_tag(): - # type: () -> Optional[str] - """Return the ABI tag based on SOABI (if available) or emulate SOABI - (CPython 2, PyPy).""" - soabi = get_config_var('SOABI') - impl = get_abbr_impl() - if not soabi and impl in {'cp', 'pp'} and hasattr(sys, 'maxunicode'): - d = '' - m = '' - u = '' - if get_flag('Py_DEBUG', - lambda: hasattr(sys, 'gettotalrefcount'), - warn=(impl == 'cp')): - d = 'd' - if get_flag('WITH_PYMALLOC', - lambda: impl == 'cp', - warn=(impl == 'cp')): - m = 'm' - if get_flag('Py_UNICODE_SIZE', - lambda: sys.maxunicode == 0x10ffff, - expected=4, - warn=(impl == 'cp' and - sys.version_info < (3, 3))) \ - and sys.version_info < (3, 3): - u = 'u' - abi = '%s%s%s%s%s' % (impl, get_impl_ver(), d, m, u) - elif soabi and soabi.startswith('cpython-'): - abi = 'cp' + soabi.split('-')[1] - elif soabi: - abi = soabi.replace('.', '_').replace('-', '_') - else: - abi = None - return abi - - -def _is_running_32bit(): - # type: () -> bool - return sys.maxsize == 2147483647 - - -def get_platform(): - # type: () -> str - """Return our platform name 'win32', 'linux_x86_64'""" - if sys.platform == 'darwin': - # distutils.util.get_platform() returns the release based on the value - # of MACOSX_DEPLOYMENT_TARGET on which Python was built, which may - # be significantly older than the user's current machine. - release, _, machine = platform.mac_ver() - split_ver = release.split('.') - - if machine == "x86_64" and _is_running_32bit(): - machine = "i386" - elif machine == "ppc64" and _is_running_32bit(): - machine = "ppc" - - return 'macosx_{}_{}_{}'.format(split_ver[0], split_ver[1], machine) - - # XXX remove distutils dependency - result = distutils.util.get_platform().replace('.', '_').replace('-', '_') - if result == "linux_x86_64" and _is_running_32bit(): - # 32 bit Python program (running on a 64 bit Linux): pip should only - # install and run 32 bit compiled extensions in that case. - result = "linux_i686" - - return result - - -def is_manylinux1_compatible(): - # type: () -> bool - # Only Linux, and only x86-64 / i686 - if get_platform() not in {"linux_x86_64", "linux_i686"}: - return False - - # Check for presence of _manylinux module - try: - import _manylinux - return bool(_manylinux.manylinux1_compatible) - except (ImportError, AttributeError): - # Fall through to heuristic check below - pass - - # Check glibc version. CentOS 5 uses glibc 2.5. - return pip._internal.utils.glibc.have_compatible_glibc(2, 5) - - -def is_manylinux2010_compatible(): - # type: () -> bool - # Only Linux, and only x86-64 / i686 - if get_platform() not in {"linux_x86_64", "linux_i686"}: - return False - - # Check for presence of _manylinux module - try: - import _manylinux - return bool(_manylinux.manylinux2010_compatible) - except (ImportError, AttributeError): - # Fall through to heuristic check below - pass - - # Check glibc version. CentOS 6 uses glibc 2.12. - return pip._internal.utils.glibc.have_compatible_glibc(2, 12) - - -def get_darwin_arches(major, minor, machine): - # type: (int, int, str) -> List[str] - """Return a list of supported arches (including group arches) for - the given major, minor and machine architecture of an macOS machine. - """ - arches = [] - - def _supports_arch(major, minor, arch): - # type: (int, int, str) -> bool - # Looking at the application support for macOS versions in the chart - # provided by https://en.wikipedia.org/wiki/OS_X#Versions it appears - # our timeline looks roughly like: - # - # 10.0 - Introduces ppc support. - # 10.4 - Introduces ppc64, i386, and x86_64 support, however the ppc64 - # and x86_64 support is CLI only, and cannot be used for GUI - # applications. - # 10.5 - Extends ppc64 and x86_64 support to cover GUI applications. - # 10.6 - Drops support for ppc64 - # 10.7 - Drops support for ppc - # - # Given that we do not know if we're installing a CLI or a GUI - # application, we must be conservative and assume it might be a GUI - # application and behave as if ppc64 and x86_64 support did not occur - # until 10.5. - # - # Note: The above information is taken from the "Application support" - # column in the chart not the "Processor support" since I believe - # that we care about what instruction sets an application can use - # not which processors the OS supports. - if arch == 'ppc': - return (major, minor) <= (10, 5) - if arch == 'ppc64': - return (major, minor) == (10, 5) - if arch == 'i386': - return (major, minor) >= (10, 4) - if arch == 'x86_64': - return (major, minor) >= (10, 5) - if arch in groups: - for garch in groups[arch]: - if _supports_arch(major, minor, garch): - return True - return False - - groups = OrderedDict([ - ("fat", ("i386", "ppc")), - ("intel", ("x86_64", "i386")), - ("fat64", ("x86_64", "ppc64")), - ("fat32", ("x86_64", "i386", "ppc")), - ]) # type: Dict[str, Tuple[str, ...]] - - if _supports_arch(major, minor, machine): - arches.append(machine) - - for garch in groups: - if machine in groups[garch] and _supports_arch(major, minor, garch): - arches.append(garch) - - arches.append('universal') - - return arches - - -def get_all_minor_versions_as_strings(version_info): - # type: (Tuple[int, ...]) -> List[str] - versions = [] - major = version_info[:-1] - # Support all previous minor Python versions. - for minor in range(version_info[-1], -1, -1): - versions.append(''.join(map(str, major + (minor,)))) - return versions - - -def get_supported( - versions=None, # type: Optional[List[str]] - noarch=False, # type: bool - platform=None, # type: Optional[str] - impl=None, # type: Optional[str] - abi=None # type: Optional[str] -): - # type: (...) -> List[Pep425Tag] - """Return a list of supported tags for each version specified in - `versions`. - - :param versions: a list of string versions, of the form ["33", "32"], - or None. The first version will be assumed to support our ABI. - :param platform: specify the exact platform you want valid - tags for, or None. If None, use the local system platform. - :param impl: specify the exact implementation you want valid - tags for, or None. If None, use the local interpreter impl. - :param abi: specify the exact abi you want valid - tags for, or None. If None, use the local interpreter abi. - """ - supported = [] - - # Versions must be given with respect to the preference - if versions is None: - version_info = get_impl_version_info() - versions = get_all_minor_versions_as_strings(version_info) - - impl = impl or get_abbr_impl() - - abis = [] # type: List[str] - - abi = abi or get_abi_tag() - if abi: - abis[0:0] = [abi] - - abi3s = set() - for suffix in get_extension_suffixes(): - if suffix.startswith('.abi'): - abi3s.add(suffix.split('.', 2)[1]) - - abis.extend(sorted(list(abi3s))) - - abis.append('none') - - if not noarch: - arch = platform or get_platform() - arch_prefix, arch_sep, arch_suffix = arch.partition('_') - if arch.startswith('macosx'): - # support macosx-10.6-intel on macosx-10.9-x86_64 - match = _osx_arch_pat.match(arch) - if match: - name, major, minor, actual_arch = match.groups() - tpl = '{}_{}_%i_%s'.format(name, major) - arches = [] - for m in reversed(range(int(minor) + 1)): - for a in get_darwin_arches(int(major), m, actual_arch): - arches.append(tpl % (m, a)) - else: - # arch pattern didn't match (?!) - arches = [arch] - elif arch_prefix == 'manylinux2010': - # manylinux1 wheels run on most manylinux2010 systems with the - # exception of wheels depending on ncurses. PEP 571 states - # manylinux1 wheels should be considered manylinux2010 wheels: - # https://www.python.org/dev/peps/pep-0571/#backwards-compatibility-with-manylinux1-wheels - arches = [arch, 'manylinux1' + arch_sep + arch_suffix] - elif platform is None: - arches = [] - if is_manylinux2010_compatible(): - arches.append('manylinux2010' + arch_sep + arch_suffix) - if is_manylinux1_compatible(): - arches.append('manylinux1' + arch_sep + arch_suffix) - arches.append(arch) - else: - arches = [arch] - - # Current version, current API (built specifically for our Python): - for abi in abis: - for arch in arches: - supported.append(('%s%s' % (impl, versions[0]), abi, arch)) - - # abi3 modules compatible with older version of Python - for version in versions[1:]: - # abi3 was introduced in Python 3.2 - if version in {'31', '30'}: - break - for abi in abi3s: # empty set if not Python 3 - for arch in arches: - supported.append(("%s%s" % (impl, version), abi, arch)) - - # Has binaries, does not use the Python API: - for arch in arches: - supported.append(('py%s' % (versions[0][0]), 'none', arch)) - - # No abi / arch, but requires our implementation: - supported.append(('%s%s' % (impl, versions[0]), 'none', 'any')) - # Tagged specifically as being cross-version compatible - # (with just the major version specified) - supported.append(('%s%s' % (impl, versions[0][0]), 'none', 'any')) - - # No abi / arch, generic Python - for i, version in enumerate(versions): - supported.append(('py%s' % (version,), 'none', 'any')) - if i == 0: - supported.append(('py%s' % (version[0]), 'none', 'any')) - - return supported - - -implementation_tag = get_impl_tag() diff --git a/venv/lib/python2.7/site-packages/pip/_internal/pep425tags.pyc b/venv/lib/python2.7/site-packages/pip/_internal/pep425tags.pyc deleted file mode 100644 index 6e97919edf82d61bb8070dd5264c0095464221c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11594 zcmd5?OLH98bv`|V*Wf`shzG%k)S^UjNP-{<&=4&v5-5O?7*ZhAAVXxg| z8FcrM00mSkp(>J6S!83cyz?%p@-AC%U6qBMsx0#pQc0yMyKI>6J9m08r08stA`PG~ z?)#p5-sg1Z|7)oK{9hhfuSn~s2mcorMUr1zBA!SIr6pcYLQ85nDdogsJ1=2gN?kgJ zdbgCivwDw|da`=2lzOvzpOpHtdO=EstllrBeyw*&I3Tq_DGj#I7?RQv9qX2GSZX6u z8Zl!%5{^o3OiE*7`C}6Qr_Sn?@Tk6p}}r8JE- zI!T5$@rOXg5~;zxe$roQb)p8dEUKeQhQ>6X2EW7WPo z_al3$UTe5%un~kox@X^YtI2GDRZ;}WB^^fLZY1@vnfm3R)~LtniWwQe$eq~pW8Yg2 zDyiw5L}%4c%l>ZaM@dkR%1Lu`GuZVLGd_m#&%Rv!vb^-^jip;<=ibW7&6Q7zIJ z#ocBj^wU1nmfSFOH_+%p<93jw+Iy#wVpBKN$@e1Eb({bs6PQ?>y>PBveBd3H=&0}} zIXpaJX%T3-fy&;fq$1mv>g{gXw>T^9k*8#O zk+m;a6uIq6!t(2bBH>O8D3ZOTQja!+YI+1MBE&SykK8!zMc2(cH{uw$KF0#-+QL8bRY?5G5&Sa525| zS+%^%E`7>Dl=?A9aH-)pz&|M&rm^Rc9Zum%`cX(OZ;e{R*0iOngs>4##r-{0fOr55 z)d6J2$EZ*aM4}(Fb2}&7%GtnnJTG3C4!zMD^19_AmfRArNBf~$dRYMt*A)H9S#0n4 zX)}&&cVi>=9|b^wXM=S^zvf3NSiK(Ekz4a;(^1TA>^1hvkAN65YY=VL!2;-QD4Mrj zppWhCJwQL$d1=yYlRW@{N z)C~RV;8t>8&21RUfI?isJM)<5C~xROk<5l(BV`6(fbuHZ31O4`pfzc|VF;pa6iSd= zr~nnjzNOf|lu1oarYTyg&RUgjfu&nB0taI0c#hPX-pt7w#BQxfb(wsQqD2?5^=zl4 zTnvMUzMWEK+hB9MnfP`P*`8mCRn(x=>~zbwYe7_x`)&MWq*SV@l?kXDRt)WI9(58$ z%FB12vsB^^b4b zn<0#u9c(J{Bj5L6IE>*o-0Q|R2+@oZKefs45zIrNUdn9pAK@LHY@P%x*fn?0-k`)(>T&E>;8zhDMuX8ZsT&a1t5x4HyytH;t16TZ-6*v% z*}b&k?}9~O>>N5Bs_q`SuhY2n0SwZeXk9}+AzacmXboCD5R-nZ*C;X4pI%db5p!x# z2%vx4su*$kUO8eg9qrNlYd3m9^1Ai52;6wX~T5nJ9n=CGeLsa z=uHb8v8TCQ{2y7*arU4IPam*hD|q?JzOxrvV!$#0b|~@gz{6e1W2+=BctX z9^G&g$N-qu2uKmK(dPMclmWligp=c&ag~zdQj5>$$nmRt=Vn!1>juto9-}6kE>X?h zZAL+*?)lDXG?j^0_sYvRKEC%!1s(cB&9Jrz5b3LcGr$mJj!bi|s9OLwOY3k~V}G+! zhr6u4v2y||)Swhm=}?2O+Dz!hJ_y~~hUb0=>Ptd+jF{5?dFqGVzj^o5^6HnLUB7+% z&QkmObT^MKVhIsO)>YHq3Op2_9hc)~>iE!s(f(I`Rp&i`P{*TJ1g$`24I)9;dn-4W z?kwLZuiY%&cVXIxarN2{}1mi3Ohg%&R~SBeAJ{LsBU+VM2T;m#g9}fK(wHoL)7$)_c_ffoR45z#-O$R_J!&ZJp z7zin?N5Lw>ewbg4PEa3al%iIp2i9dwTW?wu)^YT`l|?UHPjOmW#BMEZ@)CA?_7{ij zrs#v3N`fc;YvwwQR?9(Bj++sEmh$}EMvy+meT*+R@Y~L~dn^r)8 zRS)uv*l7yDRwQ3 zRd2?27Hey0Z=Zb}MDufJXY8|K5H)wpyVn-V3s=voOXaySMxBp{9L9`h%&5)zYYQqH zjYehRstN;Y3Ek=Xo0Un~q@N+Cq^kTgar@NB$9`uS2GPllNe&H?MY{sb?7Y{iRNapANnxZ3Q@NERuK6nCq;F@ zv-HxjpESetkfmR>ggXx4{SHrZ3unGyRRda6l@^pYP$01LIO_d*iOLdp@u;SO*ITQ zDtgS8`^fJ&psXXB+;HgTy*{F+q%}0yOY!h4jI}aP6INF~4?R9=9nE#+D;SVJN+uxv z51GKZkEUYS`4Tm~Z2P8jm#3!O1hi`qrWlLV^)weXjydYcQal2$}}9f^cU@E3g$uSgEQc ze{WH5K(GZly?WEb@n-PRcZd}>&6T670K5TkSEmY%r zv(f55$Haq1Ner^8!6QFH8UPus8IvT_S2QpQRNA^END3X$9LnVufl2)F6X)X1r$0+0;*=MvZj0JOBlS!QW_^^ zok7c>lucBfzH;-qh4X)hCt*Y_Q-jtB^kwHW3NLtoZ?KTha8t#jB3SRncQ~P9RGXNv za8>c0HRtEl)*w1(8Wve38a+)i25^xQ?h41q^b!@uhiXsw!2p?4eJYcfd&!dL_H?N3 z)lYF74L|Zs)~ih@=Wcsg#m#|YX_+;`=@2;%jrFT0i~8t{Ta1sXtl}rXB_t`Wd`4u8k;W7bG+$U1F}=a4eymC3ffc$OBif+hkNgNqI+g*4mnzjv1@JElEN4+xo% zJoMZQ<5nwrF(FM{WoH$%G@n3Na)HWEUx*#_(O!YwvBmQGkK~{r`*21vQHd5m zk$t$QecB0I2oD#A3M#u>rj?*iWakNJ3NN-_;7uY*zHm|H(q8ZF`iRn09bP_K!&X8w=(3825RA z0C89jM&w{r4#sFuwvWpGu2v#Kgz9ek171a-}3sR98AdW zdy-D+IF%ePWCml zWH|Zn7W(02><`M+{*X*n0Trgy)L0raf1V@Z0UolZ2&e3vISWoewumQ@aML>BdN$#3 z*VcpEcne5K-Hp}bhl?wRY1at!RG;V=t^Htm=*anO7vQ94< zbSy=2?2)e3Lq7s^(1ao!3IG(3r-+%daFcr!2)^%PoC%g7@^L9N+ zkMl&}V0rz|;8275Q!@ zslbl>FJ2x}Qi;Ap^5KeQZ#Aw-&)lluB z8G3wl68Zgr{nOL)^QUL*)AMtu*JpGmzD-5?o!^1X+IKlGh~bO24#XEeVaS(DZjv-> z04S|zKB~=R3DWzJO<$?MrXPNJT1_+}(pxZ2G7bgPKI&RR64HR*;wbcG=GN#~m+>u{I-&UZsj{U` zoXLpwVIjWefj5d5oN)#X$m#5$;dm@I*j+&3N8oyX^H!u~cbKPFkfJ)z(CnM$wVmZ` zMLUAiOuC5#HUKrf1CVAuF;~)$*_=(TA`uM4cl#BUr9n$O=HSd$h#@!`>- zzhvei!gE6tRuG?QBXk=0uUUD0H{fbAuO-{s(@M}|)~ok%vu}plC>xGRAcD9RcZFsfQr~ad2y5LKCtT5^}TcWSs7s z%xbDlQ#!C$FP~yEe=0+Na8A0{AXLf?l>1hj;ekVrblB<8V|6GO4tZWZbmjh4{V?yY zTh$hv;@jpU0!}TL`RN-_a}f+3PKO7)&Rit1@jzECI}(Wh^CsPJ~7yKtf~hTo4019{8*4sQJq^^hbJ diff --git a/venv/lib/python2.7/site-packages/pip/_internal/pyproject.py b/venv/lib/python2.7/site-packages/pip/_internal/pyproject.py deleted file mode 100644 index 43efbed..0000000 --- a/venv/lib/python2.7/site-packages/pip/_internal/pyproject.py +++ /dev/null @@ -1,171 +0,0 @@ -from __future__ import absolute_import - -import io -import os -import sys - -from pip._vendor import pytoml, six - -from pip._internal.exceptions import InstallationError -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import Any, Tuple, Optional, List - - -def _is_list_of_str(obj): - # type: (Any) -> bool - return ( - isinstance(obj, list) and - all(isinstance(item, six.string_types) for item in obj) - ) - - -def make_pyproject_path(setup_py_dir): - # type: (str) -> str - path = os.path.join(setup_py_dir, 'pyproject.toml') - - # Python2 __file__ should not be unicode - if six.PY2 and isinstance(path, six.text_type): - path = path.encode(sys.getfilesystemencoding()) - - return path - - -def load_pyproject_toml( - use_pep517, # type: Optional[bool] - pyproject_toml, # type: str - setup_py, # type: str - req_name # type: str -): - # type: (...) -> Optional[Tuple[List[str], str, List[str]]] - """Load the pyproject.toml file. - - Parameters: - use_pep517 - Has the user requested PEP 517 processing? None - means the user hasn't explicitly specified. - pyproject_toml - Location of the project's pyproject.toml file - setup_py - Location of the project's setup.py file - req_name - The name of the requirement we're processing (for - error reporting) - - Returns: - None if we should use the legacy code path, otherwise a tuple - ( - requirements from pyproject.toml, - name of PEP 517 backend, - requirements we should check are installed after setting - up the build environment - ) - """ - has_pyproject = os.path.isfile(pyproject_toml) - has_setup = os.path.isfile(setup_py) - - if has_pyproject: - with io.open(pyproject_toml, encoding="utf-8") as f: - pp_toml = pytoml.load(f) - build_system = pp_toml.get("build-system") - else: - build_system = None - - # The following cases must use PEP 517 - # We check for use_pep517 being non-None and falsey because that means - # the user explicitly requested --no-use-pep517. The value 0 as - # opposed to False can occur when the value is provided via an - # environment variable or config file option (due to the quirk of - # strtobool() returning an integer in pip's configuration code). - if has_pyproject and not has_setup: - if use_pep517 is not None and not use_pep517: - raise InstallationError( - "Disabling PEP 517 processing is invalid: " - "project does not have a setup.py" - ) - use_pep517 = True - elif build_system and "build-backend" in build_system: - if use_pep517 is not None and not use_pep517: - raise InstallationError( - "Disabling PEP 517 processing is invalid: " - "project specifies a build backend of {} " - "in pyproject.toml".format( - build_system["build-backend"] - ) - ) - use_pep517 = True - - # If we haven't worked out whether to use PEP 517 yet, - # and the user hasn't explicitly stated a preference, - # we do so if the project has a pyproject.toml file. - elif use_pep517 is None: - use_pep517 = has_pyproject - - # At this point, we know whether we're going to use PEP 517. - assert use_pep517 is not None - - # If we're using the legacy code path, there is nothing further - # for us to do here. - if not use_pep517: - return None - - if build_system is None: - # Either the user has a pyproject.toml with no build-system - # section, or the user has no pyproject.toml, but has opted in - # explicitly via --use-pep517. - # In the absence of any explicit backend specification, we - # assume the setuptools backend that most closely emulates the - # traditional direct setup.py execution, and require wheel and - # a version of setuptools that supports that backend. - - build_system = { - "requires": ["setuptools>=40.8.0", "wheel"], - "build-backend": "setuptools.build_meta:__legacy__", - } - - # If we're using PEP 517, we have build system information (either - # from pyproject.toml, or defaulted by the code above). - # Note that at this point, we do not know if the user has actually - # specified a backend, though. - assert build_system is not None - - # Ensure that the build-system section in pyproject.toml conforms - # to PEP 518. - error_template = ( - "{package} has a pyproject.toml file that does not comply " - "with PEP 518: {reason}" - ) - - # Specifying the build-system table but not the requires key is invalid - if "requires" not in build_system: - raise InstallationError( - error_template.format(package=req_name, reason=( - "it has a 'build-system' table but not " - "'build-system.requires' which is mandatory in the table" - )) - ) - - # Error out if requires is not a list of strings - requires = build_system["requires"] - if not _is_list_of_str(requires): - raise InstallationError(error_template.format( - package=req_name, - reason="'build-system.requires' is not a list of strings.", - )) - - backend = build_system.get("build-backend") - check = [] # type: List[str] - if backend is None: - # If the user didn't specify a backend, we assume they want to use - # the setuptools backend. But we can't be sure they have included - # a version of setuptools which supplies the backend, or wheel - # (which is needed by the backend) in their requirements. So we - # make a note to check that those requirements are present once - # we have set up the environment. - # This is quite a lot of work to check for a very specific case. But - # the problem is, that case is potentially quite common - projects that - # adopted PEP 518 early for the ability to specify requirements to - # execute setup.py, but never considered needing to mention the build - # tools themselves. The original PEP 518 code had a similar check (but - # implemented in a different way). - backend = "setuptools.build_meta:__legacy__" - check = ["setuptools>=40.8.0", "wheel"] - - return (requires, backend, check) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/pyproject.pyc b/venv/lib/python2.7/site-packages/pip/_internal/pyproject.pyc deleted file mode 100644 index 971af0293b6a71d6b45387c594c1366fa32495da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4063 zcmc&%&2Jmm5ueAUD3T&2MXntuMS*RCLQD}+c9STsk-82Xqc-9wD($2(0b{Y^K9WoA zm-jtNVk{n7_1<23?X~|v|A(IXf8<*99H76M<%i@tmmX?LT)xkFGr!-=yjkbp&HB%O zzy7R8vrh@XckdFJzoQZ0Ur|I9E9xpz+%Hj7qHam%&~~Wn%-dz^mZj}bv_f%(x)q97 zsk>V2EK^jaxJKPt(O;pcPVpLb*GTC#%KsvJD-<;-Zc?{N@j7+aDc+#&2F07y-6WMj zgH`$?QTGiBs?yk^peBtgtlZ;P9g2teQcK}sH}LQeO&X1@_QE(zbGzSSD{TdjY+}Y$qJWumtY70|eJUw{o-FtBV-sfKDtNs0l`@dUVKC=7mf zj!^}}Sm}M)&MlT_?&AAXG_dU1n>1A-2Tw(#5{vp;Jr{N!i~9R5KGO<7CS(hfp6&=1 z4VGr}Fd2Aul4(;Q#8d4XqIzg`+(MV+VMb`}W_ft*TfKYi=ezwh3UqFEzdhZZe2^a| zCr3B;o+mf<@(=fVx6J7;gKzU2_zbe$C%ajg?a1*_v}136G4Kv}NWNZ}Se*l}-E5NO z=}7l%JDZpqj{9Vw6MdTHcYcJ9Vbv-m26cE=l#GC{@Br!x!r0*SaP-?Vwae**Gr_p(}0i>_%h!Pr7=pwr0@&Y>fq@w3Wx<~eQL!;Bz$zz zO9Nem&&1fPSUu3TA4b}st7DmmQx)zcPNwZR^RkH-gn5U<>Ge@_1*gaUk%l%iSMwNw z>lijwJg9Wl`LViQ>M>VMd{^<6h^+&(B}EdR)AEH8#2y#`OQ0*9@dhfuBr?>wQh&Ne z(+bl#s?ZrY#Nt)@UEt7fzd2iFCWEpJRw=0vhNo2#^*1_Op+=4$c!fhpHOl|W?FN2q zje-^4^amjxK|Uo)JUXjV{x1q}PL+--++J?}uGsvYY{t23ya-F*f|!>jU7hcPyo!Qh zEM5{%p^3S!Y=aMnc=L|J;A0jBEwSNq6(XUbTcZIQb=nKo_@F%)#zKmPH8Rg;LV^ZO zVNhMPUZwoc3ih4VSjC`8XUJ*m6l~Brl@@xkkUG6Jt&_!yIvZgA@v3c`FK=VK3li37 zKs0U88ICD5|6W1UDY|pzG0Pf5GoaO=KJ0Aqg<<{)pLmq|foq4_U3gTR1I^`tXxHm5 zJ_mm8#~L}#+?GC%jSYNIXCK}C*xhj-_(nuvFn4qPe5?^jfqQWOz~u$-)SfoT-h*Ge z`)Q&VLRiq^6Kg-YAZF;BWZSyPo>ABfZ8ULBrh8#O)Iob8V4<@oI`6oT(w^LZZrU%5 zD)RBRd6jt!F=iIvFy)5@$RZ?mL1wWP)_Muh!PX}LQJS-}8Hh0Fgks$jy`2N%1rTnl zpXLi83k+OW^TiDe`OXJm?-dMmpkSU{fS+M>!#?D?W|)qnfC&+cBR%kY6PI(G%c2B|h~l3I7@A2XVBmoS`Z3-L1; z%;Encf9~N1vI|pZ;@F*EOrg+Alo-B^L<^gyk-77$4{x+@q55IVPlj4Y0?3R7W86!t z+j4}5$o6l0Ug0;MXTHRu7a7>}2YL!iS(!zgEpr3-@Gl_JOXCbNdJ@{<49#1&-50s` zO`1$C-$FByat9aV<{5@VMw8FjzR1tEYe9_$3RVEWG})dTwC$b@!`_g&iv1+;ZJJLQ zBu;0t-`vCrKeQLSm`mT~I)@Q1ib>OMaoy433@Nw0XdD_&h*EiksT3S(rjrgA#nOwA zMx~}eEg=IOp&e&F{Ujf2k%O?0eQWuIPYu%LqFC>6iPd69l45t6UuErr07-Phs?d%) zU{0~5A>1QGz;jt2;1ViE3O8Ye`vo6aA!`vDUJ)8{o}?iU)li1_3ElY#tHmVF{81cC zqWJZeLX7&-RI%q>XlcH|gWld!TcwJ+uCDTLwW+QsM>U+9+LBhqx#HAT8mi`Ol`E=T zYSbLnRL#|`l?p~3wV^gDb=AOMMQxz!t*Ay5tx}6?dEv List[InstallRequirement] - """ - Install everything in the given list. - - (to be called after having downloaded and unpacked the packages) - """ - - if to_install: - logger.info( - 'Installing collected packages: %s', - ', '.join([req.name for req in to_install]), - ) - - with indent_log(): - for requirement in to_install: - if requirement.conflicts_with: - logger.info( - 'Found existing installation: %s', - requirement.conflicts_with, - ) - with indent_log(): - uninstalled_pathset = requirement.uninstall( - auto_confirm=True - ) - try: - requirement.install( - install_options, - global_options, - *args, - **kwargs - ) - except Exception: - should_rollback = ( - requirement.conflicts_with and - not requirement.install_succeeded - ) - # if install did not succeed, rollback previous uninstall - if should_rollback: - uninstalled_pathset.rollback() - raise - else: - should_commit = ( - requirement.conflicts_with and - requirement.install_succeeded - ) - if should_commit: - uninstalled_pathset.commit() - requirement.remove_temporary_source() - - return to_install diff --git a/venv/lib/python2.7/site-packages/pip/_internal/req/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_internal/req/__init__.pyc deleted file mode 100644 index d7e872fd6b114f3dacaa9b0557e09600b405714e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1982 zcmc&!&2QX96o0n&)7g(SEff``8VS%A(QGSFR4P;jwFM&DP@JN)D}|9`&w9PFJ)4>F zCR=R|P|ke(OB|6nazx_9KY+xU_r~6Y3unCR@q2IH_xsH_e|6n=zv&%>P(3yLZf^sq zpOJ|0Z$S!>SunD|BHo77hLH`C15pi92eKNBYPg4d9nv~v4Hz{_z5!_yvKEY5rEL?^ zHe@c0+>&oWx&~PXMjfzt2jovCVjI#fWIY)5AnU`Z57|15*1^g#x(m@7L>-8_5M$g+ zz-^dr0KW_`F~uto^&#rPcSyfNsqPKdv5W*?7+ARIJ}$wb5^141OR|}edN-k+a(e@* zom}Z4O?`e`B$8)5*X3Rh_x>f^F z(jLX_;QPfkPVy}@SpvvApaG^9jTBomwIMe02M2vPtHZJmQwP4b;rI>e{Ra-k4x%4K%oJ=BdlBXhwNS;Stk^?^CkSfNC*w2;wPGiUp5SNzioC*|QGY56 zjuSoyqfvQy8uA%sqAy+SFja&h=hzGbY>5>fVh>D4p~$jC>#L}Zr%uc{)11y{AQw!D zLWX=msMcl?Y?S~V=!#~-1XL#LI2DIMdM=`B0vRh4>gdFfbWrfb=(X~@I_>&0^5+%u zh|K~$QCyq5Lrp}HM(jNEF6vgYvVZ{!z$_|5YB-b0JkWeN59Dwx(uhknd~rHlye|*) zlcU>P$N8--`N39rN1c8cy^y!?iD$#7!&x%BS=Dt@-+mmkCnPd2){X$ngLH`54;iwF zW^8k|@M$)$;;ZiA0=IBQZCWQNZ*VHqP8z<-k!ePEuapU$3JhtZDPS zp3OohsoJdkmI%D|A4+;L!`ObEk|97>Jdr+O(Wjf!WWg97OU4W;W3C^S$fs?_2vqRpx2hiw=sJ$8 Tuple[str, Optional[str]] - m = re.match(r'^(.+)(\[[^\]]+\])$', path) - extras = None - if m: - path_no_extras = m.group(1) - extras = m.group(2) - else: - path_no_extras = path - - return path_no_extras, extras - - -def parse_editable(editable_req): - # type: (str) -> Tuple[Optional[str], str, Optional[Set[str]]] - """Parses an editable requirement into: - - a requirement name - - an URL - - extras - - editable options - Accepted requirements: - svn+http://blahblah@rev#egg=Foobar[baz]&subdirectory=version_subdir - .[some_extra] - """ - - url = editable_req - - # If a file path is specified with extras, strip off the extras. - url_no_extras, extras = _strip_extras(url) - - if os.path.isdir(url_no_extras): - if not os.path.exists(os.path.join(url_no_extras, 'setup.py')): - msg = ( - 'File "setup.py" not found. Directory cannot be installed ' - 'in editable mode: {}'.format(os.path.abspath(url_no_extras)) - ) - pyproject_path = make_pyproject_path(url_no_extras) - if os.path.isfile(pyproject_path): - msg += ( - '\n(A "pyproject.toml" file was found, but editable ' - 'mode currently requires a setup.py based build.)' - ) - raise InstallationError(msg) - - # Treating it as code that has already been checked out - url_no_extras = path_to_url(url_no_extras) - - if url_no_extras.lower().startswith('file:'): - package_name = Link(url_no_extras).egg_fragment - if extras: - return ( - package_name, - url_no_extras, - Requirement("placeholder" + extras.lower()).extras, - ) - else: - return package_name, url_no_extras, None - - for version_control in vcs: - if url.lower().startswith('%s:' % version_control): - url = '%s+%s' % (version_control, url) - break - - if '+' not in url: - raise InstallationError( - '%s should either be a path to a local project or a VCS url ' - 'beginning with svn+, git+, hg+, or bzr+' % - editable_req - ) - - vc_type = url.split('+', 1)[0].lower() - - if not vcs.get_backend(vc_type): - error_message = 'For --editable=%s only ' % editable_req + \ - ', '.join([backend.name + '+URL' for backend in vcs.backends]) + \ - ' is currently supported' - raise InstallationError(error_message) - - package_name = Link(url).egg_fragment - if not package_name: - raise InstallationError( - "Could not detect requirement name for '%s', please specify one " - "with #egg=your_package_name" % editable_req - ) - return package_name, url, None - - -def deduce_helpful_msg(req): - # type: (str) -> str - """Returns helpful msg in case requirements file does not exist, - or cannot be parsed. - - :params req: Requirements file path - """ - msg = "" - if os.path.exists(req): - msg = " It does exist." - # Try to parse and check if it is a requirements file. - try: - with open(req, 'r') as fp: - # parse first line only - next(parse_requirements(fp.read())) - msg += " The argument you provided " + \ - "(%s) appears to be a" % (req) + \ - " requirements file. If that is the" + \ - " case, use the '-r' flag to install" + \ - " the packages specified within it." - except RequirementParseError: - logger.debug("Cannot parse '%s' as requirements \ - file" % (req), exc_info=True) - else: - msg += " File '%s' does not exist." % (req) - return msg - - -# ---- The actual constructors follow ---- - - -def install_req_from_editable( - editable_req, # type: str - comes_from=None, # type: Optional[str] - use_pep517=None, # type: Optional[bool] - isolated=False, # type: bool - options=None, # type: Optional[Dict[str, Any]] - wheel_cache=None, # type: Optional[WheelCache] - constraint=False # type: bool -): - # type: (...) -> InstallRequirement - name, url, extras_override = parse_editable(editable_req) - if url.startswith('file:'): - source_dir = url_to_path(url) - else: - source_dir = None - - if name is not None: - try: - req = Requirement(name) - except InvalidRequirement: - raise InstallationError("Invalid requirement: '%s'" % name) - else: - req = None - return InstallRequirement( - req, comes_from, source_dir=source_dir, - editable=True, - link=Link(url), - constraint=constraint, - use_pep517=use_pep517, - isolated=isolated, - options=options if options else {}, - wheel_cache=wheel_cache, - extras=extras_override or (), - ) - - -def install_req_from_line( - name, # type: str - comes_from=None, # type: Optional[Union[str, InstallRequirement]] - use_pep517=None, # type: Optional[bool] - isolated=False, # type: bool - options=None, # type: Optional[Dict[str, Any]] - wheel_cache=None, # type: Optional[WheelCache] - constraint=False # type: bool -): - # type: (...) -> InstallRequirement - """Creates an InstallRequirement from a name, which might be a - requirement, directory containing 'setup.py', filename, or URL. - """ - if is_url(name): - marker_sep = '; ' - else: - marker_sep = ';' - if marker_sep in name: - name, markers_as_string = name.split(marker_sep, 1) - markers_as_string = markers_as_string.strip() - if not markers_as_string: - markers = None - else: - markers = Marker(markers_as_string) - else: - markers = None - name = name.strip() - req_as_string = None - path = os.path.normpath(os.path.abspath(name)) - link = None - extras_as_string = None - - if is_url(name): - link = Link(name) - else: - p, extras_as_string = _strip_extras(path) - looks_like_dir = os.path.isdir(p) and ( - os.path.sep in name or - (os.path.altsep is not None and os.path.altsep in name) or - name.startswith('.') - ) - if looks_like_dir: - if not is_installable_dir(p): - raise InstallationError( - "Directory %r is not installable. Neither 'setup.py' " - "nor 'pyproject.toml' found." % name - ) - link = Link(path_to_url(p)) - elif is_archive_file(p): - if not os.path.isfile(p): - logger.warning( - 'Requirement %r looks like a filename, but the ' - 'file does not exist', - name - ) - link = Link(path_to_url(p)) - - # it's a local file, dir, or url - if link: - # Handle relative file URLs - if link.scheme == 'file' and re.search(r'\.\./', link.url): - link = Link( - path_to_url(os.path.normpath(os.path.abspath(link.path)))) - # wheel file - if link.is_wheel: - wheel = Wheel(link.filename) # can raise InvalidWheelFilename - req_as_string = "%s==%s" % (wheel.name, wheel.version) - else: - # set the req to the egg fragment. when it's not there, this - # will become an 'unnamed' requirement - req_as_string = link.egg_fragment - - # a requirement specifier - else: - req_as_string = name - - if extras_as_string: - extras = Requirement("placeholder" + extras_as_string.lower()).extras - else: - extras = () - if req_as_string is not None: - try: - req = Requirement(req_as_string) - except InvalidRequirement: - if os.path.sep in req_as_string: - add_msg = "It looks like a path." - add_msg += deduce_helpful_msg(req_as_string) - elif ('=' in req_as_string and - not any(op in req_as_string for op in operators)): - add_msg = "= is not a valid operator. Did you mean == ?" - else: - add_msg = "" - raise InstallationError( - "Invalid requirement: '%s'\n%s" % (req_as_string, add_msg) - ) - else: - req = None - - return InstallRequirement( - req, comes_from, link=link, markers=markers, - use_pep517=use_pep517, isolated=isolated, - options=options if options else {}, - wheel_cache=wheel_cache, - constraint=constraint, - extras=extras, - ) - - -def install_req_from_req_string( - req_string, # type: str - comes_from=None, # type: Optional[InstallRequirement] - isolated=False, # type: bool - wheel_cache=None, # type: Optional[WheelCache] - use_pep517=None # type: Optional[bool] -): - # type: (...) -> InstallRequirement - try: - req = Requirement(req_string) - except InvalidRequirement: - raise InstallationError("Invalid requirement: '%s'" % req_string) - - domains_not_allowed = [ - PyPI.file_storage_domain, - TestPyPI.file_storage_domain, - ] - if (req.url and comes_from and comes_from.link and - comes_from.link.netloc in domains_not_allowed): - # Explicitly disallow pypi packages that depend on external urls - raise InstallationError( - "Packages installed from PyPI cannot depend on packages " - "which are not also hosted on PyPI.\n" - "%s depends on %s " % (comes_from.name, req) - ) - - return InstallRequirement( - req, comes_from, isolated=isolated, wheel_cache=wheel_cache, - use_pep517=use_pep517 - ) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/req/constructors.pyc b/venv/lib/python2.7/site-packages/pip/_internal/req/constructors.pyc deleted file mode 100644 index aa2b4d931470958b36bbd1312c1184f5573072c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9643 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\$\{(?P[A-Z0-9_]+)\})') - -SUPPORTED_OPTIONS = [ - cmdoptions.constraints, - cmdoptions.editable, - cmdoptions.requirements, - cmdoptions.no_index, - cmdoptions.index_url, - cmdoptions.find_links, - cmdoptions.extra_index_url, - cmdoptions.always_unzip, - cmdoptions.no_binary, - cmdoptions.only_binary, - cmdoptions.pre, - cmdoptions.trusted_host, - cmdoptions.require_hashes, -] # type: List[Callable[..., optparse.Option]] - -# options to be passed to requirements -SUPPORTED_OPTIONS_REQ = [ - cmdoptions.install_options, - cmdoptions.global_options, - cmdoptions.hash, -] # type: List[Callable[..., optparse.Option]] - -# the 'dest' string values -SUPPORTED_OPTIONS_REQ_DEST = [str(o().dest) for o in SUPPORTED_OPTIONS_REQ] - - -def parse_requirements( - filename, # type: str - finder=None, # type: Optional[PackageFinder] - comes_from=None, # type: Optional[str] - options=None, # type: Optional[optparse.Values] - session=None, # type: Optional[PipSession] - constraint=False, # type: bool - wheel_cache=None, # type: Optional[WheelCache] - use_pep517=None # type: Optional[bool] -): - # type: (...) -> Iterator[InstallRequirement] - """Parse a requirements file and yield InstallRequirement instances. - - :param filename: Path or url of requirements file. - :param finder: Instance of pip.index.PackageFinder. - :param comes_from: Origin description of requirements. - :param options: cli options. - :param session: Instance of pip.download.PipSession. - :param constraint: If true, parsing a constraint file rather than - requirements file. - :param wheel_cache: Instance of pip.wheel.WheelCache - :param use_pep517: Value of the --use-pep517 option. - """ - if session is None: - raise TypeError( - "parse_requirements() missing 1 required keyword argument: " - "'session'" - ) - - _, content = get_file_content( - filename, comes_from=comes_from, session=session - ) - - lines_enum = preprocess(content, options) - - for line_number, line in lines_enum: - req_iter = process_line(line, filename, line_number, finder, - comes_from, options, session, wheel_cache, - use_pep517=use_pep517, constraint=constraint) - for req in req_iter: - yield req - - -def preprocess(content, options): - # type: (Text, Optional[optparse.Values]) -> ReqFileLines - """Split, filter, and join lines, and return a line iterator - - :param content: the content of the requirements file - :param options: cli options - """ - lines_enum = enumerate(content.splitlines(), start=1) # type: ReqFileLines - lines_enum = join_lines(lines_enum) - lines_enum = ignore_comments(lines_enum) - lines_enum = skip_regex(lines_enum, options) - lines_enum = expand_env_variables(lines_enum) - return lines_enum - - -def process_line( - line, # type: Text - filename, # type: str - line_number, # type: int - finder=None, # type: Optional[PackageFinder] - comes_from=None, # type: Optional[str] - options=None, # type: Optional[optparse.Values] - session=None, # type: Optional[PipSession] - wheel_cache=None, # type: Optional[WheelCache] - use_pep517=None, # type: Optional[bool] - constraint=False # type: bool -): - # type: (...) -> Iterator[InstallRequirement] - """Process a single requirements line; This can result in creating/yielding - requirements, or updating the finder. - - For lines that contain requirements, the only options that have an effect - are from SUPPORTED_OPTIONS_REQ, and they are scoped to the - requirement. Other options from SUPPORTED_OPTIONS may be present, but are - ignored. - - For lines that do not contain requirements, the only options that have an - effect are from SUPPORTED_OPTIONS. Options from SUPPORTED_OPTIONS_REQ may - be present, but are ignored. These lines may contain multiple options - (although our docs imply only one is supported), and all our parsed and - affect the finder. - - :param constraint: If True, parsing a constraints file. - :param options: OptionParser options that we may update - """ - parser = build_parser(line) - defaults = parser.get_default_values() - defaults.index_url = None - if finder: - defaults.format_control = finder.format_control - args_str, options_str = break_args_options(line) - # Prior to 2.7.3, shlex cannot deal with unicode entries - if sys.version_info < (2, 7, 3): - # https://github.com/python/mypy/issues/1174 - options_str = options_str.encode('utf8') # type: ignore - # https://github.com/python/mypy/issues/1174 - opts, _ = parser.parse_args( - shlex.split(options_str), defaults) # type: ignore - - # preserve for the nested code path - line_comes_from = '%s %s (line %s)' % ( - '-c' if constraint else '-r', filename, line_number, - ) - - # yield a line requirement - if args_str: - isolated = options.isolated_mode if options else False - if options: - cmdoptions.check_install_build_global(options, opts) - # get the options that apply to requirements - req_options = {} - for dest in SUPPORTED_OPTIONS_REQ_DEST: - if dest in opts.__dict__ and opts.__dict__[dest]: - req_options[dest] = opts.__dict__[dest] - yield install_req_from_line( - args_str, line_comes_from, constraint=constraint, - use_pep517=use_pep517, - isolated=isolated, options=req_options, wheel_cache=wheel_cache - ) - - # yield an editable requirement - elif opts.editables: - isolated = options.isolated_mode if options else False - yield install_req_from_editable( - opts.editables[0], comes_from=line_comes_from, - use_pep517=use_pep517, - constraint=constraint, isolated=isolated, wheel_cache=wheel_cache - ) - - # parse a nested requirements file - elif opts.requirements or opts.constraints: - if opts.requirements: - req_path = opts.requirements[0] - nested_constraint = False - else: - req_path = opts.constraints[0] - nested_constraint = True - # original file is over http - if SCHEME_RE.search(filename): - # do a url join so relative paths work - req_path = urllib_parse.urljoin(filename, req_path) - # original file and nested file are paths - elif not SCHEME_RE.search(req_path): - # do a join so relative paths work - req_path = os.path.join(os.path.dirname(filename), req_path) - # TODO: Why not use `comes_from='-r {} (line {})'` here as well? - parsed_reqs = parse_requirements( - req_path, finder, comes_from, options, session, - constraint=nested_constraint, wheel_cache=wheel_cache - ) - for req in parsed_reqs: - yield req - - # percolate hash-checking option upward - elif opts.require_hashes: - options.require_hashes = opts.require_hashes - - # set finder options - elif finder: - if opts.index_url: - finder.index_urls = [opts.index_url] - if opts.no_index is True: - finder.index_urls = [] - if opts.extra_index_urls: - finder.index_urls.extend(opts.extra_index_urls) - if opts.find_links: - # FIXME: it would be nice to keep track of the source - # of the find_links: support a find-links local path - # relative to a requirements file. - value = opts.find_links[0] - req_dir = os.path.dirname(os.path.abspath(filename)) - relative_to_reqs_file = os.path.join(req_dir, value) - if os.path.exists(relative_to_reqs_file): - value = relative_to_reqs_file - finder.find_links.append(value) - if opts.pre: - finder.allow_all_prereleases = True - if opts.trusted_hosts: - finder.secure_origins.extend( - ("*", host, "*") for host in opts.trusted_hosts) - - -def break_args_options(line): - # type: (Text) -> Tuple[str, Text] - """Break up the line into an args and options string. We only want to shlex - (and then optparse) the options, not the args. args can contain markers - which are corrupted by shlex. - """ - tokens = line.split(' ') - args = [] - options = tokens[:] - for token in tokens: - if token.startswith('-') or token.startswith('--'): - break - else: - args.append(token) - options.pop(0) - return ' '.join(args), ' '.join(options) # type: ignore - - -def build_parser(line): - # type: (Text) -> optparse.OptionParser - """ - Return a parser for parsing requirement lines - """ - parser = optparse.OptionParser(add_help_option=False) - - option_factories = SUPPORTED_OPTIONS + SUPPORTED_OPTIONS_REQ - for option_factory in option_factories: - option = option_factory() - parser.add_option(option) - - # By default optparse sys.exits on parsing errors. We want to wrap - # that in our own exception. - def parser_exit(self, msg): - # type: (Any, str) -> NoReturn - # add offending line - msg = 'Invalid requirement: %s\n%s' % (line, msg) - raise RequirementsFileParseError(msg) - # NOTE: mypy disallows assigning to a method - # https://github.com/python/mypy/issues/2427 - parser.exit = parser_exit # type: ignore - - return parser - - -def join_lines(lines_enum): - # type: (ReqFileLines) -> ReqFileLines - """Joins a line ending in '\' with the previous line (except when following - comments). The joined line takes on the index of the first line. - """ - primary_line_number = None - new_line = [] # type: List[Text] - for line_number, line in lines_enum: - if not line.endswith('\\') or COMMENT_RE.match(line): - if COMMENT_RE.match(line): - # this ensures comments are always matched later - line = ' ' + line - if new_line: - new_line.append(line) - yield primary_line_number, ''.join(new_line) - new_line = [] - else: - yield line_number, line - else: - if not new_line: - primary_line_number = line_number - new_line.append(line.strip('\\')) - - # last line contains \ - if new_line: - yield primary_line_number, ''.join(new_line) - - # TODO: handle space after '\'. - - -def ignore_comments(lines_enum): - # type: (ReqFileLines) -> ReqFileLines - """ - Strips comments and filter empty lines. - """ - for line_number, line in lines_enum: - line = COMMENT_RE.sub('', line) - line = line.strip() - if line: - yield line_number, line - - -def skip_regex(lines_enum, options): - # type: (ReqFileLines, Optional[optparse.Values]) -> ReqFileLines - """ - Skip lines that match '--skip-requirements-regex' pattern - - Note: the regex pattern is only built once - """ - skip_regex = options.skip_requirements_regex if options else None - if skip_regex: - pattern = re.compile(skip_regex) - lines_enum = filterfalse(lambda e: pattern.search(e[1]), lines_enum) - return lines_enum - - -def expand_env_variables(lines_enum): - # type: (ReqFileLines) -> ReqFileLines - """Replace all environment variables that can be retrieved via `os.getenv`. - - The only allowed format for environment variables defined in the - requirement file is `${MY_VARIABLE_1}` to ensure two things: - - 1. Strings that contain a `$` aren't accidentally (partially) expanded. - 2. Ensure consistency across platforms for requirement files. - - These points are the result of a discussion on the `github pull - request #3514 `_. - - Valid characters in variable names follow the `POSIX standard - `_ and are limited - to uppercase letter, digits and the `_` (underscore). - """ - for line_number, line in lines_enum: - for env_var, var_name in ENV_VAR_RE.findall(line): - value = os.getenv(var_name) - if not value: - continue - - line = line.replace(env_var, value) - - yield line_number, line diff --git a/venv/lib/python2.7/site-packages/pip/_internal/req/req_file.pyc b/venv/lib/python2.7/site-packages/pip/_internal/req/req_file.pyc deleted file mode 100644 index 523dbbc497ec3fff17b6cf6cdd5e578abc0a5365..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11785 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 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/req/req_install.py b/venv/lib/python2.7/site-packages/pip/_internal/req/req_install.py deleted file mode 100644 index 25a692e..0000000 --- a/venv/lib/python2.7/site-packages/pip/_internal/req/req_install.py +++ /dev/null @@ -1,1028 +0,0 @@ -from __future__ import absolute_import - -import logging -import os -import shutil -import sys -import sysconfig -import zipfile -from distutils.util import change_root - -from pip._vendor import pkg_resources, six -from pip._vendor.packaging.requirements import Requirement -from pip._vendor.packaging.utils import canonicalize_name -from pip._vendor.packaging.version import Version -from pip._vendor.packaging.version import parse as parse_version -from pip._vendor.pep517.wrappers import Pep517HookCaller - -from pip._internal import wheel -from pip._internal.build_env import NoOpBuildEnvironment -from pip._internal.exceptions import InstallationError -from pip._internal.locations import ( - PIP_DELETE_MARKER_FILENAME, running_under_virtualenv, -) -from pip._internal.models.link import Link -from pip._internal.pyproject import load_pyproject_toml, make_pyproject_path -from pip._internal.req.req_uninstall import UninstallPathSet -from pip._internal.utils.compat import native_str -from pip._internal.utils.hashes import Hashes -from pip._internal.utils.logging import indent_log -from pip._internal.utils.misc import ( - _make_build_dir, ask_path_exists, backup_dir, call_subprocess, - display_path, dist_in_site_packages, dist_in_usersite, ensure_dir, - get_installed_version, redact_password_from_url, rmtree, -) -from pip._internal.utils.packaging import get_metadata -from pip._internal.utils.setuptools_build import SETUPTOOLS_SHIM -from pip._internal.utils.temp_dir import TempDirectory -from pip._internal.utils.typing import MYPY_CHECK_RUNNING -from pip._internal.utils.ui import open_spinner -from pip._internal.vcs import vcs -from pip._internal.wheel import move_wheel_files - -if MYPY_CHECK_RUNNING: - from typing import ( - Any, Dict, Iterable, List, Mapping, Optional, Sequence, Union, - ) - from pip._internal.build_env import BuildEnvironment - from pip._internal.cache import WheelCache - from pip._internal.index import PackageFinder - from pip._vendor.pkg_resources import Distribution - from pip._vendor.packaging.specifiers import SpecifierSet - from pip._vendor.packaging.markers import Marker - - -logger = logging.getLogger(__name__) - - -class InstallRequirement(object): - """ - Represents something that may be installed later on, may have information - about where to fetch the relevant requirement and also contains logic for - installing the said requirement. - """ - - def __init__( - self, - req, # type: Optional[Requirement] - comes_from, # type: Optional[Union[str, InstallRequirement]] - source_dir=None, # type: Optional[str] - editable=False, # type: bool - link=None, # type: Optional[Link] - update=True, # type: bool - markers=None, # type: Optional[Marker] - use_pep517=None, # type: Optional[bool] - isolated=False, # type: bool - options=None, # type: Optional[Dict[str, Any]] - wheel_cache=None, # type: Optional[WheelCache] - constraint=False, # type: bool - extras=() # type: Iterable[str] - ): - # type: (...) -> None - assert req is None or isinstance(req, Requirement), req - self.req = req - self.comes_from = comes_from - self.constraint = constraint - if source_dir is not None: - self.source_dir = os.path.normpath(os.path.abspath(source_dir)) - else: - self.source_dir = None - self.editable = editable - - self._wheel_cache = wheel_cache - if link is None and req and req.url: - # PEP 508 URL requirement - link = Link(req.url) - self.link = self.original_link = link - - if extras: - self.extras = extras - elif req: - self.extras = { - pkg_resources.safe_extra(extra) for extra in req.extras - } - else: - self.extras = set() - if markers is None and req: - markers = req.marker - self.markers = markers - - self._egg_info_path = None # type: Optional[str] - # This holds the pkg_resources.Distribution object if this requirement - # is already available: - self.satisfied_by = None - # This hold the pkg_resources.Distribution object if this requirement - # conflicts with another installed distribution: - self.conflicts_with = None - # Temporary build location - self._temp_build_dir = TempDirectory(kind="req-build") - # Used to store the global directory where the _temp_build_dir should - # have been created. Cf _correct_build_location method. - self._ideal_build_dir = None # type: Optional[str] - # True if the editable should be updated: - self.update = update - # Set to True after successful installation - self.install_succeeded = None # type: Optional[bool] - # UninstallPathSet of uninstalled distribution (for possible rollback) - self.uninstalled_pathset = None - self.options = options if options else {} - # Set to True after successful preparation of this requirement - self.prepared = False - self.is_direct = False - - self.isolated = isolated - self.build_env = NoOpBuildEnvironment() # type: BuildEnvironment - - # For PEP 517, the directory where we request the project metadata - # gets stored. We need this to pass to build_wheel, so the backend - # can ensure that the wheel matches the metadata (see the PEP for - # details). - self.metadata_directory = None # type: Optional[str] - - # The static build requirements (from pyproject.toml) - self.pyproject_requires = None # type: Optional[List[str]] - - # Build requirements that we will check are available - self.requirements_to_check = [] # type: List[str] - - # The PEP 517 backend we should use to build the project - self.pep517_backend = None # type: Optional[Pep517HookCaller] - - # Are we using PEP 517 for this requirement? - # After pyproject.toml has been loaded, the only valid values are True - # and False. Before loading, None is valid (meaning "use the default"). - # Setting an explicit value before loading pyproject.toml is supported, - # but after loading this flag should be treated as read only. - self.use_pep517 = use_pep517 - - def __str__(self): - # type: () -> str - if self.req: - s = str(self.req) - if self.link: - s += ' from %s' % redact_password_from_url(self.link.url) - elif self.link: - s = redact_password_from_url(self.link.url) - else: - s = '' - if self.satisfied_by is not None: - s += ' in %s' % display_path(self.satisfied_by.location) - if self.comes_from: - if isinstance(self.comes_from, six.string_types): - comes_from = self.comes_from - else: - comes_from = self.comes_from.from_path() - if comes_from: - s += ' (from %s)' % comes_from - return s - - def __repr__(self): - # type: () -> str - return '<%s object: %s editable=%r>' % ( - self.__class__.__name__, str(self), self.editable) - - def populate_link(self, finder, upgrade, require_hashes): - # type: (PackageFinder, bool, bool) -> None - """Ensure that if a link can be found for this, that it is found. - - Note that self.link may still be None - if Upgrade is False and the - requirement is already installed. - - If require_hashes is True, don't use the wheel cache, because cached - wheels, always built locally, have different hashes than the files - downloaded from the index server and thus throw false hash mismatches. - Furthermore, cached wheels at present have undeterministic contents due - to file modification times. - """ - if self.link is None: - self.link = finder.find_requirement(self, upgrade) - if self._wheel_cache is not None and not require_hashes: - old_link = self.link - self.link = self._wheel_cache.get(self.link, self.name) - if old_link != self.link: - logger.debug('Using cached wheel link: %s', self.link) - - # Things that are valid for all kinds of requirements? - @property - def name(self): - # type: () -> Optional[str] - if self.req is None: - return None - return native_str(pkg_resources.safe_name(self.req.name)) - - @property - def specifier(self): - # type: () -> SpecifierSet - return self.req.specifier - - @property - def is_pinned(self): - # type: () -> bool - """Return whether I am pinned to an exact version. - - For example, some-package==1.2 is pinned; some-package>1.2 is not. - """ - specifiers = self.specifier - return (len(specifiers) == 1 and - next(iter(specifiers)).operator in {'==', '==='}) - - @property - def installed_version(self): - # type: () -> Optional[str] - return get_installed_version(self.name) - - def match_markers(self, extras_requested=None): - # type: (Optional[Iterable[str]]) -> bool - if not extras_requested: - # Provide an extra to safely evaluate the markers - # without matching any extra - extras_requested = ('',) - if self.markers is not None: - return any( - self.markers.evaluate({'extra': extra}) - for extra in extras_requested) - else: - return True - - @property - def has_hash_options(self): - # type: () -> bool - """Return whether any known-good hashes are specified as options. - - These activate --require-hashes mode; hashes specified as part of a - URL do not. - - """ - return bool(self.options.get('hashes', {})) - - def hashes(self, trust_internet=True): - # type: (bool) -> Hashes - """Return a hash-comparer that considers my option- and URL-based - hashes to be known-good. - - Hashes in URLs--ones embedded in the requirements file, not ones - downloaded from an index server--are almost peers with ones from - flags. They satisfy --require-hashes (whether it was implicitly or - explicitly activated) but do not activate it. md5 and sha224 are not - allowed in flags, which should nudge people toward good algos. We - always OR all hashes together, even ones from URLs. - - :param trust_internet: Whether to trust URL-based (#md5=...) hashes - downloaded from the internet, as by populate_link() - - """ - good_hashes = self.options.get('hashes', {}).copy() - link = self.link if trust_internet else self.original_link - if link and link.hash: - good_hashes.setdefault(link.hash_name, []).append(link.hash) - return Hashes(good_hashes) - - def from_path(self): - # type: () -> Optional[str] - """Format a nice indicator to show where this "comes from" - """ - if self.req is None: - return None - s = str(self.req) - if self.comes_from: - if isinstance(self.comes_from, six.string_types): - comes_from = self.comes_from - else: - comes_from = self.comes_from.from_path() - if comes_from: - s += '->' + comes_from - return s - - def build_location(self, build_dir): - # type: (str) -> Optional[str] - assert build_dir is not None - if self._temp_build_dir.path is not None: - return self._temp_build_dir.path - if self.req is None: - # for requirement via a path to a directory: the name of the - # package is not available yet so we create a temp directory - # Once run_egg_info will have run, we'll be able - # to fix it via _correct_build_location - # Some systems have /tmp as a symlink which confuses custom - # builds (such as numpy). Thus, we ensure that the real path - # is returned. - self._temp_build_dir.create() - self._ideal_build_dir = build_dir - - return self._temp_build_dir.path - if self.editable: - name = self.name.lower() - else: - name = self.name - # FIXME: Is there a better place to create the build_dir? (hg and bzr - # need this) - if not os.path.exists(build_dir): - logger.debug('Creating directory %s', build_dir) - _make_build_dir(build_dir) - return os.path.join(build_dir, name) - - def _correct_build_location(self): - # type: () -> None - """Move self._temp_build_dir to self._ideal_build_dir/self.req.name - - For some requirements (e.g. a path to a directory), the name of the - package is not available until we run egg_info, so the build_location - will return a temporary directory and store the _ideal_build_dir. - - This is only called by self.run_egg_info to fix the temporary build - directory. - """ - if self.source_dir is not None: - return - assert self.req is not None - assert self._temp_build_dir.path - assert (self._ideal_build_dir is not None and - self._ideal_build_dir.path) # type: ignore - old_location = self._temp_build_dir.path - self._temp_build_dir.path = None - - new_location = self.build_location(self._ideal_build_dir) - if os.path.exists(new_location): - raise InstallationError( - 'A package already exists in %s; please remove it to continue' - % display_path(new_location)) - logger.debug( - 'Moving package %s from %s to new location %s', - self, display_path(old_location), display_path(new_location), - ) - shutil.move(old_location, new_location) - self._temp_build_dir.path = new_location - self._ideal_build_dir = None - self.source_dir = os.path.normpath(os.path.abspath(new_location)) - self._egg_info_path = None - - # Correct the metadata directory, if it exists - if self.metadata_directory: - old_meta = self.metadata_directory - rel = os.path.relpath(old_meta, start=old_location) - new_meta = os.path.join(new_location, rel) - new_meta = os.path.normpath(os.path.abspath(new_meta)) - self.metadata_directory = new_meta - - def remove_temporary_source(self): - # type: () -> None - """Remove the source files from this requirement, if they are marked - for deletion""" - if self.source_dir and os.path.exists( - os.path.join(self.source_dir, PIP_DELETE_MARKER_FILENAME)): - logger.debug('Removing source in %s', self.source_dir) - rmtree(self.source_dir) - self.source_dir = None - self._temp_build_dir.cleanup() - self.build_env.cleanup() - - def check_if_exists(self, use_user_site): - # type: (bool) -> bool - """Find an installed distribution that satisfies or conflicts - with this requirement, and set self.satisfied_by or - self.conflicts_with appropriately. - """ - if self.req is None: - return False - try: - # get_distribution() will resolve the entire list of requirements - # anyway, and we've already determined that we need the requirement - # in question, so strip the marker so that we don't try to - # evaluate it. - no_marker = Requirement(str(self.req)) - no_marker.marker = None - self.satisfied_by = pkg_resources.get_distribution(str(no_marker)) - if self.editable and self.satisfied_by: - self.conflicts_with = self.satisfied_by - # when installing editables, nothing pre-existing should ever - # satisfy - self.satisfied_by = None - return True - except pkg_resources.DistributionNotFound: - return False - except pkg_resources.VersionConflict: - existing_dist = pkg_resources.get_distribution( - self.req.name - ) - if use_user_site: - if dist_in_usersite(existing_dist): - self.conflicts_with = existing_dist - elif (running_under_virtualenv() and - dist_in_site_packages(existing_dist)): - raise InstallationError( - "Will not install to the user site because it will " - "lack sys.path precedence to %s in %s" % - (existing_dist.project_name, existing_dist.location) - ) - else: - self.conflicts_with = existing_dist - return True - - # Things valid for wheels - @property - def is_wheel(self): - # type: () -> bool - if not self.link: - return False - return self.link.is_wheel - - def move_wheel_files( - self, - wheeldir, # type: str - root=None, # type: Optional[str] - home=None, # type: Optional[str] - prefix=None, # type: Optional[str] - warn_script_location=True, # type: bool - use_user_site=False, # type: bool - pycompile=True # type: bool - ): - # type: (...) -> None - move_wheel_files( - self.name, self.req, wheeldir, - user=use_user_site, - home=home, - root=root, - prefix=prefix, - pycompile=pycompile, - isolated=self.isolated, - warn_script_location=warn_script_location, - ) - - # Things valid for sdists - @property - def setup_py_dir(self): - # type: () -> str - return os.path.join( - self.source_dir, - self.link and self.link.subdirectory_fragment or '') - - @property - def setup_py(self): - # type: () -> str - assert self.source_dir, "No source dir for %s" % self - - setup_py = os.path.join(self.setup_py_dir, 'setup.py') - - # Python2 __file__ should not be unicode - if six.PY2 and isinstance(setup_py, six.text_type): - setup_py = setup_py.encode(sys.getfilesystemencoding()) - - return setup_py - - @property - def pyproject_toml(self): - # type: () -> str - assert self.source_dir, "No source dir for %s" % self - - return make_pyproject_path(self.setup_py_dir) - - def load_pyproject_toml(self): - # type: () -> None - """Load the pyproject.toml file. - - After calling this routine, all of the attributes related to PEP 517 - processing for this requirement have been set. In particular, the - use_pep517 attribute can be used to determine whether we should - follow the PEP 517 or legacy (setup.py) code path. - """ - pep517_data = load_pyproject_toml( - self.use_pep517, - self.pyproject_toml, - self.setup_py, - str(self) - ) - - if pep517_data is None: - self.use_pep517 = False - else: - self.use_pep517 = True - requires, backend, check = pep517_data - self.requirements_to_check = check - self.pyproject_requires = requires - self.pep517_backend = Pep517HookCaller(self.setup_py_dir, backend) - - # Use a custom function to call subprocesses - self.spin_message = "" - - def runner( - cmd, # type: List[str] - cwd=None, # type: Optional[str] - extra_environ=None # type: Optional[Mapping[str, Any]] - ): - # type: (...) -> None - with open_spinner(self.spin_message) as spinner: - call_subprocess( - cmd, - cwd=cwd, - extra_environ=extra_environ, - spinner=spinner - ) - self.spin_message = "" - - self.pep517_backend._subprocess_runner = runner - - def prepare_metadata(self): - # type: () -> None - """Ensure that project metadata is available. - - Under PEP 517, call the backend hook to prepare the metadata. - Under legacy processing, call setup.py egg-info. - """ - assert self.source_dir - - with indent_log(): - if self.use_pep517: - self.prepare_pep517_metadata() - else: - self.run_egg_info() - - if not self.req: - if isinstance(parse_version(self.metadata["Version"]), Version): - op = "==" - else: - op = "===" - self.req = Requirement( - "".join([ - self.metadata["Name"], - op, - self.metadata["Version"], - ]) - ) - self._correct_build_location() - else: - metadata_name = canonicalize_name(self.metadata["Name"]) - if canonicalize_name(self.req.name) != metadata_name: - logger.warning( - 'Generating metadata for package %s ' - 'produced metadata for project name %s. Fix your ' - '#egg=%s fragments.', - self.name, metadata_name, self.name - ) - self.req = Requirement(metadata_name) - - def prepare_pep517_metadata(self): - # type: () -> None - assert self.pep517_backend is not None - - metadata_dir = os.path.join( - self.setup_py_dir, - 'pip-wheel-metadata' - ) - ensure_dir(metadata_dir) - - with self.build_env: - # Note that Pep517HookCaller implements a fallback for - # prepare_metadata_for_build_wheel, so we don't have to - # consider the possibility that this hook doesn't exist. - backend = self.pep517_backend - self.spin_message = "Preparing wheel metadata" - distinfo_dir = backend.prepare_metadata_for_build_wheel( - metadata_dir - ) - - self.metadata_directory = os.path.join(metadata_dir, distinfo_dir) - - def run_egg_info(self): - # type: () -> None - if self.name: - logger.debug( - 'Running setup.py (path:%s) egg_info for package %s', - self.setup_py, self.name, - ) - else: - logger.debug( - 'Running setup.py (path:%s) egg_info for package from %s', - self.setup_py, self.link, - ) - script = SETUPTOOLS_SHIM % self.setup_py - base_cmd = [sys.executable, '-c', script] - if self.isolated: - base_cmd += ["--no-user-cfg"] - egg_info_cmd = base_cmd + ['egg_info'] - # We can't put the .egg-info files at the root, because then the - # source code will be mistaken for an installed egg, causing - # problems - if self.editable: - egg_base_option = [] # type: List[str] - else: - egg_info_dir = os.path.join(self.setup_py_dir, 'pip-egg-info') - ensure_dir(egg_info_dir) - egg_base_option = ['--egg-base', 'pip-egg-info'] - with self.build_env: - call_subprocess( - egg_info_cmd + egg_base_option, - cwd=self.setup_py_dir, - command_desc='python setup.py egg_info') - - @property - def egg_info_path(self): - # type: () -> str - if self._egg_info_path is None: - if self.editable: - base = self.source_dir - else: - base = os.path.join(self.setup_py_dir, 'pip-egg-info') - filenames = os.listdir(base) - if self.editable: - filenames = [] - for root, dirs, files in os.walk(base): - for dir in vcs.dirnames: - if dir in dirs: - dirs.remove(dir) - # Iterate over a copy of ``dirs``, since mutating - # a list while iterating over it can cause trouble. - # (See https://github.com/pypa/pip/pull/462.) - for dir in list(dirs): - # Don't search in anything that looks like a virtualenv - # environment - if ( - os.path.lexists( - os.path.join(root, dir, 'bin', 'python') - ) or - os.path.exists( - os.path.join( - root, dir, 'Scripts', 'Python.exe' - ) - )): - dirs.remove(dir) - # Also don't search through tests - elif dir == 'test' or dir == 'tests': - dirs.remove(dir) - filenames.extend([os.path.join(root, dir) - for dir in dirs]) - filenames = [f for f in filenames if f.endswith('.egg-info')] - - if not filenames: - raise InstallationError( - "Files/directories not found in %s" % base - ) - # if we have more than one match, we pick the toplevel one. This - # can easily be the case if there is a dist folder which contains - # an extracted tarball for testing purposes. - if len(filenames) > 1: - filenames.sort( - key=lambda x: x.count(os.path.sep) + - (os.path.altsep and x.count(os.path.altsep) or 0) - ) - self._egg_info_path = os.path.join(base, filenames[0]) - return self._egg_info_path - - @property - def metadata(self): - # type: () -> Any - if not hasattr(self, '_metadata'): - self._metadata = get_metadata(self.get_dist()) - - return self._metadata - - def get_dist(self): - # type: () -> Distribution - """Return a pkg_resources.Distribution for this requirement""" - if self.metadata_directory: - base_dir, distinfo = os.path.split(self.metadata_directory) - metadata = pkg_resources.PathMetadata( - base_dir, self.metadata_directory - ) - dist_name = os.path.splitext(distinfo)[0] - typ = pkg_resources.DistInfoDistribution - else: - egg_info = self.egg_info_path.rstrip(os.path.sep) - base_dir = os.path.dirname(egg_info) - metadata = pkg_resources.PathMetadata(base_dir, egg_info) - dist_name = os.path.splitext(os.path.basename(egg_info))[0] - # https://github.com/python/mypy/issues/1174 - typ = pkg_resources.Distribution # type: ignore - - return typ( - base_dir, - project_name=dist_name, - metadata=metadata, - ) - - def assert_source_matches_version(self): - # type: () -> None - assert self.source_dir - version = self.metadata['version'] - if self.req.specifier and version not in self.req.specifier: - logger.warning( - 'Requested %s, but installing version %s', - self, - version, - ) - else: - logger.debug( - 'Source in %s has version %s, which satisfies requirement %s', - display_path(self.source_dir), - version, - self, - ) - - # For both source distributions and editables - def ensure_has_source_dir(self, parent_dir): - # type: (str) -> str - """Ensure that a source_dir is set. - - This will create a temporary build dir if the name of the requirement - isn't known yet. - - :param parent_dir: The ideal pip parent_dir for the source_dir. - Generally src_dir for editables and build_dir for sdists. - :return: self.source_dir - """ - if self.source_dir is None: - self.source_dir = self.build_location(parent_dir) - return self.source_dir - - # For editable installations - def install_editable( - self, - install_options, # type: List[str] - global_options=(), # type: Sequence[str] - prefix=None # type: Optional[str] - ): - # type: (...) -> None - logger.info('Running setup.py develop for %s', self.name) - - if self.isolated: - global_options = list(global_options) + ["--no-user-cfg"] - - if prefix: - prefix_param = ['--prefix={}'.format(prefix)] - install_options = list(install_options) + prefix_param - - with indent_log(): - # FIXME: should we do --install-headers here too? - with self.build_env: - call_subprocess( - [ - sys.executable, - '-c', - SETUPTOOLS_SHIM % self.setup_py - ] + - list(global_options) + - ['develop', '--no-deps'] + - list(install_options), - - cwd=self.setup_py_dir, - ) - - self.install_succeeded = True - - def update_editable(self, obtain=True): - # type: (bool) -> None - if not self.link: - logger.debug( - "Cannot update repository at %s; repository location is " - "unknown", - self.source_dir, - ) - return - assert self.editable - assert self.source_dir - if self.link.scheme == 'file': - # Static paths don't get updated - return - assert '+' in self.link.url, "bad url: %r" % self.link.url - if not self.update: - return - vc_type, url = self.link.url.split('+', 1) - backend = vcs.get_backend(vc_type) - if backend: - vcs_backend = backend(self.link.url) - if obtain: - vcs_backend.obtain(self.source_dir) - else: - vcs_backend.export(self.source_dir) - else: - assert 0, ( - 'Unexpected version control type (in %s): %s' - % (self.link, vc_type)) - - # Top-level Actions - def uninstall(self, auto_confirm=False, verbose=False, - use_user_site=False): - # type: (bool, bool, bool) -> Optional[UninstallPathSet] - """ - Uninstall the distribution currently satisfying this requirement. - - Prompts before removing or modifying files unless - ``auto_confirm`` is True. - - Refuses to delete or modify files outside of ``sys.prefix`` - - thus uninstallation within a virtual environment can only - modify that virtual environment, even if the virtualenv is - linked to global site-packages. - - """ - if not self.check_if_exists(use_user_site): - logger.warning("Skipping %s as it is not installed.", self.name) - return None - dist = self.satisfied_by or self.conflicts_with - - uninstalled_pathset = UninstallPathSet.from_dist(dist) - uninstalled_pathset.remove(auto_confirm, verbose) - return uninstalled_pathset - - def _clean_zip_name(self, name, prefix): # only used by archive. - # type: (str, str) -> str - assert name.startswith(prefix + os.path.sep), ( - "name %r doesn't start with prefix %r" % (name, prefix) - ) - name = name[len(prefix) + 1:] - name = name.replace(os.path.sep, '/') - return name - - def _get_archive_name(self, path, parentdir, rootdir): - # type: (str, str, str) -> str - path = os.path.join(parentdir, path) - name = self._clean_zip_name(path, rootdir) - return self.name + '/' + name - - # TODO: Investigate if this should be kept in InstallRequirement - # Seems to be used only when VCS + downloads - def archive(self, build_dir): - # type: (str) -> None - assert self.source_dir - create_archive = True - archive_name = '%s-%s.zip' % (self.name, self.metadata["version"]) - archive_path = os.path.join(build_dir, archive_name) - if os.path.exists(archive_path): - response = ask_path_exists( - 'The file %s exists. (i)gnore, (w)ipe, (b)ackup, (a)bort ' % - display_path(archive_path), ('i', 'w', 'b', 'a')) - if response == 'i': - create_archive = False - elif response == 'w': - logger.warning('Deleting %s', display_path(archive_path)) - os.remove(archive_path) - elif response == 'b': - dest_file = backup_dir(archive_path) - logger.warning( - 'Backing up %s to %s', - display_path(archive_path), - display_path(dest_file), - ) - shutil.move(archive_path, dest_file) - elif response == 'a': - sys.exit(-1) - if create_archive: - zip = zipfile.ZipFile( - archive_path, 'w', zipfile.ZIP_DEFLATED, - allowZip64=True - ) - dir = os.path.normcase(os.path.abspath(self.setup_py_dir)) - for dirpath, dirnames, filenames in os.walk(dir): - if 'pip-egg-info' in dirnames: - dirnames.remove('pip-egg-info') - for dirname in dirnames: - dir_arcname = self._get_archive_name(dirname, - parentdir=dirpath, - rootdir=dir) - zipdir = zipfile.ZipInfo(dir_arcname + '/') - zipdir.external_attr = 0x1ED << 16 # 0o755 - zip.writestr(zipdir, '') - for filename in filenames: - if filename == PIP_DELETE_MARKER_FILENAME: - continue - file_arcname = self._get_archive_name(filename, - parentdir=dirpath, - rootdir=dir) - filename = os.path.join(dirpath, filename) - zip.write(filename, file_arcname) - zip.close() - logger.info('Saved %s', display_path(archive_path)) - - def install( - self, - install_options, # type: List[str] - global_options=None, # type: Optional[Sequence[str]] - root=None, # type: Optional[str] - home=None, # type: Optional[str] - prefix=None, # type: Optional[str] - warn_script_location=True, # type: bool - use_user_site=False, # type: bool - pycompile=True # type: bool - ): - # type: (...) -> None - global_options = global_options if global_options is not None else [] - if self.editable: - self.install_editable( - install_options, global_options, prefix=prefix, - ) - return - if self.is_wheel: - version = wheel.wheel_version(self.source_dir) - wheel.check_compatibility(version, self.name) - - self.move_wheel_files( - self.source_dir, root=root, prefix=prefix, home=home, - warn_script_location=warn_script_location, - use_user_site=use_user_site, pycompile=pycompile, - ) - self.install_succeeded = True - return - - # Extend the list of global and install options passed on to - # the setup.py call with the ones from the requirements file. - # Options specified in requirements file override those - # specified on the command line, since the last option given - # to setup.py is the one that is used. - global_options = list(global_options) + \ - self.options.get('global_options', []) - install_options = list(install_options) + \ - self.options.get('install_options', []) - - if self.isolated: - # https://github.com/python/mypy/issues/1174 - global_options = global_options + ["--no-user-cfg"] # type: ignore - - with TempDirectory(kind="record") as temp_dir: - record_filename = os.path.join(temp_dir.path, 'install-record.txt') - install_args = self.get_install_args( - global_options, record_filename, root, prefix, pycompile, - ) - msg = 'Running setup.py install for %s' % (self.name,) - with open_spinner(msg) as spinner: - with indent_log(): - with self.build_env: - call_subprocess( - install_args + install_options, - cwd=self.setup_py_dir, - spinner=spinner, - ) - - if not os.path.exists(record_filename): - logger.debug('Record file %s not found', record_filename) - return - self.install_succeeded = True - - def prepend_root(path): - # type: (str) -> str - if root is None or not os.path.isabs(path): - return path - else: - return change_root(root, path) - - with open(record_filename) as f: - for line in f: - directory = os.path.dirname(line) - if directory.endswith('.egg-info'): - egg_info_dir = prepend_root(directory) - break - else: - logger.warning( - 'Could not find .egg-info directory in install record' - ' for %s', - self, - ) - # FIXME: put the record somewhere - # FIXME: should this be an error? - return - new_lines = [] - with open(record_filename) as f: - for line in f: - filename = line.strip() - if os.path.isdir(filename): - filename += os.path.sep - new_lines.append( - os.path.relpath(prepend_root(filename), egg_info_dir) - ) - new_lines.sort() - ensure_dir(egg_info_dir) - inst_files_path = os.path.join(egg_info_dir, 'installed-files.txt') - with open(inst_files_path, 'w') as f: - f.write('\n'.join(new_lines) + '\n') - - def get_install_args( - self, - global_options, # type: Sequence[str] - record_filename, # type: str - root, # type: Optional[str] - prefix, # type: Optional[str] - pycompile # type: bool - ): - # type: (...) -> List[str] - install_args = [sys.executable, "-u"] - install_args.append('-c') - install_args.append(SETUPTOOLS_SHIM % self.setup_py) - install_args += list(global_options) + \ - ['install', '--record', record_filename] - install_args += ['--single-version-externally-managed'] - - if root is not None: - install_args += ['--root', root] - if prefix is not None: - install_args += ['--prefix', prefix] - - if pycompile: - install_args += ["--compile"] - else: - install_args += ["--no-compile"] - - if running_under_virtualenv(): - py_ver_str = 'python' + sysconfig.get_python_version() - install_args += ['--install-headers', - os.path.join(sys.prefix, 'include', 'site', - py_ver_str, self.name)] - - return install_args diff --git a/venv/lib/python2.7/site-packages/pip/_internal/req/req_install.pyc b/venv/lib/python2.7/site-packages/pip/_internal/req/req_install.pyc deleted file mode 100644 index 59aa79e6051223bb0d4b8a7c53610cae4fb10c55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32280 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 None - """Create a RequirementSet. - """ - - self.requirements = OrderedDict() # type: Dict[str, InstallRequirement] # noqa: E501 - self.require_hashes = require_hashes - self.check_supported_wheels = check_supported_wheels - - # Mapping of alias: real_name - self.requirement_aliases = {} # type: Dict[str, str] - self.unnamed_requirements = [] # type: List[InstallRequirement] - self.successfully_downloaded = [] # type: List[InstallRequirement] - self.reqs_to_cleanup = [] # type: List[InstallRequirement] - - def __str__(self): - # type: () -> str - reqs = [req for req in self.requirements.values() - if not req.comes_from] - reqs.sort(key=lambda req: req.name.lower()) - return ' '.join([str(req.req) for req in reqs]) - - def __repr__(self): - # type: () -> str - reqs = [req for req in self.requirements.values()] - reqs.sort(key=lambda req: req.name.lower()) - reqs_str = ', '.join([str(req.req) for req in reqs]) - return ('<%s object; %d requirement(s): %s>' - % (self.__class__.__name__, len(reqs), reqs_str)) - - def add_requirement( - self, - install_req, # type: InstallRequirement - parent_req_name=None, # type: Optional[str] - extras_requested=None # type: Optional[Iterable[str]] - ): - # type: (...) -> Tuple[List[InstallRequirement], Optional[InstallRequirement]] # noqa: E501 - """Add install_req as a requirement to install. - - :param parent_req_name: The name of the requirement that needed this - added. The name is used because when multiple unnamed requirements - resolve to the same name, we could otherwise end up with dependency - links that point outside the Requirements set. parent_req must - already be added. Note that None implies that this is a user - supplied requirement, vs an inferred one. - :param extras_requested: an iterable of extras used to evaluate the - environment markers. - :return: Additional requirements to scan. That is either [] if - the requirement is not applicable, or [install_req] if the - requirement is applicable and has just been added. - """ - name = install_req.name - - # If the markers do not match, ignore this requirement. - if not install_req.match_markers(extras_requested): - logger.info( - "Ignoring %s: markers '%s' don't match your environment", - name, install_req.markers, - ) - return [], None - - # If the wheel is not supported, raise an error. - # Should check this after filtering out based on environment markers to - # allow specifying different wheels based on the environment/OS, in a - # single requirements file. - if install_req.link and install_req.link.is_wheel: - wheel = Wheel(install_req.link.filename) - if self.check_supported_wheels and not wheel.supported(): - raise InstallationError( - "%s is not a supported wheel on this platform." % - wheel.filename - ) - - # This next bit is really a sanity check. - assert install_req.is_direct == (parent_req_name is None), ( - "a direct req shouldn't have a parent and also, " - "a non direct req should have a parent" - ) - - # Unnamed requirements are scanned again and the requirement won't be - # added as a dependency until after scanning. - if not name: - # url or path requirement w/o an egg fragment - self.unnamed_requirements.append(install_req) - return [install_req], None - - try: - existing_req = self.get_requirement(name) - except KeyError: - existing_req = None - - has_conflicting_requirement = ( - parent_req_name is None and - existing_req and - not existing_req.constraint and - existing_req.extras == install_req.extras and - existing_req.req.specifier != install_req.req.specifier - ) - if has_conflicting_requirement: - raise InstallationError( - "Double requirement given: %s (already in %s, name=%r)" - % (install_req, existing_req, name) - ) - - # When no existing requirement exists, add the requirement as a - # dependency and it will be scanned again after. - if not existing_req: - self.requirements[name] = install_req - # FIXME: what about other normalizations? E.g., _ vs. -? - if name.lower() != name: - self.requirement_aliases[name.lower()] = name - # We'd want to rescan this requirements later - return [install_req], install_req - - # Assume there's no need to scan, and that we've already - # encountered this for scanning. - if install_req.constraint or not existing_req.constraint: - return [], existing_req - - does_not_satisfy_constraint = ( - install_req.link and - not ( - existing_req.link and - install_req.link.path == existing_req.link.path - ) - ) - if does_not_satisfy_constraint: - self.reqs_to_cleanup.append(install_req) - raise InstallationError( - "Could not satisfy constraints for '%s': " - "installation from path or url cannot be " - "constrained to a version" % name, - ) - # If we're now installing a constraint, mark the existing - # object for real installation. - existing_req.constraint = False - existing_req.extras = tuple(sorted( - set(existing_req.extras) | set(install_req.extras) - )) - logger.debug( - "Setting %s extras to: %s", - existing_req, existing_req.extras, - ) - # Return the existing requirement for addition to the parent and - # scanning again. - return [existing_req], existing_req - - def has_requirement(self, project_name): - # type: (str) -> bool - name = project_name.lower() - if (name in self.requirements and - not self.requirements[name].constraint or - name in self.requirement_aliases and - not self.requirements[self.requirement_aliases[name]].constraint): - return True - return False - - def get_requirement(self, project_name): - # type: (str) -> InstallRequirement - for name in project_name, project_name.lower(): - if name in self.requirements: - return self.requirements[name] - if name in self.requirement_aliases: - return self.requirements[self.requirement_aliases[name]] - raise KeyError("No project with the name %r" % project_name) - - def cleanup_files(self): - # type: () -> None - """Clean up files, remove builds.""" - logger.debug('Cleaning up...') - with indent_log(): - for req in self.reqs_to_cleanup: - req.remove_temporary_source() diff --git a/venv/lib/python2.7/site-packages/pip/_internal/req/req_set.pyc b/venv/lib/python2.7/site-packages/pip/_internal/req/req_set.pyc deleted file mode 100644 index 8e059194a8d2ffbeefe6889b7f7fe4729b0f8dfb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6797 zcmc&(OLH5?5$***kl;h4#D_%Nu}6*-!7&ZmWk=;OiXuz$LnRw_mU7XCOW9gt2jqf_ zU2tbWiZ1ey$YWy%}oFxOSD28uezWHS5~bl+00Yo?7$d=~>GEB)iT~vOv8{)Vf5yMQSZlZ;4t< z)VoZr%hbCRtx#))yp%|nsJlvfjh=zns}#+WzD6C7qB;7O=o!&ht#u}U zyFL%rVtiEhP}oHj;jYP&fz?6W>u0%bx{*1Ie3nN#*U^KxZC&SObUsXt4U;6aah86N z=UMKCW-%0}kxp%pWP7gf3i>|%>hrIH`yYRB|54z7(QH0!e&oicFt)R=byDY=t)Sp@ z>3A4_%x3!&6^u4=K z^fu;bV*Nsby38v078LIw+6bp?jRf?wNw=5H8D5^+*jiM>3%u-a9${hLIb!MW? zaN@6o@BUq!_8}@()Nx7_cyx+iR7!M;UsTGh8Lm`l&sC;|mFlnpDm_cYge<6MVU zt58j{+L%?vPg98TMcb_Wd@Ld(GAcTP{m|@dW7jaJy|3E`ff@7}4>}5tSx?3;Pc9F_ zBn}Ohte}68reP0LC$_(e0W)Z~wK1JRlAHulcAO?z80komhsh?eSp2twy;A9BP%krOZ0@h)uOQ85+)7g>F&HnBW9BLdKw%KP#-z@mpwgPR z>Mc8nv8G25J43@ciIHj_Jee;bHi0Z$SI;A>EKA48stB^ChRC|dl`|j`{eVuDy3+(h zfR{r5X_-1@TH6-4-Sov>3=#J~q0VQo;9o-_P;~l0>w+xYe*s4~@Cm{UJJt9M9_!!i;dhieY8Dv1IOSl54&Zc%qGx|Lox(CB?l$|Wg_+`Re44zeKC%sA)dxZ`_$-m*TJd}{@qq2M6X_Z{r zU8eb>wjvCzFeOFLDs|VSQz{2#I-90baKGmdc) z8cPHfY?J@NLxqRexyKFNb}|8TSUME@GMT?Iu}o(Ech(6S!$I)yFBwGTdp?kT!V5gZ zRlvyn8PqgGxhnB#FP@Vla{!%H&Jk{3;)2oF_t3^KPhAo0 zC=RmF^9HPJHXLuvjzXoaewc?ng_5IK ztP9vsx76c(t+=MLjPMQ1XEF?v#B^<_W3AfRAc<6lf&4he-a3ucps$W&yRRbM zM^mTmlL_*YI6W|qgFfGoDjQf6M>qhx`(t-!6bD1+Wl&6=ms77J+T=tCMVy z15zW&m^ZN$_v4UgHA)s3)H;ERKq*H1NEAC+-fNi0SP`lS=~>${6 z5*V1ln#kAR0kvWhv|1}KdR2sX z3#HlWs&~a(L%r-RSFU-rYPGb4ezd#=Z?-&-d9#>tt;F-o-r7_ZqgYW|s4Qc=R;qdH z<*K*Dqv)$){tcPCP-!#h%Efp8E>8a%4Zi;6k;G-j98P$2P^ElB0vX))C0a)kJ&)HL zRC&BC<2%D~>ET&2E#F}%Z37v@+?TUPNkAOp*b9yk_c$MDe+ymX98nbC&ofR1BqR`E zT(tHWc;}q|A3?HvoG8tEi{52?*Sv~1k}+G8$e5o{o_@h%9!VN;-h(Ia7f%smfxj~p zC`7qkh`J=AcF{0)fT-pDVtsx4aG7>shDbKCZxN(MaC!37&@^ld%}f64i2Dqx#-$ilE6=K#Ni%&*{1N!*%&=>HuTfBmbY}{u6;Jm$r%G1 zC#F$sE5NZ#z<--$Px?68XZIox#FKO6;&c%Rn?*5M956>P{tOrVe&F-F0@A_f4}phk z-~;jUzYad%)vvCvHTx{V`}jL diff --git a/venv/lib/python2.7/site-packages/pip/_internal/req/req_tracker.py b/venv/lib/python2.7/site-packages/pip/_internal/req/req_tracker.py deleted file mode 100644 index e36a3f6..0000000 --- a/venv/lib/python2.7/site-packages/pip/_internal/req/req_tracker.py +++ /dev/null @@ -1,96 +0,0 @@ -from __future__ import absolute_import - -import contextlib -import errno -import hashlib -import logging -import os - -from pip._internal.utils.temp_dir import TempDirectory -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from types import TracebackType - from typing import Iterator, Optional, Set, Type - from pip._internal.req.req_install import InstallRequirement - from pip._internal.models.link import Link - -logger = logging.getLogger(__name__) - - -class RequirementTracker(object): - - def __init__(self): - # type: () -> None - self._root = os.environ.get('PIP_REQ_TRACKER') - if self._root is None: - self._temp_dir = TempDirectory(delete=False, kind='req-tracker') - self._temp_dir.create() - self._root = os.environ['PIP_REQ_TRACKER'] = self._temp_dir.path - logger.debug('Created requirements tracker %r', self._root) - else: - self._temp_dir = None - logger.debug('Re-using requirements tracker %r', self._root) - self._entries = set() # type: Set[InstallRequirement] - - def __enter__(self): - # type: () -> RequirementTracker - return self - - def __exit__( - self, - exc_type, # type: Optional[Type[BaseException]] - exc_val, # type: Optional[BaseException] - exc_tb # type: Optional[TracebackType] - ): - # type: (...) -> None - self.cleanup() - - def _entry_path(self, link): - # type: (Link) -> str - hashed = hashlib.sha224(link.url_without_fragment.encode()).hexdigest() - return os.path.join(self._root, hashed) - - def add(self, req): - # type: (InstallRequirement) -> None - link = req.link - info = str(req) - entry_path = self._entry_path(link) - try: - with open(entry_path) as fp: - # Error, these's already a build in progress. - raise LookupError('%s is already being built: %s' - % (link, fp.read())) - except IOError as e: - if e.errno != errno.ENOENT: - raise - assert req not in self._entries - with open(entry_path, 'w') as fp: - fp.write(info) - self._entries.add(req) - logger.debug('Added %s to build tracker %r', req, self._root) - - def remove(self, req): - # type: (InstallRequirement) -> None - link = req.link - self._entries.remove(req) - os.unlink(self._entry_path(link)) - logger.debug('Removed %s from build tracker %r', req, self._root) - - def cleanup(self): - # type: () -> None - for req in set(self._entries): - self.remove(req) - remove = self._temp_dir is not None - if remove: - self._temp_dir.cleanup() - logger.debug('%s build tracker %r', - 'Removed' if remove else 'Cleaned', - self._root) - - @contextlib.contextmanager - def track(self, req): - # type: (InstallRequirement) -> Iterator[None] - self.add(req) - yield - self.remove(req) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/req/req_tracker.pyc b/venv/lib/python2.7/site-packages/pip/_internal/req/req_tracker.pyc deleted file mode 100644 index cc9e4e54bf0e0ae98b645ef31dfc056a92b546c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4564 zcmd5jz6+Sb2VV8?o34vuraVXoW+9V~g6h*m|DusecLRntnfkf7(TvNkN1G76j zvzqBe;DU#kyyd~K`2+ba`6qeFORDk*{C%gFixRu?NPubja;E$A`M&=8Oy%Em(?9yt zjW2pK`KjRl+L}oDFH~aud6J3@J?VPlvF%IhOV`&i)GN}hoY$+;t)ACw(yg7>>(Z@j zy&~z93>(sIxVfs5Hf1<1-D&a6v=o0=tD2-UGMts}th1_1Iw!*$(!C+WdFjr}uqEA= z3~x&Jrn8um^p*@4q`TnS4M}gya8bI8;$`<=;Nd?J)0NDuKO0cKYg|J zDqR2F#`-5=@cT|@v-8_4uM|_)x8&hf~!t6ZajV$+%;!YtZ&F|tXXMX4ne+s0a& zslEEdB{s9tMrj(D*JG?dG?{fv(DHeb4J?hWjP79BfhjIP_A&hHHGupI6(htp7RG|O zdRhUfzE*%}MJs@_suf^a)5?^@b*(hSG^IZ+@f4ek@{9!AZEmecr}@gcX*3<Rz74rYKjx zJX$^eNwJ%~89aRQI{WBJ@%Tya=jG8a;xCJj@UuT!-B}$aqX&s2^#l9x)BSLZUHXJc zhSP!bu!1CgM-2MP+a$}6fOqb6k+%w94d*v_&s{f=VBYA2KlWjMtMHp5G|A}z0^e6c%)jR zo70$?qh4qsL5@#o971nMY8}|U?f^94Nf??V!b)G<{-=5j167fa!uS{!cjQl0PM{w+ z!cdex1w&4uAJG0fHG*Mk$cZmdg7YXb&>Dh+s60rMT@68b5IuVI*xtt2xJbh{i9N{2 zHry+seJZUBQ`XC4cdic1QJn0X(gp-0SmKn#sGlcUa1)g_y>+2ye@cC3sJW(zuRGLK zEj`=EA%)-}nkC&7|2IVd#yh^@!Yd>(!aqQW-{fx zoKj+4~>a`}E~dEDNV_fS5IW9U7s zZLZ_-6}fM>U=aKeg_BlW1V3hj@yk)%PRhC|iY!+a zZFF92basNf=(Hr@v$BMSBZ0Uyep4j4r^v!6jswbMaEFDGlkhrn(g5=6{Nu_=wwEKc zyl`yc=%Lrp-bnXru9>>Q6S&5wd=G^{=w~7O6>r|Jd&{WZ^6K6q$_20Gn9L1wU&`c7 zR4$lIR;YeBK6?lj1cbdH5eTI$_YiOB2wCjthYSQ!ONT##S4}q@JrlqwmhxI&VvevV!z3UQ&<(ZZY765HP<8$hZFi4BxnJVCd!+ zo|3X7{*reSr=kvcn)t8UPTKP6t-H@+S@S3v3RJuNO1pO8B3{5jy{w%IL{q List[str] - """Create the fully qualified name of the files created by - {console,gui}_scripts for the given ``dist``. - Returns the list of file names - """ - if dist_in_usersite(dist): - bin_dir = bin_user - else: - bin_dir = bin_py - exe_name = os.path.join(bin_dir, script_name) - paths_to_remove = [exe_name] - if WINDOWS: - paths_to_remove.append(exe_name + '.exe') - paths_to_remove.append(exe_name + '.exe.manifest') - if is_gui: - paths_to_remove.append(exe_name + '-script.pyw') - else: - paths_to_remove.append(exe_name + '-script.py') - return paths_to_remove - - -def _unique(fn): - # type: (Callable) -> Callable[..., Iterator[Any]] - @functools.wraps(fn) - def unique(*args, **kw): - # type: (Any, Any) -> Iterator[Any] - seen = set() # type: Set[Any] - for item in fn(*args, **kw): - if item not in seen: - seen.add(item) - yield item - return unique - - -@_unique -def uninstallation_paths(dist): - # type: (Distribution) -> Iterator[str] - """ - Yield all the uninstallation paths for dist based on RECORD-without-.py[co] - - Yield paths to all the files in RECORD. For each .py file in RECORD, add - the .pyc and .pyo in the same directory. - - UninstallPathSet.add() takes care of the __pycache__ .py[co]. - """ - r = csv.reader(FakeFile(dist.get_metadata_lines('RECORD'))) - for row in r: - path = os.path.join(dist.location, row[0]) - yield path - if path.endswith('.py'): - dn, fn = os.path.split(path) - base = fn[:-3] - path = os.path.join(dn, base + '.pyc') - yield path - path = os.path.join(dn, base + '.pyo') - yield path - - -def compact(paths): - # type: (Iterable[str]) -> Set[str] - """Compact a path set to contain the minimal number of paths - necessary to contain all paths in the set. If /a/path/ and - /a/path/to/a/file.txt are both in the set, leave only the - shorter path.""" - - sep = os.path.sep - short_paths = set() # type: Set[str] - for path in sorted(paths, key=len): - should_skip = any( - path.startswith(shortpath.rstrip("*")) and - path[len(shortpath.rstrip("*").rstrip(sep))] == sep - for shortpath in short_paths - ) - if not should_skip: - short_paths.add(path) - return short_paths - - -def compress_for_rename(paths): - # type: (Iterable[str]) -> Set[str] - """Returns a set containing the paths that need to be renamed. - - This set may include directories when the original sequence of paths - included every file on disk. - """ - case_map = dict((os.path.normcase(p), p) for p in paths) - remaining = set(case_map) - unchecked = sorted(set(os.path.split(p)[0] - for p in case_map.values()), key=len) - wildcards = set() # type: Set[str] - - def norm_join(*a): - # type: (str) -> str - return os.path.normcase(os.path.join(*a)) - - for root in unchecked: - if any(os.path.normcase(root).startswith(w) - for w in wildcards): - # This directory has already been handled. - continue - - all_files = set() # type: Set[str] - all_subdirs = set() # type: Set[str] - for dirname, subdirs, files in os.walk(root): - all_subdirs.update(norm_join(root, dirname, d) - for d in subdirs) - all_files.update(norm_join(root, dirname, f) - for f in files) - # If all the files we found are in our remaining set of files to - # remove, then remove them from the latter set and add a wildcard - # for the directory. - if not (all_files - remaining): - remaining.difference_update(all_files) - wildcards.add(root + os.sep) - - return set(map(case_map.__getitem__, remaining)) | wildcards - - -def compress_for_output_listing(paths): - # type: (Iterable[str]) -> Tuple[Set[str], Set[str]] - """Returns a tuple of 2 sets of which paths to display to user - - The first set contains paths that would be deleted. Files of a package - are not added and the top-level directory of the package has a '*' added - at the end - to signify that all it's contents are removed. - - The second set contains files that would have been skipped in the above - folders. - """ - - will_remove = set(paths) - will_skip = set() - - # Determine folders and files - folders = set() - files = set() - for path in will_remove: - if path.endswith(".pyc"): - continue - if path.endswith("__init__.py") or ".dist-info" in path: - folders.add(os.path.dirname(path)) - files.add(path) - - # probably this one https://github.com/python/mypy/issues/390 - _normcased_files = set(map(os.path.normcase, files)) # type: ignore - - folders = compact(folders) - - # This walks the tree using os.walk to not miss extra folders - # that might get added. - for folder in folders: - for dirpath, _, dirfiles in os.walk(folder): - for fname in dirfiles: - if fname.endswith(".pyc"): - continue - - file_ = os.path.join(dirpath, fname) - if (os.path.isfile(file_) and - os.path.normcase(file_) not in _normcased_files): - # We are skipping this file. Add it to the set. - will_skip.add(file_) - - will_remove = files | { - os.path.join(folder, "*") for folder in folders - } - - return will_remove, will_skip - - -class StashedUninstallPathSet(object): - """A set of file rename operations to stash files while - tentatively uninstalling them.""" - def __init__(self): - # type: () -> None - # Mapping from source file root to [Adjacent]TempDirectory - # for files under that directory. - self._save_dirs = {} # type: Dict[str, TempDirectory] - # (old path, new path) tuples for each move that may need - # to be undone. - self._moves = [] # type: List[Tuple[str, str]] - - def _get_directory_stash(self, path): - # type: (str) -> str - """Stashes a directory. - - Directories are stashed adjacent to their original location if - possible, or else moved/copied into the user's temp dir.""" - - try: - save_dir = AdjacentTempDirectory(path) # type: TempDirectory - save_dir.create() - except OSError: - save_dir = TempDirectory(kind="uninstall") - save_dir.create() - self._save_dirs[os.path.normcase(path)] = save_dir - - return save_dir.path - - def _get_file_stash(self, path): - # type: (str) -> str - """Stashes a file. - - If no root has been provided, one will be created for the directory - in the user's temp directory.""" - path = os.path.normcase(path) - head, old_head = os.path.dirname(path), None - save_dir = None - - while head != old_head: - try: - save_dir = self._save_dirs[head] - break - except KeyError: - pass - head, old_head = os.path.dirname(head), head - else: - # Did not find any suitable root - head = os.path.dirname(path) - save_dir = TempDirectory(kind='uninstall') - save_dir.create() - self._save_dirs[head] = save_dir - - relpath = os.path.relpath(path, head) - if relpath and relpath != os.path.curdir: - return os.path.join(save_dir.path, relpath) - return save_dir.path - - def stash(self, path): - # type: (str) -> str - """Stashes the directory or file and returns its new location. - """ - if os.path.isdir(path): - new_path = self._get_directory_stash(path) - else: - new_path = self._get_file_stash(path) - - self._moves.append((path, new_path)) - if os.path.isdir(path) and os.path.isdir(new_path): - # If we're moving a directory, we need to - # remove the destination first or else it will be - # moved to inside the existing directory. - # We just created new_path ourselves, so it will - # be removable. - os.rmdir(new_path) - renames(path, new_path) - return new_path - - def commit(self): - # type: () -> None - """Commits the uninstall by removing stashed files.""" - for _, save_dir in self._save_dirs.items(): - save_dir.cleanup() - self._moves = [] - self._save_dirs = {} - - def rollback(self): - # type: () -> None - """Undoes the uninstall by moving stashed files back.""" - for p in self._moves: - logging.info("Moving to %s\n from %s", *p) - - for new_path, path in self._moves: - try: - logger.debug('Replacing %s from %s', new_path, path) - if os.path.isfile(new_path): - os.unlink(new_path) - elif os.path.isdir(new_path): - rmtree(new_path) - renames(path, new_path) - except OSError as ex: - logger.error("Failed to restore %s", new_path) - logger.debug("Exception: %s", ex) - - self.commit() - - @property - def can_rollback(self): - # type: () -> bool - return bool(self._moves) - - -class UninstallPathSet(object): - """A set of file paths to be removed in the uninstallation of a - requirement.""" - def __init__(self, dist): - # type: (Distribution) -> None - self.paths = set() # type: Set[str] - self._refuse = set() # type: Set[str] - self.pth = {} # type: Dict[str, UninstallPthEntries] - self.dist = dist - self._moved_paths = StashedUninstallPathSet() - - def _permitted(self, path): - # type: (str) -> bool - """ - Return True if the given path is one we are permitted to - remove/modify, False otherwise. - - """ - return is_local(path) - - def add(self, path): - # type: (str) -> None - head, tail = os.path.split(path) - - # we normalize the head to resolve parent directory symlinks, but not - # the tail, since we only want to uninstall symlinks, not their targets - path = os.path.join(normalize_path(head), os.path.normcase(tail)) - - if not os.path.exists(path): - return - if self._permitted(path): - self.paths.add(path) - else: - self._refuse.add(path) - - # __pycache__ files can show up after 'installed-files.txt' is created, - # due to imports - if os.path.splitext(path)[1] == '.py' and uses_pycache: - self.add(cache_from_source(path)) - - def add_pth(self, pth_file, entry): - # type: (str, str) -> None - pth_file = normalize_path(pth_file) - if self._permitted(pth_file): - if pth_file not in self.pth: - self.pth[pth_file] = UninstallPthEntries(pth_file) - self.pth[pth_file].add(entry) - else: - self._refuse.add(pth_file) - - def remove(self, auto_confirm=False, verbose=False): - # type: (bool, bool) -> None - """Remove paths in ``self.paths`` with confirmation (unless - ``auto_confirm`` is True).""" - - if not self.paths: - logger.info( - "Can't uninstall '%s'. No files were found to uninstall.", - self.dist.project_name, - ) - return - - dist_name_version = ( - self.dist.project_name + "-" + self.dist.version - ) - logger.info('Uninstalling %s:', dist_name_version) - - with indent_log(): - if auto_confirm or self._allowed_to_proceed(verbose): - moved = self._moved_paths - - for_rename = compress_for_rename(self.paths) - - for path in sorted(compact(for_rename)): - moved.stash(path) - logger.debug('Removing file or directory %s', path) - - for pth in self.pth.values(): - pth.remove() - - logger.info('Successfully uninstalled %s', dist_name_version) - - def _allowed_to_proceed(self, verbose): - # type: (bool) -> bool - """Display which files would be deleted and prompt for confirmation - """ - - def _display(msg, paths): - # type: (str, Iterable[str]) -> None - if not paths: - return - - logger.info(msg) - with indent_log(): - for path in sorted(compact(paths)): - logger.info(path) - - if not verbose: - will_remove, will_skip = compress_for_output_listing(self.paths) - else: - # In verbose mode, display all the files that are going to be - # deleted. - will_remove = set(self.paths) - will_skip = set() - - _display('Would remove:', will_remove) - _display('Would not remove (might be manually added):', will_skip) - _display('Would not remove (outside of prefix):', self._refuse) - if verbose: - _display('Will actually move:', compress_for_rename(self.paths)) - - return ask('Proceed (y/n)? ', ('y', 'n')) == 'y' - - def rollback(self): - # type: () -> None - """Rollback the changes previously made by remove().""" - if not self._moved_paths.can_rollback: - logger.error( - "Can't roll back %s; was not uninstalled", - self.dist.project_name, - ) - return - logger.info('Rolling back uninstall of %s', self.dist.project_name) - self._moved_paths.rollback() - for pth in self.pth.values(): - pth.rollback() - - def commit(self): - # type: () -> None - """Remove temporary save dir: rollback will no longer be possible.""" - self._moved_paths.commit() - - @classmethod - def from_dist(cls, dist): - # type: (Distribution) -> UninstallPathSet - dist_path = normalize_path(dist.location) - if not dist_is_local(dist): - logger.info( - "Not uninstalling %s at %s, outside environment %s", - dist.key, - dist_path, - sys.prefix, - ) - return cls(dist) - - if dist_path in {p for p in {sysconfig.get_path("stdlib"), - sysconfig.get_path("platstdlib")} - if p}: - logger.info( - "Not uninstalling %s at %s, as it is in the standard library.", - dist.key, - dist_path, - ) - return cls(dist) - - paths_to_remove = cls(dist) - develop_egg_link = egg_link_path(dist) - develop_egg_link_egg_info = '{}.egg-info'.format( - pkg_resources.to_filename(dist.project_name)) - egg_info_exists = dist.egg_info and os.path.exists(dist.egg_info) - # Special case for distutils installed package - distutils_egg_info = getattr(dist._provider, 'path', None) - - # Uninstall cases order do matter as in the case of 2 installs of the - # same package, pip needs to uninstall the currently detected version - if (egg_info_exists and dist.egg_info.endswith('.egg-info') and - not dist.egg_info.endswith(develop_egg_link_egg_info)): - # if dist.egg_info.endswith(develop_egg_link_egg_info), we - # are in fact in the develop_egg_link case - paths_to_remove.add(dist.egg_info) - if dist.has_metadata('installed-files.txt'): - for installed_file in dist.get_metadata( - 'installed-files.txt').splitlines(): - path = os.path.normpath( - os.path.join(dist.egg_info, installed_file) - ) - paths_to_remove.add(path) - # FIXME: need a test for this elif block - # occurs with --single-version-externally-managed/--record outside - # of pip - elif dist.has_metadata('top_level.txt'): - if dist.has_metadata('namespace_packages.txt'): - namespaces = dist.get_metadata('namespace_packages.txt') - else: - namespaces = [] - for top_level_pkg in [ - p for p - in dist.get_metadata('top_level.txt').splitlines() - if p and p not in namespaces]: - path = os.path.join(dist.location, top_level_pkg) - paths_to_remove.add(path) - paths_to_remove.add(path + '.py') - paths_to_remove.add(path + '.pyc') - paths_to_remove.add(path + '.pyo') - - elif distutils_egg_info: - raise UninstallationError( - "Cannot uninstall {!r}. It is a distutils installed project " - "and thus we cannot accurately determine which files belong " - "to it which would lead to only a partial uninstall.".format( - dist.project_name, - ) - ) - - elif dist.location.endswith('.egg'): - # package installed by easy_install - # We cannot match on dist.egg_name because it can slightly vary - # i.e. setuptools-0.6c11-py2.6.egg vs setuptools-0.6rc11-py2.6.egg - paths_to_remove.add(dist.location) - easy_install_egg = os.path.split(dist.location)[1] - easy_install_pth = os.path.join(os.path.dirname(dist.location), - 'easy-install.pth') - paths_to_remove.add_pth(easy_install_pth, './' + easy_install_egg) - - elif egg_info_exists and dist.egg_info.endswith('.dist-info'): - for path in uninstallation_paths(dist): - paths_to_remove.add(path) - - elif develop_egg_link: - # develop egg - with open(develop_egg_link, 'r') as fh: - link_pointer = os.path.normcase(fh.readline().strip()) - assert (link_pointer == dist.location), ( - 'Egg-link %s does not match installed location of %s ' - '(at %s)' % (link_pointer, dist.project_name, dist.location) - ) - paths_to_remove.add(develop_egg_link) - easy_install_pth = os.path.join(os.path.dirname(develop_egg_link), - 'easy-install.pth') - paths_to_remove.add_pth(easy_install_pth, dist.location) - - else: - logger.debug( - 'Not sure how to uninstall: %s - Check: %s', - dist, dist.location, - ) - - # find distutils scripts= scripts - if dist.has_metadata('scripts') and dist.metadata_isdir('scripts'): - for script in dist.metadata_listdir('scripts'): - if dist_in_usersite(dist): - bin_dir = bin_user - else: - bin_dir = bin_py - paths_to_remove.add(os.path.join(bin_dir, script)) - if WINDOWS: - paths_to_remove.add(os.path.join(bin_dir, script) + '.bat') - - # find console_scripts - _scripts_to_remove = [] - console_scripts = dist.get_entry_map(group='console_scripts') - for name in console_scripts.keys(): - _scripts_to_remove.extend(_script_names(dist, name, False)) - # find gui_scripts - gui_scripts = dist.get_entry_map(group='gui_scripts') - for name in gui_scripts.keys(): - _scripts_to_remove.extend(_script_names(dist, name, True)) - - for s in _scripts_to_remove: - paths_to_remove.add(s) - - return paths_to_remove - - -class UninstallPthEntries(object): - def __init__(self, pth_file): - # type: (str) -> None - if not os.path.isfile(pth_file): - raise UninstallationError( - "Cannot remove entries from nonexistent file %s" % pth_file - ) - self.file = pth_file - self.entries = set() # type: Set[str] - self._saved_lines = None # type: Optional[List[bytes]] - - def add(self, entry): - # type: (str) -> None - entry = os.path.normcase(entry) - # On Windows, os.path.normcase converts the entry to use - # backslashes. This is correct for entries that describe absolute - # paths outside of site-packages, but all the others use forward - # slashes. - if WINDOWS and not os.path.splitdrive(entry)[0]: - entry = entry.replace('\\', '/') - self.entries.add(entry) - - def remove(self): - # type: () -> None - logger.debug('Removing pth entries from %s:', self.file) - with open(self.file, 'rb') as fh: - # windows uses '\r\n' with py3k, but uses '\n' with py2.x - lines = fh.readlines() - self._saved_lines = lines - if any(b'\r\n' in line for line in lines): - endline = '\r\n' - else: - endline = '\n' - # handle missing trailing newline - if lines and not lines[-1].endswith(endline.encode("utf-8")): - lines[-1] = lines[-1] + endline.encode("utf-8") - for entry in self.entries: - try: - logger.debug('Removing entry: %s', entry) - lines.remove((entry + endline).encode("utf-8")) - except ValueError: - pass - with open(self.file, 'wb') as fh: - fh.writelines(lines) - - def rollback(self): - # type: () -> bool - if self._saved_lines is None: - logger.error( - 'Cannot roll back changes to %s, none were made', self.file - ) - return False - logger.debug('Rolling %s back to previous state', self.file) - with open(self.file, 'wb') as fh: - fh.writelines(self._saved_lines) - return True diff --git a/venv/lib/python2.7/site-packages/pip/_internal/req/req_uninstall.pyc b/venv/lib/python2.7/site-packages/pip/_internal/req/req_uninstall.pyc deleted file mode 100644 index acdfce65c56524916ec36b82388f265acda372ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23635 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 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/resolve.py b/venv/lib/python2.7/site-packages/pip/_internal/resolve.py deleted file mode 100644 index f49667b..0000000 --- a/venv/lib/python2.7/site-packages/pip/_internal/resolve.py +++ /dev/null @@ -1,393 +0,0 @@ -"""Dependency Resolution - -The dependency resolution in pip is performed as follows: - -for top-level requirements: - a. only one spec allowed per project, regardless of conflicts or not. - otherwise a "double requirement" exception is raised - b. they override sub-dependency requirements. -for sub-dependencies - a. "first found, wins" (where the order is breadth first) -""" - -import logging -from collections import defaultdict -from itertools import chain - -from pip._internal.exceptions import ( - BestVersionAlreadyInstalled, DistributionNotFound, HashError, HashErrors, - UnsupportedPythonVersion, -) -from pip._internal.req.constructors import install_req_from_req_string -from pip._internal.utils.logging import indent_log -from pip._internal.utils.misc import dist_in_usersite, ensure_dir -from pip._internal.utils.packaging import check_dist_requires_python -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import Optional, DefaultDict, List, Set - from pip._internal.download import PipSession - from pip._internal.req.req_install import InstallRequirement - from pip._internal.index import PackageFinder - from pip._internal.req.req_set import RequirementSet - from pip._internal.operations.prepare import ( - DistAbstraction, RequirementPreparer - ) - from pip._internal.cache import WheelCache - -logger = logging.getLogger(__name__) - - -class Resolver(object): - """Resolves which packages need to be installed/uninstalled to perform \ - the requested operation without breaking the requirements of any package. - """ - - _allowed_strategies = {"eager", "only-if-needed", "to-satisfy-only"} - - def __init__( - self, - preparer, # type: RequirementPreparer - session, # type: PipSession - finder, # type: PackageFinder - wheel_cache, # type: Optional[WheelCache] - use_user_site, # type: bool - ignore_dependencies, # type: bool - ignore_installed, # type: bool - ignore_requires_python, # type: bool - force_reinstall, # type: bool - isolated, # type: bool - upgrade_strategy, # type: str - use_pep517=None # type: Optional[bool] - ): - # type: (...) -> None - super(Resolver, self).__init__() - assert upgrade_strategy in self._allowed_strategies - - self.preparer = preparer - self.finder = finder - self.session = session - - # NOTE: This would eventually be replaced with a cache that can give - # information about both sdist and wheels transparently. - self.wheel_cache = wheel_cache - - # This is set in resolve - self.require_hashes = None # type: Optional[bool] - - self.upgrade_strategy = upgrade_strategy - self.force_reinstall = force_reinstall - self.isolated = isolated - self.ignore_dependencies = ignore_dependencies - self.ignore_installed = ignore_installed - self.ignore_requires_python = ignore_requires_python - self.use_user_site = use_user_site - self.use_pep517 = use_pep517 - - self._discovered_dependencies = \ - defaultdict(list) # type: DefaultDict[str, List] - - def resolve(self, requirement_set): - # type: (RequirementSet) -> None - """Resolve what operations need to be done - - As a side-effect of this method, the packages (and their dependencies) - are downloaded, unpacked and prepared for installation. This - preparation is done by ``pip.operations.prepare``. - - Once PyPI has static dependency metadata available, it would be - possible to move the preparation to become a step separated from - dependency resolution. - """ - # make the wheelhouse - if self.preparer.wheel_download_dir: - ensure_dir(self.preparer.wheel_download_dir) - - # If any top-level requirement has a hash specified, enter - # hash-checking mode, which requires hashes from all. - root_reqs = ( - requirement_set.unnamed_requirements + - list(requirement_set.requirements.values()) - ) - self.require_hashes = ( - requirement_set.require_hashes or - any(req.has_hash_options for req in root_reqs) - ) - - # Display where finder is looking for packages - locations = self.finder.get_formatted_locations() - if locations: - logger.info(locations) - - # Actually prepare the files, and collect any exceptions. Most hash - # exceptions cannot be checked ahead of time, because - # req.populate_link() needs to be called before we can make decisions - # based on link type. - discovered_reqs = [] # type: List[InstallRequirement] - hash_errors = HashErrors() - for req in chain(root_reqs, discovered_reqs): - try: - discovered_reqs.extend( - self._resolve_one(requirement_set, req) - ) - except HashError as exc: - exc.req = req - hash_errors.append(exc) - - if hash_errors: - raise hash_errors - - def _is_upgrade_allowed(self, req): - # type: (InstallRequirement) -> bool - if self.upgrade_strategy == "to-satisfy-only": - return False - elif self.upgrade_strategy == "eager": - return True - else: - assert self.upgrade_strategy == "only-if-needed" - return req.is_direct - - def _set_req_to_reinstall(self, req): - # type: (InstallRequirement) -> None - """ - Set a requirement to be installed. - """ - # Don't uninstall the conflict if doing a user install and the - # conflict is not a user install. - if not self.use_user_site or dist_in_usersite(req.satisfied_by): - req.conflicts_with = req.satisfied_by - req.satisfied_by = None - - # XXX: Stop passing requirement_set for options - def _check_skip_installed(self, req_to_install): - # type: (InstallRequirement) -> Optional[str] - """Check if req_to_install should be skipped. - - This will check if the req is installed, and whether we should upgrade - or reinstall it, taking into account all the relevant user options. - - After calling this req_to_install will only have satisfied_by set to - None if the req_to_install is to be upgraded/reinstalled etc. Any - other value will be a dist recording the current thing installed that - satisfies the requirement. - - Note that for vcs urls and the like we can't assess skipping in this - routine - we simply identify that we need to pull the thing down, - then later on it is pulled down and introspected to assess upgrade/ - reinstalls etc. - - :return: A text reason for why it was skipped, or None. - """ - if self.ignore_installed: - return None - - req_to_install.check_if_exists(self.use_user_site) - if not req_to_install.satisfied_by: - return None - - if self.force_reinstall: - self._set_req_to_reinstall(req_to_install) - return None - - if not self._is_upgrade_allowed(req_to_install): - if self.upgrade_strategy == "only-if-needed": - return 'already satisfied, skipping upgrade' - return 'already satisfied' - - # Check for the possibility of an upgrade. For link-based - # requirements we have to pull the tree down and inspect to assess - # the version #, so it's handled way down. - if not req_to_install.link: - try: - self.finder.find_requirement(req_to_install, upgrade=True) - except BestVersionAlreadyInstalled: - # Then the best version is installed. - return 'already up-to-date' - except DistributionNotFound: - # No distribution found, so we squash the error. It will - # be raised later when we re-try later to do the install. - # Why don't we just raise here? - pass - - self._set_req_to_reinstall(req_to_install) - return None - - def _get_abstract_dist_for(self, req): - # type: (InstallRequirement) -> DistAbstraction - """Takes a InstallRequirement and returns a single AbstractDist \ - representing a prepared variant of the same. - """ - assert self.require_hashes is not None, ( - "require_hashes should have been set in Resolver.resolve()" - ) - - if req.editable: - return self.preparer.prepare_editable_requirement( - req, self.require_hashes, self.use_user_site, self.finder, - ) - - # satisfied_by is only evaluated by calling _check_skip_installed, - # so it must be None here. - assert req.satisfied_by is None - skip_reason = self._check_skip_installed(req) - - if req.satisfied_by: - return self.preparer.prepare_installed_requirement( - req, self.require_hashes, skip_reason - ) - - upgrade_allowed = self._is_upgrade_allowed(req) - abstract_dist = self.preparer.prepare_linked_requirement( - req, self.session, self.finder, upgrade_allowed, - self.require_hashes - ) - - # NOTE - # The following portion is for determining if a certain package is - # going to be re-installed/upgraded or not and reporting to the user. - # This should probably get cleaned up in a future refactor. - - # req.req is only avail after unpack for URL - # pkgs repeat check_if_exists to uninstall-on-upgrade - # (#14) - if not self.ignore_installed: - req.check_if_exists(self.use_user_site) - - if req.satisfied_by: - should_modify = ( - self.upgrade_strategy != "to-satisfy-only" or - self.force_reinstall or - self.ignore_installed or - req.link.scheme == 'file' - ) - if should_modify: - self._set_req_to_reinstall(req) - else: - logger.info( - 'Requirement already satisfied (use --upgrade to upgrade):' - ' %s', req, - ) - - return abstract_dist - - def _resolve_one( - self, - requirement_set, # type: RequirementSet - req_to_install # type: InstallRequirement - ): - # type: (...) -> List[InstallRequirement] - """Prepare a single requirements file. - - :return: A list of additional InstallRequirements to also install. - """ - # Tell user what we are doing for this requirement: - # obtain (editable), skipping, processing (local url), collecting - # (remote url or package name) - if req_to_install.constraint or req_to_install.prepared: - return [] - - req_to_install.prepared = True - - # register tmp src for cleanup in case something goes wrong - requirement_set.reqs_to_cleanup.append(req_to_install) - - abstract_dist = self._get_abstract_dist_for(req_to_install) - - # Parse and return dependencies - dist = abstract_dist.dist() - try: - check_dist_requires_python(dist) - except UnsupportedPythonVersion as err: - if self.ignore_requires_python: - logger.warning(err.args[0]) - else: - raise - - more_reqs = [] # type: List[InstallRequirement] - - def add_req(subreq, extras_requested): - sub_install_req = install_req_from_req_string( - str(subreq), - req_to_install, - isolated=self.isolated, - wheel_cache=self.wheel_cache, - use_pep517=self.use_pep517 - ) - parent_req_name = req_to_install.name - to_scan_again, add_to_parent = requirement_set.add_requirement( - sub_install_req, - parent_req_name=parent_req_name, - extras_requested=extras_requested, - ) - if parent_req_name and add_to_parent: - self._discovered_dependencies[parent_req_name].append( - add_to_parent - ) - more_reqs.extend(to_scan_again) - - with indent_log(): - # We add req_to_install before its dependencies, so that we - # can refer to it when adding dependencies. - if not requirement_set.has_requirement(req_to_install.name): - # 'unnamed' requirements will get added here - req_to_install.is_direct = True - requirement_set.add_requirement( - req_to_install, parent_req_name=None, - ) - - if not self.ignore_dependencies: - if req_to_install.extras: - logger.debug( - "Installing extra requirements: %r", - ','.join(req_to_install.extras), - ) - missing_requested = sorted( - set(req_to_install.extras) - set(dist.extras) - ) - for missing in missing_requested: - logger.warning( - '%s does not provide the extra \'%s\'', - dist, missing - ) - - available_requested = sorted( - set(dist.extras) & set(req_to_install.extras) - ) - for subreq in dist.requires(available_requested): - add_req(subreq, extras_requested=available_requested) - - if not req_to_install.editable and not req_to_install.satisfied_by: - # XXX: --no-install leads this to report 'Successfully - # downloaded' for only non-editable reqs, even though we took - # action on them. - requirement_set.successfully_downloaded.append(req_to_install) - - return more_reqs - - def get_installation_order(self, req_set): - # type: (RequirementSet) -> List[InstallRequirement] - """Create the installation order. - - The installation order is topological - requirements are installed - before the requiring thing. We break cycles at an arbitrary point, - and make no other guarantees. - """ - # The current implementation, which we may change at any point - # installs the user specified things in the order given, except when - # dependencies must come earlier to achieve topological order. - order = [] - ordered_reqs = set() # type: Set[InstallRequirement] - - def schedule(req): - if req.satisfied_by or req in ordered_reqs: - return - if req.constraint: - return - ordered_reqs.add(req) - for dep in self._discovered_dependencies[req.name]: - schedule(dep) - order.append(req) - - for install_req in req_set.requirements.values(): - schedule(install_req) - return order diff --git a/venv/lib/python2.7/site-packages/pip/_internal/resolve.pyc b/venv/lib/python2.7/site-packages/pip/_internal/resolve.pyc deleted file mode 100644 index eb6968b1974ce78f40c2dac9ffa5e6bbc97d6024..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11222 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 R=Bv(S{;&U5%4fg>{ttks@!$Xe diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/__init__.py b/venv/lib/python2.7/site-packages/pip/_internal/utils/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/__init__.pyc deleted file mode 100644 index 778974b2b0f1ba7ab3a0801d38fdda705eca7ed8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 198 zcmZ9GK?=e!5Je-p5JAsTggPxsP!RC~ilAEwv56%Z)0m{S?aniM0jJ{15AT0?o0#!D1*`-7zz~_o7pA|@#gwoh*HZ< I_nAk?2U)5y@&Et; diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/appdirs.py b/venv/lib/python2.7/site-packages/pip/_internal/utils/appdirs.py deleted file mode 100644 index fb26111..0000000 --- a/venv/lib/python2.7/site-packages/pip/_internal/utils/appdirs.py +++ /dev/null @@ -1,268 +0,0 @@ -""" -This code was taken from https://github.com/ActiveState/appdirs and modified -to suit our purposes. -""" -from __future__ import absolute_import - -import os -import sys - -from pip._vendor.six import PY2, text_type - -from pip._internal.utils.compat import WINDOWS, expanduser -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import List - - -def user_cache_dir(appname): - # type: (str) -> str - r""" - Return full path to the user-specific cache dir for this application. - - "appname" is the name of application. - - Typical user cache directories are: - macOS: ~/Library/Caches/ - Unix: ~/.cache/ (XDG default) - Windows: C:\Users\\AppData\Local\\Cache - - On Windows the only suggestion in the MSDN docs is that local settings go - in the `CSIDL_LOCAL_APPDATA` directory. This is identical to the - non-roaming app data dir (the default returned by `user_data_dir`). Apps - typically put cache data somewhere *under* the given dir here. Some - examples: - ...\Mozilla\Firefox\Profiles\\Cache - ...\Acme\SuperApp\Cache\1.0 - - OPINION: This function appends "Cache" to the `CSIDL_LOCAL_APPDATA` value. - """ - if WINDOWS: - # Get the base path - path = os.path.normpath(_get_win_folder("CSIDL_LOCAL_APPDATA")) - - # When using Python 2, return paths as bytes on Windows like we do on - # other operating systems. See helper function docs for more details. - if PY2 and isinstance(path, text_type): - path = _win_path_to_bytes(path) - - # Add our app name and Cache directory to it - path = os.path.join(path, appname, "Cache") - elif sys.platform == "darwin": - # Get the base path - path = expanduser("~/Library/Caches") - - # Add our app name to it - path = os.path.join(path, appname) - else: - # Get the base path - path = os.getenv("XDG_CACHE_HOME", expanduser("~/.cache")) - - # Add our app name to it - path = os.path.join(path, appname) - - return path - - -def user_data_dir(appname, roaming=False): - # type: (str, bool) -> str - r""" - Return full path to the user-specific data dir for this application. - - "appname" is the name of application. - If None, just the system directory is returned. - "roaming" (boolean, default False) can be set True to use the Windows - roaming appdata directory. That means that for users on a Windows - network setup for roaming profiles, this user data will be - sync'd on login. See - - for a discussion of issues. - - Typical user data directories are: - macOS: ~/Library/Application Support/ - if it exists, else ~/.config/ - Unix: ~/.local/share/ # or in - $XDG_DATA_HOME, if defined - Win XP (not roaming): C:\Documents and Settings\\ ... - ...Application Data\ - Win XP (roaming): C:\Documents and Settings\\Local ... - ...Settings\Application Data\ - Win 7 (not roaming): C:\\Users\\AppData\Local\ - Win 7 (roaming): C:\\Users\\AppData\Roaming\ - - For Unix, we follow the XDG spec and support $XDG_DATA_HOME. - That means, by default "~/.local/share/". - """ - if WINDOWS: - const = roaming and "CSIDL_APPDATA" or "CSIDL_LOCAL_APPDATA" - path = os.path.join(os.path.normpath(_get_win_folder(const)), appname) - elif sys.platform == "darwin": - path = os.path.join( - expanduser('~/Library/Application Support/'), - appname, - ) if os.path.isdir(os.path.join( - expanduser('~/Library/Application Support/'), - appname, - ) - ) else os.path.join( - expanduser('~/.config/'), - appname, - ) - else: - path = os.path.join( - os.getenv('XDG_DATA_HOME', expanduser("~/.local/share")), - appname, - ) - - return path - - -def user_config_dir(appname, roaming=True): - # type: (str, bool) -> str - """Return full path to the user-specific config dir for this application. - - "appname" is the name of application. - If None, just the system directory is returned. - "roaming" (boolean, default True) can be set False to not use the - Windows roaming appdata directory. That means that for users on a - Windows network setup for roaming profiles, this user data will be - sync'd on login. See - - for a discussion of issues. - - Typical user data directories are: - macOS: same as user_data_dir - Unix: ~/.config/ - Win *: same as user_data_dir - - For Unix, we follow the XDG spec and support $XDG_CONFIG_HOME. - That means, by default "~/.config/". - """ - if WINDOWS: - path = user_data_dir(appname, roaming=roaming) - elif sys.platform == "darwin": - path = user_data_dir(appname) - else: - path = os.getenv('XDG_CONFIG_HOME', expanduser("~/.config")) - path = os.path.join(path, appname) - - return path - - -# for the discussion regarding site_config_dirs locations -# see -def site_config_dirs(appname): - # type: (str) -> List[str] - r"""Return a list of potential user-shared config dirs for this application. - - "appname" is the name of application. - - Typical user config directories are: - macOS: /Library/Application Support// - Unix: /etc or $XDG_CONFIG_DIRS[i]// for each value in - $XDG_CONFIG_DIRS - Win XP: C:\Documents and Settings\All Users\Application ... - ...Data\\ - Vista: (Fail! "C:\ProgramData" is a hidden *system* directory - on Vista.) - Win 7: Hidden, but writeable on Win 7: - C:\ProgramData\\ - """ - if WINDOWS: - path = os.path.normpath(_get_win_folder("CSIDL_COMMON_APPDATA")) - pathlist = [os.path.join(path, appname)] - elif sys.platform == 'darwin': - pathlist = [os.path.join('/Library/Application Support', appname)] - else: - # try looking in $XDG_CONFIG_DIRS - xdg_config_dirs = os.getenv('XDG_CONFIG_DIRS', '/etc/xdg') - if xdg_config_dirs: - pathlist = [ - os.path.join(expanduser(x), appname) - for x in xdg_config_dirs.split(os.pathsep) - ] - else: - pathlist = [] - - # always look in /etc directly as well - pathlist.append('/etc') - - return pathlist - - -# -- Windows support functions -- - -def _get_win_folder_from_registry(csidl_name): - # type: (str) -> str - """ - This is a fallback technique at best. I'm not sure if using the - registry for this guarantees us the correct answer for all CSIDL_* - names. - """ - import _winreg - - shell_folder_name = { - "CSIDL_APPDATA": "AppData", - "CSIDL_COMMON_APPDATA": "Common AppData", - "CSIDL_LOCAL_APPDATA": "Local AppData", - }[csidl_name] - - key = _winreg.OpenKey( - _winreg.HKEY_CURRENT_USER, - r"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" - ) - directory, _type = _winreg.QueryValueEx(key, shell_folder_name) - return directory - - -def _get_win_folder_with_ctypes(csidl_name): - # type: (str) -> str - csidl_const = { - "CSIDL_APPDATA": 26, - "CSIDL_COMMON_APPDATA": 35, - "CSIDL_LOCAL_APPDATA": 28, - }[csidl_name] - - buf = ctypes.create_unicode_buffer(1024) - ctypes.windll.shell32.SHGetFolderPathW(None, csidl_const, None, 0, buf) - - # Downgrade to short path name if have highbit chars. See - # . - has_high_char = False - for c in buf: - if ord(c) > 255: - has_high_char = True - break - if has_high_char: - buf2 = ctypes.create_unicode_buffer(1024) - if ctypes.windll.kernel32.GetShortPathNameW(buf.value, buf2, 1024): - buf = buf2 - - return buf.value - - -if WINDOWS: - try: - import ctypes - _get_win_folder = _get_win_folder_with_ctypes - except ImportError: - _get_win_folder = _get_win_folder_from_registry - - -def _win_path_to_bytes(path): - """Encode Windows paths to bytes. Only used on Python 2. - - Motivation is to be consistent with other operating systems where paths - are also returned as bytes. This avoids problems mixing bytes and Unicode - elsewhere in the codebase. For more details and discussion see - . - - If encoding using ASCII and MBCS fails, return the original Unicode path. - """ - for encoding in ('ASCII', 'MBCS'): - try: - return path.encode(encoding) - except (UnicodeEncodeError, LookupError): - pass - return path diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/appdirs.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/appdirs.pyc deleted file mode 100644 index 8d6c13ade048d1326949b7cd14b1541d5a25a87d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9403 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 (3, 4): - uses_pycache = True - from importlib.util import cache_from_source -else: - import imp - - try: - cache_from_source = imp.cache_from_source # type: ignore - except AttributeError: - # does not use __pycache__ - cache_from_source = None - - uses_pycache = cache_from_source is not None - - -if sys.version_info >= (3, 5): - backslashreplace_decode = "backslashreplace" -else: - # In version 3.4 and older, backslashreplace exists - # but does not support use for decoding. - # We implement our own replace handler for this - # situation, so that we can consistently use - # backslash replacement for all versions. - def backslashreplace_decode_fn(err): - raw_bytes = (err.object[i] for i in range(err.start, err.end)) - if sys.version_info[0] == 2: - # Python 2 gave us characters - convert to numeric bytes - raw_bytes = (ord(b) for b in raw_bytes) - return u"".join(u"\\x%x" % c for c in raw_bytes), err.end - codecs.register_error( - "backslashreplace_decode", - backslashreplace_decode_fn, - ) - backslashreplace_decode = "backslashreplace_decode" - - -def console_to_str(data): - # type: (bytes) -> Text - """Return a string, safe for output, of subprocess output. - - We assume the data is in the locale preferred encoding. - If it won't decode properly, we warn the user but decode as - best we can. - - We also ensure that the output can be safely written to - standard output without encoding errors. - """ - - # First, get the encoding we assume. This is the preferred - # encoding for the locale, unless that is not found, or - # it is ASCII, in which case assume UTF-8 - encoding = locale.getpreferredencoding() - if (not encoding) or codecs.lookup(encoding).name == "ascii": - encoding = "utf-8" - - # Now try to decode the data - if we fail, warn the user and - # decode with replacement. - try: - decoded_data = data.decode(encoding) - except UnicodeDecodeError: - logger.warning( - "Subprocess output does not appear to be encoded as %s", - encoding, - ) - decoded_data = data.decode(encoding, errors=backslashreplace_decode) - - # Make sure we can print the output, by encoding it to the output - # encoding with replacement of unencodable characters, and then - # decoding again. - # We use stderr's encoding because it's less likely to be - # redirected and if we don't find an encoding we skip this - # step (on the assumption that output is wrapped by something - # that won't fail). - # The double getattr is to deal with the possibility that we're - # being called in a situation where sys.__stderr__ doesn't exist, - # or doesn't have an encoding attribute. Neither of these cases - # should occur in normal pip use, but there's no harm in checking - # in case people use pip in (unsupported) unusual situations. - output_encoding = getattr(getattr(sys, "__stderr__", None), - "encoding", None) - - if output_encoding: - output_encoded = decoded_data.encode( - output_encoding, - errors="backslashreplace" - ) - decoded_data = output_encoded.decode(output_encoding) - - return decoded_data - - -if sys.version_info >= (3,): - def native_str(s, replace=False): - # type: (str, bool) -> str - if isinstance(s, bytes): - return s.decode('utf-8', 'replace' if replace else 'strict') - return s - -else: - def native_str(s, replace=False): - # type: (str, bool) -> str - # Replace is ignored -- unicode to UTF-8 can't fail - if isinstance(s, text_type): - return s.encode('utf-8') - return s - - -def get_path_uid(path): - # type: (str) -> int - """ - Return path's uid. - - Does not follow symlinks: - https://github.com/pypa/pip/pull/935#discussion_r5307003 - - Placed this function in compat due to differences on AIX and - Jython, that should eventually go away. - - :raises OSError: When path is a symlink or can't be read. - """ - if hasattr(os, 'O_NOFOLLOW'): - fd = os.open(path, os.O_RDONLY | os.O_NOFOLLOW) - file_uid = os.fstat(fd).st_uid - os.close(fd) - else: # AIX and Jython - # WARNING: time of check vulnerability, but best we can do w/o NOFOLLOW - if not os.path.islink(path): - # older versions of Jython don't have `os.fstat` - file_uid = os.stat(path).st_uid - else: - # raise OSError for parity with os.O_NOFOLLOW above - raise OSError( - "%s is a symlink; Will not return uid for symlinks" % path - ) - return file_uid - - -if sys.version_info >= (3, 4): - from importlib.machinery import EXTENSION_SUFFIXES - - def get_extension_suffixes(): - return EXTENSION_SUFFIXES -else: - from imp import get_suffixes - - def get_extension_suffixes(): - return [suffix[0] for suffix in get_suffixes()] - - -def expanduser(path): - # type: (str) -> str - """ - Expand ~ and ~user constructions. - - Includes a workaround for https://bugs.python.org/issue14768 - """ - expanded = os.path.expanduser(path) - if path.startswith('~/') and expanded.startswith('//'): - expanded = expanded[1:] - return expanded - - -# packages in the stdlib that may have installation metadata, but should not be -# considered 'installed'. this theoretically could be determined based on -# dist.location (py27:`sysconfig.get_paths()['stdlib']`, -# py26:sysconfig.get_config_vars('LIBDEST')), but fear platform variation may -# make this ineffective, so hard-coding -stdlib_pkgs = {"python", "wsgiref", "argparse"} - - -# windows detection, covers cpython and ironpython -WINDOWS = (sys.platform.startswith("win") or - (sys.platform == 'cli' and os.name == 'nt')) - - -def samefile(file1, file2): - # type: (str, str) -> bool - """Provide an alternative for os.path.samefile on Windows/Python2""" - if hasattr(os.path, 'samefile'): - return os.path.samefile(file1, file2) - else: - path1 = os.path.normcase(os.path.abspath(file1)) - path2 = os.path.normcase(os.path.abspath(file2)) - return path1 == path2 - - -if hasattr(shutil, 'get_terminal_size'): - def get_terminal_size(): - # type: () -> Tuple[int, int] - """ - Returns a tuple (x, y) representing the width(x) and the height(y) - in characters of the terminal window. - """ - return tuple(shutil.get_terminal_size()) # type: ignore -else: - def get_terminal_size(): - # type: () -> Tuple[int, int] - """ - Returns a tuple (x, y) representing the width(x) and the height(y) - in characters of the terminal window. - """ - def ioctl_GWINSZ(fd): - try: - import fcntl - import termios - import struct - cr = struct.unpack_from( - 'hh', - fcntl.ioctl(fd, termios.TIOCGWINSZ, '12345678') - ) - except Exception: - return None - if cr == (0, 0): - return None - return cr - cr = ioctl_GWINSZ(0) or ioctl_GWINSZ(1) or ioctl_GWINSZ(2) - if not cr: - try: - fd = os.open(os.ctermid(), os.O_RDONLY) - cr = ioctl_GWINSZ(fd) - os.close(fd) - except Exception: - pass - if not cr: - cr = (os.environ.get('LINES', 25), os.environ.get('COLUMNS', 80)) - return int(cr[1]), int(cr[0]) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/compat.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/compat.pyc deleted file mode 100644 index 510688cb5cabafb4f96c637b0d2873e8d7a5befa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8638 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 Xy>pexvB~+_F?i3_$-}eW^u+%H*DvKo diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/deprecation.py b/venv/lib/python2.7/site-packages/pip/_internal/utils/deprecation.py deleted file mode 100644 index 8c896f8..0000000 --- a/venv/lib/python2.7/site-packages/pip/_internal/utils/deprecation.py +++ /dev/null @@ -1,93 +0,0 @@ -""" -A module that implements tooling to enable easy warnings about deprecations. -""" -from __future__ import absolute_import - -import logging -import warnings - -from pip._vendor.packaging.version import parse - -from pip import __version__ as current_version -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import Any, Optional - - -DEPRECATION_MSG_PREFIX = "DEPRECATION: " - - -class PipDeprecationWarning(Warning): - pass - - -_original_showwarning = None # type: Any - - -# Warnings <-> Logging Integration -def _showwarning(message, category, filename, lineno, file=None, line=None): - if file is not None: - if _original_showwarning is not None: - _original_showwarning( - message, category, filename, lineno, file, line, - ) - elif issubclass(category, PipDeprecationWarning): - # We use a specially named logger which will handle all of the - # deprecation messages for pip. - logger = logging.getLogger("pip._internal.deprecations") - logger.warning(message) - else: - _original_showwarning( - message, category, filename, lineno, file, line, - ) - - -def install_warning_logger(): - # type: () -> None - # Enable our Deprecation Warnings - warnings.simplefilter("default", PipDeprecationWarning, append=True) - - global _original_showwarning - - if _original_showwarning is None: - _original_showwarning = warnings.showwarning - warnings.showwarning = _showwarning - - -def deprecated(reason, replacement, gone_in, issue=None): - # type: (str, Optional[str], Optional[str], Optional[int]) -> None - """Helper to deprecate existing functionality. - - reason: - Textual reason shown to the user about why this functionality has - been deprecated. - replacement: - Textual suggestion shown to the user about what alternative - functionality they can use. - gone_in: - The version of pip does this functionality should get removed in. - Raises errors if pip's current version is greater than or equal to - this. - issue: - Issue number on the tracker that would serve as a useful place for - users to find related discussion and provide feedback. - - Always pass replacement, gone_in and issue as keyword arguments for clarity - at the call site. - """ - - # Construct a nice message. - # This is purposely eagerly formatted as we want it to appear as if someone - # typed this entire message out. - message = DEPRECATION_MSG_PREFIX + reason - if replacement is not None: - message += " A possible replacement is {}.".format(replacement) - if issue is not None: - url = "https://github.com/pypa/pip/issues/" + str(issue) - message += " You can find discussion regarding this at {}.".format(url) - - # Raise as an error if it has to be removed. - if gone_in is not None and parse(current_version) >= parse(gone_in): - raise PipDeprecationWarning(message) - warnings.warn(message, category=PipDeprecationWarning, stacklevel=2) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/deprecation.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/deprecation.pyc deleted file mode 100644 index 4d1f4cc8cc2e2a0af3d21878f5cb7c0e15c570e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3408 zcmc&$>uwuG6h3P^PU0j@3N%$vfe|2KP;0jWwGa?$XiFPG-D*=*VhL7b@7UR7y}O;6 zb?TB-qU{UtBD@9Sfp`JFGrP52Rq(e?Jf7>heCJyIXRYzs?`MALQ~9al_xg1r^EW0T zQ5T~}VTEFkMiuH-$m4aD;wp8k?hNx9b!%>3qj-Tvb?VlOdkYjV(rAgg%f-4*af3!H z)LkJ@t&l!-uNEm@rO_I7*JyNxx@X8sz!tC8DO@JCK?AUC&2dn>^oZo`Ei=gQ2k_MroMGO4tKwMKsD{HByN+!lr2)B}4oQ zmB=1$C}}3*Sn34ZM#x^8TM?>EtG={RnwVB20!3qQ_P?8`~;^MD|AxjYbOiz9B%sPDJ8ebV%KA| zpI1mLvNbwfVBdW1(P^Dd>U4+^{^!9rxBiUBgD2B6-lw~C0{whhGNWAYRyjL7L@-shpLoQ%fA?Q3j?_q5?e8^kH zU)8%%S+A~p8+t>)6CjANIe&_91MG_~ zFfY0w_2|&W975_EjsY^lvb^zYX&da|`26XDdr@^S5Vf-xFk(UT4-O{l&M-lYRr zY3w6#YrK5sF%#JDaLJLw{W^t+@;Xi{9tiC@E1JKMU+$>zPOg0x3^~sX|44T`Pc)$Du$f0xY9+tU?hb1zCp7myy9krFE)}h#aj?jOgcD zqef4e0IVUAdiKETMSY?<-u0u#z73CB!ogSL<&V1nSO4#x(kWzOsC^0RAQi1*aMr= zTXy1OIWZzbO2^BoDKCl=Uia3C&O#ii$#JSfA@wjX+7-wlP!Kfy&&dO0vL<~LRbe7q z+RD6-2oyUaOCb>VG;^#3VEpa0Wj?}{18Xz0-EI#fdyw~9{dCmMCYf|K*$H9VhT~oA zr@8Y6r}3PoS`DQRUH`;ZhcqDVZ*cr`nnSVgAH`~{;)qLkr|Hrj=a#u9Cb+wIJ3veG z{qE02TI4(eJx9{ICdgRra}VQstoJYJ%W zyn!^wp5b#N=h)>sp5@>-m3|q#Y5obfu_}t)Rs+Ru6W#&tN9;du&;MDu2pN< zNru-xKX9OzYqo~Z==vY<2@CkJ=t~Qeu_F|fkiEfYvHVXl%%Fdx<&W#zH$@lxEvsfO cV5p Text - """Check a bytes string for a BOM to correctly detect the encoding - - Fallback to locale.getpreferredencoding(False) like open() on Python3""" - for bom, encoding in BOMS: - if data.startswith(bom): - return data[len(bom):].decode(encoding) - # Lets check the first two lines as in PEP263 - for line in data.split(b'\n')[:2]: - if line[0:1] == b'#' and ENCODING_RE.search(line): - encoding = ENCODING_RE.search(line).groups()[0].decode('ascii') - return data.decode(encoding) - return data.decode( - locale.getpreferredencoding(False) or sys.getdefaultencoding(), - ) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/encoding.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/encoding.pyc deleted file mode 100644 index 2b66969c062c6d3b3ef08a12772ec249f0e7f416..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1649 zcmc&z-EP}96h4ytA17(j?ymz@ZM#uA*lz5>$ck+knz-Ar#7&hHLERXJEYda|T2e{6 zv5Vwl=&tr?yVwitG4=r4A!E62vHMZx@pleClIM@k-|MCOzixCxSd0Sx|A15eg@WME z0uInwVhcJ}YPX?dr`UmxW3UZ81CuOtvS86H2x_bj@ElC?(8^ zQ10lMPP}!DkNtzA?O6!bHj1O?$IpBFKehIM>G{vv?VsB}dX8Sppg3ewsVsuiX~L;7 zozj_-+B8*z%AU+E&~8%}m$1^Os~V?ETBE*PXw+9}s3Gk`JR*zAe%C#h_q`XD z^UG@YtDR8$t6kD_AE*2i#q1#{fP-!w&TY81;M#^O%&Y}hmX2TKwW`o))O%wGu57(< z@-h!+Gj7Nkof@WP=vas93X9MSN?4cz`*QRzx0FeC0D z7HE3(Nat}Fa9SNwl?XbZxR<14 z4|$UAxSU;3H%@5e?YME|9?#V%jv7+uy~J#k3@0$tH(GpY8Y7S)W2Uc6cc6DC7#xP7 z0-@w3QzPY|%4wu@s}PDFQnOPgoGFYSpw-@ga)5o;^IL`_X&}OpfkP2b6KUX02O(b|o8$yj758q^_A$C3^^=9{ZEMr|)V^zdf!~&u zv%C+`YSN_h8%lpe>$+-!`db>`MS*u#m-ki8eN{D2u(^C(z1hFeb%lMs-`C|c*}>ZO zo}E74Q~IGVl-;H(uWG$Vt@jLvtyO-bzPj9~zsEvf@AE9_# nkN>YI1@z bool - # If we don't have a way to check the effective uid of this process, then - # we'll just assume that we own the directory. - if not hasattr(os, "geteuid"): - return True - - previous = None - while path != previous: - if os.path.lexists(path): - # Check if path is writable by current user. - if os.geteuid() == 0: - # Special handling for root user in order to handle properly - # cases where users use sudo without -H flag. - try: - path_uid = get_path_uid(path) - except OSError: - return False - return path_uid == 0 - else: - return os.access(path, os.W_OK) - else: - previous, path = path, os.path.dirname(path) - return False # assume we don't own the path diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/filesystem.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/filesystem.pyc deleted file mode 100644 index f2f87783c87285f8b52f563d962772a80209d8fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 912 zcmc&y!EVz)5S?8+p@f7)LE?bQ-9l>I3W%swAtVGBM2g}{L6uNs>}|63#&&i$X;P8{ z3O@k%U3G5cf_bW8>99@bJ0|jt?i`fn4 zpg2rCIQM|19(=i zZ}%Xpfi8hDX757uam9BBA}U#!=7(MVted NZrjjp)mfdlyuZy5&~*R+ diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/glibc.py b/venv/lib/python2.7/site-packages/pip/_internal/utils/glibc.py deleted file mode 100644 index 5bea655..0000000 --- a/venv/lib/python2.7/site-packages/pip/_internal/utils/glibc.py +++ /dev/null @@ -1,93 +0,0 @@ -from __future__ import absolute_import - -import ctypes -import re -import warnings - -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import Optional, Tuple - - -def glibc_version_string(): - # type: () -> Optional[str] - "Returns glibc version string, or None if not using glibc." - - # ctypes.CDLL(None) internally calls dlopen(NULL), and as the dlopen - # manpage says, "If filename is NULL, then the returned handle is for the - # main program". This way we can let the linker do the work to figure out - # which libc our process is actually using. - process_namespace = ctypes.CDLL(None) - try: - gnu_get_libc_version = process_namespace.gnu_get_libc_version - except AttributeError: - # Symbol doesn't exist -> therefore, we are not linked to - # glibc. - return None - - # Call gnu_get_libc_version, which returns a string like "2.5" - gnu_get_libc_version.restype = ctypes.c_char_p - version_str = gnu_get_libc_version() - # py2 / py3 compatibility: - if not isinstance(version_str, str): - version_str = version_str.decode("ascii") - - return version_str - - -# Separated out from have_compatible_glibc for easier unit testing -def check_glibc_version(version_str, required_major, minimum_minor): - # type: (str, int, int) -> bool - # Parse string and check against requested version. - # - # We use a regexp instead of str.split because we want to discard any - # random junk that might come after the minor version -- this might happen - # in patched/forked versions of glibc (e.g. Linaro's version of glibc - # uses version strings like "2.20-2014.11"). See gh-3588. - m = re.match(r"(?P[0-9]+)\.(?P[0-9]+)", version_str) - if not m: - warnings.warn("Expected glibc version with 2 components major.minor," - " got: %s" % version_str, RuntimeWarning) - return False - return (int(m.group("major")) == required_major and - int(m.group("minor")) >= minimum_minor) - - -def have_compatible_glibc(required_major, minimum_minor): - # type: (int, int) -> bool - version_str = glibc_version_string() # type: Optional[str] - if version_str is None: - return False - return check_glibc_version(version_str, required_major, minimum_minor) - - -# platform.libc_ver regularly returns completely nonsensical glibc -# versions. E.g. on my computer, platform says: -# -# ~$ python2.7 -c 'import platform; print(platform.libc_ver())' -# ('glibc', '2.7') -# ~$ python3.5 -c 'import platform; print(platform.libc_ver())' -# ('glibc', '2.9') -# -# But the truth is: -# -# ~$ ldd --version -# ldd (Debian GLIBC 2.22-11) 2.22 -# -# This is unfortunate, because it means that the linehaul data on libc -# versions that was generated by pip 8.1.2 and earlier is useless and -# misleading. Solution: instead of using platform, use our code that actually -# works. -def libc_ver(): - # type: () -> Tuple[str, str] - """Try to determine the glibc version - - Returns a tuple of strings (lib, version) which default to empty strings - in case the lookup fails. - """ - glibc_version = glibc_version_string() - if glibc_version is None: - return ("", "") - else: - return ("glibc", glibc_version) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/glibc.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/glibc.pyc deleted file mode 100644 index c946e0fb5a33f34f0f4f976ac2321e16d822a370..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2406 zcmc&#ZEqVz5T3nr96K*f8lX}rh(iM5Kw_tWB7#Z@3I!@!6J3Hz4b|y#x3(|7x9;xc zrAj`a@QsiBRQ>?Z?Ahh*2jpbW&Cc%a&OGzXto!Hk!iT@!dLGgAaq!;TBhtS^iSZMZ z5@mu0f&`BpN*x+Fb`H8r19zr3Xwa~_OX(bCO&T;w$R?@CS{szkQ`VwEi?TKi+9Y!9 zH%Gq_4HhVFT4j;qd8;f@+_K6tpLy76!=D6y>Iew40udhTBCU)JlB_J0>DM!Bn0fN- z;90Q$-NXIw1OLZ<|55+j4hLph5I>YADe^Eia~K>|Wh!m(E=FwG-$U>dD2C`n@Y&ab zu81y{=@J%~t^_^J*Qj9{G+7|EO+pCv@F)IYjxGfSO_tY0R}PtZx`b@ewL^Nu`bnEX zcK!%XTjjHJ)I znnj4|$pK>QU`SSIaE^MVN=`!~d#9o54U04e8oih2y^BxOaeg+rxAP+3-cg_KM4##N z-T0;2#xp8=N4+vBx2#)fx@GP?83hMyvi~5-ja0~fuQExhdlu(zc~K+sPbkFGuTjHQXX2cQ97i9g)rAwFeHW}m|wc@b-4swAx zfwUb0F)TQlr`Tm$;0N|h94aEt;&ckj>nVpO_@={D?d$g-J6|5$&%%>JJ@|QhYxns_ z8^3g|Darpf=`XPG;dv<|Bjf*&>nt&2?_)12P(-=RjrQzr-HbQb^hSmG+@z+dpxkr@~hk=nS5GL+E2a-Q(bchnX#6UDyp)>sQRlA z_CqCKREd&tP zD None - """ - :param hashes: A dict of algorithm names pointing to lists of allowed - hex digests - """ - self._allowed = {} if hashes is None else hashes - - def check_against_chunks(self, chunks): - # type: (Iterator[bytes]) -> None - """Check good hashes against ones built from iterable of chunks of - data. - - Raise HashMismatch if none match. - - """ - gots = {} - for hash_name in iterkeys(self._allowed): - try: - gots[hash_name] = hashlib.new(hash_name) - except (ValueError, TypeError): - raise InstallationError('Unknown hash name: %s' % hash_name) - - for chunk in chunks: - for hash in itervalues(gots): - hash.update(chunk) - - for hash_name, got in iteritems(gots): - if got.hexdigest() in self._allowed[hash_name]: - return - self._raise(gots) - - def _raise(self, gots): - # type: (Dict[str, _Hash]) -> NoReturn - raise HashMismatch(self._allowed, gots) - - def check_against_file(self, file): - # type: (BinaryIO) -> None - """Check good hashes against a file-like object - - Raise HashMismatch if none match. - - """ - return self.check_against_chunks(read_chunks(file)) - - def check_against_path(self, path): - # type: (str) -> None - with open(path, 'rb') as file: - return self.check_against_file(file) - - def __nonzero__(self): - # type: () -> bool - """Return whether I know any known-good hashes.""" - return bool(self._allowed) - - def __bool__(self): - # type: () -> bool - return self.__nonzero__() - - -class MissingHashes(Hashes): - """A workalike for Hashes used when we're missing a hash for a requirement - - It computes the actual hash of the requirement and raises a HashMissing - exception showing it to the user. - - """ - def __init__(self): - # type: () -> None - """Don't offer the ``hashes`` kwarg.""" - # Pass our favorite hash in to generate a "gotten hash". With the - # empty list, it will never match, so an error will always raise. - super(MissingHashes, self).__init__(hashes={FAVORITE_HASH: []}) - - def _raise(self, gots): - # type: (Dict[str, _Hash]) -> NoReturn - raise HashMissing(gots[FAVORITE_HASH].hexdigest()) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/hashes.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/hashes.pyc deleted file mode 100644 index 6491e8dc571e7cbcf24c6a8ee552636f489a8b79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5026 zcmd5<+j1Mn5$#<7O90|cq)3Ujl8kdH!LE?d&5WaRrAS>OvK&Fmk~YOHE34)109ax# z;LboK74jjb-}4dvk-X<0Qk8GW52U*X7rLCh2>g~L%IOo z0;G%JEkb$&yc=eAm91C;ZwY5FLGgE24Ix-8^S#^_D86M>tc(^R9(X+*0R7SRk}Lt_2jA2^3WV6{zluSfzmuyZYKhq2jEg zuVa5ZQ#weJK*xFZtSIur7(qh|8AN{A9b`Ralw|0O{a5?`ldWe@zVO{ITdnQZ^F{^L zx{S@!IMgisAy%60dmLv$ak~AIJFVQ6dQfEC*~W7OdbAxK@74YTvkk51li`=TUF>QH zU#MS#{H*nr76eJJ`5rc%jDk1Y*gk_n+fRRG< zMI{y-h{`NXK~!M@2Rkg(Aev&K4(?8aBBBCpHpOuf^!u_9x*KS5Fo=^#iFA?YcJe$DCYW_rhjft9^JD|J{TV9G z@H7_ms!%Ktgt8K8&d`0V-)YbUm1Dze(DIM^K@p@wgC2=Z5n<3o-WEa9$q`xIRAfPl zw)XQl(})tGbCF;?l^K-e$1)nPMk{vZ2`t;dHSF@$c}sW){nBg>&3(M@H2Jt+vt69 z7k{08bGO-#`>W(m+;3Iid(rVSUhAJ43-NWVeg6*buE=%Z zu-m6lqKDo7PZZGA=QfKn0}7FgFVt;8_u+t zlPDq8H*{u#sbDycKy1K@NJf+p(6wk6c`AsRf&&CQg2}K3N@GMsfezLTlnFF$5GyIR zFfB&xB;vNna81Enb!n(tLNmV1I4>Bt4A4j7SE|(@igPJa?lLy$B>=KAi4QcLAd|<; zj9(EeGP^N{?wIDHxz>9uQ!NGhs?wrx3h=n`QvMb5ao6Y z`4p>>gUQ8__hshNLR{#WY$SyB1KoAWAwM#wkX^fImLem;Ua&&q7<%Yr?3Ni6F5f0Y zko_9frfL$$U5Uj)A-1_hz#8K8a;;#f1oOw;``)g-~SWJLl$W@=%mAXf^Grd=R3&v z(>xj^)TK=J{U{H8-=)jVU7?1PT#!V_c2}vP&?D%8oT% zt=+1XYqeUXR?!4syvgaaf-dz-1vrK6@dnNlD15H~$Lbr4?$W6GE>l5GRH6Qc4HndS z(F>SA+j+sI0@fP?B_qm&OdQKQ1r`ftPZ5~PfJO$QkVk{Kkg3duq`R#}n5TXGpyGmC z1fd=TiJ5}c3Z~WNIb5FeWsep6s79faaWNxLLfNOUC84_cF%`(MrW%zUvp539^yv?5#QoMa@vi$8^ z(K`-`&YF7*N3|NnDqL%*0e*qF53$RT;;8(7^Q)Kc_UqN53)JY@9UwKh&4Wokl>A8q*`#_~7X8m4&2#gC?4zrUIpp-=mm zhi;Wt;iXKUN_dy95|wWAt#U?CiQPThBRBp6&2TrgCHM-?0|$#fnpzD=lyS8!z^$KmY&$ diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/logging.py b/venv/lib/python2.7/site-packages/pip/_internal/utils/logging.py deleted file mode 100644 index a28e88c..0000000 --- a/venv/lib/python2.7/site-packages/pip/_internal/utils/logging.py +++ /dev/null @@ -1,371 +0,0 @@ -from __future__ import absolute_import - -import contextlib -import errno -import logging -import logging.handlers -import os -import sys -from logging import Filter - -from pip._vendor.six import PY2 - -from pip._internal.utils.compat import WINDOWS -from pip._internal.utils.deprecation import DEPRECATION_MSG_PREFIX -from pip._internal.utils.misc import ensure_dir, subprocess_logger - -try: - import threading -except ImportError: - import dummy_threading as threading # type: ignore - - -try: - from pip._vendor import colorama -# Lots of different errors can come from this, including SystemError and -# ImportError. -except Exception: - colorama = None - - -_log_state = threading.local() -_log_state.indentation = 0 - - -class BrokenStdoutLoggingError(Exception): - """ - Raised if BrokenPipeError occurs for the stdout stream while logging. - """ - pass - - -# BrokenPipeError does not exist in Python 2 and, in addition, manifests -# differently in Windows and non-Windows. -if WINDOWS: - # In Windows, a broken pipe can show up as EINVAL rather than EPIPE: - # https://bugs.python.org/issue19612 - # https://bugs.python.org/issue30418 - if PY2: - def _is_broken_pipe_error(exc_class, exc): - """See the docstring for non-Windows Python 3 below.""" - return (exc_class is IOError and - exc.errno in (errno.EINVAL, errno.EPIPE)) - else: - # In Windows, a broken pipe IOError became OSError in Python 3. - def _is_broken_pipe_error(exc_class, exc): - """See the docstring for non-Windows Python 3 below.""" - return ((exc_class is BrokenPipeError) or # noqa: F821 - (exc_class is OSError and - exc.errno in (errno.EINVAL, errno.EPIPE))) -elif PY2: - def _is_broken_pipe_error(exc_class, exc): - """See the docstring for non-Windows Python 3 below.""" - return (exc_class is IOError and exc.errno == errno.EPIPE) -else: - # Then we are in the non-Windows Python 3 case. - def _is_broken_pipe_error(exc_class, exc): - """ - Return whether an exception is a broken pipe error. - - Args: - exc_class: an exception class. - exc: an exception instance. - """ - return (exc_class is BrokenPipeError) # noqa: F821 - - -@contextlib.contextmanager -def indent_log(num=2): - """ - A context manager which will cause the log output to be indented for any - log messages emitted inside it. - """ - _log_state.indentation += num - try: - yield - finally: - _log_state.indentation -= num - - -def get_indentation(): - return getattr(_log_state, 'indentation', 0) - - -class IndentingFormatter(logging.Formatter): - def __init__(self, *args, **kwargs): - """ - A logging.Formatter that obeys the indent_log() context manager. - - :param add_timestamp: A bool indicating output lines should be prefixed - with their record's timestamp. - """ - self.add_timestamp = kwargs.pop("add_timestamp", False) - super(IndentingFormatter, self).__init__(*args, **kwargs) - - def get_message_start(self, formatted, levelno): - """ - Return the start of the formatted log message (not counting the - prefix to add to each line). - """ - if levelno < logging.WARNING: - return '' - if formatted.startswith(DEPRECATION_MSG_PREFIX): - # Then the message already has a prefix. We don't want it to - # look like "WARNING: DEPRECATION: ...." - return '' - if levelno < logging.ERROR: - return 'WARNING: ' - - return 'ERROR: ' - - def format(self, record): - """ - Calls the standard formatter, but will indent all of the log messages - by our current indentation level. - """ - formatted = super(IndentingFormatter, self).format(record) - message_start = self.get_message_start(formatted, record.levelno) - formatted = message_start + formatted - - prefix = '' - if self.add_timestamp: - prefix = self.formatTime(record, "%Y-%m-%dT%H:%M:%S ") - prefix += " " * get_indentation() - formatted = "".join([ - prefix + line - for line in formatted.splitlines(True) - ]) - return formatted - - -def _color_wrap(*colors): - def wrapped(inp): - return "".join(list(colors) + [inp, colorama.Style.RESET_ALL]) - return wrapped - - -class ColorizedStreamHandler(logging.StreamHandler): - - # Don't build up a list of colors if we don't have colorama - if colorama: - COLORS = [ - # This needs to be in order from highest logging level to lowest. - (logging.ERROR, _color_wrap(colorama.Fore.RED)), - (logging.WARNING, _color_wrap(colorama.Fore.YELLOW)), - ] - else: - COLORS = [] - - def __init__(self, stream=None, no_color=None): - logging.StreamHandler.__init__(self, stream) - self._no_color = no_color - - if WINDOWS and colorama: - self.stream = colorama.AnsiToWin32(self.stream) - - def _using_stdout(self): - """ - Return whether the handler is using sys.stdout. - """ - if WINDOWS and colorama: - # Then self.stream is an AnsiToWin32 object. - return self.stream.wrapped is sys.stdout - - return self.stream is sys.stdout - - def should_color(self): - # Don't colorize things if we do not have colorama or if told not to - if not colorama or self._no_color: - return False - - real_stream = ( - self.stream if not isinstance(self.stream, colorama.AnsiToWin32) - else self.stream.wrapped - ) - - # If the stream is a tty we should color it - if hasattr(real_stream, "isatty") and real_stream.isatty(): - return True - - # If we have an ANSI term we should color it - if os.environ.get("TERM") == "ANSI": - return True - - # If anything else we should not color it - return False - - def format(self, record): - msg = logging.StreamHandler.format(self, record) - - if self.should_color(): - for level, color in self.COLORS: - if record.levelno >= level: - msg = color(msg) - break - - return msg - - # The logging module says handleError() can be customized. - def handleError(self, record): - exc_class, exc = sys.exc_info()[:2] - # If a broken pipe occurred while calling write() or flush() on the - # stdout stream in logging's Handler.emit(), then raise our special - # exception so we can handle it in main() instead of logging the - # broken pipe error and continuing. - if (exc_class and self._using_stdout() and - _is_broken_pipe_error(exc_class, exc)): - raise BrokenStdoutLoggingError() - - return super(ColorizedStreamHandler, self).handleError(record) - - -class BetterRotatingFileHandler(logging.handlers.RotatingFileHandler): - - def _open(self): - ensure_dir(os.path.dirname(self.baseFilename)) - return logging.handlers.RotatingFileHandler._open(self) - - -class MaxLevelFilter(Filter): - - def __init__(self, level): - self.level = level - - def filter(self, record): - return record.levelno < self.level - - -class ExcludeLoggerFilter(Filter): - - """ - A logging Filter that excludes records from a logger (or its children). - """ - - def filter(self, record): - # The base Filter class allows only records from a logger (or its - # children). - return not super(ExcludeLoggerFilter, self).filter(record) - - -def setup_logging(verbosity, no_color, user_log_file): - """Configures and sets up all of the logging - - Returns the requested logging level, as its integer value. - """ - - # Determine the level to be logging at. - if verbosity >= 1: - level = "DEBUG" - elif verbosity == -1: - level = "WARNING" - elif verbosity == -2: - level = "ERROR" - elif verbosity <= -3: - level = "CRITICAL" - else: - level = "INFO" - - level_number = getattr(logging, level) - - # The "root" logger should match the "console" level *unless* we also need - # to log to a user log file. - include_user_log = user_log_file is not None - if include_user_log: - additional_log_file = user_log_file - root_level = "DEBUG" - else: - additional_log_file = "/dev/null" - root_level = level - - # Disable any logging besides WARNING unless we have DEBUG level logging - # enabled for vendored libraries. - vendored_log_level = "WARNING" if level in ["INFO", "ERROR"] else "DEBUG" - - # Shorthands for clarity - log_streams = { - "stdout": "ext://sys.stdout", - "stderr": "ext://sys.stderr", - } - handler_classes = { - "stream": "pip._internal.utils.logging.ColorizedStreamHandler", - "file": "pip._internal.utils.logging.BetterRotatingFileHandler", - } - handlers = ["console", "console_errors", "console_subprocess"] + ( - ["user_log"] if include_user_log else [] - ) - - logging.config.dictConfig({ - "version": 1, - "disable_existing_loggers": False, - "filters": { - "exclude_warnings": { - "()": "pip._internal.utils.logging.MaxLevelFilter", - "level": logging.WARNING, - }, - "restrict_to_subprocess": { - "()": "logging.Filter", - "name": subprocess_logger.name, - }, - "exclude_subprocess": { - "()": "pip._internal.utils.logging.ExcludeLoggerFilter", - "name": subprocess_logger.name, - }, - }, - "formatters": { - "indent": { - "()": IndentingFormatter, - "format": "%(message)s", - }, - "indent_with_timestamp": { - "()": IndentingFormatter, - "format": "%(message)s", - "add_timestamp": True, - }, - }, - "handlers": { - "console": { - "level": level, - "class": handler_classes["stream"], - "no_color": no_color, - "stream": log_streams["stdout"], - "filters": ["exclude_subprocess", "exclude_warnings"], - "formatter": "indent", - }, - "console_errors": { - "level": "WARNING", - "class": handler_classes["stream"], - "no_color": no_color, - "stream": log_streams["stderr"], - "filters": ["exclude_subprocess"], - "formatter": "indent", - }, - # A handler responsible for logging to the console messages - # from the "subprocessor" logger. - "console_subprocess": { - "level": level, - "class": handler_classes["stream"], - "no_color": no_color, - "stream": log_streams["stderr"], - "filters": ["restrict_to_subprocess"], - "formatter": "indent", - }, - "user_log": { - "level": "DEBUG", - "class": handler_classes["file"], - "filename": additional_log_file, - "delay": True, - "formatter": "indent_with_timestamp", - }, - }, - "root": { - "level": root_level, - "handlers": handlers, - }, - "loggers": { - "pip._vendor": { - "level": vendored_log_level - } - }, - }) - - return level_number diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/logging.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/logging.pyc deleted file mode 100644 index 7ff25426ac32cd69fda7f182d85179c5ffad5532..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12636 zcmd5?-A^1@cE8o#G&Hmg1_S<@ae2ph+Fvjq8)k=0cEK3WqO}`Ru*m8>EqFZlx^B~p~fyyY**Yoz=EiSiOf%0r|md5V;e-|yV&YVde=9}=mJ zUDfxV`%&kfd+zzVr}*#ZhVT6R{IjOY{s!>7xTsWev!IlV|Aq>bY8k3wD1-Ha3JR)G zkT#Tys!{BgOR7=omIqFi%c@cC!Ut7jP|8IWlvHa-HHP%OB^6XuYgjdgb$vhuBdS$Z zjjFDfRd7zV&a1|GT_04zsA`R=#+YhdP>l=9I3DYMWL!1I)mHePDtQy?U|7X}uMDG$ z{Y5s0hWhIGqVyk9!K7+Usm7Etw!&$QnU*ml7-C?#fU~zZuJ$jhS4uUmaF};R*;kcY zQRuy6D0f)BR&0IRxTd_SihpW&`0kqFj2vZmldYZLY4> z?I#;w+NeER{i+7eROv8YUYK-Z&vyMdy?|=c*>1;C(@PRNh<10o-x)$vGYX>EX*ua7 zR3609ffsJ1Zq!L1qoW`0uEcQ^H_;}4T*!k(On4pz4@<=c<6TgeMlM+ceAvXF<@kx` zn*NTdCtdg3p3G%N&1NS~%$+DU(>>2j9*z*I=B$D{{tjts+Ia1%zhfeCv9Xj#cP87IaoXmZFGw z>YxlBBEgf7@!Ie_As1E&Qh_)^z%UB$Z~37cy-3XU<8&_y%}>p3FNj{u*7$iL&FY#E zKBWZn;y8>_GTh2){U=M01-P=ly1t^Br@}r*O}iO5NsHmY^q_3RvH#lB4VQoV;!8(Ud z7Eg~wc_2i$##rS!?JJ?JabWNno`mc{nx3L6*;iQi8VWg8qpN3F_kdFG|G=?iH>=8* zQ0bi{&~E{~gw#-l{9Nb6q3F$tlab=j0TVeUQqfC0aR@2rLG;C@6Ph?)UOV-1aQ(z| zOwHsbncNg6pB>HzFU7mbLS8dDRG-s@vlGeL)v}Y{l#Xw75vdk7ybJ z07z+)5BVf@lPt!EeA-+@;~WYQrX>hbkpHuSZK$tdHyG+C#unbarth)oD}Xj+mB}Fn z3PqR9W(0|Tl$tFkbf6)riJE)n3qJ_VrqfBZ^o5u=p&Q$s)J!7?S`)I@!#G!@u@fH4 zWbD;~vc)`!>9zcn9YAv5#eh`PysqUfIfgpfhL%aabOcpBr9+<33ZKU!?6mqS97N@6 z%!uw2pp;P2sq&~%G%AHA%lxC(Szbgdg&GJCr3P}t9(q*-(YchmMGHn7M%+#jkGme$ zpT-u2eQ%*s>Vpm!DGrpN<+;7G7Y$&hxzI={DOaTliuh3!!+e4@kkf#?`Ct*h0WrsKMH>Vw5o zr`29Cm(1-b3V0U$CTIoQBs(L4AL0Zgdr>EFd0N`Bx8omqZjKqH(+fY{BMyFS#$Gdu z-4B6Mck-TqN~sghe7Iht01zXk9ks=hdE^9%XI&$h+BoU7z1X_SDw);Be)=hlM3M*; zL0Tx2^|^Q^E{~!tKbL>p2umv`ZInAP*kea{1D3ilxJx$b3O2I_I})7I z31!1EDBo1Q%M_5VWNcrQ*9GLOZjXhW8RWp}L`gmL;Ddzm5d4!t0Z`ntd3l2N*3I)bu4PAL$@ ztx^M{M#&g0;xS6v$RMASAhPv;ih>rbnFN4X5NG&AG;N z!2zie|CADBzs#-_&*)lGaF<>pQUUogNbmXLXMkbQ{*c<$vZzA;63q4R*_b+k=)r6Q zYWimd_52qE69pQ9!dyQGqB&D6!->+O2CEHSCl-~d1?N3;8wyoat(HS3I(ND66wf93 zY}>~WF|i3pGKPH4w6KV2Q+Bw=XVy(%kx*dIJiR~Dx?8@D5)hQmCwT%O>QLbp=%s9{UlzK{h7sz)wZ!34Al|cp{@TH*#Vv z;jG&nN`ZEU1w;Vp(<9?KQ(rmNx(^hO@g!8)YT%MFX$%+2Mg_kYj50L;t%96Xizm$@ z2}F2l!f|j9eJS-rnsQTrhDY2Q;67X#YoaP1Ipyi#BHC#9{sDGZtd-wa>I6EqYbDl2 zHIrA!))Vah0SY`9*hNGA5{g(1PkNF?p1a+Gng&Q4nRQ`7O(ro^IZNOtsYUT7a%&?! z4m^=o*2>1proHs|anJPg!?v!Fe&i)1qWrnraD7lhei zkP_cTbV)d@UK_%6)(q#Qa5_U4IoQIZb{J{0T0}#0F=@R74`(w%IO@|+M3U){UQZoc zOPrXW=uV)S1OU|s{*VPxnQBMIn1CCDhzD7gPi|^u&SiX^XB}@6P!2j|H1sGUcpDnj zs|z&~E;rX$nQ_(i{ApzEX?~;Q-$`gSC&$UG4u|&im)0LSp@oKWz{Kvwh>X+>*~(`{ z*YuUJ!aKGs38oDZ`wLQ;46I7k!bCx6O#0?*e1ZztxC*b4v;>_mGA_4)MY3KJ9v>iU z!zO*CYL{o`jW<0!s@!hJ?Fa0BXje?;x$w87LtzoJ60Dn8b2U5lkI zwDc2rbH`eNuUJo{uvFhzt?@_*w_878iQ#?G`aU*~MorVxyR*nv%0Lm9dk*J|tw)41 zCW&<^6(!Q>g@=BOzyk>Zi%^GNZm<&%6e8jQD9FHge>apdIqk*iga22o)232|F{4y` z->8U4{Q!v{<`gN9_=b{Ib4}uZsC%t?~P0zU8&YYu1L?b6Ojd&=$RHp?@pc6=f_2 zq?AN=^p*0mg1-TV+A}aFA)%(=7gUWA?HQENmQ(sEmmD`VC|q6P8ph@DyUL&TSfwKT1_nTYeRT34(W$Gk+p(~M3LnV zM4QxfRE3$fw38sXxCbJqg!=DF{QJj1_3!W`v}2VqH84&}7wR>J=1*C;G}|`(B> z`Ns7XPW6pqxiC5i!+Ek&O)sPEfya246)`e~02r?9-n5+z_FBX&q@5?W6U>a)DCBpA zxuz|m%QE}kLjn8?HLDe@7W7~~{5Qar+SYYEHnDmx z7(2WJoWzLfKM+rT+SF8srm30VSdoF&$(nBka%NR z)MC9Y@58c0*6m0V!@u+vrzL%lGfm>ZeFoRQ2|5R8{1YBIM&&}KC=y`hs2Oxz@3Evw zd>fZeV_43mO!?^s^)nVtej6Rc^v^@@rk+d3-Jvo0kt7RvBN-x&5LK5jJ+7W=NR9B* z#B3rN!bN~93!CPgk_$}Yp#>%-BD6I$x=71vS2nV%R>VAOn)Jd%H(2dE*9b!Y0aWy1 zD89)rw1VFiejx$>m8ep|luPA;MCGYi#JF5U%U^@E*a@%$4c19I8;HM#D+1Im2a<$J z0+fUVgaYV?{6M*IV$c)!=@>q!4&VW8DtAbLND-^BknOaXY&4F+cb}*OG{Hp1=l+n8 z6LiKKemz{BVOC+{p^CTrDN{<~za#>o+&`TRDcEyJ#6tenJTk73Xf=OQ5t!sy%_Fx8 zSyl5Vh*{u%0a;;_Y8Q4RKK5_Qol?6n7mEyPOrMO1)|R-4k2E%TSkr1As?)us=KZ2f zd0Dwv0E1uyj#u%)YiPpf-_!6xI&ALyfM3^e^G)~-w0%d~Fbqx|r*o0jbrU}`@|m+h zIA`uHw0(%DhW3*3g&h3&OSFxt%kFIyf$SapV8SXOW9WTD0Xal%_&H4N-o?)ZW&q-d zhkxtv^Z9U4=JeQ$GM0PrYsX$ERZowd#8}V~$Yf*3Gqi!sJE_Y2gVxWiwV zo9l&AtcL)8vjxc&qOuU6KvC{mk#sSe=XK3WUe|24j@h?|3dP?~eghx)Rb#)^T9#!% zXL@3)A^`!(fu5L2Sy|^fC34@~1@&_Ige1sJh{gcfmn3(74Z3GdG!e|T+hRARn!cjDY}}KEm^Km5v`Z$f5Cj@8Dux!yg=;T zWlKD#dt(?U!k3axV?DqSiGJp-LVoU^tdtz=dVzCn@vcEA5Jyoe_{cI3J*4Tyf-9*7 zTy+YFs1xC3P9fKy`bLV5mUc76ucwj$58!ADlDKM5m!&F!C^<3~`&ezhcqNU5 zHt=kBk8#&07KhqeMvEn4dK9Ho%siX;M;5Kgly2MG4s$bV!4;Q#f|NI`Z|mcFxbkG) zNEGUud}boQtz*kinida<@VW4Gx`*JXi@lK$)2bv@ONdE$%I&mT$M)Gir_k3o7j#Y_ zYjhHxB}a|l2%@GFNIH_FE9r<9`ME2fNx>{v%p%76I+(K|4y5n3^(p* None - """os.path.makedirs without EEXIST.""" - try: - os.makedirs(path) - except OSError as e: - if e.errno != errno.EEXIST: - raise - - -def get_prog(): - # type: () -> str - try: - prog = os.path.basename(sys.argv[0]) - if prog in ('__main__.py', '-c'): - return "%s -m pip" % sys.executable - else: - return prog - except (AttributeError, TypeError, IndexError): - pass - return 'pip' - - -# Retry every half second for up to 3 seconds -@retry(stop_max_delay=3000, wait_fixed=500) -def rmtree(dir, ignore_errors=False): - # type: (str, bool) -> None - shutil.rmtree(dir, ignore_errors=ignore_errors, - onerror=rmtree_errorhandler) - - -def rmtree_errorhandler(func, path, exc_info): - """On Windows, the files in .svn are read-only, so when rmtree() tries to - remove them, an exception is thrown. We catch that here, remove the - read-only attribute, and hopefully continue without problems.""" - # if file type currently read only - if os.stat(path).st_mode & stat.S_IREAD: - # convert to read/write - os.chmod(path, stat.S_IWRITE) - # use the original function to repeat the operation - func(path) - return - else: - raise - - -def display_path(path): - # type: (Union[str, Text]) -> str - """Gives the display value for a given path, making it relative to cwd - if possible.""" - path = os.path.normcase(os.path.abspath(path)) - if sys.version_info[0] == 2: - path = path.decode(sys.getfilesystemencoding(), 'replace') - path = path.encode(sys.getdefaultencoding(), 'replace') - if path.startswith(os.getcwd() + os.path.sep): - path = '.' + path[len(os.getcwd()):] - return path - - -def backup_dir(dir, ext='.bak'): - # type: (str, str) -> str - """Figure out the name of a directory to back up the given dir to - (adding .bak, .bak2, etc)""" - n = 1 - extension = ext - while os.path.exists(dir + extension): - n += 1 - extension = ext + str(n) - return dir + extension - - -def ask_path_exists(message, options): - # type: (str, Iterable[str]) -> str - for action in os.environ.get('PIP_EXISTS_ACTION', '').split(): - if action in options: - return action - return ask(message, options) - - -def ask(message, options): - # type: (str, Iterable[str]) -> str - """Ask the message interactively, with the given possible responses""" - while 1: - if os.environ.get('PIP_NO_INPUT'): - raise Exception( - 'No input was expected ($PIP_NO_INPUT set); question: %s' % - message - ) - response = input(message) - response = response.strip().lower() - if response not in options: - print( - 'Your response (%r) was not one of the expected responses: ' - '%s' % (response, ', '.join(options)) - ) - else: - return response - - -def format_size(bytes): - # type: (float) -> str - if bytes > 1000 * 1000: - return '%.1fMB' % (bytes / 1000.0 / 1000) - elif bytes > 10 * 1000: - return '%ikB' % (bytes / 1000) - elif bytes > 1000: - return '%.1fkB' % (bytes / 1000.0) - else: - return '%ibytes' % bytes - - -def is_installable_dir(path): - # type: (str) -> bool - """Is path is a directory containing setup.py or pyproject.toml? - """ - if not os.path.isdir(path): - return False - setup_py = os.path.join(path, 'setup.py') - if os.path.isfile(setup_py): - return True - pyproject_toml = os.path.join(path, 'pyproject.toml') - if os.path.isfile(pyproject_toml): - return True - return False - - -def is_svn_page(html): - # type: (Union[str, Text]) -> Optional[Match[Union[str, Text]]] - """ - Returns true if the page appears to be the index page of an svn repository - """ - return (re.search(r'[^<]*Revision \d+:', html) and - re.search(r'Powered by (?:<a[^>]*?>)?Subversion', html, re.I)) - - -def file_contents(filename): - # type: (str) -> Text - with open(filename, 'rb') as fp: - return fp.read().decode('utf-8') - - -def read_chunks(file, size=io.DEFAULT_BUFFER_SIZE): - """Yield pieces of data from a file-like object until EOF.""" - while True: - chunk = file.read(size) - if not chunk: - break - yield chunk - - -def split_leading_dir(path): - # type: (Union[str, Text]) -> List[Union[str, Text]] - path = path.lstrip('/').lstrip('\\') - if '/' in path and (('\\' in path and path.find('/') < path.find('\\')) or - '\\' not in path): - return path.split('/', 1) - elif '\\' in path: - return path.split('\\', 1) - else: - return [path, ''] - - -def has_leading_dir(paths): - # type: (Iterable[Union[str, Text]]) -> bool - """Returns true if all the paths have the same leading path name - (i.e., everything is in one subdirectory in an archive)""" - common_prefix = None - for path in paths: - prefix, rest = split_leading_dir(path) - if not prefix: - return False - elif common_prefix is None: - common_prefix = prefix - elif prefix != common_prefix: - return False - return True - - -def normalize_path(path, resolve_symlinks=True): - # type: (str, bool) -> str - """ - Convert a path to its canonical, case-normalized, absolute version. - - """ - path = expanduser(path) - if resolve_symlinks: - path = os.path.realpath(path) - else: - path = os.path.abspath(path) - return os.path.normcase(path) - - -def splitext(path): - # type: (str) -> Tuple[str, str] - """Like os.path.splitext, but take off .tar too""" - base, ext = posixpath.splitext(path) - if base.lower().endswith('.tar'): - ext = base[-4:] + ext - base = base[:-4] - return base, ext - - -def renames(old, new): - # type: (str, str) -> None - """Like os.renames(), but handles renaming across devices.""" - # Implementation borrowed from os.renames(). - head, tail = os.path.split(new) - if head and tail and not os.path.exists(head): - os.makedirs(head) - - shutil.move(old, new) - - head, tail = os.path.split(old) - if head and tail: - try: - os.removedirs(head) - except OSError: - pass - - -def is_local(path): - # type: (str) -> bool - """ - Return True if path is within sys.prefix, if we're running in a virtualenv. - - If we're not in a virtualenv, all paths are considered "local." - - """ - if not running_under_virtualenv(): - return True - return normalize_path(path).startswith(normalize_path(sys.prefix)) - - -def dist_is_local(dist): - # type: (Distribution) -> bool - """ - Return True if given Distribution object is installed locally - (i.e. within current virtualenv). - - Always True if we're not in a virtualenv. - - """ - return is_local(dist_location(dist)) - - -def dist_in_usersite(dist): - # type: (Distribution) -> bool - """ - Return True if given Distribution is installed in user site. - """ - norm_path = normalize_path(dist_location(dist)) - return norm_path.startswith(normalize_path(user_site)) - - -def dist_in_site_packages(dist): - # type: (Distribution) -> bool - """ - Return True if given Distribution is installed in - sysconfig.get_python_lib(). - """ - return normalize_path( - dist_location(dist) - ).startswith(normalize_path(site_packages)) - - -def dist_is_editable(dist): - # type: (Distribution) -> bool - """ - Return True if given Distribution is an editable install. - """ - for path_item in sys.path: - egg_link = os.path.join(path_item, dist.project_name + '.egg-link') - if os.path.isfile(egg_link): - return True - return False - - -def get_installed_distributions(local_only=True, - skip=stdlib_pkgs, - include_editables=True, - editables_only=False, - user_only=False): - # type: (bool, Container[str], bool, bool, bool) -> List[Distribution] - """ - Return a list of installed Distribution objects. - - If ``local_only`` is True (default), only return installations - local to the current virtualenv, if in a virtualenv. - - ``skip`` argument is an iterable of lower-case project names to - ignore; defaults to stdlib_pkgs - - If ``include_editables`` is False, don't report editables. - - If ``editables_only`` is True , only report editables. - - If ``user_only`` is True , only report installations in the user - site directory. - - """ - if local_only: - local_test = dist_is_local - else: - def local_test(d): - return True - - if include_editables: - def editable_test(d): - return True - else: - def editable_test(d): - return not dist_is_editable(d) - - if editables_only: - def editables_only_test(d): - return dist_is_editable(d) - else: - def editables_only_test(d): - return True - - if user_only: - user_test = dist_in_usersite - else: - def user_test(d): - return True - - # because of pkg_resources vendoring, mypy cannot find stub in typeshed - return [d for d in pkg_resources.working_set # type: ignore - if local_test(d) and - d.key not in skip and - editable_test(d) and - editables_only_test(d) and - user_test(d) - ] - - -def egg_link_path(dist): - # type: (Distribution) -> Optional[str] - """ - Return the path for the .egg-link file if it exists, otherwise, None. - - There's 3 scenarios: - 1) not in a virtualenv - try to find in site.USER_SITE, then site_packages - 2) in a no-global virtualenv - try to find in site_packages - 3) in a yes-global virtualenv - try to find in site_packages, then site.USER_SITE - (don't look in global location) - - For #1 and #3, there could be odd cases, where there's an egg-link in 2 - locations. - - This method will just return the first one found. - """ - sites = [] - if running_under_virtualenv(): - if virtualenv_no_global(): - sites.append(site_packages) - else: - sites.append(site_packages) - if user_site: - sites.append(user_site) - else: - if user_site: - sites.append(user_site) - sites.append(site_packages) - - for site in sites: - egglink = os.path.join(site, dist.project_name) + '.egg-link' - if os.path.isfile(egglink): - return egglink - return None - - -def dist_location(dist): - # type: (Distribution) -> str - """ - Get the site-packages location of this distribution. Generally - this is dist.location, except in the case of develop-installed - packages, where dist.location is the source code location, and we - want to know where the egg-link file is. - - """ - egg_link = egg_link_path(dist) - if egg_link: - return egg_link - return dist.location - - -def current_umask(): - """Get the current umask which involves having to set it temporarily.""" - mask = os.umask(0) - os.umask(mask) - return mask - - -def unzip_file(filename, location, flatten=True): - # type: (str, str, bool) -> None - """ - Unzip the file (with path `filename`) to the destination `location`. All - files are written based on system defaults and umask (i.e. permissions are - not preserved), except that regular file members with any execute - permissions (user, group, or world) have "chmod +x" applied after being - written. Note that for windows, any execute changes using os.chmod are - no-ops per the python docs. - """ - ensure_dir(location) - zipfp = open(filename, 'rb') - try: - zip = zipfile.ZipFile(zipfp, allowZip64=True) - leading = has_leading_dir(zip.namelist()) and flatten - for info in zip.infolist(): - name = info.filename - fn = name - if leading: - fn = split_leading_dir(name)[1] - fn = os.path.join(location, fn) - dir = os.path.dirname(fn) - if fn.endswith('/') or fn.endswith('\\'): - # A directory - ensure_dir(fn) - else: - ensure_dir(dir) - # Don't use read() to avoid allocating an arbitrarily large - # chunk of memory for the file's content - fp = zip.open(name) - try: - with open(fn, 'wb') as destfp: - shutil.copyfileobj(fp, destfp) - finally: - fp.close() - mode = info.external_attr >> 16 - # if mode and regular file and any execute permissions for - # user/group/world? - if mode and stat.S_ISREG(mode) and mode & 0o111: - # make dest file have execute for user/group/world - # (chmod +x) no-op on windows per python docs - os.chmod(fn, (0o777 - current_umask() | 0o111)) - finally: - zipfp.close() - - -def untar_file(filename, location): - # type: (str, str) -> None - """ - Untar the file (with path `filename`) to the destination `location`. - All files are written based on system defaults and umask (i.e. permissions - are not preserved), except that regular file members with any execute - permissions (user, group, or world) have "chmod +x" applied after being - written. Note that for windows, any execute changes using os.chmod are - no-ops per the python docs. - """ - ensure_dir(location) - if filename.lower().endswith('.gz') or filename.lower().endswith('.tgz'): - mode = 'r:gz' - elif filename.lower().endswith(BZ2_EXTENSIONS): - mode = 'r:bz2' - elif filename.lower().endswith(XZ_EXTENSIONS): - mode = 'r:xz' - elif filename.lower().endswith('.tar'): - mode = 'r' - else: - logger.warning( - 'Cannot determine compression type for file %s', filename, - ) - mode = 'r:*' - tar = tarfile.open(filename, mode) - try: - leading = has_leading_dir([ - member.name for member in tar.getmembers() - ]) - for member in tar.getmembers(): - fn = member.name - if leading: - # https://github.com/python/mypy/issues/1174 - fn = split_leading_dir(fn)[1] # type: ignore - path = os.path.join(location, fn) - if member.isdir(): - ensure_dir(path) - elif member.issym(): - try: - # https://github.com/python/typeshed/issues/2673 - tar._extract_member(member, path) # type: ignore - except Exception as exc: - # Some corrupt tar files seem to produce this - # (specifically bad symlinks) - logger.warning( - 'In the tar file %s the member %s is invalid: %s', - filename, member.name, exc, - ) - continue - else: - try: - fp = tar.extractfile(member) - except (KeyError, AttributeError) as exc: - # Some corrupt tar files seem to produce this - # (specifically bad symlinks) - logger.warning( - 'In the tar file %s the member %s is invalid: %s', - filename, member.name, exc, - ) - continue - ensure_dir(os.path.dirname(path)) - with open(path, 'wb') as destfp: - shutil.copyfileobj(fp, destfp) - fp.close() - # Update the timestamp (useful for cython compiled files) - # https://github.com/python/typeshed/issues/2673 - tar.utime(member, path) # type: ignore - # member have any execute permissions for user/group/world? - if member.mode & 0o111: - # make dest file have execute for user/group/world - # no-op on windows per python docs - os.chmod(path, (0o777 - current_umask() | 0o111)) - finally: - tar.close() - - -def unpack_file( - filename, # type: str - location, # type: str - content_type, # type: Optional[str] - link # type: Optional[Link] -): - # type: (...) -> None - filename = os.path.realpath(filename) - if (content_type == 'application/zip' or - filename.lower().endswith(ZIP_EXTENSIONS) or - zipfile.is_zipfile(filename)): - unzip_file( - filename, - location, - flatten=not filename.endswith('.whl') - ) - elif (content_type == 'application/x-gzip' or - tarfile.is_tarfile(filename) or - filename.lower().endswith( - TAR_EXTENSIONS + BZ2_EXTENSIONS + XZ_EXTENSIONS)): - untar_file(filename, location) - elif (content_type and content_type.startswith('text/html') and - is_svn_page(file_contents(filename))): - # We don't really care about this - from pip._internal.vcs.subversion import Subversion - Subversion('svn+' + link.url).unpack(location) - else: - # FIXME: handle? - # FIXME: magic signatures? - logger.critical( - 'Cannot unpack file %s (downloaded from %s, content-type: %s); ' - 'cannot detect archive format', - filename, location, content_type, - ) - raise InstallationError( - 'Cannot determine archive format of %s' % location - ) - - -def format_command_args(args): - # type: (List[str]) -> str - """ - Format command arguments for display. - """ - return ' '.join(shlex_quote(arg) for arg in args) - - -def call_subprocess( - cmd, # type: List[str] - show_stdout=False, # type: bool - cwd=None, # type: Optional[str] - on_returncode='raise', # type: str - extra_ok_returncodes=None, # type: Optional[Iterable[int]] - command_desc=None, # type: Optional[str] - extra_environ=None, # type: Optional[Mapping[str, Any]] - unset_environ=None, # type: Optional[Iterable[str]] - spinner=None # type: Optional[SpinnerInterface] -): - # type: (...) -> Optional[Text] - """ - Args: - show_stdout: if true, use INFO to log the subprocess's stderr and - stdout streams. Otherwise, use DEBUG. Defaults to False. - extra_ok_returncodes: an iterable of integer return codes that are - acceptable, in addition to 0. Defaults to None, which means []. - unset_environ: an iterable of environment variable names to unset - prior to calling subprocess.Popen(). - """ - if extra_ok_returncodes is None: - extra_ok_returncodes = [] - if unset_environ is None: - unset_environ = [] - # Most places in pip use show_stdout=False. What this means is-- - # - # - We connect the child's output (combined stderr and stdout) to a - # single pipe, which we read. - # - We log this output to stderr at DEBUG level as it is received. - # - If DEBUG logging isn't enabled (e.g. if --verbose logging wasn't - # requested), then we show a spinner so the user can still see the - # subprocess is in progress. - # - If the subprocess exits with an error, we log the output to stderr - # at ERROR level if it hasn't already been displayed to the console - # (e.g. if --verbose logging wasn't enabled). This way we don't log - # the output to the console twice. - # - # If show_stdout=True, then the above is still done, but with DEBUG - # replaced by INFO. - if show_stdout: - # Then log the subprocess output at INFO level. - log_subprocess = subprocess_logger.info - used_level = std_logging.INFO - else: - # Then log the subprocess output using DEBUG. This also ensures - # it will be logged to the log file (aka user_log), if enabled. - log_subprocess = subprocess_logger.debug - used_level = std_logging.DEBUG - - # Whether the subprocess will be visible in the console. - showing_subprocess = subprocess_logger.getEffectiveLevel() <= used_level - - # Only use the spinner if we're not showing the subprocess output - # and we have a spinner. - use_spinner = not showing_subprocess and spinner is not None - - if command_desc is None: - command_desc = format_command_args(cmd) - - log_subprocess("Running command %s", command_desc) - env = os.environ.copy() - if extra_environ: - env.update(extra_environ) - for name in unset_environ: - env.pop(name, None) - try: - proc = subprocess.Popen( - cmd, stderr=subprocess.STDOUT, stdin=subprocess.PIPE, - stdout=subprocess.PIPE, cwd=cwd, env=env, - ) - proc.stdin.close() - except Exception as exc: - subprocess_logger.critical( - "Error %s while executing command %s", exc, command_desc, - ) - raise - all_output = [] - while True: - line = console_to_str(proc.stdout.readline()) - if not line: - break - line = line.rstrip() - all_output.append(line + '\n') - - # Show the line immediately. - log_subprocess(line) - # Update the spinner. - if use_spinner: - spinner.spin() - try: - proc.wait() - finally: - if proc.stdout: - proc.stdout.close() - proc_had_error = ( - proc.returncode and proc.returncode not in extra_ok_returncodes - ) - if use_spinner: - if proc_had_error: - spinner.finish("error") - else: - spinner.finish("done") - if proc_had_error: - if on_returncode == 'raise': - if not showing_subprocess: - # Then the subprocess streams haven't been logged to the - # console yet. - subprocess_logger.error( - 'Complete output from command %s:', command_desc, - ) - # The all_output value already ends in a newline. - subprocess_logger.error(''.join(all_output) + LOG_DIVIDER) - raise InstallationError( - 'Command "%s" failed with error code %s in %s' - % (command_desc, proc.returncode, cwd)) - elif on_returncode == 'warn': - subprocess_logger.warning( - 'Command "%s" had error code %s in %s', - command_desc, proc.returncode, cwd, - ) - elif on_returncode == 'ignore': - pass - else: - raise ValueError('Invalid value: on_returncode=%s' % - repr(on_returncode)) - return ''.join(all_output) - - -def _make_build_dir(build_dir): - os.makedirs(build_dir) - write_delete_marker_file(build_dir) - - -class FakeFile(object): - """Wrap a list of lines in an object with readline() to make - ConfigParser happy.""" - def __init__(self, lines): - self._gen = (l for l in lines) - - def readline(self): - try: - try: - return next(self._gen) - except NameError: - return self._gen.next() - except StopIteration: - return '' - - def __iter__(self): - return self._gen - - -class StreamWrapper(StringIO): - - @classmethod - def from_stream(cls, orig_stream): - cls.orig_stream = orig_stream - return cls() - - # compileall.compile_dir() needs stdout.encoding to print to stdout - @property - def encoding(self): - return self.orig_stream.encoding - - -@contextlib.contextmanager -def captured_output(stream_name): - """Return a context manager used by captured_stdout/stdin/stderr - that temporarily replaces the sys stream *stream_name* with a StringIO. - - Taken from Lib/support/__init__.py in the CPython repo. - """ - orig_stdout = getattr(sys, stream_name) - setattr(sys, stream_name, StreamWrapper.from_stream(orig_stdout)) - try: - yield getattr(sys, stream_name) - finally: - setattr(sys, stream_name, orig_stdout) - - -def captured_stdout(): - """Capture the output of sys.stdout: - - with captured_stdout() as stdout: - print('hello') - self.assertEqual(stdout.getvalue(), 'hello\n') - - Taken from Lib/support/__init__.py in the CPython repo. - """ - return captured_output('stdout') - - -def captured_stderr(): - """ - See captured_stdout(). - """ - return captured_output('stderr') - - -class cached_property(object): - """A property that is only computed once per instance and then replaces - itself with an ordinary attribute. Deleting the attribute resets the - property. - - Source: https://github.com/bottlepy/bottle/blob/0.11.5/bottle.py#L175 - """ - - def __init__(self, func): - self.__doc__ = getattr(func, '__doc__') - self.func = func - - def __get__(self, obj, cls): - if obj is None: - # We're being accessed from the class itself, not from an object - return self - value = obj.__dict__[self.func.__name__] = self.func(obj) - return value - - -def get_installed_version(dist_name, working_set=None): - """Get the installed version of dist_name avoiding pkg_resources cache""" - # Create a requirement that we'll look for inside of setuptools. - req = pkg_resources.Requirement.parse(dist_name) - - if working_set is None: - # We want to avoid having this cached, so we need to construct a new - # working set each time. - working_set = pkg_resources.WorkingSet() - - # Get the installed distribution from our working set - dist = working_set.find(req) - - # Check to see if we got an installed distribution or not, if we did - # we want to return it's version. - return dist.version if dist else None - - -def consume(iterator): - """Consume an iterable at C speed.""" - deque(iterator, maxlen=0) - - -# Simulates an enum -def enum(*sequential, **named): - enums = dict(zip(sequential, range(len(sequential))), **named) - reverse = {value: key for key, value in enums.items()} - enums['reverse_mapping'] = reverse - return type('Enum', (), enums) - - -def split_auth_from_netloc(netloc): - """ - Parse out and remove the auth information from a netloc. - - Returns: (netloc, (username, password)). - """ - if '@' not in netloc: - return netloc, (None, None) - - # Split from the right because that's how urllib.parse.urlsplit() - # behaves if more than one @ is present (which can be checked using - # the password attribute of urlsplit()'s return value). - auth, netloc = netloc.rsplit('@', 1) - if ':' in auth: - # Split from the left because that's how urllib.parse.urlsplit() - # behaves if more than one : is present (which again can be checked - # using the password attribute of the return value) - user_pass = auth.split(':', 1) - else: - user_pass = auth, None - - user_pass = tuple( - None if x is None else urllib_unquote(x) for x in user_pass - ) - - return netloc, user_pass - - -def redact_netloc(netloc): - # type: (str) -> str - """ - Replace the password in a netloc with "****", if it exists. - - For example, "user:pass@example.com" returns "user:****@example.com". - """ - netloc, (user, password) = split_auth_from_netloc(netloc) - if user is None: - return netloc - password = '' if password is None else ':****' - return '{user}{password}@{netloc}'.format(user=urllib_parse.quote(user), - password=password, - netloc=netloc) - - -def _transform_url(url, transform_netloc): - purl = urllib_parse.urlsplit(url) - netloc = transform_netloc(purl.netloc) - # stripped url - url_pieces = ( - purl.scheme, netloc, purl.path, purl.query, purl.fragment - ) - surl = urllib_parse.urlunsplit(url_pieces) - return surl - - -def _get_netloc(netloc): - return split_auth_from_netloc(netloc)[0] - - -def remove_auth_from_url(url): - # type: (str) -> str - # Return a copy of url with 'username:password@' removed. - # username/pass params are passed to subversion through flags - # and are not recognized in the url. - return _transform_url(url, _get_netloc) - - -def redact_password_from_url(url): - # type: (str) -> str - """Replace the password in a given url with ****.""" - return _transform_url(url, redact_netloc) - - -def protect_pip_from_modification_on_windows(modifying_pip): - """Protection of pip.exe from modification on Windows - - On Windows, any operation modifying pip should be run as: - python -m pip ... - """ - pip_names = [ - "pip.exe", - "pip{}.exe".format(sys.version_info[0]), - "pip{}.{}.exe".format(*sys.version_info[:2]) - ] - - # See https://github.com/pypa/pip/issues/1299 for more discussion - should_show_use_python_msg = ( - modifying_pip and - WINDOWS and - os.path.basename(sys.argv[0]) in pip_names - ) - - if should_show_use_python_msg: - new_command = [ - sys.executable, "-m", "pip" - ] + sys.argv[1:] - raise CommandError( - 'To modify pip, please run the following command:\n{}' - .format(" ".join(new_command)) - ) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/misc.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/misc.pyc deleted file mode 100644 index 2982d3d602858a81adf2f2f7763fa7fce6d953c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34905 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 HErb6L&@@Qo diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/models.py b/venv/lib/python2.7/site-packages/pip/_internal/utils/models.py deleted file mode 100644 index d5cb80a..0000000 --- a/venv/lib/python2.7/site-packages/pip/_internal/utils/models.py +++ /dev/null @@ -1,40 +0,0 @@ -"""Utilities for defining models -""" - -import operator - - -class KeyBasedCompareMixin(object): - """Provides comparision capabilities that is based on a key - """ - - def __init__(self, key, defining_class): - self._compare_key = key - self._defining_class = defining_class - - def __hash__(self): - return hash(self._compare_key) - - def __lt__(self, other): - return self._compare(other, operator.__lt__) - - def __le__(self, other): - return self._compare(other, operator.__le__) - - def __gt__(self, other): - return self._compare(other, operator.__gt__) - - def __ge__(self, other): - return self._compare(other, operator.__ge__) - - def __eq__(self, other): - return self._compare(other, operator.__eq__) - - def __ne__(self, other): - return self._compare(other, operator.__ne__) - - def _compare(self, other, method): - if not isinstance(other, self._defining_class): - return NotImplemented - - return method(self._compare_key, other._compare_key) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/models.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/models.pyc deleted file mode 100644 index 18a19632685f9dbd2f1021a5e965f4ed58882220..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2950 zcmd5;+iuf95M4WInxq$?TqPuABpw2yxD}`Z2@q<Z5NcIz;ekkK<#;#ArjG4;x2382 zg32HB0WfEsl)x(ysjV50_u`#1vwOysA1lo#-&ViGY<yMd`HsXqB_$ballGYOS>mxa z85O2{)+M9LzB6{g*ynZy-3P4&%z8lTlhui~TA84m6@gS;o$9m~3^S<`)6_rd+OxN4 z;0HC@j*OB!*)Wd^wX08cdg+Kq1Ge!=K}wM$v?ggE?$FBRsxYc>3dX|NsdkOY1=q63 zWX&0MCKsL2V6yIvCX)?kEHQr2YGR=`r1p#KL`!l#c0OsNvowgKJnBp^*?wdLZGsLw z52!Z^4%Mg`&=n(i5T9g+#M~iu?y+;m2*tVY42R>O1$=ugjI_(7M7f|6^f7x44U@o$ zIEjpD;k&j<%BZAk@rIGB^!#fewXhbH8IlU~LZ3udg(p!FcC$pP!h~n1;plnMNxvR$ zZXKl?Tg8j5_@z00CC`ctx_Wu|G0b(ou2W;9Bw4qcyFIawCMQCtRuyTKgvXR>6PB5M zmXB<mRut5&tq@Ca0S+^-;l+RpxeUz;y;uqgV*`&}c(j40B7$lC$n-hdTn7hY2W!6A z;FS<akO36t#dtvA;0}qoNeZxB>aE8HKD)pHDe+-g8K-f^-Ak6MBC=UwYt$`7Lh*BZ z!@;&VTAA&uVx9ruNaz~LKLF<qn$L0CCP39RP>z!@SB%(|w@GG+vG+$Z=Z_Jbac|Zb zuUH;&K=02OqdK};d-XcuL%p5lUQMr99&Zr7hf^5Ao)d9o`<NO~MqH6aCGk;pE%9wx zZU+_gk)EPpR2K^pqVkRkm&S^N!Cf`o%k2AMo~WUsA}7lNgcThVyTj|KYp85LlXK-N zaOoowgPOs-HLvQoK%nC)oJK=Rro$-&mFVLHuZuK52${t~aLnU%C{Q~G_i>N|$LZnN zUL5gvr2QMIv;P0T1t(7!yf^rDtob#+QEgPF?-ugP??PQxn5;8Uv2}Cjj=<&Rb(x8` N*l+IdsOB$MegUQcs(t_f diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/outdated.py b/venv/lib/python2.7/site-packages/pip/_internal/utils/outdated.py deleted file mode 100644 index 3b58cd5..0000000 --- a/venv/lib/python2.7/site-packages/pip/_internal/utils/outdated.py +++ /dev/null @@ -1,162 +0,0 @@ -from __future__ import absolute_import - -import datetime -import json -import logging -import os.path -import sys - -from pip._vendor import lockfile, pkg_resources -from pip._vendor.packaging import version as packaging_version - -from pip._internal.index import PackageFinder -from pip._internal.utils.compat import WINDOWS -from pip._internal.utils.filesystem import check_path_owner -from pip._internal.utils.misc import ensure_dir, get_installed_version -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - import optparse - from typing import Any, Dict - from pip._internal.download import PipSession - - -SELFCHECK_DATE_FMT = "%Y-%m-%dT%H:%M:%SZ" - - -logger = logging.getLogger(__name__) - - -class SelfCheckState(object): - def __init__(self, cache_dir): - # type: (str) -> None - self.state = {} # type: Dict[str, Any] - self.statefile_path = None - - # Try to load the existing state - if cache_dir: - self.statefile_path = os.path.join(cache_dir, "selfcheck.json") - try: - with open(self.statefile_path) as statefile: - self.state = json.load(statefile)[sys.prefix] - except (IOError, ValueError, KeyError): - # Explicitly suppressing exceptions, since we don't want to - # error out if the cache file is invalid. - pass - - def save(self, pypi_version, current_time): - # type: (str, datetime.datetime) -> None - # If we do not have a path to cache in, don't bother saving. - if not self.statefile_path: - return - - # Check to make sure that we own the directory - if not check_path_owner(os.path.dirname(self.statefile_path)): - return - - # Now that we've ensured the directory is owned by this user, we'll go - # ahead and make sure that all our directories are created. - ensure_dir(os.path.dirname(self.statefile_path)) - - # Attempt to write out our version check file - with lockfile.LockFile(self.statefile_path): - if os.path.exists(self.statefile_path): - with open(self.statefile_path) as statefile: - state = json.load(statefile) - else: - state = {} - - state[sys.prefix] = { - "last_check": current_time.strftime(SELFCHECK_DATE_FMT), - "pypi_version": pypi_version, - } - - with open(self.statefile_path, "w") as statefile: - json.dump(state, statefile, sort_keys=True, - separators=(",", ":")) - - -def was_installed_by_pip(pkg): - # type: (str) -> bool - """Checks whether pkg was installed by pip - - This is used not to display the upgrade message when pip is in fact - installed by system package manager, such as dnf on Fedora. - """ - try: - dist = pkg_resources.get_distribution(pkg) - return (dist.has_metadata('INSTALLER') and - 'pip' in dist.get_metadata_lines('INSTALLER')) - except pkg_resources.DistributionNotFound: - return False - - -def pip_version_check(session, options): - # type: (PipSession, optparse.Values) -> None - """Check for an update for pip. - - Limit the frequency of checks to once per week. State is stored either in - the active virtualenv or in the user's USER_CACHE_DIR keyed off the prefix - of the pip script path. - """ - installed_version = get_installed_version("pip") - if not installed_version: - return - - pip_version = packaging_version.parse(installed_version) - pypi_version = None - - try: - state = SelfCheckState(cache_dir=options.cache_dir) - - current_time = datetime.datetime.utcnow() - # Determine if we need to refresh the state - if "last_check" in state.state and "pypi_version" in state.state: - last_check = datetime.datetime.strptime( - state.state["last_check"], - SELFCHECK_DATE_FMT - ) - if (current_time - last_check).total_seconds() < 7 * 24 * 60 * 60: - pypi_version = state.state["pypi_version"] - - # Refresh the version if we need to or just see if we need to warn - if pypi_version is None: - # Lets use PackageFinder to see what the latest pip version is - finder = PackageFinder( - find_links=options.find_links, - index_urls=[options.index_url] + options.extra_index_urls, - allow_all_prereleases=False, # Explicitly set to False - trusted_hosts=options.trusted_hosts, - session=session, - ) - candidate = finder.find_candidates("pip").get_best() - if candidate is None: - return - pypi_version = str(candidate.version) - - # save that we've performed a check - state.save(pypi_version, current_time) - - remote_version = packaging_version.parse(pypi_version) - - # Determine if our pypi_version is older - if (pip_version < remote_version and - pip_version.base_version != remote_version.base_version and - was_installed_by_pip('pip')): - # Advise "python -m pip" on Windows to avoid issues - # with overwriting pip.exe. - if WINDOWS: - pip_cmd = "python -m pip" - else: - pip_cmd = "pip" - logger.warning( - "You are using pip version %s, however version %s is " - "available.\nYou should consider upgrading via the " - "'%s install --upgrade pip' command.", - pip_version, pypi_version, pip_cmd - ) - except Exception: - logger.debug( - "There was an error checking the latest version of pip", - exc_info=True, - ) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/outdated.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/outdated.pyc deleted file mode 100644 index 021fd09de9b78a5d4640a32494c6d3c11542544d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5214 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 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/packaging.py b/venv/lib/python2.7/site-packages/pip/_internal/utils/packaging.py deleted file mode 100644 index 449f3fd..0000000 --- a/venv/lib/python2.7/site-packages/pip/_internal/utils/packaging.py +++ /dev/null @@ -1,85 +0,0 @@ -from __future__ import absolute_import - -import logging -import sys -from email.parser import FeedParser - -from pip._vendor import pkg_resources -from pip._vendor.packaging import specifiers, version - -from pip._internal import exceptions -from pip._internal.utils.misc import display_path -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import Optional - from email.message import Message - from pip._vendor.pkg_resources import Distribution - - -logger = logging.getLogger(__name__) - - -def check_requires_python(requires_python): - # type: (Optional[str]) -> bool - """ - Check if the python version in use match the `requires_python` specifier. - - Returns `True` if the version of python in use matches the requirement. - Returns `False` if the version of python in use does not matches the - requirement. - - Raises an InvalidSpecifier if `requires_python` have an invalid format. - """ - if requires_python is None: - # The package provides no information - return True - requires_python_specifier = specifiers.SpecifierSet(requires_python) - - # We only use major.minor.micro - python_version = version.parse('.'.join(map(str, sys.version_info[:3]))) - return python_version in requires_python_specifier - - -def get_metadata(dist): - # type: (Distribution) -> Message - if (isinstance(dist, pkg_resources.DistInfoDistribution) and - dist.has_metadata('METADATA')): - metadata = dist.get_metadata('METADATA') - elif dist.has_metadata('PKG-INFO'): - metadata = dist.get_metadata('PKG-INFO') - else: - logger.warning("No metadata found in %s", display_path(dist.location)) - metadata = '' - - feed_parser = FeedParser() - feed_parser.feed(metadata) - return feed_parser.close() - - -def check_dist_requires_python(dist): - pkg_info_dict = get_metadata(dist) - requires_python = pkg_info_dict.get('Requires-Python') - try: - if not check_requires_python(requires_python): - raise exceptions.UnsupportedPythonVersion( - "%s requires Python '%s' but the running Python is %s" % ( - dist.project_name, - requires_python, - '.'.join(map(str, sys.version_info[:3])),) - ) - except specifiers.InvalidSpecifier as e: - logger.warning( - "Package %s has an invalid Requires-Python entry %s - %s", - dist.project_name, requires_python, e, - ) - return - - -def get_installer(dist): - # type: (Distribution) -> str - if dist.has_metadata('INSTALLER'): - for line in dist.get_metadata_lines('INSTALLER'): - if line.strip(): - return line.strip() - return '' diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/packaging.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/packaging.pyc deleted file mode 100644 index 4e085d7768d6d502f331c28da5a77b5e111e0b3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3489 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 Zx7?Pqj0b=2G`G%DZL!uk(P%Z6{slJHPJ{pe diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/setuptools_build.py b/venv/lib/python2.7/site-packages/pip/_internal/utils/setuptools_build.py deleted file mode 100644 index 03973e9..0000000 --- a/venv/lib/python2.7/site-packages/pip/_internal/utils/setuptools_build.py +++ /dev/null @@ -1,8 +0,0 @@ -# Shim to wrap setup.py invocation with setuptools -SETUPTOOLS_SHIM = ( - "import setuptools, tokenize;__file__=%r;" - "f=getattr(tokenize, 'open', open)(__file__);" - "code=f.read().replace('\\r\\n', '\\n');" - "f.close();" - "exec(compile(code, __file__, 'exec'))" -) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/setuptools_build.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/setuptools_build.pyc deleted file mode 100644 index 2653a4ccdf6032dd48aa143f757fb788a0db9604..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 404 zcmYLFT}#6-6z$xL4Aj5S7il8hvY`y6PJ9_CI5+5gkxA&9+Yy#EF-iCJ=CAPw`Ukuf z$1a?6l5-FDk~DwLT327^A9?U!4b(@3Yaxjsct>soDLJXVZzQ=g+WOFeuZ-7Pxj6KC z38maa!g(PTa6Y)SNikS}&%C$f(2m1M8z`eVtc8+8nkKmxFeo|}GC?ScQCSWon%P;M zj*w|mbaJH~5SqXia+2$n!Cj~V;_xsE!*w^J^p(^v@fS$xaQZfxj>j)4PoJJg1g+pm zZi825tXyXv*gCVU&`N-HY`<l@YdbGD%U=Jp?Dp+VKfiU`JF&N2tc77yW~6D$()moO uw(pG=d{SF~;Ii~!%S^G#OXb+{$N0RGN_5Q5pW^QOl@^tPhbEpKBKQRxy>=D= diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/temp_dir.py b/venv/lib/python2.7/site-packages/pip/_internal/utils/temp_dir.py deleted file mode 100644 index 2c81ad5..0000000 --- a/venv/lib/python2.7/site-packages/pip/_internal/utils/temp_dir.py +++ /dev/null @@ -1,155 +0,0 @@ -from __future__ import absolute_import - -import errno -import itertools -import logging -import os.path -import tempfile - -from pip._internal.utils.misc import rmtree - -logger = logging.getLogger(__name__) - - -class TempDirectory(object): - """Helper class that owns and cleans up a temporary directory. - - This class can be used as a context manager or as an OO representation of a - temporary directory. - - Attributes: - path - Location to the created temporary directory or None - delete - Whether the directory should be deleted when exiting - (when used as a contextmanager) - - Methods: - create() - Creates a temporary directory and stores its path in the path - attribute. - cleanup() - Deletes the temporary directory and sets path attribute to None - - When used as a context manager, a temporary directory is created on - entering the context and, if the delete attribute is True, on exiting the - context the created directory is deleted. - """ - - def __init__(self, path=None, delete=None, kind="temp"): - super(TempDirectory, self).__init__() - - if path is None and delete is None: - # If we were not given an explicit directory, and we were not given - # an explicit delete option, then we'll default to deleting. - delete = True - - self.path = path - self.delete = delete - self.kind = kind - - def __repr__(self): - return "<{} {!r}>".format(self.__class__.__name__, self.path) - - def __enter__(self): - self.create() - return self - - def __exit__(self, exc, value, tb): - if self.delete: - self.cleanup() - - def create(self): - """Create a temporary directory and store its path in self.path - """ - if self.path is not None: - logger.debug( - "Skipped creation of temporary directory: {}".format(self.path) - ) - return - # We realpath here because some systems have their default tmpdir - # symlinked to another directory. This tends to confuse build - # scripts, so we canonicalize the path by traversing potential - # symlinks here. - self.path = os.path.realpath( - tempfile.mkdtemp(prefix="pip-{}-".format(self.kind)) - ) - logger.debug("Created temporary directory: {}".format(self.path)) - - def cleanup(self): - """Remove the temporary directory created and reset state - """ - if self.path is not None and os.path.exists(self.path): - rmtree(self.path) - self.path = None - - -class AdjacentTempDirectory(TempDirectory): - """Helper class that creates a temporary directory adjacent to a real one. - - Attributes: - original - The original directory to create a temp directory for. - path - After calling create() or entering, contains the full - path to the temporary directory. - delete - Whether the directory should be deleted when exiting - (when used as a contextmanager) - - """ - # The characters that may be used to name the temp directory - # We always prepend a ~ and then rotate through these until - # a usable name is found. - # pkg_resources raises a different error for .dist-info folder - # with leading '-' and invalid metadata - LEADING_CHARS = "-~.=%0123456789" - - def __init__(self, original, delete=None): - super(AdjacentTempDirectory, self).__init__(delete=delete) - self.original = original.rstrip('/\\') - - @classmethod - def _generate_names(cls, name): - """Generates a series of temporary names. - - The algorithm replaces the leading characters in the name - with ones that are valid filesystem characters, but are not - valid package names (for both Python and pip definitions of - package). - """ - for i in range(1, len(name)): - for candidate in itertools.combinations_with_replacement( - cls.LEADING_CHARS, i - 1): - new_name = '~' + ''.join(candidate) + name[i:] - if new_name != name: - yield new_name - - # If we make it this far, we will have to make a longer name - for i in range(len(cls.LEADING_CHARS)): - for candidate in itertools.combinations_with_replacement( - cls.LEADING_CHARS, i): - new_name = '~' + ''.join(candidate) + name - if new_name != name: - yield new_name - - def create(self): - root, name = os.path.split(self.original) - for candidate in self._generate_names(name): - path = os.path.join(root, candidate) - try: - os.mkdir(path) - except OSError as ex: - # Continue if the name exists already - if ex.errno != errno.EEXIST: - raise - else: - self.path = os.path.realpath(path) - break - - if not self.path: - # Final fallback on the default behavior. - self.path = os.path.realpath( - tempfile.mkdtemp(prefix="pip-{}-".format(self.kind)) - ) - logger.debug("Created temporary directory: {}".format(self.path)) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/temp_dir.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/temp_dir.pyc deleted file mode 100644 index 811d41a5ba6ef03b9d1c0887170291f4929aa47f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6397 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 OnB-q&rZQbU`{2I^NgEIV diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/typing.py b/venv/lib/python2.7/site-packages/pip/_internal/utils/typing.py deleted file mode 100644 index 10170ce..0000000 --- a/venv/lib/python2.7/site-packages/pip/_internal/utils/typing.py +++ /dev/null @@ -1,29 +0,0 @@ -"""For neatly implementing static typing in pip. - -`mypy` - the static type analysis tool we use - uses the `typing` module, which -provides core functionality fundamental to mypy's functioning. - -Generally, `typing` would be imported at runtime and used in that fashion - -it acts as a no-op at runtime and does not have any run-time overhead by -design. - -As it turns out, `typing` is not vendorable - it uses separate sources for -Python 2/Python 3. Thus, this codebase can not expect it to be present. -To work around this, mypy allows the typing import to be behind a False-y -optional to prevent it from running at runtime and type-comments can be used -to remove the need for the types to be accessible directly during runtime. - -This module provides the False-y guard in a nicely named fashion so that a -curious maintainer can reach here to read this. - -In pip, all static-typing related imports should be guarded as follows: - - from pip._internal.utils.typing import MYPY_CHECK_RUNNING - - if MYPY_CHECK_RUNNING: - from typing import ... - -Ref: https://github.com/python/mypy/issues/3216 -""" - -MYPY_CHECK_RUNNING = False diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/typing.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/typing.pyc deleted file mode 100644 index ffcc5c5fb40b8e5fb96c5477076392f67549d2e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1350 zcmZWp+iu)85S5*@DFh@a^4gbqi&3nkI1Y@~D2iOrToA-CQuiSNf;E?%T@jH;g`{?^ zy!D&&13AOpI5%O%<@L;&Gl#nN@n-q^|F_=iV)yLf{{i0kD;iT2Z;FEViZ}a(*(?4% z*q4<@*Nftb59C;-ZX(+c9rx^#bt{TVC95e-gN&@B!47p<Ui8y2T~I}-<*)WIDW|$A z+DOU!jy6nVWNbr=DeS%2B3)4L&DimbHm%idIRwA9279y*Ov};fWIdp4nq*{@@KGI5 zNh05gS9?GUe4eu7pt^3FeTlH~V`pf=l8_IH4XH$7L|(n{G(yTqN~y)dQpFY_sVZ$E zrBft@A30z7;roNegQ@e0TD2CaNnopt>(?AwR){;5$j7c6*gcE{&@=`Y$&cwPju1+4 z*6fTAYSD>S*qY^vJgA@&^z~!Vh`98jJeyJrmiL-n=cuOhc8oJ50W9qeFBBBl%4J}_ z99X9u-HQ}M;0Pt_^4!zLhj*lchrIdpEK5sJ(QmfJ`dsy_pJ)$+1-BLl6g^R0<Z3GY zuq~CW10Jd5c+22>k;RE`z7rm}Txs7+Q9&A90W8%hff2Zeh}kTTQ6OZU2XaVkC3}^I z9?^<k#s*{v+nO;*s9k}f`nf2wwHb)*{3RaTF{jn2LN)-(Y&8SJ!DooLvqJO;4C<=X z!1g21l!Xl~yp~x9R=TB@VcAR^WtTD__VavEW+LY9dQ>|x19zw?!e&t;#rCsJGaanJ zcT1m(a8j0pCrc^!ZjR_2a4qUF*)G=K*5~Exv)A*-&;EJ*V*cvC)6?gtPq)YIl73t| z$;eme-y+pDQh3G76KYc$;z`r2Y--0vjhZz>c3>mdu(2_Y9GjzihsWjV!8LqL(hW58 zx$$~FPd}lb#ZI@;`;o)}W{WRP>@jSHVAoKnS*y@M2g4yYA1<5eC@kFO-Qn?jclS8l zKh}T5%RkMBa2L;NXwDl5R9T1bRo7MN@a1ZLCR6#n(yht5HQQ`!Wbz9l{<ZbU-@l<B J<%9V1{wHwlzuo`< diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/ui.py b/venv/lib/python2.7/site-packages/pip/_internal/utils/ui.py deleted file mode 100644 index 0902ce7..0000000 --- a/venv/lib/python2.7/site-packages/pip/_internal/utils/ui.py +++ /dev/null @@ -1,424 +0,0 @@ -from __future__ import absolute_import, division - -import contextlib -import itertools -import logging -import sys -import time -from signal import SIGINT, default_int_handler, signal - -from pip._vendor import six -from pip._vendor.progress import HIDE_CURSOR, SHOW_CURSOR -from pip._vendor.progress.bar import Bar, FillingCirclesBar, IncrementalBar -from pip._vendor.progress.spinner import Spinner - -from pip._internal.utils.compat import WINDOWS -from pip._internal.utils.logging import get_indentation -from pip._internal.utils.misc import format_size -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import Any, Iterator, IO - -try: - from pip._vendor import colorama -# Lots of different errors can come from this, including SystemError and -# ImportError. -except Exception: - colorama = None - -logger = logging.getLogger(__name__) - - -def _select_progress_class(preferred, fallback): - encoding = getattr(preferred.file, "encoding", None) - - # If we don't know what encoding this file is in, then we'll just assume - # that it doesn't support unicode and use the ASCII bar. - if not encoding: - return fallback - - # Collect all of the possible characters we want to use with the preferred - # bar. - characters = [ - getattr(preferred, "empty_fill", six.text_type()), - getattr(preferred, "fill", six.text_type()), - ] - characters += list(getattr(preferred, "phases", [])) - - # Try to decode the characters we're using for the bar using the encoding - # of the given file, if this works then we'll assume that we can use the - # fancier bar and if not we'll fall back to the plaintext bar. - try: - six.text_type().join(characters).encode(encoding) - except UnicodeEncodeError: - return fallback - else: - return preferred - - -_BaseBar = _select_progress_class(IncrementalBar, Bar) # type: Any - - -class InterruptibleMixin(object): - """ - Helper to ensure that self.finish() gets called on keyboard interrupt. - - This allows downloads to be interrupted without leaving temporary state - (like hidden cursors) behind. - - This class is similar to the progress library's existing SigIntMixin - helper, but as of version 1.2, that helper has the following problems: - - 1. It calls sys.exit(). - 2. It discards the existing SIGINT handler completely. - 3. It leaves its own handler in place even after an uninterrupted finish, - which will have unexpected delayed effects if the user triggers an - unrelated keyboard interrupt some time after a progress-displaying - download has already completed, for example. - """ - - def __init__(self, *args, **kwargs): - """ - Save the original SIGINT handler for later. - """ - super(InterruptibleMixin, self).__init__(*args, **kwargs) - - self.original_handler = signal(SIGINT, self.handle_sigint) - - # If signal() returns None, the previous handler was not installed from - # Python, and we cannot restore it. This probably should not happen, - # but if it does, we must restore something sensible instead, at least. - # The least bad option should be Python's default SIGINT handler, which - # just raises KeyboardInterrupt. - if self.original_handler is None: - self.original_handler = default_int_handler - - def finish(self): - """ - Restore the original SIGINT handler after finishing. - - This should happen regardless of whether the progress display finishes - normally, or gets interrupted. - """ - super(InterruptibleMixin, self).finish() - signal(SIGINT, self.original_handler) - - def handle_sigint(self, signum, frame): - """ - Call self.finish() before delegating to the original SIGINT handler. - - This handler should only be in place while the progress display is - active. - """ - self.finish() - self.original_handler(signum, frame) - - -class SilentBar(Bar): - - def update(self): - pass - - -class BlueEmojiBar(IncrementalBar): - - suffix = "%(percent)d%%" - bar_prefix = " " - bar_suffix = " " - phases = (u"\U0001F539", u"\U0001F537", u"\U0001F535") # type: Any - - -class DownloadProgressMixin(object): - - def __init__(self, *args, **kwargs): - super(DownloadProgressMixin, self).__init__(*args, **kwargs) - self.message = (" " * (get_indentation() + 2)) + self.message - - @property - def downloaded(self): - return format_size(self.index) - - @property - def download_speed(self): - # Avoid zero division errors... - if self.avg == 0.0: - return "..." - return format_size(1 / self.avg) + "/s" - - @property - def pretty_eta(self): - if self.eta: - return "eta %s" % self.eta_td - return "" - - def iter(self, it, n=1): - for x in it: - yield x - self.next(n) - self.finish() - - -class WindowsMixin(object): - - def __init__(self, *args, **kwargs): - # The Windows terminal does not support the hide/show cursor ANSI codes - # even with colorama. So we'll ensure that hide_cursor is False on - # Windows. - # This call needs to go before the super() call, so that hide_cursor - # is set in time. The base progress bar class writes the "hide cursor" - # code to the terminal in its init, so if we don't set this soon - # enough, we get a "hide" with no corresponding "show"... - if WINDOWS and self.hide_cursor: - self.hide_cursor = False - - super(WindowsMixin, self).__init__(*args, **kwargs) - - # Check if we are running on Windows and we have the colorama module, - # if we do then wrap our file with it. - if WINDOWS and colorama: - self.file = colorama.AnsiToWin32(self.file) - # The progress code expects to be able to call self.file.isatty() - # but the colorama.AnsiToWin32() object doesn't have that, so we'll - # add it. - self.file.isatty = lambda: self.file.wrapped.isatty() - # The progress code expects to be able to call self.file.flush() - # but the colorama.AnsiToWin32() object doesn't have that, so we'll - # add it. - self.file.flush = lambda: self.file.wrapped.flush() - - -class BaseDownloadProgressBar(WindowsMixin, InterruptibleMixin, - DownloadProgressMixin): - - file = sys.stdout - message = "%(percent)d%%" - suffix = "%(downloaded)s %(download_speed)s %(pretty_eta)s" - -# NOTE: The "type: ignore" comments on the following classes are there to -# work around https://github.com/python/typing/issues/241 - - -class DefaultDownloadProgressBar(BaseDownloadProgressBar, - _BaseBar): - pass - - -class DownloadSilentBar(BaseDownloadProgressBar, SilentBar): # type: ignore - pass - - -class DownloadIncrementalBar(BaseDownloadProgressBar, # type: ignore - IncrementalBar): - pass - - -class DownloadFillingCirclesBar(BaseDownloadProgressBar, # type: ignore - FillingCirclesBar): - pass - - -class DownloadBlueEmojiProgressBar(BaseDownloadProgressBar, # type: ignore - BlueEmojiBar): - pass - - -class DownloadProgressSpinner(WindowsMixin, InterruptibleMixin, - DownloadProgressMixin, Spinner): - - file = sys.stdout - suffix = "%(downloaded)s %(download_speed)s" - - def next_phase(self): - if not hasattr(self, "_phaser"): - self._phaser = itertools.cycle(self.phases) - return next(self._phaser) - - def update(self): - message = self.message % self - phase = self.next_phase() - suffix = self.suffix % self - line = ''.join([ - message, - " " if message else "", - phase, - " " if suffix else "", - suffix, - ]) - - self.writeln(line) - - -BAR_TYPES = { - "off": (DownloadSilentBar, DownloadSilentBar), - "on": (DefaultDownloadProgressBar, DownloadProgressSpinner), - "ascii": (DownloadIncrementalBar, DownloadProgressSpinner), - "pretty": (DownloadFillingCirclesBar, DownloadProgressSpinner), - "emoji": (DownloadBlueEmojiProgressBar, DownloadProgressSpinner) -} - - -def DownloadProgressProvider(progress_bar, max=None): - if max is None or max == 0: - return BAR_TYPES[progress_bar][1]().iter - else: - return BAR_TYPES[progress_bar][0](max=max).iter - - -################################################################ -# Generic "something is happening" spinners -# -# We don't even try using progress.spinner.Spinner here because it's actually -# simpler to reimplement from scratch than to coerce their code into doing -# what we need. -################################################################ - -@contextlib.contextmanager -def hidden_cursor(file): - # type: (IO) -> Iterator[None] - # The Windows terminal does not support the hide/show cursor ANSI codes, - # even via colorama. So don't even try. - if WINDOWS: - yield - # We don't want to clutter the output with control characters if we're - # writing to a file, or if the user is running with --quiet. - # See https://github.com/pypa/pip/issues/3418 - elif not file.isatty() or logger.getEffectiveLevel() > logging.INFO: - yield - else: - file.write(HIDE_CURSOR) - try: - yield - finally: - file.write(SHOW_CURSOR) - - -class RateLimiter(object): - def __init__(self, min_update_interval_seconds): - # type: (float) -> None - self._min_update_interval_seconds = min_update_interval_seconds - self._last_update = 0 # type: float - - def ready(self): - # type: () -> bool - now = time.time() - delta = now - self._last_update - return delta >= self._min_update_interval_seconds - - def reset(self): - # type: () -> None - self._last_update = time.time() - - -class SpinnerInterface(object): - def spin(self): - # type: () -> None - raise NotImplementedError() - - def finish(self, final_status): - # type: (str) -> None - raise NotImplementedError() - - -class InteractiveSpinner(SpinnerInterface): - def __init__(self, message, file=None, spin_chars="-\\|/", - # Empirically, 8 updates/second looks nice - min_update_interval_seconds=0.125): - self._message = message - if file is None: - file = sys.stdout - self._file = file - self._rate_limiter = RateLimiter(min_update_interval_seconds) - self._finished = False - - self._spin_cycle = itertools.cycle(spin_chars) - - self._file.write(" " * get_indentation() + self._message + " ... ") - self._width = 0 - - def _write(self, status): - assert not self._finished - # Erase what we wrote before by backspacing to the beginning, writing - # spaces to overwrite the old text, and then backspacing again - backup = "\b" * self._width - self._file.write(backup + " " * self._width + backup) - # Now we have a blank slate to add our status - self._file.write(status) - self._width = len(status) - self._file.flush() - self._rate_limiter.reset() - - def spin(self): - # type: () -> None - if self._finished: - return - if not self._rate_limiter.ready(): - return - self._write(next(self._spin_cycle)) - - def finish(self, final_status): - # type: (str) -> None - if self._finished: - return - self._write(final_status) - self._file.write("\n") - self._file.flush() - self._finished = True - - -# Used for dumb terminals, non-interactive installs (no tty), etc. -# We still print updates occasionally (once every 60 seconds by default) to -# act as a keep-alive for systems like Travis-CI that take lack-of-output as -# an indication that a task has frozen. -class NonInteractiveSpinner(SpinnerInterface): - def __init__(self, message, min_update_interval_seconds=60): - # type: (str, float) -> None - self._message = message - self._finished = False - self._rate_limiter = RateLimiter(min_update_interval_seconds) - self._update("started") - - def _update(self, status): - assert not self._finished - self._rate_limiter.reset() - logger.info("%s: %s", self._message, status) - - def spin(self): - # type: () -> None - if self._finished: - return - if not self._rate_limiter.ready(): - return - self._update("still running...") - - def finish(self, final_status): - # type: (str) -> None - if self._finished: - return - self._update("finished with status '%s'" % (final_status,)) - self._finished = True - - -@contextlib.contextmanager -def open_spinner(message): - # type: (str) -> Iterator[SpinnerInterface] - # Interactive spinner goes directly to sys.stdout rather than being routed - # through the logging system, but it acts like it has level INFO, - # i.e. it's only displayed if we're at level INFO or better. - # Non-interactive spinner goes through the logging system, so it is always - # in sync with logging configuration. - if sys.stdout.isatty() and logger.getEffectiveLevel() <= logging.INFO: - spinner = InteractiveSpinner(message) # type: SpinnerInterface - else: - spinner = NonInteractiveSpinner(message) - try: - with hidden_cursor(sys.stdout): - yield spinner - except KeyboardInterrupt: - spinner.finish("canceled") - raise - except Exception: - spinner.finish("error") - raise - else: - spinner.finish("done") diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/ui.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/ui.pyc deleted file mode 100644 index 600aaae86e3b386501a64a32373f6a3a333efa70..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17200 zcmdU0%WoV<das@t4j-aKNu(&zlB||(StDB_t%v1Dy!M(S+2-1&?51o<gLP(_(=}w1 zJw3DCJrt?f$=VWj7f!GNf=w<tEE439bAliVkRU;hx#W;bF1h5COMn3R2lD%U)!j3q zB<~^zjxtgg>)ln~`}?Z8_&@t6Ui$jL7fqG^M)3Fh4W;6^sFa8QmI{<=TdHQMc0tt& z%3^In1w~aWN)O~qs#ePKBdRu%<;$v8&hn$GHY)j|3dU4>T-C-^dqUMFRC`R-#>~7W z73@>(NmZLP<q;L^SM39;c0jeKRBg)CmQ`?2wGXM<A=N&tYKK*OTGgga+o%d=RQrgk z9WmuG70jykQB^x?%Ht|HrrL9=HfPEcDtJb<kE_~oQ{Jb76RLeu)lMo)pH$Hq+3%zZ zo>lErs&-1XZB?^X`?RW^R#vFg&W!A8zpVT@ReMfZx5A^Uq@P!t6Do2n`~WZ1hnBjn zN7Tj{rC(I{0n)R|JD?sYRjVkC|I<nzQuopIobslWeo3_~<sD>)`%2xZy{x=L?7`Z@ zdF^@SVcfLT&g8Whly@YXVK%RwSKiUA_E=uKpu9Py7nFWk>3P)xQlH7&UQyn0rC(9{ zoN5)6cOq}NsJxTXa9$do%^NN$@02uPNf=@04VRU7S{e>Z!*hAV73DoI4Hu;0g}mWa z<pEUL!t@c<0+GF#H(yo$h|-t%pKm&=uIh_QUzI`yh09st912&m!b>Q;niXDFS8K14 zn!WSt0TA-K(nYoLhVm}RTTt_+^5!#;E#$BM4dnqQ20<6|+P9R4)x0IBxSZF1PkDH` zseLuCeLH*8RjI<8-r+h{DzAY7eKKREfFzkh;;zP>pqJ>n-|lvzBpE}U=WqG3-wBs1 z;8T^9k*qAezqEWanP#hQxxFB%`(aXFcSA4Gk#vduwa^VJ7Kd<L>~EXb>_g#$rEAyg z)z6%j8&1OV$_F=YrDgLHj#zY~<PiS8=Ldlwu2uc08R(d`2T;2dHY45EVd4g;GVdAX zR9!y|^+3g~rR8fkZmpOe+~b<&YCR53ur1TTRkS)$+fC}Re@~mr!>IiD&L?;3)eo*$ zKdd{SEiW%Ezu#ZsyWx&NXerT=n*d&f<I)W?n4oKRf==YN-6k7KcnG{|1JL+$WD=#m zRB8h}hX3HaqWY?!zAUKtl={+AE2bHk0{k{gWK8r(E0GzfTq~%rit0;Lj$|E5YEAls z_g_QXj@=)yQD#>(Y>e`4$Uur5RwZnOQskEkQiSinjm52CT`Ltz>Sfuf4x1eh$Veto zrQ6+Pr``g367Eeh++cUzjdffZM>Zi!0B|=+qO6ma%yK8x4ku2epWaUD$xhd_1%8}J zr;QHCic`vabwY%E7W!C&zRs2C>rvE+Dtx<4(~WdXN0Ihqu`M?UR^8^NGsAYSxVi2| zZWGvwD<~;RVzR(OH}bdKL@#W)(L$>ec<8clZ+l_qa<m%W-Mo19N8u}1qbpaNugBYO zc=w`L@LTIH++67T-3xvgg9?KS$;FS?>YuPm9<qdvzyu4u#1G<yo<HB+NoMi3daMK8 zOzPdJvli(%t~UcWj!&Z{X0x)6l*(3V<cM{=aAKrr+17q*q#&DL;*?RZoA|4N{@CC4 z!zKstM^0O8V2X3dXh?b?Driwq*8>zGYzvZsWGhN$L^&%0yZE0#pA$BIALyW~BRlEX zI*fafwv%-?v9a9Ne9I60c)fDY20CNAi4AMd?u7QH-dXLqk!Q<xxwiQUnd|1dAKU2G zxf|PF=WZBuTrcL-tGeG8bKLcl^-eFb1MO~swCn_Q1+Iy9Y=AY<GFK(=H?_U)dth6; z*^A;%6raOH>tN);*9jnPyf^mSe&EVZl67rokhTMVl~bRMZM_XD<NH?pHGoxsDeqbr z7@W6Pu_iaRJ1u())Bs6gU!1>m-ay3ku|eo4Ya0}UZE`Za2$*TdZyFd}oVS+}0T!0D z6VKzNN#)$Uyyud%d4Ajk^vpc{HHm=5{31~8W~bc^bfSYDGxV|yCBSrS`#=Z4n|Jm@ zyBoMoZR;%n%WZ*TY&W!fVU8dG-C*;)EChJJyY4sFfr%i%G+P>-^>!B|ik_Yh+#USY ztrjZqx|VFY7n4pRe{BuG!Ti}wy)eQ64t$g_?6}hgN%=_9W#x#u061XPJAh#}Q${la zWjBbl>+R%_@XiD15s>H-G6pJ5vH&#)pBoLZ!pF!!VkQ;^EzF$_$XDbG>gV7WNKgnF zO5hQ;AybEBL=kqRr8dV@w4@+MOg*eGRIZ2$i@%3yvsKzFgcpgR17P@IciU*k93NaK zArhHYlFgQlaHRN)dtf-{1um2tqYkOzC-u5RndVS!B>RyVLV#+*8<ON8YO=RwO4oUY z1GsaepE#a;D{|D0)?$&Pn|GNVmhf|4#G*ds!njpcnkyU`ow5XN8S1JHw4O!dF0|c$ z6k%2$A%BknIYJyALl=KHP7L`OCIHE$B7~?BsTD&Y1s*Wi?Sh3Oy#@}2?IFV8?z#rH zLHmPZC8ge!t#q6(CZtUf1Uu(J9!7EwaN!_9P|G=Im<TPfXqMNf1c!JN<HDhg9~u_V z<K-@%m^7wFr>$njbo^UwpygR)$V%WkAdWe(op2sFZ2)n9fqprxssPk3U9+meJ(@BI zI1p(K{qY^lwi}U|08J6v34<M@eo_$$xfd8p$u&fVO23apm<;|_Dr5}%k}(~^!Qh1Z z7M$d!Z?6qo3@C*42Y(AcN%q#(aL7lScv3`7SQV00DrZ8htX>zhs9tY(yk5W}?X`N{ z>og&P$gO6RoT$HxVQhs=@eUr59OZ-M!uY}Q39<QBfWa_<570!j{3uHn8|X{#A-9Ac zzy>PN;$d?xb6BW0QV@AGc3HD*Hp}c#Sxv~P*Y%)1wy~C&WTz|<@Xi7k_X?BCNQR4@ zOIX1c9$8?ykW3=K81(e@c4xyML=72bv4M^@GC69DkxB~{&MC}OiR%DUq}G_~?@R?s zvI#Vw^Uj=sHdo5-QTY7#FMsj3S>~^^%wGw7veM()Id30+hG%=NmcK3Bu<Ayz%=KU~ zmR9E|#tj$HSFi#|)07PgWsCokBdEESTG*eYKE=b%0SQOo{sUxkxEq#090G7h{=Pt; zMR62ZMAQRCaTi#GWhCf%fcz+ViI5atB4YW7+4VXyyYzS8?83WXdEJ-D-q9JVhLSpp zKXuGZ{^Kmm&Z|g$u3DT=qZr>n(Fi5dgovs(l(M^~4M$KZIxjJK8A%^edn|P+Hh+T0 zNL_2LZ{To0)kaFw0Fcp(0Bk08*ui0RLzD-D6x+ks_resJF|NIDu{<M)3W9lZBXL%3 zpq@bIuEbj2EU0K&LQP;<5Rqv(j{Sm)j;3LSHH?rSqrhr@e%|MV@`8ofM2y(rZmkJm zo&s<XKN&dcaaU^(-h_(D3aU6|l^%odV`wtFj}XEYZv+O>?23fpgy3a3;w1K&7=!`p zB`JVUz^!nCIXC{+6YnY5{{$8T`IsQ~gEjpjN@nkcaciF?*b{q@@|o*zHqhZBGTSyy zz-wO|OM_LPi(Lr7m>ATLM%As9A)w<#6p#{@4J0@le9}bh5eZrtdy8Q56Hy7Fq}#*d zdvUaUxOsn!B^d{YaU1K9RT)D~U*Cub6C(^ZC-hpf<GjTVZ!=kB@;;LOHYB&lGK`}3 z0iKx1hOt$eDou?}l|`}Nf?PsO=V1jyR4q0z;8)mOqzFD!>`N&LYLAYqpNWTn3__^L z*DVEy+c@Yb(sLgf^xQG#8%Cl{iZ~|6k5Pef@R<53EN@5|i*ndB)yK2S!a(H&Un8W( zH7z%h$d9|3ZeWG<v^jw+57C4BeG8EzoH-<-i0(%86+PipKSsE7r-G*4-rC+`QE2R~ zz-_O3?%RKZ)x=!V|80}b4=~iYG(itxK+d#F7VYikoR6@Azr!P&sxW@<(Cn1+1Oy6o z-Gm8c&F{HEtc?+|#EvgA;pv6+em9K$n;nq#<x7H4=R-C#cJySsf)pYWXpeWzmH!!@ zm|94UO<9wLxzZ#8#z#tKv3<9IT@9YtRdRd0Si<^G@nmiR?dL_D4eYj62R(#bkeozk zW2tJeKaPOKKIDO~7@{yfDf=IF4`TX6XDXS7*50|;?iY>1ma4uEI~P|*F{m%1Me!nD zYg~iGLwMRy#+&SR70GY`%NW`};1R`JE{@X)VEpfzIgI<Y;5&x?2EG6#^2X%o!(g~O zyom+<GoFles8+IVeTT>YbZ_c2Y~o+?O<8gllx^za^UQ~YwCL5RduN|xSO1#ttdLMI zW;=W2{PzFb=5Ap#|2D9>69b#eqa2yv{a9J{bR+LJ_Ve!p`=gl7ke6*MJyw4db#%I) zB&K0OGGt(m9VK2+<ZDhN=}Y7%2<S(B%PSZLYY{#IGyqIO923Ce=aCMqGei``twI!m zmLsf1RN~M)JF{6fkxe<8j!YPoA|D5Max^`TJZ<-+(+OfR8Jat|Z6FaJr-nwSie#6; zBNB3NRjT;n^n>cMlmEn`jPqqpS;vgyIfA+}o@xVaZDa@uNoT*xJkR?|t{R|0pf`&f z0)Q!i$S{qiB3wEts8A~5o#D1X^zlGVQLW*`%u-*O(=((3XydaH!^;jswGzWI;Tut# zzsWl4PKT;JwVDC+AT*swNe+7o{AGXAT^uXi0MP>PApl(htpA0D#WP40yt+v|Wvd9F z^O-E}_V65Zb5@v85SmTP_AjH@-^MWZatAB;4?HH2PSc?<J|gx`r`3`RES*pg;Kohg z7X!!`N>ZsA&~4K2;zL|l8<^`oWI#9Yq;PB+ACo+eP!a!mDLs6h13}G!>_BiU;9Ah+ z94Ky%Q6Vt1vRE&USP4@t`$&|85@cm<ciR}Zv~eWpzxb|Gzj^1A>np}r=3>M*g-2~} zR3M1!tf96K>^){whJ1DlQ3%s5cqY*ZjNFuMk6DNNVKlOCvw^lIG7xpq0fO{%EBsWL zn1E7~uy27T3Ow{F(J|gEsp$2z=UM4lCVPQHt$X99{ubt;96*D($<}QFHjQm_7A?M$ zI6i{%pu=;0xqgM~9@pjQA4gyx;YvXuoXZY4I2GPpT7K__P{-W}?CenZI25i%T#^HZ zh6M(S&8?Bt9h@QP>D8-|vNcwE&KfK12NRDM#1nLI(DD&(jzAL-1@a?|78@A#JTgYp z0d^1MGzlckOcpVRivnA^h<-VXkTR<cjGje?(iQOuQDDpn#~44xki3a?oj})m+YjsJ z<j342+HwP28)|k!FBVF#<H}Hy_K;yF9(EjKzhmgI5FsA-Il{h#1uBFJn}jPtl|zXB zDu^Ds>ORzyC?b-qrH+|vaV!+n=13kb=V&27-Y9Wml$;1j-)R@&5q9nhapDX)afh{k zS%KVOnI{m)BC0?wB48jWaxhGzkb_}>O4!K+L!BP7vfrn`Afe2{9X6d@;l{WNRWSPe z;YftD%|-7Z>El3hdn=cnA8`d44$9W}$aq=q)1(G2Zi4Bkh1*k2^phXqzSzLtsC=Hp z|7kQL$0i3=Ifw!X*aSs?lX5$omIZNge|EW(Eb$5xud-^-+-GE$;hsB_OJm%meG^Mb zk(!INUu$p9Z()W3xx~;M?z2#c;XI=^yemlOv5>d>yD~=!eNqL(nL7`|rP6y?#v5EE z5dkVK^>2Tg%P713G4@+*U;qzJQz|vzLxAkyfSFGy%)L(p(n_MY5K9}8OqqI%DqG%n z;fG%?(00P_AKz(`!TC_yRvYL7TJCEyxCfqCebMREEP=3w2S&F6TC60ln79Wlie19Y z7|pniiS!~eYxaqK0()kXt_Uu@;WctPtkh9#;3%ybPtFkQVilR2tLC6M=K5@$9ok|z zR;Exiw_MWmVRJbyx5`Bt^Ww4=aUeJB>bSwJ>w!`J&JE5$rx3k(?Nxiu4^eWyU_E2a zh$BKl8z-^D7GZSC_4-}kOV)R}H0GdS0?lR|?jgqx<idb3++#UNZF`Lrb{H82KVTC7 z#^KG37Y-MmvxM7;auQaxfqoR-Kor#TBn&9n@Dylb&_FBCP(`CrE~S$uOc4!7Q4-|! zn_<TSnLq+fe`6Bmqszp*91M=iiB5JD$fYdDSg#s0ekGCPe1k;326#8dbyVKw7Xj)# zVB?RO5I155;F6Gp^qsF+EqaJ^8mozTGjd6+UtSvTb^8)vZ&4#lsEaMVLIg>q-#S>_ zZ=EU}1cC;P2JWERKp(oz2077wGUN&i5*z_IV>_=Jyz*+$z|NwLmL)18AT=-&h5aoi zme_}biJpQ0h=YyMa5g8CG$cy^3C`RLsL!5i1MSyP@feU8niC2WFA5|~YGhB8A*n!d zBu%^}JsRY!hV&)|KqP?qF`9(LgtWvKy&3g%U++0zp~tWYNzTgG2rFt|1FQYkK@iaL zuJaBfA1M+X*%yIqPTDzeXzTxNyu6y>8aJH^ll#Xf$H(Np6TTl2TkY}ckT_dxVCM_S zr0P)It_L_g67d8PLBH)0jR-|ZZQ{R$B)`|n>8cG(cL|x?i!*VIx_qDmDVK_}>`Hk` zSi)aILgF_=%0#g93?cmvW)oFoxQ?c&u%7hHd^_^ENGXYp4PR+&5g}t(6bXt7BWJx5 z>Z%R2zJ?4LYEV_MoP{kca0=oUsrJC7d+=Zp>YbuUKqU^+nfOiIhB1`-4Q6zH!sKfv z6yMG!5@9(%Y;_#Ma)9rC#v&e*?5zNIevbFTfz4t(<hUk^@`(=jS8br}A~FU@ze;33 zLP-+9z{e}NE*<qkeAlrC+s9b40w{rzh;OcB_)ek-ZI}yB6xyWmY6I=_$UFupq!f!+ zI%X-W5&lA-hsE<824<!jzGF$&<>R4VY@a<7pEVHy0Sy7-{4SCKS{b^G{+6K0SgK^r zn0wm&qgaWa2vrFrp90DJdw^gsTXor*9EBe}CNy3^3k7Jifj#{tGK^(pmPmA&#+cEv zP_hU|ZsN27mG}}-?w^8d!b#fhd2#0y4RJFGkpKG=(A5@VqPHL|KD~V_d>0=sPRNIg zU#A}~ZtSCEA)x@{;XK+WrTtF^+Rc?SwjWTpF(1ds5t0!?lw{_E$EF)L@$rEtE(1Qj z!$+QM^zij!g(km~I~C^E2!)apFljRhnNW>6gqYJsB0<#;(~ssvh4Gs?!Krv0*SDJ* z-}m9eRD#kRh=^;Je%Ol2VF)z|I^w!oD4q|#u>Av~pD__N_JTEqU{(>P1+7yajW8W8 zRKAZ^IkKwPTfGF|6XL4^j&LwG{UQ^m4LHuiXL-iK5~vAGCCEis%U4kHWs`Vb_`Gty zjxXE1PGr6xok5?0%K7XJpdW}%7>s{hmw6r&kntRGCnk_fPCThEJvZ#zq5CJdEo4Ud zoCk4@dHKk5o?q&@iMffySnT8aq_K13GUiL$HBlSi1)8hCgz@91!RNA&{LU1YLkA`; zGq~;Wx`cC>3B!rbFPLy1p)f@BKa%*qkuXBC&$E$`sPlpj4zXp*&gurf`Ey?2@Jmdt zFnNQ?5|dAv++@P54GwPsI6N(PZZo;VWSt2t0pq73eob_@-4M67BjE>e!JT{T)@PJI zLa~BpAlX|TF0gpZd=|rSk&4OGvmo>A-w8Nlv(^dgApXif+{QmuC|Wac)Fuj3#qr}) z#o5<p%d=y%&(5A4x27k`)^uqOU-nMt&$u-^R}^L;!yGJ4P92_^Jv2KpdujIM{{ozq BWL5wG diff --git a/venv/lib/python2.7/site-packages/pip/_internal/vcs/__init__.py b/venv/lib/python2.7/site-packages/pip/_internal/vcs/__init__.py deleted file mode 100644 index 6fca079..0000000 --- a/venv/lib/python2.7/site-packages/pip/_internal/vcs/__init__.py +++ /dev/null @@ -1,604 +0,0 @@ -"""Handles all VCS (version control) support""" -from __future__ import absolute_import - -import errno -import logging -import os -import shutil -import sys - -from pip._vendor import pkg_resources -from pip._vendor.six.moves.urllib import parse as urllib_parse - -from pip._internal.exceptions import BadCommand -from pip._internal.utils.misc import ( - ask_path_exists, backup_dir, call_subprocess, display_path, rmtree, -) -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import ( - Any, Dict, Iterable, List, Mapping, Optional, Text, Tuple, Type - ) - from pip._internal.utils.ui import SpinnerInterface - - AuthInfo = Tuple[Optional[str], Optional[str]] - -__all__ = ['vcs'] - - -logger = logging.getLogger(__name__) - - -def make_vcs_requirement_url(repo_url, rev, project_name, subdir=None): - """ - Return the URL for a VCS requirement. - - Args: - repo_url: the remote VCS url, with any needed VCS prefix (e.g. "git+"). - project_name: the (unescaped) project name. - """ - egg_project_name = pkg_resources.to_filename(project_name) - req = '{}@{}#egg={}'.format(repo_url, rev, egg_project_name) - if subdir: - req += '&subdirectory={}'.format(subdir) - - return req - - -class RemoteNotFoundError(Exception): - pass - - -class RevOptions(object): - - """ - Encapsulates a VCS-specific revision to install, along with any VCS - install options. - - Instances of this class should be treated as if immutable. - """ - - def __init__( - self, - vc_class, # type: Type[VersionControl] - rev=None, # type: Optional[str] - extra_args=None, # type: Optional[List[str]] - ): - # type: (...) -> None - """ - Args: - vc_class: a VersionControl subclass. - rev: the name of the revision to install. - extra_args: a list of extra options. - """ - if extra_args is None: - extra_args = [] - - self.extra_args = extra_args - self.rev = rev - self.vc_class = vc_class - - def __repr__(self): - return '<RevOptions {}: rev={!r}>'.format(self.vc_class.name, self.rev) - - @property - def arg_rev(self): - # type: () -> Optional[str] - if self.rev is None: - return self.vc_class.default_arg_rev - - return self.rev - - def to_args(self): - # type: () -> List[str] - """ - Return the VCS-specific command arguments. - """ - args = [] # type: List[str] - rev = self.arg_rev - if rev is not None: - args += self.vc_class.get_base_rev_args(rev) - args += self.extra_args - - return args - - def to_display(self): - # type: () -> str - if not self.rev: - return '' - - return ' (to revision {})'.format(self.rev) - - def make_new(self, rev): - # type: (str) -> RevOptions - """ - Make a copy of the current instance, but with a new rev. - - Args: - rev: the name of the revision for the new object. - """ - return self.vc_class.make_rev_options(rev, extra_args=self.extra_args) - - -class VcsSupport(object): - _registry = {} # type: Dict[str, Type[VersionControl]] - schemes = ['ssh', 'git', 'hg', 'bzr', 'sftp', 'svn'] - - def __init__(self): - # type: () -> None - # Register more schemes with urlparse for various version control - # systems - urllib_parse.uses_netloc.extend(self.schemes) - # Python >= 2.7.4, 3.3 doesn't have uses_fragment - if getattr(urllib_parse, 'uses_fragment', None): - urllib_parse.uses_fragment.extend(self.schemes) - super(VcsSupport, self).__init__() - - def __iter__(self): - return self._registry.__iter__() - - @property - def backends(self): - # type: () -> List[Type[VersionControl]] - return list(self._registry.values()) - - @property - def dirnames(self): - # type: () -> List[str] - return [backend.dirname for backend in self.backends] - - @property - def all_schemes(self): - # type: () -> List[str] - schemes = [] # type: List[str] - for backend in self.backends: - schemes.extend(backend.schemes) - return schemes - - def register(self, cls): - # type: (Type[VersionControl]) -> None - if not hasattr(cls, 'name'): - logger.warning('Cannot register VCS %s', cls.__name__) - return - if cls.name not in self._registry: - self._registry[cls.name] = cls - logger.debug('Registered VCS backend: %s', cls.name) - - def unregister(self, cls=None, name=None): - # type: (Optional[Type[VersionControl]], Optional[str]) -> None - if name in self._registry: - del self._registry[name] - elif cls in self._registry.values(): - del self._registry[cls.name] - else: - logger.warning('Cannot unregister because no class or name given') - - def get_backend_type(self, location): - # type: (str) -> Optional[Type[VersionControl]] - """ - Return the type of the version control backend if found at given - location, e.g. vcs.get_backend_type('/path/to/vcs/checkout') - """ - for vc_type in self._registry.values(): - if vc_type.controls_location(location): - logger.debug('Determine that %s uses VCS: %s', - location, vc_type.name) - return vc_type - return None - - def get_backend(self, name): - # type: (str) -> Optional[Type[VersionControl]] - name = name.lower() - if name in self._registry: - return self._registry[name] - return None - - -vcs = VcsSupport() - - -class VersionControl(object): - name = '' - dirname = '' - repo_name = '' - # List of supported schemes for this Version Control - schemes = () # type: Tuple[str, ...] - # Iterable of environment variable names to pass to call_subprocess(). - unset_environ = () # type: Tuple[str, ...] - default_arg_rev = None # type: Optional[str] - - @classmethod - def should_add_vcs_url_prefix(cls, remote_url): - """ - Return whether the vcs prefix (e.g. "git+") should be added to a - repository's remote url when used in a requirement. - """ - return not remote_url.lower().startswith('{}:'.format(cls.name)) - - @classmethod - def get_subdirectory(cls, repo_dir): - """ - Return the path to setup.py, relative to the repo root. - """ - return None - - @classmethod - def get_requirement_revision(cls, repo_dir): - """ - Return the revision string that should be used in a requirement. - """ - return cls.get_revision(repo_dir) - - @classmethod - def get_src_requirement(cls, repo_dir, project_name): - """ - Return the requirement string to use to redownload the files - currently at the given repository directory. - - Args: - project_name: the (unescaped) project name. - - The return value has a form similar to the following: - - {repository_url}@{revision}#egg={project_name} - """ - repo_url = cls.get_remote_url(repo_dir) - if repo_url is None: - return None - - if cls.should_add_vcs_url_prefix(repo_url): - repo_url = '{}+{}'.format(cls.name, repo_url) - - revision = cls.get_requirement_revision(repo_dir) - subdir = cls.get_subdirectory(repo_dir) - req = make_vcs_requirement_url(repo_url, revision, project_name, - subdir=subdir) - - return req - - def __init__(self, url=None, *args, **kwargs): - self.url = url - super(VersionControl, self).__init__(*args, **kwargs) - - @staticmethod - def get_base_rev_args(rev): - """ - Return the base revision arguments for a vcs command. - - Args: - rev: the name of a revision to install. Cannot be None. - """ - raise NotImplementedError - - @classmethod - def make_rev_options(cls, rev=None, extra_args=None): - # type: (Optional[str], Optional[List[str]]) -> RevOptions - """ - Return a RevOptions object. - - Args: - rev: the name of a revision to install. - extra_args: a list of extra options. - """ - return RevOptions(cls, rev, extra_args=extra_args) - - @classmethod - def _is_local_repository(cls, repo): - # type: (str) -> bool - """ - posix absolute paths start with os.path.sep, - win32 ones start with drive (like c:\\folder) - """ - drive, tail = os.path.splitdrive(repo) - return repo.startswith(os.path.sep) or bool(drive) - - def export(self, location): - """ - Export the repository at the url to the destination location - i.e. only download the files, without vcs informations - """ - raise NotImplementedError - - @classmethod - def get_netloc_and_auth(cls, netloc, scheme): - """ - Parse the repository URL's netloc, and return the new netloc to use - along with auth information. - - Args: - netloc: the original repository URL netloc. - scheme: the repository URL's scheme without the vcs prefix. - - This is mainly for the Subversion class to override, so that auth - information can be provided via the --username and --password options - instead of through the URL. For other subclasses like Git without - such an option, auth information must stay in the URL. - - Returns: (netloc, (username, password)). - """ - return netloc, (None, None) - - @classmethod - def get_url_rev_and_auth(cls, url): - # type: (str) -> Tuple[str, Optional[str], AuthInfo] - """ - Parse the repository URL to use, and return the URL, revision, - and auth info to use. - - Returns: (url, rev, (username, password)). - """ - scheme, netloc, path, query, frag = urllib_parse.urlsplit(url) - if '+' not in scheme: - raise ValueError( - "Sorry, {!r} is a malformed VCS url. " - "The format is <vcs>+<protocol>://<url>, " - "e.g. svn+http://myrepo/svn/MyApp#egg=MyApp".format(url) - ) - # Remove the vcs prefix. - scheme = scheme.split('+', 1)[1] - netloc, user_pass = cls.get_netloc_and_auth(netloc, scheme) - rev = None - if '@' in path: - path, rev = path.rsplit('@', 1) - url = urllib_parse.urlunsplit((scheme, netloc, path, query, '')) - return url, rev, user_pass - - @staticmethod - def make_rev_args(username, password): - """ - Return the RevOptions "extra arguments" to use in obtain(). - """ - return [] - - def get_url_rev_options(self, url): - # type: (str) -> Tuple[str, RevOptions] - """ - Return the URL and RevOptions object to use in obtain() and in - some cases export(), as a tuple (url, rev_options). - """ - url, rev, user_pass = self.get_url_rev_and_auth(url) - username, password = user_pass - extra_args = self.make_rev_args(username, password) - rev_options = self.make_rev_options(rev, extra_args=extra_args) - - return url, rev_options - - @staticmethod - def normalize_url(url): - # type: (str) -> str - """ - Normalize a URL for comparison by unquoting it and removing any - trailing slash. - """ - return urllib_parse.unquote(url).rstrip('/') - - @classmethod - def compare_urls(cls, url1, url2): - # type: (str, str) -> bool - """ - Compare two repo URLs for identity, ignoring incidental differences. - """ - return (cls.normalize_url(url1) == cls.normalize_url(url2)) - - @classmethod - def fetch_new(cls, dest, url, rev_options): - """ - Fetch a revision from a repository, in the case that this is the - first fetch from the repository. - - Args: - dest: the directory to fetch the repository to. - rev_options: a RevOptions object. - """ - raise NotImplementedError - - def switch(self, dest, url, rev_options): - """ - Switch the repo at ``dest`` to point to ``URL``. - - Args: - rev_options: a RevOptions object. - """ - raise NotImplementedError - - def update(self, dest, url, rev_options): - """ - Update an already-existing repo to the given ``rev_options``. - - Args: - rev_options: a RevOptions object. - """ - raise NotImplementedError - - @classmethod - def is_commit_id_equal(cls, dest, name): - """ - Return whether the id of the current commit equals the given name. - - Args: - dest: the repository directory. - name: a string name. - """ - raise NotImplementedError - - def obtain(self, dest): - # type: (str) -> None - """ - Install or update in editable mode the package represented by this - VersionControl object. - - Args: - dest: the repository directory in which to install or update. - """ - url, rev_options = self.get_url_rev_options(self.url) - - if not os.path.exists(dest): - self.fetch_new(dest, url, rev_options) - return - - rev_display = rev_options.to_display() - if self.is_repository_directory(dest): - existing_url = self.get_remote_url(dest) - if self.compare_urls(existing_url, url): - logger.debug( - '%s in %s exists, and has correct URL (%s)', - self.repo_name.title(), - display_path(dest), - url, - ) - if not self.is_commit_id_equal(dest, rev_options.rev): - logger.info( - 'Updating %s %s%s', - display_path(dest), - self.repo_name, - rev_display, - ) - self.update(dest, url, rev_options) - else: - logger.info('Skipping because already up-to-date.') - return - - logger.warning( - '%s %s in %s exists with URL %s', - self.name, - self.repo_name, - display_path(dest), - existing_url, - ) - prompt = ('(s)witch, (i)gnore, (w)ipe, (b)ackup ', - ('s', 'i', 'w', 'b')) - else: - logger.warning( - 'Directory %s already exists, and is not a %s %s.', - dest, - self.name, - self.repo_name, - ) - # https://github.com/python/mypy/issues/1174 - prompt = ('(i)gnore, (w)ipe, (b)ackup ', # type: ignore - ('i', 'w', 'b')) - - logger.warning( - 'The plan is to install the %s repository %s', - self.name, - url, - ) - response = ask_path_exists('What to do? %s' % prompt[0], prompt[1]) - - if response == 'a': - sys.exit(-1) - - if response == 'w': - logger.warning('Deleting %s', display_path(dest)) - rmtree(dest) - self.fetch_new(dest, url, rev_options) - return - - if response == 'b': - dest_dir = backup_dir(dest) - logger.warning( - 'Backing up %s to %s', display_path(dest), dest_dir, - ) - shutil.move(dest, dest_dir) - self.fetch_new(dest, url, rev_options) - return - - # Do nothing if the response is "i". - if response == 's': - logger.info( - 'Switching %s %s to %s%s', - self.repo_name, - display_path(dest), - url, - rev_display, - ) - self.switch(dest, url, rev_options) - - def unpack(self, location): - # type: (str) -> None - """ - Clean up current location and download the url repository - (and vcs infos) into location - """ - if os.path.exists(location): - rmtree(location) - self.obtain(location) - - @classmethod - def get_remote_url(cls, location): - """ - Return the url used at location - - Raises RemoteNotFoundError if the repository does not have a remote - url configured. - """ - raise NotImplementedError - - @classmethod - def get_revision(cls, location): - """ - Return the current commit id of the files at the given location. - """ - raise NotImplementedError - - @classmethod - def run_command( - cls, - cmd, # type: List[str] - show_stdout=True, # type: bool - cwd=None, # type: Optional[str] - on_returncode='raise', # type: str - extra_ok_returncodes=None, # type: Optional[Iterable[int]] - command_desc=None, # type: Optional[str] - extra_environ=None, # type: Optional[Mapping[str, Any]] - spinner=None # type: Optional[SpinnerInterface] - ): - # type: (...) -> Optional[Text] - """ - Run a VCS subcommand - This is simply a wrapper around call_subprocess that adds the VCS - command name, and checks that the VCS is available - """ - cmd = [cls.name] + cmd - try: - return call_subprocess(cmd, show_stdout, cwd, - on_returncode=on_returncode, - extra_ok_returncodes=extra_ok_returncodes, - command_desc=command_desc, - extra_environ=extra_environ, - unset_environ=cls.unset_environ, - spinner=spinner) - except OSError as e: - # errno.ENOENT = no such file or directory - # In other words, the VCS executable isn't available - if e.errno == errno.ENOENT: - raise BadCommand( - 'Cannot find command %r - do you have ' - '%r installed and in your ' - 'PATH?' % (cls.name, cls.name)) - else: - raise # re-raise exception if a different error occurred - - @classmethod - def is_repository_directory(cls, path): - # type: (str) -> bool - """ - Return whether a directory path is a repository directory. - """ - logger.debug('Checking in %s for %s (%s)...', - path, cls.dirname, cls.name) - return os.path.exists(os.path.join(path, cls.dirname)) - - @classmethod - def controls_location(cls, location): - # type: (str) -> bool - """ - Check if a location is controlled by the vcs. - It is meant to be overridden to implement smarter detection - mechanisms for specific vcs. - - This can do more than is_repository_directory() alone. For example, - the Git override checks that Git is actually available. - """ - return cls.is_repository_directory(location) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/vcs/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_internal/vcs/__init__.pyc deleted file mode 100644 index 011e3400c04b5c9e3f51291a468dc2883be1bfc6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22654 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 A-v9sr diff --git a/venv/lib/python2.7/site-packages/pip/_internal/vcs/bazaar.py b/venv/lib/python2.7/site-packages/pip/_internal/vcs/bazaar.py deleted file mode 100644 index 3587b3d..0000000 --- a/venv/lib/python2.7/site-packages/pip/_internal/vcs/bazaar.py +++ /dev/null @@ -1,103 +0,0 @@ -from __future__ import absolute_import - -import logging -import os - -from pip._vendor.six.moves.urllib import parse as urllib_parse - -from pip._internal.download import path_to_url -from pip._internal.utils.misc import display_path, rmtree -from pip._internal.vcs import VersionControl, vcs - -logger = logging.getLogger(__name__) - - -class Bazaar(VersionControl): - name = 'bzr' - dirname = '.bzr' - repo_name = 'branch' - schemes = ( - 'bzr', 'bzr+http', 'bzr+https', 'bzr+ssh', 'bzr+sftp', 'bzr+ftp', - 'bzr+lp', - ) - - def __init__(self, url=None, *args, **kwargs): - super(Bazaar, self).__init__(url, *args, **kwargs) - # This is only needed for python <2.7.5 - # Register lp but do not expose as a scheme to support bzr+lp. - if getattr(urllib_parse, 'uses_fragment', None): - urllib_parse.uses_fragment.extend(['lp']) - - @staticmethod - def get_base_rev_args(rev): - return ['-r', rev] - - def export(self, location): - """ - Export the Bazaar repository at the url to the destination location - """ - # Remove the location to make sure Bazaar can export it correctly - if os.path.exists(location): - rmtree(location) - - url, rev_options = self.get_url_rev_options(self.url) - self.run_command( - ['export', location, url] + rev_options.to_args(), - show_stdout=False, - ) - - @classmethod - def fetch_new(cls, dest, url, rev_options): - rev_display = rev_options.to_display() - logger.info( - 'Checking out %s%s to %s', - url, - rev_display, - display_path(dest), - ) - cmd_args = ['branch', '-q'] + rev_options.to_args() + [url, dest] - cls.run_command(cmd_args) - - def switch(self, dest, url, rev_options): - self.run_command(['switch', url], cwd=dest) - - def update(self, dest, url, rev_options): - cmd_args = ['pull', '-q'] + rev_options.to_args() - self.run_command(cmd_args, cwd=dest) - - @classmethod - def get_url_rev_and_auth(cls, url): - # hotfix the URL scheme after removing bzr+ from bzr+ssh:// readd it - url, rev, user_pass = super(Bazaar, cls).get_url_rev_and_auth(url) - if url.startswith('ssh://'): - url = 'bzr+' + url - return url, rev, user_pass - - @classmethod - def get_remote_url(cls, location): - urls = cls.run_command(['info'], show_stdout=False, cwd=location) - for line in urls.splitlines(): - line = line.strip() - for x in ('checkout of branch: ', - 'parent branch: '): - if line.startswith(x): - repo = line.split(x)[1] - if cls._is_local_repository(repo): - return path_to_url(repo) - return repo - return None - - @classmethod - def get_revision(cls, location): - revision = cls.run_command( - ['revno'], show_stdout=False, cwd=location, - ) - return revision.splitlines()[-1] - - @classmethod - def is_commit_id_equal(cls, dest, name): - """Always assume the versions don't match""" - return False - - -vcs.register(Bazaar) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/vcs/bazaar.pyc b/venv/lib/python2.7/site-packages/pip/_internal/vcs/bazaar.pyc deleted file mode 100644 index a430345544e6694f9b233d8cb3d991d3d564c59e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5100 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 VTPU12YFo7}lt;H~?fUIM{u_dkij4pO diff --git a/venv/lib/python2.7/site-packages/pip/_internal/vcs/git.py b/venv/lib/python2.7/site-packages/pip/_internal/vcs/git.py deleted file mode 100644 index 35ea930..0000000 --- a/venv/lib/python2.7/site-packages/pip/_internal/vcs/git.py +++ /dev/null @@ -1,362 +0,0 @@ -from __future__ import absolute_import - -import logging -import os.path -import re - -from pip._vendor.packaging.version import parse as parse_version -from pip._vendor.six.moves.urllib import parse as urllib_parse -from pip._vendor.six.moves.urllib import request as urllib_request - -from pip._internal.exceptions import BadCommand -from pip._internal.utils.compat import samefile -from pip._internal.utils.misc import display_path, redact_password_from_url -from pip._internal.utils.temp_dir import TempDirectory -from pip._internal.vcs import RemoteNotFoundError, VersionControl, vcs - -urlsplit = urllib_parse.urlsplit -urlunsplit = urllib_parse.urlunsplit - - -logger = logging.getLogger(__name__) - - -HASH_REGEX = re.compile('[a-fA-F0-9]{40}') - - -def looks_like_hash(sha): - return bool(HASH_REGEX.match(sha)) - - -class Git(VersionControl): - name = 'git' - dirname = '.git' - repo_name = 'clone' - schemes = ( - 'git', 'git+http', 'git+https', 'git+ssh', 'git+git', 'git+file', - ) - # Prevent the user's environment variables from interfering with pip: - # https://github.com/pypa/pip/issues/1130 - unset_environ = ('GIT_DIR', 'GIT_WORK_TREE') - default_arg_rev = 'HEAD' - - def __init__(self, url=None, *args, **kwargs): - - # Works around an apparent Git bug - # (see https://article.gmane.org/gmane.comp.version-control.git/146500) - if url: - scheme, netloc, path, query, fragment = urlsplit(url) - if scheme.endswith('file'): - initial_slashes = path[:-len(path.lstrip('/'))] - newpath = ( - initial_slashes + - urllib_request.url2pathname(path) - .replace('\\', '/').lstrip('/') - ) - url = urlunsplit((scheme, netloc, newpath, query, fragment)) - after_plus = scheme.find('+') + 1 - url = scheme[:after_plus] + urlunsplit( - (scheme[after_plus:], netloc, newpath, query, fragment), - ) - - super(Git, self).__init__(url, *args, **kwargs) - - @staticmethod - def get_base_rev_args(rev): - return [rev] - - def get_git_version(self): - VERSION_PFX = 'git version ' - version = self.run_command(['version'], show_stdout=False) - if version.startswith(VERSION_PFX): - version = version[len(VERSION_PFX):].split()[0] - else: - version = '' - # get first 3 positions of the git version because - # on windows it is x.y.z.windows.t, and this parses as - # LegacyVersion which always smaller than a Version. - version = '.'.join(version.split('.')[:3]) - return parse_version(version) - - @classmethod - def get_current_branch(cls, location): - """ - Return the current branch, or None if HEAD isn't at a branch - (e.g. detached HEAD). - """ - # git-symbolic-ref exits with empty stdout if "HEAD" is a detached - # HEAD rather than a symbolic ref. In addition, the -q causes the - # command to exit with status code 1 instead of 128 in this case - # and to suppress the message to stderr. - args = ['symbolic-ref', '-q', 'HEAD'] - output = cls.run_command( - args, extra_ok_returncodes=(1, ), show_stdout=False, cwd=location, - ) - ref = output.strip() - - if ref.startswith('refs/heads/'): - return ref[len('refs/heads/'):] - - return None - - def export(self, location): - """Export the Git repository at the url to the destination location""" - if not location.endswith('/'): - location = location + '/' - - with TempDirectory(kind="export") as temp_dir: - self.unpack(temp_dir.path) - self.run_command( - ['checkout-index', '-a', '-f', '--prefix', location], - show_stdout=False, cwd=temp_dir.path - ) - - @classmethod - def get_revision_sha(cls, dest, rev): - """ - Return (sha_or_none, is_branch), where sha_or_none is a commit hash - if the revision names a remote branch or tag, otherwise None. - - Args: - dest: the repository directory. - rev: the revision name. - """ - # Pass rev to pre-filter the list. - output = cls.run_command(['show-ref', rev], cwd=dest, - show_stdout=False, on_returncode='ignore') - refs = {} - for line in output.strip().splitlines(): - try: - sha, ref = line.split() - except ValueError: - # Include the offending line to simplify troubleshooting if - # this error ever occurs. - raise ValueError('unexpected show-ref line: {!r}'.format(line)) - - refs[ref] = sha - - branch_ref = 'refs/remotes/origin/{}'.format(rev) - tag_ref = 'refs/tags/{}'.format(rev) - - sha = refs.get(branch_ref) - if sha is not None: - return (sha, True) - - sha = refs.get(tag_ref) - - return (sha, False) - - @classmethod - def resolve_revision(cls, dest, url, rev_options): - """ - Resolve a revision to a new RevOptions object with the SHA1 of the - branch, tag, or ref if found. - - Args: - rev_options: a RevOptions object. - """ - rev = rev_options.arg_rev - sha, is_branch = cls.get_revision_sha(dest, rev) - - if sha is not None: - rev_options = rev_options.make_new(sha) - rev_options.branch_name = rev if is_branch else None - - return rev_options - - # Do not show a warning for the common case of something that has - # the form of a Git commit hash. - if not looks_like_hash(rev): - logger.warning( - "Did not find branch or tag '%s', assuming revision or ref.", - rev, - ) - - if not rev.startswith('refs/'): - return rev_options - - # If it looks like a ref, we have to fetch it explicitly. - cls.run_command( - ['fetch', '-q', url] + rev_options.to_args(), - cwd=dest, - ) - # Change the revision to the SHA of the ref we fetched - sha = cls.get_revision(dest, rev='FETCH_HEAD') - rev_options = rev_options.make_new(sha) - - return rev_options - - @classmethod - def is_commit_id_equal(cls, dest, name): - """ - Return whether the current commit hash equals the given name. - - Args: - dest: the repository directory. - name: a string name. - """ - if not name: - # Then avoid an unnecessary subprocess call. - return False - - return cls.get_revision(dest) == name - - @classmethod - def fetch_new(cls, dest, url, rev_options): - rev_display = rev_options.to_display() - logger.info( - 'Cloning %s%s to %s', redact_password_from_url(url), - rev_display, display_path(dest), - ) - cls.run_command(['clone', '-q', url, dest]) - - if rev_options.rev: - # Then a specific revision was requested. - rev_options = cls.resolve_revision(dest, url, rev_options) - branch_name = getattr(rev_options, 'branch_name', None) - if branch_name is None: - # Only do a checkout if the current commit id doesn't match - # the requested revision. - if not cls.is_commit_id_equal(dest, rev_options.rev): - cmd_args = ['checkout', '-q'] + rev_options.to_args() - cls.run_command(cmd_args, cwd=dest) - elif cls.get_current_branch(dest) != branch_name: - # Then a specific branch was requested, and that branch - # is not yet checked out. - track_branch = 'origin/{}'.format(branch_name) - cmd_args = [ - 'checkout', '-b', branch_name, '--track', track_branch, - ] - cls.run_command(cmd_args, cwd=dest) - - #: repo may contain submodules - cls.update_submodules(dest) - - def switch(self, dest, url, rev_options): - self.run_command(['config', 'remote.origin.url', url], cwd=dest) - cmd_args = ['checkout', '-q'] + rev_options.to_args() - self.run_command(cmd_args, cwd=dest) - - self.update_submodules(dest) - - def update(self, dest, url, rev_options): - # First fetch changes from the default remote - if self.get_git_version() >= parse_version('1.9.0'): - # fetch tags in addition to everything else - self.run_command(['fetch', '-q', '--tags'], cwd=dest) - else: - self.run_command(['fetch', '-q'], cwd=dest) - # Then reset to wanted revision (maybe even origin/master) - rev_options = self.resolve_revision(dest, url, rev_options) - cmd_args = ['reset', '--hard', '-q'] + rev_options.to_args() - self.run_command(cmd_args, cwd=dest) - #: update submodules - self.update_submodules(dest) - - @classmethod - def get_remote_url(cls, location): - """ - Return URL of the first remote encountered. - - Raises RemoteNotFoundError if the repository does not have a remote - url configured. - """ - # We need to pass 1 for extra_ok_returncodes since the command - # exits with return code 1 if there are no matching lines. - stdout = cls.run_command( - ['config', '--get-regexp', r'remote\..*\.url'], - extra_ok_returncodes=(1, ), show_stdout=False, cwd=location, - ) - remotes = stdout.splitlines() - try: - found_remote = remotes[0] - except IndexError: - raise RemoteNotFoundError - - for remote in remotes: - if remote.startswith('remote.origin.url '): - found_remote = remote - break - url = found_remote.split(' ')[1] - return url.strip() - - @classmethod - def get_revision(cls, location, rev=None): - if rev is None: - rev = 'HEAD' - current_rev = cls.run_command( - ['rev-parse', rev], show_stdout=False, cwd=location, - ) - return current_rev.strip() - - @classmethod - def get_subdirectory(cls, location): - # find the repo root - git_dir = cls.run_command(['rev-parse', '--git-dir'], - show_stdout=False, cwd=location).strip() - if not os.path.isabs(git_dir): - git_dir = os.path.join(location, git_dir) - root_dir = os.path.join(git_dir, '..') - # find setup.py - orig_location = location - while not os.path.exists(os.path.join(location, 'setup.py')): - last_location = location - location = os.path.dirname(location) - if location == last_location: - # We've traversed up to the root of the filesystem without - # finding setup.py - logger.warning( - "Could not find setup.py for directory %s (tried all " - "parent directories)", - orig_location, - ) - return None - # relative path of setup.py to repo root - if samefile(root_dir, location): - return None - return os.path.relpath(location, root_dir) - - @classmethod - def get_url_rev_and_auth(cls, url): - """ - Prefixes stub URLs like 'user@hostname:user/repo.git' with 'ssh://'. - That's required because although they use SSH they sometimes don't - work with a ssh:// scheme (e.g. GitHub). But we need a scheme for - parsing. Hence we remove it again afterwards and return it as a stub. - """ - if '://' not in url: - assert 'file:' not in url - url = url.replace('git+', 'git+ssh://') - url, rev, user_pass = super(Git, cls).get_url_rev_and_auth(url) - url = url.replace('ssh://', '') - else: - url, rev, user_pass = super(Git, cls).get_url_rev_and_auth(url) - - return url, rev, user_pass - - @classmethod - def update_submodules(cls, location): - if not os.path.exists(os.path.join(location, '.gitmodules')): - return - cls.run_command( - ['submodule', 'update', '--init', '--recursive', '-q'], - cwd=location, - ) - - @classmethod - def controls_location(cls, location): - if super(Git, cls).controls_location(location): - return True - try: - r = cls.run_command(['rev-parse'], - cwd=location, - show_stdout=False, - on_returncode='ignore') - return not r - except BadCommand: - logger.debug("could not determine if %s is under git control " - "because git is not available", location) - return False - - -vcs.register(Git) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/vcs/git.pyc b/venv/lib/python2.7/site-packages/pip/_internal/vcs/git.pyc deleted file mode 100644 index 08abc1de3e110c6b8735763a6b92ed952b005645..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12424 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 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/vcs/mercurial.py b/venv/lib/python2.7/site-packages/pip/_internal/vcs/mercurial.py deleted file mode 100644 index 81edc4a..0000000 --- a/venv/lib/python2.7/site-packages/pip/_internal/vcs/mercurial.py +++ /dev/null @@ -1,105 +0,0 @@ -from __future__ import absolute_import - -import logging -import os - -from pip._vendor.six.moves import configparser - -from pip._internal.download import path_to_url -from pip._internal.utils.misc import display_path -from pip._internal.utils.temp_dir import TempDirectory -from pip._internal.vcs import VersionControl, vcs - -logger = logging.getLogger(__name__) - - -class Mercurial(VersionControl): - name = 'hg' - dirname = '.hg' - repo_name = 'clone' - schemes = ('hg', 'hg+http', 'hg+https', 'hg+ssh', 'hg+static-http') - - @staticmethod - def get_base_rev_args(rev): - return [rev] - - def export(self, location): - """Export the Hg repository at the url to the destination location""" - with TempDirectory(kind="export") as temp_dir: - self.unpack(temp_dir.path) - - self.run_command( - ['archive', location], show_stdout=False, cwd=temp_dir.path - ) - - @classmethod - def fetch_new(cls, dest, url, rev_options): - rev_display = rev_options.to_display() - logger.info( - 'Cloning hg %s%s to %s', - url, - rev_display, - display_path(dest), - ) - cls.run_command(['clone', '--noupdate', '-q', url, dest]) - cmd_args = ['update', '-q'] + rev_options.to_args() - cls.run_command(cmd_args, cwd=dest) - - def switch(self, dest, url, rev_options): - repo_config = os.path.join(dest, self.dirname, 'hgrc') - config = configparser.SafeConfigParser() - try: - config.read(repo_config) - config.set('paths', 'default', url) - with open(repo_config, 'w') as config_file: - config.write(config_file) - except (OSError, configparser.NoSectionError) as exc: - logger.warning( - 'Could not switch Mercurial repository to %s: %s', url, exc, - ) - else: - cmd_args = ['update', '-q'] + rev_options.to_args() - self.run_command(cmd_args, cwd=dest) - - def update(self, dest, url, rev_options): - self.run_command(['pull', '-q'], cwd=dest) - cmd_args = ['update', '-q'] + rev_options.to_args() - self.run_command(cmd_args, cwd=dest) - - @classmethod - def get_remote_url(cls, location): - url = cls.run_command( - ['showconfig', 'paths.default'], - show_stdout=False, cwd=location).strip() - if cls._is_local_repository(url): - url = path_to_url(url) - return url.strip() - - @classmethod - def get_revision(cls, location): - """ - Return the repository-local changeset revision number, as an integer. - """ - current_revision = cls.run_command( - ['parents', '--template={rev}'], - show_stdout=False, cwd=location).strip() - return current_revision - - @classmethod - def get_requirement_revision(cls, location): - """ - Return the changeset identification hash, as a 40-character - hexadecimal string - """ - current_rev_hash = cls.run_command( - ['parents', '--template={node}'], - show_stdout=False, cwd=location).strip() - return current_rev_hash - - @classmethod - def is_commit_id_equal(cls, dest, name): - """Always assume the versions don't match""" - return False - - -vcs.register(Mercurial) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/vcs/mercurial.pyc b/venv/lib/python2.7/site-packages/pip/_internal/vcs/mercurial.pyc deleted file mode 100644 index 809ed1f885fb1db4396cc897b1aef64ab71f0206..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5223 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 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/vcs/subversion.py b/venv/lib/python2.7/site-packages/pip/_internal/vcs/subversion.py deleted file mode 100644 index 01bb161..0000000 --- a/venv/lib/python2.7/site-packages/pip/_internal/vcs/subversion.py +++ /dev/null @@ -1,234 +0,0 @@ -from __future__ import absolute_import - -import logging -import os -import re - -from pip._internal.utils.logging import indent_log -from pip._internal.utils.misc import ( - display_path, rmtree, split_auth_from_netloc, -) -from pip._internal.utils.typing import MYPY_CHECK_RUNNING -from pip._internal.vcs import VersionControl, vcs - -_svn_xml_url_re = re.compile('url="([^"]+)"') -_svn_rev_re = re.compile(r'committed-rev="(\d+)"') -_svn_info_xml_rev_re = re.compile(r'\s*revision="(\d+)"') -_svn_info_xml_url_re = re.compile(r'<url>(.*)</url>') - - -if MYPY_CHECK_RUNNING: - from typing import Optional, Tuple - -logger = logging.getLogger(__name__) - - -class Subversion(VersionControl): - name = 'svn' - dirname = '.svn' - repo_name = 'checkout' - schemes = ('svn', 'svn+ssh', 'svn+http', 'svn+https', 'svn+svn') - - @classmethod - def should_add_vcs_url_prefix(cls, remote_url): - return True - - @staticmethod - def get_base_rev_args(rev): - return ['-r', rev] - - def get_vcs_version(self): - # type: () -> Optional[Tuple[int, ...]] - """Return the version of the currently installed Subversion client. - - :return: A tuple containing the parts of the version information or - ``None`` if the version returned from ``svn`` could not be parsed. - :raises: BadCommand: If ``svn`` is not installed. - """ - # Example versions: - # svn, version 1.10.3 (r1842928) - # compiled Feb 25 2019, 14:20:39 on x86_64-apple-darwin17.0.0 - # svn, version 1.7.14 (r1542130) - # compiled Mar 28 2018, 08:49:13 on x86_64-pc-linux-gnu - version_prefix = 'svn, version ' - version = self.run_command(['--version'], show_stdout=False) - if not version.startswith(version_prefix): - return None - - version = version[len(version_prefix):].split()[0] - version_list = version.split('.') - try: - parsed_version = tuple(map(int, version_list)) - except ValueError: - return None - - if not parsed_version: - return None - - return parsed_version - - def export(self, location): - """Export the svn repository at the url to the destination location""" - url, rev_options = self.get_url_rev_options(self.url) - - logger.info('Exporting svn repository %s to %s', url, location) - with indent_log(): - if os.path.exists(location): - # Subversion doesn't like to check out over an existing - # directory --force fixes this, but was only added in svn 1.5 - rmtree(location) - cmd_args = ['export'] + rev_options.to_args() + [url, location] - self.run_command(cmd_args, show_stdout=False) - - @classmethod - def fetch_new(cls, dest, url, rev_options): - rev_display = rev_options.to_display() - logger.info( - 'Checking out %s%s to %s', - url, - rev_display, - display_path(dest), - ) - cmd_args = ['checkout', '-q'] + rev_options.to_args() + [url, dest] - cls.run_command(cmd_args) - - def switch(self, dest, url, rev_options): - cmd_args = ['switch'] + rev_options.to_args() + [url, dest] - self.run_command(cmd_args) - - def update(self, dest, url, rev_options): - cmd_args = ['update'] + rev_options.to_args() + [dest] - self.run_command(cmd_args) - - @classmethod - def get_revision(cls, location): - """ - Return the maximum revision for all files under a given location - """ - # Note: taken from setuptools.command.egg_info - revision = 0 - - for base, dirs, files in os.walk(location): - if cls.dirname not in dirs: - dirs[:] = [] - continue # no sense walking uncontrolled subdirs - dirs.remove(cls.dirname) - entries_fn = os.path.join(base, cls.dirname, 'entries') - if not os.path.exists(entries_fn): - # FIXME: should we warn? - continue - - dirurl, localrev = cls._get_svn_url_rev(base) - - if base == location: - base = dirurl + '/' # save the root url - elif not dirurl or not dirurl.startswith(base): - dirs[:] = [] - continue # not part of the same svn tree, skip it - revision = max(revision, localrev) - return revision - - @classmethod - def get_netloc_and_auth(cls, netloc, scheme): - """ - This override allows the auth information to be passed to svn via the - --username and --password options instead of via the URL. - """ - if scheme == 'ssh': - # The --username and --password options can't be used for - # svn+ssh URLs, so keep the auth information in the URL. - return super(Subversion, cls).get_netloc_and_auth(netloc, scheme) - - return split_auth_from_netloc(netloc) - - @classmethod - def get_url_rev_and_auth(cls, url): - # hotfix the URL scheme after removing svn+ from svn+ssh:// readd it - url, rev, user_pass = super(Subversion, cls).get_url_rev_and_auth(url) - if url.startswith('ssh://'): - url = 'svn+' + url - return url, rev, user_pass - - @staticmethod - def make_rev_args(username, password): - extra_args = [] - if username: - extra_args += ['--username', username] - if password: - extra_args += ['--password', password] - - return extra_args - - @classmethod - def get_remote_url(cls, location): - # In cases where the source is in a subdirectory, not alongside - # setup.py we have to look up in the location until we find a real - # setup.py - orig_location = location - while not os.path.exists(os.path.join(location, 'setup.py')): - last_location = location - location = os.path.dirname(location) - if location == last_location: - # We've traversed up to the root of the filesystem without - # finding setup.py - logger.warning( - "Could not find setup.py for directory %s (tried all " - "parent directories)", - orig_location, - ) - return None - - return cls._get_svn_url_rev(location)[0] - - @classmethod - def _get_svn_url_rev(cls, location): - from pip._internal.exceptions import InstallationError - - entries_path = os.path.join(location, cls.dirname, 'entries') - if os.path.exists(entries_path): - with open(entries_path) as f: - data = f.read() - else: # subversion >= 1.7 does not have the 'entries' file - data = '' - - if (data.startswith('8') or - data.startswith('9') or - data.startswith('10')): - data = list(map(str.splitlines, data.split('\n\x0c\n'))) - del data[0][0] # get rid of the '8' - url = data[0][3] - revs = [int(d[9]) for d in data if len(d) > 9 and d[9]] + [0] - elif data.startswith('<?xml'): - match = _svn_xml_url_re.search(data) - if not match: - raise ValueError('Badly formatted data: %r' % data) - url = match.group(1) # get repository URL - revs = [int(m.group(1)) for m in _svn_rev_re.finditer(data)] + [0] - else: - try: - # subversion >= 1.7 - xml = cls.run_command( - ['info', '--xml', location], - show_stdout=False, - ) - url = _svn_info_xml_url_re.search(xml).group(1) - revs = [ - int(m.group(1)) for m in _svn_info_xml_rev_re.finditer(xml) - ] - except InstallationError: - url, revs = None, [] - - if revs: - rev = max(revs) - else: - rev = 0 - - return url, rev - - @classmethod - def is_commit_id_equal(cls, dest, name): - """Always assume the versions don't match""" - return False - - -vcs.register(Subversion) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/vcs/subversion.pyc b/venv/lib/python2.7/site-packages/pip/_internal/vcs/subversion.pyc deleted file mode 100644 index 33ed1ffe32642c128ba288e4d0158b55ab47003c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8821 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 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/wheel.py b/venv/lib/python2.7/site-packages/pip/_internal/wheel.py deleted file mode 100644 index 1bdbe93..0000000 --- a/venv/lib/python2.7/site-packages/pip/_internal/wheel.py +++ /dev/null @@ -1,1098 +0,0 @@ -""" -Support for installing and building the "wheel" binary package format. -""" -from __future__ import absolute_import - -import collections -import compileall -import csv -import hashlib -import logging -import os.path -import re -import shutil -import stat -import sys -import warnings -from base64 import urlsafe_b64encode -from email.parser import Parser - -from pip._vendor import pkg_resources -from pip._vendor.distlib.scripts import ScriptMaker -from pip._vendor.packaging.utils import canonicalize_name -from pip._vendor.six import StringIO - -from pip._internal import pep425tags -from pip._internal.download import path_to_url, unpack_url -from pip._internal.exceptions import ( - InstallationError, InvalidWheelFilename, UnsupportedWheel, -) -from pip._internal.locations import ( - PIP_DELETE_MARKER_FILENAME, distutils_scheme, -) -from pip._internal.models.link import Link -from pip._internal.utils.logging import indent_log -from pip._internal.utils.misc import ( - LOG_DIVIDER, call_subprocess, captured_stdout, ensure_dir, - format_command_args, read_chunks, -) -from pip._internal.utils.setuptools_build import SETUPTOOLS_SHIM -from pip._internal.utils.temp_dir import TempDirectory -from pip._internal.utils.typing import MYPY_CHECK_RUNNING -from pip._internal.utils.ui import open_spinner - -if MYPY_CHECK_RUNNING: - from typing import ( - Dict, List, Optional, Sequence, Mapping, Tuple, IO, Text, Any, Iterable - ) - from pip._vendor.packaging.requirements import Requirement - from pip._internal.req.req_install import InstallRequirement - from pip._internal.download import PipSession - from pip._internal.index import FormatControl, PackageFinder - from pip._internal.operations.prepare import ( - RequirementPreparer - ) - from pip._internal.cache import WheelCache - from pip._internal.pep425tags import Pep425Tag - - InstalledCSVRow = Tuple[str, ...] - - -VERSION_COMPATIBLE = (1, 0) - - -logger = logging.getLogger(__name__) - - -def normpath(src, p): - return os.path.relpath(src, p).replace(os.path.sep, '/') - - -def rehash(path, blocksize=1 << 20): - # type: (str, int) -> Tuple[str, str] - """Return (hash, length) for path using hashlib.sha256()""" - h = hashlib.sha256() - length = 0 - with open(path, 'rb') as f: - for block in read_chunks(f, size=blocksize): - length += len(block) - h.update(block) - digest = 'sha256=' + urlsafe_b64encode( - h.digest() - ).decode('latin1').rstrip('=') - # unicode/str python2 issues - return (digest, str(length)) # type: ignore - - -def open_for_csv(name, mode): - # type: (str, Text) -> IO - if sys.version_info[0] < 3: - nl = {} # type: Dict[str, Any] - bin = 'b' - else: - nl = {'newline': ''} # type: Dict[str, Any] - bin = '' - return open(name, mode + bin, **nl) - - -def replace_python_tag(wheelname, new_tag): - # type: (str, str) -> str - """Replace the Python tag in a wheel file name with a new value. - """ - parts = wheelname.split('-') - parts[-3] = new_tag - return '-'.join(parts) - - -def fix_script(path): - # type: (str) -> Optional[bool] - """Replace #!python with #!/path/to/python - Return True if file was changed.""" - # XXX RECORD hashes will need to be updated - if os.path.isfile(path): - with open(path, 'rb') as script: - firstline = script.readline() - if not firstline.startswith(b'#!python'): - return False - exename = sys.executable.encode(sys.getfilesystemencoding()) - firstline = b'#!' + exename + os.linesep.encode("ascii") - rest = script.read() - with open(path, 'wb') as script: - script.write(firstline) - script.write(rest) - return True - return None - - -dist_info_re = re.compile(r"""^(?P<namever>(?P<name>.+?)(-(?P<ver>.+?))?) - \.dist-info$""", re.VERBOSE) - - -def root_is_purelib(name, wheeldir): - # type: (str, str) -> bool - """ - Return True if the extracted wheel in wheeldir should go into purelib. - """ - name_folded = name.replace("-", "_") - for item in os.listdir(wheeldir): - match = dist_info_re.match(item) - if match and match.group('name') == name_folded: - with open(os.path.join(wheeldir, item, 'WHEEL')) as wheel: - for line in wheel: - line = line.lower().rstrip() - if line == "root-is-purelib: true": - return True - return False - - -def get_entrypoints(filename): - # type: (str) -> Tuple[Dict[str, str], Dict[str, str]] - if not os.path.exists(filename): - return {}, {} - - # This is done because you can pass a string to entry_points wrappers which - # means that they may or may not be valid INI files. The attempt here is to - # strip leading and trailing whitespace in order to make them valid INI - # files. - with open(filename) as fp: - data = StringIO() - for line in fp: - data.write(line.strip()) - data.write("\n") - data.seek(0) - - # get the entry points and then the script names - entry_points = pkg_resources.EntryPoint.parse_map(data) - console = entry_points.get('console_scripts', {}) - gui = entry_points.get('gui_scripts', {}) - - def _split_ep(s): - """get the string representation of EntryPoint, remove space and split - on '='""" - return str(s).replace(" ", "").split("=") - - # convert the EntryPoint objects into strings with module:function - console = dict(_split_ep(v) for v in console.values()) - gui = dict(_split_ep(v) for v in gui.values()) - return console, gui - - -def message_about_scripts_not_on_PATH(scripts): - # type: (Sequence[str]) -> Optional[str] - """Determine if any scripts are not on PATH and format a warning. - - Returns a warning message if one or more scripts are not on PATH, - otherwise None. - """ - if not scripts: - return None - - # Group scripts by the path they were installed in - grouped_by_dir = collections.defaultdict(set) # type: Dict[str, set] - for destfile in scripts: - parent_dir = os.path.dirname(destfile) - script_name = os.path.basename(destfile) - grouped_by_dir[parent_dir].add(script_name) - - # We don't want to warn for directories that are on PATH. - not_warn_dirs = [ - os.path.normcase(i).rstrip(os.sep) for i in - os.environ.get("PATH", "").split(os.pathsep) - ] - # If an executable sits with sys.executable, we don't warn for it. - # This covers the case of venv invocations without activating the venv. - not_warn_dirs.append(os.path.normcase(os.path.dirname(sys.executable))) - warn_for = { - parent_dir: scripts for parent_dir, scripts in grouped_by_dir.items() - if os.path.normcase(parent_dir) not in not_warn_dirs - } - if not warn_for: - return None - - # Format a message - msg_lines = [] - for parent_dir, scripts in warn_for.items(): - sorted_scripts = sorted(scripts) # type: List[str] - if len(sorted_scripts) == 1: - start_text = "script {} is".format(sorted_scripts[0]) - else: - start_text = "scripts {} are".format( - ", ".join(sorted_scripts[:-1]) + " and " + sorted_scripts[-1] - ) - - msg_lines.append( - "The {} installed in '{}' which is not on PATH." - .format(start_text, parent_dir) - ) - - last_line_fmt = ( - "Consider adding {} to PATH or, if you prefer " - "to suppress this warning, use --no-warn-script-location." - ) - if len(msg_lines) == 1: - msg_lines.append(last_line_fmt.format("this directory")) - else: - msg_lines.append(last_line_fmt.format("these directories")) - - # Returns the formatted multiline message - return "\n".join(msg_lines) - - -def sorted_outrows(outrows): - # type: (Iterable[InstalledCSVRow]) -> List[InstalledCSVRow] - """ - Return the given rows of a RECORD file in sorted order. - - Each row is a 3-tuple (path, hash, size) and corresponds to a record of - a RECORD file (see PEP 376 and PEP 427 for details). For the rows - passed to this function, the size can be an integer as an int or string, - or the empty string. - """ - # Normally, there should only be one row per path, in which case the - # second and third elements don't come into play when sorting. - # However, in cases in the wild where a path might happen to occur twice, - # we don't want the sort operation to trigger an error (but still want - # determinism). Since the third element can be an int or string, we - # coerce each element to a string to avoid a TypeError in this case. - # For additional background, see-- - # https://github.com/pypa/pip/issues/5868 - return sorted(outrows, key=lambda row: tuple(str(x) for x in row)) - - -def get_csv_rows_for_installed( - old_csv_rows, # type: Iterable[List[str]] - installed, # type: Dict[str, str] - changed, # type: set - generated, # type: List[str] - lib_dir, # type: str -): - # type: (...) -> List[InstalledCSVRow] - """ - :param installed: A map from archive RECORD path to installation RECORD - path. - """ - installed_rows = [] # type: List[InstalledCSVRow] - for row in old_csv_rows: - if len(row) > 3: - logger.warning( - 'RECORD line has more than three elements: {}'.format(row) - ) - # Make a copy because we are mutating the row. - row = list(row) - old_path = row[0] - new_path = installed.pop(old_path, old_path) - row[0] = new_path - if new_path in changed: - digest, length = rehash(new_path) - row[1] = digest - row[2] = length - installed_rows.append(tuple(row)) - for f in generated: - digest, length = rehash(f) - installed_rows.append((normpath(f, lib_dir), digest, str(length))) - for f in installed: - installed_rows.append((installed[f], '', '')) - return installed_rows - - -def move_wheel_files( - name, # type: str - req, # type: Requirement - wheeldir, # type: str - user=False, # type: bool - home=None, # type: Optional[str] - root=None, # type: Optional[str] - pycompile=True, # type: bool - scheme=None, # type: Optional[Mapping[str, str]] - isolated=False, # type: bool - prefix=None, # type: Optional[str] - warn_script_location=True # type: bool -): - # type: (...) -> None - """Install a wheel""" - # TODO: Investigate and break this up. - # TODO: Look into moving this into a dedicated class for representing an - # installation. - - if not scheme: - scheme = distutils_scheme( - name, user=user, home=home, root=root, isolated=isolated, - prefix=prefix, - ) - - if root_is_purelib(name, wheeldir): - lib_dir = scheme['purelib'] - else: - lib_dir = scheme['platlib'] - - info_dir = [] # type: List[str] - data_dirs = [] - source = wheeldir.rstrip(os.path.sep) + os.path.sep - - # Record details of the files moved - # installed = files copied from the wheel to the destination - # changed = files changed while installing (scripts #! line typically) - # generated = files newly generated during the install (script wrappers) - installed = {} # type: Dict[str, str] - changed = set() - generated = [] # type: List[str] - - # Compile all of the pyc files that we're going to be installing - if pycompile: - with captured_stdout() as stdout: - with warnings.catch_warnings(): - warnings.filterwarnings('ignore') - compileall.compile_dir(source, force=True, quiet=True) - logger.debug(stdout.getvalue()) - - def record_installed(srcfile, destfile, modified=False): - """Map archive RECORD paths to installation RECORD paths.""" - oldpath = normpath(srcfile, wheeldir) - newpath = normpath(destfile, lib_dir) - installed[oldpath] = newpath - if modified: - changed.add(destfile) - - def clobber(source, dest, is_base, fixer=None, filter=None): - ensure_dir(dest) # common for the 'include' path - - for dir, subdirs, files in os.walk(source): - basedir = dir[len(source):].lstrip(os.path.sep) - destdir = os.path.join(dest, basedir) - if is_base and basedir.split(os.path.sep, 1)[0].endswith('.data'): - continue - for s in subdirs: - destsubdir = os.path.join(dest, basedir, s) - if is_base and basedir == '' and destsubdir.endswith('.data'): - data_dirs.append(s) - continue - elif (is_base and - s.endswith('.dist-info') and - canonicalize_name(s).startswith( - canonicalize_name(req.name))): - assert not info_dir, ('Multiple .dist-info directories: ' + - destsubdir + ', ' + - ', '.join(info_dir)) - info_dir.append(destsubdir) - for f in files: - # Skip unwanted files - if filter and filter(f): - continue - srcfile = os.path.join(dir, f) - destfile = os.path.join(dest, basedir, f) - # directory creation is lazy and after the file filtering above - # to ensure we don't install empty dirs; empty dirs can't be - # uninstalled. - ensure_dir(destdir) - - # copyfile (called below) truncates the destination if it - # exists and then writes the new contents. This is fine in most - # cases, but can cause a segfault if pip has loaded a shared - # object (e.g. from pyopenssl through its vendored urllib3) - # Since the shared object is mmap'd an attempt to call a - # symbol in it will then cause a segfault. Unlinking the file - # allows writing of new contents while allowing the process to - # continue to use the old copy. - if os.path.exists(destfile): - os.unlink(destfile) - - # We use copyfile (not move, copy, or copy2) to be extra sure - # that we are not moving directories over (copyfile fails for - # directories) as well as to ensure that we are not copying - # over any metadata because we want more control over what - # metadata we actually copy over. - shutil.copyfile(srcfile, destfile) - - # Copy over the metadata for the file, currently this only - # includes the atime and mtime. - st = os.stat(srcfile) - if hasattr(os, "utime"): - os.utime(destfile, (st.st_atime, st.st_mtime)) - - # If our file is executable, then make our destination file - # executable. - if os.access(srcfile, os.X_OK): - st = os.stat(srcfile) - permissions = ( - st.st_mode | stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH - ) - os.chmod(destfile, permissions) - - changed = False - if fixer: - changed = fixer(destfile) - record_installed(srcfile, destfile, changed) - - clobber(source, lib_dir, True) - - assert info_dir, "%s .dist-info directory not found" % req - - # Get the defined entry points - ep_file = os.path.join(info_dir[0], 'entry_points.txt') - console, gui = get_entrypoints(ep_file) - - def is_entrypoint_wrapper(name): - # EP, EP.exe and EP-script.py are scripts generated for - # entry point EP by setuptools - if name.lower().endswith('.exe'): - matchname = name[:-4] - elif name.lower().endswith('-script.py'): - matchname = name[:-10] - elif name.lower().endswith(".pya"): - matchname = name[:-4] - else: - matchname = name - # Ignore setuptools-generated scripts - return (matchname in console or matchname in gui) - - for datadir in data_dirs: - fixer = None - filter = None - for subdir in os.listdir(os.path.join(wheeldir, datadir)): - fixer = None - if subdir == 'scripts': - fixer = fix_script - filter = is_entrypoint_wrapper - source = os.path.join(wheeldir, datadir, subdir) - dest = scheme[subdir] - clobber(source, dest, False, fixer=fixer, filter=filter) - - maker = ScriptMaker(None, scheme['scripts']) - - # Ensure old scripts are overwritten. - # See https://github.com/pypa/pip/issues/1800 - maker.clobber = True - - # Ensure we don't generate any variants for scripts because this is almost - # never what somebody wants. - # See https://bitbucket.org/pypa/distlib/issue/35/ - maker.variants = {''} - - # This is required because otherwise distlib creates scripts that are not - # executable. - # See https://bitbucket.org/pypa/distlib/issue/32/ - maker.set_mode = True - - # Simplify the script and fix the fact that the default script swallows - # every single stack trace. - # See https://bitbucket.org/pypa/distlib/issue/34/ - # See https://bitbucket.org/pypa/distlib/issue/33/ - def _get_script_text(entry): - if entry.suffix is None: - raise InstallationError( - "Invalid script entry point: %s for req: %s - A callable " - "suffix is required. Cf https://packaging.python.org/en/" - "latest/distributing.html#console-scripts for more " - "information." % (entry, req) - ) - return maker.script_template % { - "module": entry.prefix, - "import_name": entry.suffix.split(".")[0], - "func": entry.suffix, - } - # ignore type, because mypy disallows assigning to a method, - # see https://github.com/python/mypy/issues/2427 - maker._get_script_text = _get_script_text # type: ignore - maker.script_template = r"""# -*- coding: utf-8 -*- -import re -import sys - -from %(module)s import %(import_name)s - -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(%(func)s()) -""" - - # Special case pip and setuptools to generate versioned wrappers - # - # The issue is that some projects (specifically, pip and setuptools) use - # code in setup.py to create "versioned" entry points - pip2.7 on Python - # 2.7, pip3.3 on Python 3.3, etc. But these entry points are baked into - # the wheel metadata at build time, and so if the wheel is installed with - # a *different* version of Python the entry points will be wrong. The - # correct fix for this is to enhance the metadata to be able to describe - # such versioned entry points, but that won't happen till Metadata 2.0 is - # available. - # In the meantime, projects using versioned entry points will either have - # incorrect versioned entry points, or they will not be able to distribute - # "universal" wheels (i.e., they will need a wheel per Python version). - # - # Because setuptools and pip are bundled with _ensurepip and virtualenv, - # we need to use universal wheels. So, as a stopgap until Metadata 2.0, we - # override the versioned entry points in the wheel and generate the - # correct ones. This code is purely a short-term measure until Metadata 2.0 - # is available. - # - # To add the level of hack in this section of code, in order to support - # ensurepip this code will look for an ``ENSUREPIP_OPTIONS`` environment - # variable which will control which version scripts get installed. - # - # ENSUREPIP_OPTIONS=altinstall - # - Only pipX.Y and easy_install-X.Y will be generated and installed - # ENSUREPIP_OPTIONS=install - # - pipX.Y, pipX, easy_install-X.Y will be generated and installed. Note - # that this option is technically if ENSUREPIP_OPTIONS is set and is - # not altinstall - # DEFAULT - # - The default behavior is to install pip, pipX, pipX.Y, easy_install - # and easy_install-X.Y. - pip_script = console.pop('pip', None) - if pip_script: - if "ENSUREPIP_OPTIONS" not in os.environ: - spec = 'pip = ' + pip_script - generated.extend(maker.make(spec)) - - if os.environ.get("ENSUREPIP_OPTIONS", "") != "altinstall": - spec = 'pip%s = %s' % (sys.version[:1], pip_script) - generated.extend(maker.make(spec)) - - spec = 'pip%s = %s' % (sys.version[:3], pip_script) - generated.extend(maker.make(spec)) - # Delete any other versioned pip entry points - pip_ep = [k for k in console if re.match(r'pip(\d(\.\d)?)?$', k)] - for k in pip_ep: - del console[k] - easy_install_script = console.pop('easy_install', None) - if easy_install_script: - if "ENSUREPIP_OPTIONS" not in os.environ: - spec = 'easy_install = ' + easy_install_script - generated.extend(maker.make(spec)) - - spec = 'easy_install-%s = %s' % (sys.version[:3], easy_install_script) - generated.extend(maker.make(spec)) - # Delete any other versioned easy_install entry points - easy_install_ep = [ - k for k in console if re.match(r'easy_install(-\d\.\d)?$', k) - ] - for k in easy_install_ep: - del console[k] - - # Generate the console and GUI entry points specified in the wheel - if len(console) > 0: - generated_console_scripts = maker.make_multiple( - ['%s = %s' % kv for kv in console.items()] - ) - generated.extend(generated_console_scripts) - - if warn_script_location: - msg = message_about_scripts_not_on_PATH(generated_console_scripts) - if msg is not None: - logger.warning(msg) - - if len(gui) > 0: - generated.extend( - maker.make_multiple( - ['%s = %s' % kv for kv in gui.items()], - {'gui': True} - ) - ) - - # Record pip as the installer - installer = os.path.join(info_dir[0], 'INSTALLER') - temp_installer = os.path.join(info_dir[0], 'INSTALLER.pip') - with open(temp_installer, 'wb') as installer_file: - installer_file.write(b'pip\n') - shutil.move(temp_installer, installer) - generated.append(installer) - - # Record details of all files installed - record = os.path.join(info_dir[0], 'RECORD') - temp_record = os.path.join(info_dir[0], 'RECORD.pip') - with open_for_csv(record, 'r') as record_in: - with open_for_csv(temp_record, 'w+') as record_out: - reader = csv.reader(record_in) - outrows = get_csv_rows_for_installed( - reader, installed=installed, changed=changed, - generated=generated, lib_dir=lib_dir, - ) - writer = csv.writer(record_out) - # Sort to simplify testing. - for row in sorted_outrows(outrows): - writer.writerow(row) - shutil.move(temp_record, record) - - -def wheel_version(source_dir): - # type: (Optional[str]) -> Optional[Tuple[int, ...]] - """ - Return the Wheel-Version of an extracted wheel, if possible. - - Otherwise, return None if we couldn't parse / extract it. - """ - try: - dist = [d for d in pkg_resources.find_on_path(None, source_dir)][0] - - wheel_data = dist.get_metadata('WHEEL') - wheel_data = Parser().parsestr(wheel_data) - - version = wheel_data['Wheel-Version'].strip() - version = tuple(map(int, version.split('.'))) - return version - except Exception: - return None - - -def check_compatibility(version, name): - # type: (Optional[Tuple[int, ...]], str) -> None - """ - Raises errors or warns if called with an incompatible Wheel-Version. - - Pip should refuse to install a Wheel-Version that's a major series - ahead of what it's compatible with (e.g 2.0 > 1.1); and warn when - installing a version only minor version ahead (e.g 1.2 > 1.1). - - version: a 2-tuple representing a Wheel-Version (Major, Minor) - name: name of wheel or package to raise exception about - - :raises UnsupportedWheel: when an incompatible Wheel-Version is given - """ - if not version: - raise UnsupportedWheel( - "%s is in an unsupported or invalid wheel" % name - ) - if version[0] > VERSION_COMPATIBLE[0]: - raise UnsupportedWheel( - "%s's Wheel-Version (%s) is not compatible with this version " - "of pip" % (name, '.'.join(map(str, version))) - ) - elif version > VERSION_COMPATIBLE: - logger.warning( - 'Installing from a newer Wheel-Version (%s)', - '.'.join(map(str, version)), - ) - - -class Wheel(object): - """A wheel file""" - - # TODO: Maybe move the class into the models sub-package - # TODO: Maybe move the install code into this class - - wheel_file_re = re.compile( - r"""^(?P<namever>(?P<name>.+?)-(?P<ver>.*?)) - ((-(?P<build>\d[^-]*?))?-(?P<pyver>.+?)-(?P<abi>.+?)-(?P<plat>.+?) - \.whl|\.dist-info)$""", - re.VERBOSE - ) - - def __init__(self, filename): - # type: (str) -> None - """ - :raises InvalidWheelFilename: when the filename is invalid for a wheel - """ - wheel_info = self.wheel_file_re.match(filename) - if not wheel_info: - raise InvalidWheelFilename( - "%s is not a valid wheel filename." % filename - ) - self.filename = filename - self.name = wheel_info.group('name').replace('_', '-') - # we'll assume "_" means "-" due to wheel naming scheme - # (https://github.com/pypa/pip/issues/1150) - self.version = wheel_info.group('ver').replace('_', '-') - self.build_tag = wheel_info.group('build') - self.pyversions = wheel_info.group('pyver').split('.') - self.abis = wheel_info.group('abi').split('.') - self.plats = wheel_info.group('plat').split('.') - - # All the tag combinations from this file - self.file_tags = { - (x, y, z) for x in self.pyversions - for y in self.abis for z in self.plats - } - - def support_index_min(self, tags=None): - # type: (Optional[List[Pep425Tag]]) -> Optional[int] - """ - Return the lowest index that one of the wheel's file_tag combinations - achieves in the supported_tags list e.g. if there are 8 supported tags, - and one of the file tags is first in the list, then return 0. Returns - None is the wheel is not supported. - """ - if tags is None: # for mock - tags = pep425tags.get_supported() - indexes = [tags.index(c) for c in self.file_tags if c in tags] - return min(indexes) if indexes else None - - def supported(self, tags=None): - # type: (Optional[List[Pep425Tag]]) -> bool - """Is this wheel supported on this system?""" - if tags is None: # for mock - tags = pep425tags.get_supported() - return bool(set(tags).intersection(self.file_tags)) - - -def _contains_egg_info( - s, _egg_info_re=re.compile(r'([a-z0-9_.]+)-([a-z0-9_.!+-]+)', re.I)): - """Determine whether the string looks like an egg_info. - - :param s: The string to parse. E.g. foo-2.1 - """ - return bool(_egg_info_re.search(s)) - - -def should_use_ephemeral_cache( - req, # type: InstallRequirement - format_control, # type: FormatControl - autobuilding, # type: bool - cache_available # type: bool -): - # type: (...) -> Optional[bool] - """ - Return whether to build an InstallRequirement object using the - ephemeral cache. - - :param cache_available: whether a cache directory is available for the - autobuilding=True case. - - :return: True or False to build the requirement with ephem_cache=True - or False, respectively; or None not to build the requirement. - """ - if req.constraint: - return None - if req.is_wheel: - if not autobuilding: - logger.info( - 'Skipping %s, due to already being wheel.', req.name, - ) - return None - if not autobuilding: - return False - - if req.editable or not req.source_dir: - return None - - if req.link and not req.link.is_artifact: - # VCS checkout. Build wheel just for this run. - return True - - if "binary" not in format_control.get_allowed_formats( - canonicalize_name(req.name)): - logger.info( - "Skipping bdist_wheel for %s, due to binaries " - "being disabled for it.", req.name, - ) - return None - - link = req.link - base, ext = link.splitext() - if cache_available and _contains_egg_info(base): - return False - - # Otherwise, build the wheel just for this run using the ephemeral - # cache since we are either in the case of e.g. a local directory, or - # no cache directory is available to use. - return True - - -def format_command_result( - command_args, # type: List[str] - command_output, # type: str -): - # type: (...) -> str - """ - Format command information for logging. - """ - command_desc = format_command_args(command_args) - text = 'Command arguments: {}\n'.format(command_desc) - - if not command_output: - text += 'Command output: None' - elif logger.getEffectiveLevel() > logging.DEBUG: - text += 'Command output: [use --verbose to show]' - else: - if not command_output.endswith('\n'): - command_output += '\n' - text += 'Command output:\n{}{}'.format(command_output, LOG_DIVIDER) - - return text - - -def get_legacy_build_wheel_path( - names, # type: List[str] - temp_dir, # type: str - req, # type: InstallRequirement - command_args, # type: List[str] - command_output, # type: str -): - # type: (...) -> Optional[str] - """ - Return the path to the wheel in the temporary build directory. - """ - # Sort for determinism. - names = sorted(names) - if not names: - msg = ( - 'Legacy build of wheel for {!r} created no files.\n' - ).format(req.name) - msg += format_command_result(command_args, command_output) - logger.warning(msg) - return None - - if len(names) > 1: - msg = ( - 'Legacy build of wheel for {!r} created more than one file.\n' - 'Filenames (choosing first): {}\n' - ).format(req.name, names) - msg += format_command_result(command_args, command_output) - logger.warning(msg) - - return os.path.join(temp_dir, names[0]) - - -class WheelBuilder(object): - """Build wheels from a RequirementSet.""" - - def __init__( - self, - finder, # type: PackageFinder - preparer, # type: RequirementPreparer - wheel_cache, # type: WheelCache - build_options=None, # type: Optional[List[str]] - global_options=None, # type: Optional[List[str]] - no_clean=False # type: bool - ): - # type: (...) -> None - self.finder = finder - self.preparer = preparer - self.wheel_cache = wheel_cache - - self._wheel_dir = preparer.wheel_download_dir - - self.build_options = build_options or [] - self.global_options = global_options or [] - self.no_clean = no_clean - - def _build_one(self, req, output_dir, python_tag=None): - """Build one wheel. - - :return: The filename of the built wheel, or None if the build failed. - """ - # Install build deps into temporary directory (PEP 518) - with req.build_env: - return self._build_one_inside_env(req, output_dir, - python_tag=python_tag) - - def _build_one_inside_env(self, req, output_dir, python_tag=None): - with TempDirectory(kind="wheel") as temp_dir: - if req.use_pep517: - builder = self._build_one_pep517 - else: - builder = self._build_one_legacy - wheel_path = builder(req, temp_dir.path, python_tag=python_tag) - if wheel_path is not None: - wheel_name = os.path.basename(wheel_path) - dest_path = os.path.join(output_dir, wheel_name) - try: - shutil.move(wheel_path, dest_path) - logger.info('Stored in directory: %s', output_dir) - return dest_path - except Exception: - pass - # Ignore return, we can't do anything else useful. - self._clean_one(req) - return None - - def _base_setup_args(self, req): - # NOTE: Eventually, we'd want to also -S to the flags here, when we're - # isolating. Currently, it breaks Python in virtualenvs, because it - # relies on site.py to find parts of the standard library outside the - # virtualenv. - return [ - sys.executable, '-u', '-c', - SETUPTOOLS_SHIM % req.setup_py - ] + list(self.global_options) - - def _build_one_pep517(self, req, tempd, python_tag=None): - """Build one InstallRequirement using the PEP 517 build process. - - Returns path to wheel if successfully built. Otherwise, returns None. - """ - assert req.metadata_directory is not None - if self.build_options: - # PEP 517 does not support --build-options - logger.error('Cannot build wheel for %s using PEP 517 when ' - '--build-options is present' % (req.name,)) - return None - try: - req.spin_message = 'Building wheel for %s (PEP 517)' % (req.name,) - logger.debug('Destination directory: %s', tempd) - wheel_name = req.pep517_backend.build_wheel( - tempd, - metadata_directory=req.metadata_directory - ) - if python_tag: - # General PEP 517 backends don't necessarily support - # a "--python-tag" option, so we rename the wheel - # file directly. - new_name = replace_python_tag(wheel_name, python_tag) - os.rename( - os.path.join(tempd, wheel_name), - os.path.join(tempd, new_name) - ) - # Reassign to simplify the return at the end of function - wheel_name = new_name - except Exception: - logger.error('Failed building wheel for %s', req.name) - return None - return os.path.join(tempd, wheel_name) - - def _build_one_legacy(self, req, tempd, python_tag=None): - """Build one InstallRequirement using the "legacy" build process. - - Returns path to wheel if successfully built. Otherwise, returns None. - """ - base_args = self._base_setup_args(req) - - spin_message = 'Building wheel for %s (setup.py)' % (req.name,) - with open_spinner(spin_message) as spinner: - logger.debug('Destination directory: %s', tempd) - wheel_args = base_args + ['bdist_wheel', '-d', tempd] \ - + self.build_options - - if python_tag is not None: - wheel_args += ["--python-tag", python_tag] - - try: - output = call_subprocess(wheel_args, cwd=req.setup_py_dir, - spinner=spinner) - except Exception: - spinner.finish("error") - logger.error('Failed building wheel for %s', req.name) - return None - names = os.listdir(tempd) - wheel_path = get_legacy_build_wheel_path( - names=names, - temp_dir=tempd, - req=req, - command_args=wheel_args, - command_output=output, - ) - return wheel_path - - def _clean_one(self, req): - base_args = self._base_setup_args(req) - - logger.info('Running setup.py clean for %s', req.name) - clean_args = base_args + ['clean', '--all'] - try: - call_subprocess(clean_args, cwd=req.source_dir) - return True - except Exception: - logger.error('Failed cleaning build dir for %s', req.name) - return False - - def build( - self, - requirements, # type: Iterable[InstallRequirement] - session, # type: PipSession - autobuilding=False # type: bool - ): - # type: (...) -> List[InstallRequirement] - """Build wheels. - - :param unpack: If True, replace the sdist we built from with the - newly built wheel, in preparation for installation. - :return: True if all the wheels built correctly. - """ - buildset = [] - format_control = self.finder.format_control - # Whether a cache directory is available for autobuilding=True. - cache_available = bool(self._wheel_dir or self.wheel_cache.cache_dir) - - for req in requirements: - ephem_cache = should_use_ephemeral_cache( - req, format_control=format_control, autobuilding=autobuilding, - cache_available=cache_available, - ) - if ephem_cache is None: - continue - - buildset.append((req, ephem_cache)) - - if not buildset: - return [] - - # Is any wheel build not using the ephemeral cache? - if any(not ephem_cache for _, ephem_cache in buildset): - have_directory_for_build = self._wheel_dir or ( - autobuilding and self.wheel_cache.cache_dir - ) - assert have_directory_for_build - - # TODO by @pradyunsg - # Should break up this method into 2 separate methods. - - # Build the wheels. - logger.info( - 'Building wheels for collected packages: %s', - ', '.join([req.name for (req, _) in buildset]), - ) - _cache = self.wheel_cache # shorter name - with indent_log(): - build_success, build_failure = [], [] - for req, ephem in buildset: - python_tag = None - if autobuilding: - python_tag = pep425tags.implementation_tag - if ephem: - output_dir = _cache.get_ephem_path_for_link(req.link) - else: - output_dir = _cache.get_path_for_link(req.link) - try: - ensure_dir(output_dir) - except OSError as e: - logger.warning("Building wheel for %s failed: %s", - req.name, e) - build_failure.append(req) - continue - else: - output_dir = self._wheel_dir - wheel_file = self._build_one( - req, output_dir, - python_tag=python_tag, - ) - if wheel_file: - build_success.append(req) - if autobuilding: - # XXX: This is mildly duplicative with prepare_files, - # but not close enough to pull out to a single common - # method. - # The code below assumes temporary source dirs - - # prevent it doing bad things. - if req.source_dir and not os.path.exists(os.path.join( - req.source_dir, PIP_DELETE_MARKER_FILENAME)): - raise AssertionError( - "bad source dir - missing marker") - # Delete the source we built the wheel from - req.remove_temporary_source() - # set the build directory again - name is known from - # the work prepare_files did. - req.source_dir = req.build_location( - self.preparer.build_dir - ) - # Update the link for this. - req.link = Link(path_to_url(wheel_file)) - assert req.link.is_wheel - # extract the wheel into the dir - unpack_url( - req.link, req.source_dir, None, False, - session=session, - ) - else: - build_failure.append(req) - - # notify success/failure - if build_success: - logger.info( - 'Successfully built %s', - ' '.join([req.name for req in build_success]), - ) - if build_failure: - logger.info( - 'Failed to build %s', - ' '.join([req.name for req in build_failure]), - ) - # Return a list of requirements that failed to build - return build_failure diff --git a/venv/lib/python2.7/site-packages/pip/_internal/wheel.pyc b/venv/lib/python2.7/site-packages/pip/_internal/wheel.pyc deleted file mode 100644 index fd5734cf4e1c761f8cefad0663d5eb42095ecf2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32820 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 Wxu<(~^zPqve($E<GrhZe{r?RJnF_=J diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/__init__.py deleted file mode 100644 index c1d9508..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/__init__.py +++ /dev/null @@ -1,109 +0,0 @@ -""" -pip._vendor is for vendoring dependencies of pip to prevent needing pip to -depend on something external. - -Files inside of pip._vendor should be considered immutable and should only be -updated to versions from upstream. -""" -from __future__ import absolute_import - -import glob -import os.path -import sys - -# Downstream redistributors which have debundled our dependencies should also -# patch this value to be true. This will trigger the additional patching -# to cause things like "six" to be available as pip. -DEBUNDLED = False - -# By default, look in this directory for a bunch of .whl files which we will -# add to the beginning of sys.path before attempting to import anything. This -# is done to support downstream re-distributors like Debian and Fedora who -# wish to create their own Wheels for our dependencies to aid in debundling. -WHEEL_DIR = os.path.abspath(os.path.dirname(__file__)) - - -# Define a small helper function to alias our vendored modules to the real ones -# if the vendored ones do not exist. This idea of this was taken from -# https://github.com/kennethreitz/requests/pull/2567. -def vendored(modulename): - vendored_name = "{0}.{1}".format(__name__, modulename) - - try: - __import__(modulename, globals(), locals(), level=0) - except ImportError: - # We can just silently allow import failures to pass here. If we - # got to this point it means that ``import pip._vendor.whatever`` - # failed and so did ``import whatever``. Since we're importing this - # upfront in an attempt to alias imports, not erroring here will - # just mean we get a regular import error whenever pip *actually* - # tries to import one of these modules to use it, which actually - # gives us a better error message than we would have otherwise - # gotten. - pass - else: - sys.modules[vendored_name] = sys.modules[modulename] - base, head = vendored_name.rsplit(".", 1) - setattr(sys.modules[base], head, sys.modules[modulename]) - - -# If we're operating in a debundled setup, then we want to go ahead and trigger -# the aliasing of our vendored libraries as well as looking for wheels to add -# to our sys.path. This will cause all of this code to be a no-op typically -# however downstream redistributors can enable it in a consistent way across -# all platforms. -if DEBUNDLED: - # Actually look inside of WHEEL_DIR to find .whl files and add them to the - # front of our sys.path. - sys.path[:] = glob.glob(os.path.join(WHEEL_DIR, "*.whl")) + sys.path - - # Actually alias all of our vendored dependencies. - vendored("cachecontrol") - vendored("colorama") - vendored("distlib") - vendored("distro") - vendored("html5lib") - vendored("lockfile") - vendored("six") - vendored("six.moves") - vendored("six.moves.urllib") - vendored("six.moves.urllib.parse") - vendored("packaging") - vendored("packaging.version") - vendored("packaging.specifiers") - vendored("pep517") - vendored("pkg_resources") - vendored("progress") - vendored("pytoml") - vendored("retrying") - vendored("requests") - vendored("requests.exceptions") - vendored("requests.packages") - vendored("requests.packages.urllib3") - vendored("requests.packages.urllib3._collections") - vendored("requests.packages.urllib3.connection") - vendored("requests.packages.urllib3.connectionpool") - vendored("requests.packages.urllib3.contrib") - vendored("requests.packages.urllib3.contrib.ntlmpool") - vendored("requests.packages.urllib3.contrib.pyopenssl") - vendored("requests.packages.urllib3.exceptions") - vendored("requests.packages.urllib3.fields") - vendored("requests.packages.urllib3.filepost") - vendored("requests.packages.urllib3.packages") - vendored("requests.packages.urllib3.packages.ordered_dict") - vendored("requests.packages.urllib3.packages.six") - vendored("requests.packages.urllib3.packages.ssl_match_hostname") - vendored("requests.packages.urllib3.packages.ssl_match_hostname." - "_implementation") - vendored("requests.packages.urllib3.poolmanager") - vendored("requests.packages.urllib3.request") - vendored("requests.packages.urllib3.response") - vendored("requests.packages.urllib3.util") - vendored("requests.packages.urllib3.util.connection") - vendored("requests.packages.urllib3.util.request") - vendored("requests.packages.urllib3.util.response") - vendored("requests.packages.urllib3.util.retry") - vendored("requests.packages.urllib3.util.ssl_") - vendored("requests.packages.urllib3.util.timeout") - vendored("requests.packages.urllib3.util.url") - vendored("urllib3") diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/__init__.pyc deleted file mode 100644 index b030e25f73b2e55152792324441d6129c539db3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3389 zcmcguZEqYk5T3nFF3Gh?Uul~{%l7@6(!GQ<0i+65kW?T_g#xJP1X}Iw`tCOIuD7-? z&9%)36n+9fkAJ}*;Ia441cB}%gt!;)<MHG1c*Zkc|M$hl%FjzbB{cfX;Q8bUkvgmq zr9^GC9;G$n9_2M^*T^${pSVwL-;M##P<wWa>(s6jo1^wTv02((pxwq8oFaCbjy&^g zFH$-~zhHqSV)G=2HRjW<KW3gG2Er^I)eM={jh@TZqsf*itsAjt(40f_4lOv;aOjjn z)&x6u(aDw^I^)n;ht4^4-k}Q)U3BOjhb}pE*`X^AEjx78p?4j6&!KA$U3chxhXRLg zICRsYTMpfJ=#E2o9lGaG)1mtgtvK|+p${B-=uqfT%b`_=)*SlKp>>BIIkaI>fg|VB zx6Mr)MfDq+Mwyjiw9krE$RJZe7muo!6}=#3B}Q10WK0F38-N^W5tNdFql1F6)X*w% zqhbf52$aZ~?wcWYpqVUU9yS_JGY&0Tp|X^Xl)05vUkrE}bXbrGOOPxLvOFK?xWicx z7iln}h=LEnYYfUX)*!*0eI`|gX+c+tJQ$QpOBUy0Bg6iv>7mhQ(8L`j_&~EL%S$2k z^TdppoUG&j`4c$gR{&(-E+%;NmQ02mdNd43*GyOYbcA-sw8&aG^2qnR7sWZ6(X+JI zAh}JR=M`Vk4;ooDXXY%AkVlW-Li4=I%qsVOgmV0R(hD>q)oA%G`fl!#kBUGDm$C4< znnU|$^)P(1c8K+eIHJJqCSfj7n3=ZOKm!#-2xT5?Jr5W~MVzxJ(q=FkIRIUwvByOx z=E_dtA~En3#9vw`ZA%GP`RJ>mvh-Y}1H{qNr7C%*tynRQwPe%y)2>qS%(8kBvg%B+ z)EWX85_MwCF`&=lw23F#M)iPNrOfsb-qwCBTV26ZM7Z_(pfy~Vo#NHr+UCn*byGgt zOg>fzpQNwlDn7lk^<4`m@gYu_jyZp**S_vW-x!hoj}CbY+b=R5MPWI#z8PC~4eP42 z#t!d%&G!Otabc!*(YxX)<Lj01RiEqAKuMhR8BVE|f?EZN;6lc5wee<}Db2Hvb&tVP zSWaK(e8b31G~ngEE|Q`0Yj&U(AXM2wn2UX;tPQRg4kX7sb?G=|Bn-<~!iQ#d87F&j z4+*Ev9q)zX)VTN;sVZ5Lbu&2C+F7!4W9=gwrgE<rNv6a=CWx^ywv?g=$%r}BBCmEW znU+H=Xi1X29DuLX1<V+CLUxd_Qk%@QRylcPEOag(XOE?$&8@4ulSab`Zs#ni)Zd;+ zMX-ty(;TtC*)d)*{F7J;!PSjvWGxYym6Nc-LUSY(ls-5Sy&MWuUZuF2ytQL44kju_ zw0Wx3%_$_#N`W{|ri~+|S`)R6X`ztFU!;DTC3;F!-5ex<+Blhdcqu~mCH<%m+fBt$ z+y8cEXlf&8Ic~Su9<4i*H6fyTT*N)3(&W=JK6H~ki$p7tE=*mYxa>e@T-~2aId-0> zxZNlW$0pvJuGrZ*`E-udqEM(?)0LVyp2SX_<xC8w9a6hCil?p0RS{ipn(}T1QIv|r z-G|+Q9!Ok|I~X?idvz&VqEM)^x{ntCBB6Fnt+jXWQ{0nP>D}7??EB|i&$hShL`yao z0p2zoPBXj$;UYBkG>S~=$I?dCi!ZjfpG8|=?(CSdZ58Z_tT0uox(zM*-><~S)#d%E i*@u#7>fYJfX%FAodi{ER;cDH#?>D^v<Xih^Eq?%XvXSKg diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/appdirs.py b/venv/lib/python2.7/site-packages/pip/_vendor/appdirs.py deleted file mode 100644 index 2bd3911..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/appdirs.py +++ /dev/null @@ -1,604 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# Copyright (c) 2005-2010 ActiveState Software Inc. -# Copyright (c) 2013 Eddy Petrișor - -"""Utilities for determining application-specific dirs. - -See <http://github.com/ActiveState/appdirs> for details and usage. -""" -# Dev Notes: -# - MSDN on where to store app data files: -# http://support.microsoft.com/default.aspx?scid=kb;en-us;310294#XSLTH3194121123120121120120 -# - Mac OS X: http://developer.apple.com/documentation/MacOSX/Conceptual/BPFileSystem/index.html -# - XDG spec for Un*x: http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html - -__version_info__ = (1, 4, 3) -__version__ = '.'.join(map(str, __version_info__)) - - -import sys -import os - -PY3 = sys.version_info[0] == 3 - -if PY3: - unicode = str - -if sys.platform.startswith('java'): - import platform - os_name = platform.java_ver()[3][0] - if os_name.startswith('Windows'): # "Windows XP", "Windows 7", etc. - system = 'win32' - elif os_name.startswith('Mac'): # "Mac OS X", etc. - system = 'darwin' - else: # "Linux", "SunOS", "FreeBSD", etc. - # Setting this to "linux2" is not ideal, but only Windows or Mac - # are actually checked for and the rest of the module expects - # *sys.platform* style strings. - system = 'linux2' -else: - system = sys.platform - - - -def user_data_dir(appname=None, appauthor=None, version=None, roaming=False): - r"""Return full path to the user-specific data dir for this application. - - "appname" is the name of application. - If None, just the system directory is returned. - "appauthor" (only used on Windows) is the name of the - appauthor or distributing body for this application. Typically - it is the owning company name. This falls back to appname. You may - pass False to disable it. - "version" is an optional version path element to append to the - path. You might want to use this if you want multiple versions - of your app to be able to run independently. If used, this - would typically be "<major>.<minor>". - Only applied when appname is present. - "roaming" (boolean, default False) can be set True to use the Windows - roaming appdata directory. That means that for users on a Windows - network setup for roaming profiles, this user data will be - sync'd on login. See - <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx> - for a discussion of issues. - - Typical user data directories are: - Mac OS X: ~/Library/Application Support/<AppName> - Unix: ~/.local/share/<AppName> # or in $XDG_DATA_HOME, if defined - Win XP (not roaming): C:\Documents and Settings\<username>\Application Data\<AppAuthor>\<AppName> - Win XP (roaming): C:\Documents and Settings\<username>\Local Settings\Application Data\<AppAuthor>\<AppName> - Win 7 (not roaming): C:\Users\<username>\AppData\Local\<AppAuthor>\<AppName> - Win 7 (roaming): C:\Users\<username>\AppData\Roaming\<AppAuthor>\<AppName> - - For Unix, we follow the XDG spec and support $XDG_DATA_HOME. - That means, by default "~/.local/share/<AppName>". - """ - if system == "win32": - if appauthor is None: - appauthor = appname - const = roaming and "CSIDL_APPDATA" or "CSIDL_LOCAL_APPDATA" - path = os.path.normpath(_get_win_folder(const)) - if appname: - if appauthor is not False: - path = os.path.join(path, appauthor, appname) - else: - path = os.path.join(path, appname) - elif system == 'darwin': - path = os.path.expanduser('~/Library/Application Support/') - if appname: - path = os.path.join(path, appname) - else: - path = os.getenv('XDG_DATA_HOME', os.path.expanduser("~/.local/share")) - if appname: - path = os.path.join(path, appname) - if appname and version: - path = os.path.join(path, version) - return path - - -def site_data_dir(appname=None, appauthor=None, version=None, multipath=False): - r"""Return full path to the user-shared data dir for this application. - - "appname" is the name of application. - If None, just the system directory is returned. - "appauthor" (only used on Windows) is the name of the - appauthor or distributing body for this application. Typically - it is the owning company name. This falls back to appname. You may - pass False to disable it. - "version" is an optional version path element to append to the - path. You might want to use this if you want multiple versions - of your app to be able to run independently. If used, this - would typically be "<major>.<minor>". - Only applied when appname is present. - "multipath" is an optional parameter only applicable to *nix - which indicates that the entire list of data dirs should be - returned. By default, the first item from XDG_DATA_DIRS is - returned, or '/usr/local/share/<AppName>', - if XDG_DATA_DIRS is not set - - Typical site data directories are: - Mac OS X: /Library/Application Support/<AppName> - Unix: /usr/local/share/<AppName> or /usr/share/<AppName> - Win XP: C:\Documents and Settings\All Users\Application Data\<AppAuthor>\<AppName> - Vista: (Fail! "C:\ProgramData" is a hidden *system* directory on Vista.) - Win 7: C:\ProgramData\<AppAuthor>\<AppName> # Hidden, but writeable on Win 7. - - For Unix, this is using the $XDG_DATA_DIRS[0] default. - - WARNING: Do not use this on Windows. See the Vista-Fail note above for why. - """ - if system == "win32": - if appauthor is None: - appauthor = appname - path = os.path.normpath(_get_win_folder("CSIDL_COMMON_APPDATA")) - if appname: - if appauthor is not False: - path = os.path.join(path, appauthor, appname) - else: - path = os.path.join(path, appname) - elif system == 'darwin': - path = os.path.expanduser('/Library/Application Support') - if appname: - path = os.path.join(path, appname) - else: - # XDG default for $XDG_DATA_DIRS - # only first, if multipath is False - path = os.getenv('XDG_DATA_DIRS', - os.pathsep.join(['/usr/local/share', '/usr/share'])) - pathlist = [os.path.expanduser(x.rstrip(os.sep)) for x in path.split(os.pathsep)] - if appname: - if version: - appname = os.path.join(appname, version) - pathlist = [os.sep.join([x, appname]) for x in pathlist] - - if multipath: - path = os.pathsep.join(pathlist) - else: - path = pathlist[0] - return path - - if appname and version: - path = os.path.join(path, version) - return path - - -def user_config_dir(appname=None, appauthor=None, version=None, roaming=False): - r"""Return full path to the user-specific config dir for this application. - - "appname" is the name of application. - If None, just the system directory is returned. - "appauthor" (only used on Windows) is the name of the - appauthor or distributing body for this application. Typically - it is the owning company name. This falls back to appname. You may - pass False to disable it. - "version" is an optional version path element to append to the - path. You might want to use this if you want multiple versions - of your app to be able to run independently. If used, this - would typically be "<major>.<minor>". - Only applied when appname is present. - "roaming" (boolean, default False) can be set True to use the Windows - roaming appdata directory. That means that for users on a Windows - network setup for roaming profiles, this user data will be - sync'd on login. See - <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx> - for a discussion of issues. - - Typical user config directories are: - Mac OS X: same as user_data_dir - Unix: ~/.config/<AppName> # or in $XDG_CONFIG_HOME, if defined - Win *: same as user_data_dir - - For Unix, we follow the XDG spec and support $XDG_CONFIG_HOME. - That means, by default "~/.config/<AppName>". - """ - if system in ["win32", "darwin"]: - path = user_data_dir(appname, appauthor, None, roaming) - else: - path = os.getenv('XDG_CONFIG_HOME', os.path.expanduser("~/.config")) - if appname: - path = os.path.join(path, appname) - if appname and version: - path = os.path.join(path, version) - return path - - -def site_config_dir(appname=None, appauthor=None, version=None, multipath=False): - r"""Return full path to the user-shared data dir for this application. - - "appname" is the name of application. - If None, just the system directory is returned. - "appauthor" (only used on Windows) is the name of the - appauthor or distributing body for this application. Typically - it is the owning company name. This falls back to appname. You may - pass False to disable it. - "version" is an optional version path element to append to the - path. You might want to use this if you want multiple versions - of your app to be able to run independently. If used, this - would typically be "<major>.<minor>". - Only applied when appname is present. - "multipath" is an optional parameter only applicable to *nix - which indicates that the entire list of config dirs should be - returned. By default, the first item from XDG_CONFIG_DIRS is - returned, or '/etc/xdg/<AppName>', if XDG_CONFIG_DIRS is not set - - Typical site config directories are: - Mac OS X: same as site_data_dir - Unix: /etc/xdg/<AppName> or $XDG_CONFIG_DIRS[i]/<AppName> for each value in - $XDG_CONFIG_DIRS - Win *: same as site_data_dir - Vista: (Fail! "C:\ProgramData" is a hidden *system* directory on Vista.) - - For Unix, this is using the $XDG_CONFIG_DIRS[0] default, if multipath=False - - WARNING: Do not use this on Windows. See the Vista-Fail note above for why. - """ - if system in ["win32", "darwin"]: - path = site_data_dir(appname, appauthor) - if appname and version: - path = os.path.join(path, version) - else: - # XDG default for $XDG_CONFIG_DIRS - # only first, if multipath is False - path = os.getenv('XDG_CONFIG_DIRS', '/etc/xdg') - pathlist = [os.path.expanduser(x.rstrip(os.sep)) for x in path.split(os.pathsep)] - if appname: - if version: - appname = os.path.join(appname, version) - pathlist = [os.sep.join([x, appname]) for x in pathlist] - - if multipath: - path = os.pathsep.join(pathlist) - else: - path = pathlist[0] - return path - - -def user_cache_dir(appname=None, appauthor=None, version=None, opinion=True): - r"""Return full path to the user-specific cache dir for this application. - - "appname" is the name of application. - If None, just the system directory is returned. - "appauthor" (only used on Windows) is the name of the - appauthor or distributing body for this application. Typically - it is the owning company name. This falls back to appname. You may - pass False to disable it. - "version" is an optional version path element to append to the - path. You might want to use this if you want multiple versions - of your app to be able to run independently. If used, this - would typically be "<major>.<minor>". - Only applied when appname is present. - "opinion" (boolean) can be False to disable the appending of - "Cache" to the base app data dir for Windows. See - discussion below. - - Typical user cache directories are: - Mac OS X: ~/Library/Caches/<AppName> - Unix: ~/.cache/<AppName> (XDG default) - Win XP: C:\Documents and Settings\<username>\Local Settings\Application Data\<AppAuthor>\<AppName>\Cache - Vista: C:\Users\<username>\AppData\Local\<AppAuthor>\<AppName>\Cache - - On Windows the only suggestion in the MSDN docs is that local settings go in - the `CSIDL_LOCAL_APPDATA` directory. This is identical to the non-roaming - app data dir (the default returned by `user_data_dir` above). Apps typically - put cache data somewhere *under* the given dir here. Some examples: - ...\Mozilla\Firefox\Profiles\<ProfileName>\Cache - ...\Acme\SuperApp\Cache\1.0 - OPINION: This function appends "Cache" to the `CSIDL_LOCAL_APPDATA` value. - This can be disabled with the `opinion=False` option. - """ - if system == "win32": - if appauthor is None: - appauthor = appname - path = os.path.normpath(_get_win_folder("CSIDL_LOCAL_APPDATA")) - if appname: - if appauthor is not False: - path = os.path.join(path, appauthor, appname) - else: - path = os.path.join(path, appname) - if opinion: - path = os.path.join(path, "Cache") - elif system == 'darwin': - path = os.path.expanduser('~/Library/Caches') - if appname: - path = os.path.join(path, appname) - else: - path = os.getenv('XDG_CACHE_HOME', os.path.expanduser('~/.cache')) - if appname: - path = os.path.join(path, appname) - if appname and version: - path = os.path.join(path, version) - return path - - -def user_state_dir(appname=None, appauthor=None, version=None, roaming=False): - r"""Return full path to the user-specific state dir for this application. - - "appname" is the name of application. - If None, just the system directory is returned. - "appauthor" (only used on Windows) is the name of the - appauthor or distributing body for this application. Typically - it is the owning company name. This falls back to appname. You may - pass False to disable it. - "version" is an optional version path element to append to the - path. You might want to use this if you want multiple versions - of your app to be able to run independently. If used, this - would typically be "<major>.<minor>". - Only applied when appname is present. - "roaming" (boolean, default False) can be set True to use the Windows - roaming appdata directory. That means that for users on a Windows - network setup for roaming profiles, this user data will be - sync'd on login. See - <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx> - for a discussion of issues. - - Typical user state directories are: - Mac OS X: same as user_data_dir - Unix: ~/.local/state/<AppName> # or in $XDG_STATE_HOME, if defined - Win *: same as user_data_dir - - For Unix, we follow this Debian proposal <https://wiki.debian.org/XDGBaseDirectorySpecification#state> - to extend the XDG spec and support $XDG_STATE_HOME. - - That means, by default "~/.local/state/<AppName>". - """ - if system in ["win32", "darwin"]: - path = user_data_dir(appname, appauthor, None, roaming) - else: - path = os.getenv('XDG_STATE_HOME', os.path.expanduser("~/.local/state")) - if appname: - path = os.path.join(path, appname) - if appname and version: - path = os.path.join(path, version) - return path - - -def user_log_dir(appname=None, appauthor=None, version=None, opinion=True): - r"""Return full path to the user-specific log dir for this application. - - "appname" is the name of application. - If None, just the system directory is returned. - "appauthor" (only used on Windows) is the name of the - appauthor or distributing body for this application. Typically - it is the owning company name. This falls back to appname. You may - pass False to disable it. - "version" is an optional version path element to append to the - path. You might want to use this if you want multiple versions - of your app to be able to run independently. If used, this - would typically be "<major>.<minor>". - Only applied when appname is present. - "opinion" (boolean) can be False to disable the appending of - "Logs" to the base app data dir for Windows, and "log" to the - base cache dir for Unix. See discussion below. - - Typical user log directories are: - Mac OS X: ~/Library/Logs/<AppName> - Unix: ~/.cache/<AppName>/log # or under $XDG_CACHE_HOME if defined - Win XP: C:\Documents and Settings\<username>\Local Settings\Application Data\<AppAuthor>\<AppName>\Logs - Vista: C:\Users\<username>\AppData\Local\<AppAuthor>\<AppName>\Logs - - On Windows the only suggestion in the MSDN docs is that local settings - go in the `CSIDL_LOCAL_APPDATA` directory. (Note: I'm interested in - examples of what some windows apps use for a logs dir.) - - OPINION: This function appends "Logs" to the `CSIDL_LOCAL_APPDATA` - value for Windows and appends "log" to the user cache dir for Unix. - This can be disabled with the `opinion=False` option. - """ - if system == "darwin": - path = os.path.join( - os.path.expanduser('~/Library/Logs'), - appname) - elif system == "win32": - path = user_data_dir(appname, appauthor, version) - version = False - if opinion: - path = os.path.join(path, "Logs") - else: - path = user_cache_dir(appname, appauthor, version) - version = False - if opinion: - path = os.path.join(path, "log") - if appname and version: - path = os.path.join(path, version) - return path - - -class AppDirs(object): - """Convenience wrapper for getting application dirs.""" - def __init__(self, appname=None, appauthor=None, version=None, - roaming=False, multipath=False): - self.appname = appname - self.appauthor = appauthor - self.version = version - self.roaming = roaming - self.multipath = multipath - - @property - def user_data_dir(self): - return user_data_dir(self.appname, self.appauthor, - version=self.version, roaming=self.roaming) - - @property - def site_data_dir(self): - return site_data_dir(self.appname, self.appauthor, - version=self.version, multipath=self.multipath) - - @property - def user_config_dir(self): - return user_config_dir(self.appname, self.appauthor, - version=self.version, roaming=self.roaming) - - @property - def site_config_dir(self): - return site_config_dir(self.appname, self.appauthor, - version=self.version, multipath=self.multipath) - - @property - def user_cache_dir(self): - return user_cache_dir(self.appname, self.appauthor, - version=self.version) - - @property - def user_state_dir(self): - return user_state_dir(self.appname, self.appauthor, - version=self.version) - - @property - def user_log_dir(self): - return user_log_dir(self.appname, self.appauthor, - version=self.version) - - -#---- internal support stuff - -def _get_win_folder_from_registry(csidl_name): - """This is a fallback technique at best. I'm not sure if using the - registry for this guarantees us the correct answer for all CSIDL_* - names. - """ - if PY3: - import winreg as _winreg - else: - import _winreg - - shell_folder_name = { - "CSIDL_APPDATA": "AppData", - "CSIDL_COMMON_APPDATA": "Common AppData", - "CSIDL_LOCAL_APPDATA": "Local AppData", - }[csidl_name] - - key = _winreg.OpenKey( - _winreg.HKEY_CURRENT_USER, - r"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" - ) - dir, type = _winreg.QueryValueEx(key, shell_folder_name) - return dir - - -def _get_win_folder_with_pywin32(csidl_name): - from win32com.shell import shellcon, shell - dir = shell.SHGetFolderPath(0, getattr(shellcon, csidl_name), 0, 0) - # Try to make this a unicode path because SHGetFolderPath does - # not return unicode strings when there is unicode data in the - # path. - try: - dir = unicode(dir) - - # Downgrade to short path name if have highbit chars. See - # <http://bugs.activestate.com/show_bug.cgi?id=85099>. - has_high_char = False - for c in dir: - if ord(c) > 255: - has_high_char = True - break - if has_high_char: - try: - import win32api - dir = win32api.GetShortPathName(dir) - except ImportError: - pass - except UnicodeError: - pass - return dir - - -def _get_win_folder_with_ctypes(csidl_name): - import ctypes - - csidl_const = { - "CSIDL_APPDATA": 26, - "CSIDL_COMMON_APPDATA": 35, - "CSIDL_LOCAL_APPDATA": 28, - }[csidl_name] - - buf = ctypes.create_unicode_buffer(1024) - ctypes.windll.shell32.SHGetFolderPathW(None, csidl_const, None, 0, buf) - - # Downgrade to short path name if have highbit chars. See - # <http://bugs.activestate.com/show_bug.cgi?id=85099>. - has_high_char = False - for c in buf: - if ord(c) > 255: - has_high_char = True - break - if has_high_char: - buf2 = ctypes.create_unicode_buffer(1024) - if ctypes.windll.kernel32.GetShortPathNameW(buf.value, buf2, 1024): - buf = buf2 - - return buf.value - -def _get_win_folder_with_jna(csidl_name): - import array - from com.sun import jna - from com.sun.jna.platform import win32 - - buf_size = win32.WinDef.MAX_PATH * 2 - buf = array.zeros('c', buf_size) - shell = win32.Shell32.INSTANCE - shell.SHGetFolderPath(None, getattr(win32.ShlObj, csidl_name), None, win32.ShlObj.SHGFP_TYPE_CURRENT, buf) - dir = jna.Native.toString(buf.tostring()).rstrip("\0") - - # Downgrade to short path name if have highbit chars. See - # <http://bugs.activestate.com/show_bug.cgi?id=85099>. - has_high_char = False - for c in dir: - if ord(c) > 255: - has_high_char = True - break - if has_high_char: - buf = array.zeros('c', buf_size) - kernel = win32.Kernel32.INSTANCE - if kernel.GetShortPathName(dir, buf, buf_size): - dir = jna.Native.toString(buf.tostring()).rstrip("\0") - - return dir - -if system == "win32": - try: - from ctypes import windll - _get_win_folder = _get_win_folder_with_ctypes - except ImportError: - try: - import com.sun.jna - _get_win_folder = _get_win_folder_with_jna - except ImportError: - _get_win_folder = _get_win_folder_from_registry - - -#---- self test code - -if __name__ == "__main__": - appname = "MyApp" - appauthor = "MyCompany" - - props = ("user_data_dir", - "user_config_dir", - "user_cache_dir", - "user_state_dir", - "user_log_dir", - "site_data_dir", - "site_config_dir") - - print("-- app dirs %s --" % __version__) - - print("-- app dirs (with optional 'version')") - dirs = AppDirs(appname, appauthor, version="1.0") - for prop in props: - print("%s: %s" % (prop, getattr(dirs, prop))) - - print("\n-- app dirs (without optional 'version')") - dirs = AppDirs(appname, appauthor) - for prop in props: - print("%s: %s" % (prop, getattr(dirs, prop))) - - print("\n-- app dirs (without optional 'appauthor')") - dirs = AppDirs(appname) - for prop in props: - print("%s: %s" % (prop, getattr(dirs, prop))) - - print("\n-- app dirs (with disabled 'appauthor')") - dirs = AppDirs(appname, appauthor=False) - for prop in props: - print("%s: %s" % (prop, getattr(dirs, prop))) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/appdirs.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/appdirs.pyc deleted file mode 100644 index 7f27d9a48d878a783416a78e66b636c4198551dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23990 zcmeHP-ESP%b-%M*ev10AEXuMZ+at;jKP)X}$&h1JQA3N8rC6evUD}ixDy!knkQ{0` zvz(a~xvrcdl^^od4-{xoz(CQLpg>+)1b!)6)DK0AAV317eJt9C{t103(1)hK-?=lh zv#TYkq_UZ$l*r-C{W$mBd(XZ1ch5QZcKzr6f${GixK~l}zh3<PI)1}9yOgq(n#XfO z%^S+jtJR!xx|EYwj-ejs)MG=<cPkq|J*wKH=6jO&UNzsVoF28>r|e$!qTQt)<kWn> za{5*9ZRVdJP@a+$`_$^7vinFY_)(I7pPJvN97OF`k5POVNPx`z0p%Q!<o%NTFO@x@ z<`1g%pC#e@B>Zz_560p4e!h4p8O(s{L9(iUoadB%Kz#yU4z~s#l)&d(0}n~yk=DTH zBycDbcvRVkCGdqzAPRb30*_?^k@AQHzNqXW<s4T_XyK#k6U7>TIDbOfFYsgjq_U66 z%S+0BQC?nF_HlW6MLDR?0NXYg%r%Zn>zz<lQ>~p+^QV;IysYMj)!h1EF7KRH4+d1w zmop5bfwFa<y{hJ4Q_d?oRezc)&s5Gy2Cw($?jrwP_SRRFeNqZL*JZz?=0}tb`lHG| zr{>3${T1bOtE2DUut(IpH=Gm78Bq=*@iPWlG3LkBCX$S)se8!vy0XWW^SW}*C`Vo( zO-nguU!Tp**{^3wAnK_z{}D2uNi$PEpSIW^Bj?#Pr(IBxkH?0vJ@zzg@9UaF8$q;6 zqi=BZH1K#oa;t9SI-$Ab2d3>rPO#>BuD5JjwOZA!Sdr^{XTzFPahKeRX}dvK7#Juy zj(K?{ifWf8CYIf3rM_6G_-hlBmB@YQlp-r~CXk(puOxIWw;Gz3XPfoVT6PKpu7T3s zJRcauD&l9s{W<<kyLeR*qgJhlR>aXh=X$ok5k}p3-*CMP=ObpiZB?Qk{I#tBf$~~) zz53?)3Ntf?f3M;<ya@UcQW_#1f2<xsl>5|!J{6o&kCgh@;9!5$rGm4{&Z*itj_8l` zD$1$VF13o6ZuKb7p^Kl7@vc;GzyJ{x`T#S=W|Fd3JwmL(1dl<XTdn_LYZStB5`Mt& zen(i!3rjyslJ!yYv!%p5Xv*2_mnBO-do)giyuHGt6rq{yn4OhH70w%vFfh*>Eom@m zN_M8{hOG3n{l0--C^}I+@XV!pwQAO^XvK_tGg@)bqfU?!5i7DNC(`lJii=)vN)lwp zjQ<TI*t6E0VG~J6h99QC)S5g=&A&I7%xT|q&X}w9Fp?}`BaECimgZC<KWLCtAY3|j zp`|3N9<BJnusP~`)do4XP2V$Pu^MY<0qmr?Su$AF1WXPRH;e*zu^w@hEc$k%b4|_J zMh)YqT5YtDa-*a$e?!I@22RcL8dCj&Im-rHLaxwUv?>qS#Bn<n%n$v#xn{MJt65=a zUbm{D!=zx%TC6&z8)a($&<R2eVrgf~GyNKev{g0ZaNU(o)md{qw5pWnV4UjCZQ-4r z9<$*tuSDjCrE{P;(H&siT{0VBQo`5j)yS=ZnYf&=g%tW3DFarHB`rFpFpk%t?wJ_v zP7O?eqiUnTj%SaZkwRL?Z20vmSWQ}*bcQdlS*w0<rEnP&8U7A8n}S_=hy9OIt1d)f zW5w~3_GP!!0w+Y7%^bslZ-LA*1ZUCrtB&QJ!6dn4p>Dd>$IJ@a6vc*4WX=Y4=?2{% zP9k0{9LEG%svVCMExYV{D>Bzm2FC+lIU|Eq5K>gFj?_FS+VF!1EWKWn3<>>O;4isV zC)AB5bWAC5!^QAjY?be@;Z;UtL{$A{*DIKq;9Iy(Ci}>#tf0)onp+9{&|ivV-gmsS z^>Cu<E(TW6n5b0Vx_I%;uf9DxS1P=5ZmeL1waqIn)L1dj5n-hsQZza0-7u^>TwB;l z@zBX|oeXiVR94_zO6g$@Fz=MiyO)?R^Y1$ow_<)Ko70b3s@H0M5KUZ0;56o&CSUJ+ z?q)j;lKaj?q3UB8PlPKdx0#V~r#T(Cp84wCsdvj$le3fM8+UGBJHufBA#pv&PT9mv zW8R%HM?F6><1QLwaaS)bO!<{M$DUpuOHRazC0w}7uIHS1Wg%OGDG1F1*`Jgd?TWm& zRwXGbTMpTMs<LjevgrSqi(jJXx6F>!e4mosRx7EDl=u`?BHa#E+LCTj58W*&OV3<K z|FPrGm>Uj8PqpfA$hw05G>Lfxu!LG>+Im^f5zQfc#$0TqQ^W99QWH-`MWUBzKfy`q z=G3k7<jf4kCwe{&xpn92WEx&1><M4SV|%F<iY>Aj9*|5~5uP3$K$w6fy?hGN;=&3P zpp+lVH>dij58s$Vu|DDBAU?{=PE-ceDx<AzClEL$i;qTYK0p|WJDXV1Y|5_`gG`S1 zaFlpVz?`KQ{)oT=?|NmGn0Tp>_qeO2jEe7tQIYL6ieLQ*m+&@G3tT`%XX2q1OlYRU ziH|lX8W(~^Z{xum7uUUW7lSu1R=yf;zHNULoWsB6+QjTc&8?kvK@=<P+31bi%jFpc z$#3}~Rvte{5Nx5=kalHt%A7&Vn2XM$?C>k(#T+ySjeg^>am?t!+lkx>JP+gjMDArg zkKyZ>A$XKHmK`a0^dDOA=ywH=_P68F7?uh81S*ZuXI`M&ry2CQl;A&LM8u}(Gq2Xa z(;B7WBf>v5yb}fivFv+;&y!?8kOFgoeF+dh%|Js5AvDz4|5dU8eRj*sfLiU9y<@Lh z)~rg(Wq?R*%J;=-P=%>`uM+>pb?YO>#P*t>*hve%{&r5S|Cjo>M>q%tqF&4J0g4); zLO7LT0X?!~i;3<hBLv}y6GlkxmH~1Ev_Sa3FSLYT<RsG0D{p{Qup@Yp70;^@EC0C^ z{duNn#Ob1uLn>C1!4$fX?d{Pq7Y|!6z<byjP$xlb=>o|GY7ZN;6^Mp@EwHgh_*fgB z*jm)A0Kf&h1R&Q0ZdVe3KaK^rrQ0`F+{y|uKh+JucLIL7BLpbI&d#i2!^K7s_=?dJ zn&FDz{x%ew?)=Pm(xsU27fU-bVc*5Q;!@zRndurib+cFk^lV`#A#;Z4Ze*e!1`{0- z;K-SlYyf@jWKE(yK=W2m8-kCtE`t5H1-1VN9J@8|teV8Oq1v=Y8bfM8yfto|#8yJ% zuU`-+et<5uVz@ne9lD`Y<}iwx3H)V94q>5|DRafOu?sZEHB=eTZ1u5i5GsYS7N*~d zskTz<3<5FMPMbHR1i-gCHnaiyM&wj02h6wP4M`Iy>V0mAtqHgP6s{)vr!;-*+`R+_ z#(C!^i_<r!-@Rl``63Vi63B<$rY?heE!l7hF{#p7wg}U5SL{C|G!3v<ZD`D?!Q&Ak z2?38+@7%t9XF9=<8Y`Ye>~@0FiWJFrc!*irggqphYs!fz=B7u9DT|CL?&D*S4`Q>T zL=YzyNv!xBABXuMt`$&6BpEt20d*nv;E@1C49>u<iAoQVqXbGt)~`6k$5Cb`R!rv` zDNQtnn}ShEm6OEofkTez6dc;%HGC5f^@;|EPe8+bzj4C&8sH%TVj<UK4CMxld@hBG zgo!Cs{2o3cAhmAwphpF-QdJ6cLIoxeQkQz17XSlgpeQN<==cIq1w5lQmIA~GXznLb z8Yd=TkWdD(pAg*O8E4mN+TjlSCj1xhwmsZQ^u++~OYSm9t;n#5Js^LgSl&|y?m?bk zE65XXO83-(+V-;>>cHldvNLuP*@_<_%?lP6?#w<ug$~=O|8#+^n!i@n-_<+Q*KfYN zz4C87#w9zmBs?_%$J1)2GED5Kn`*C8RxKp}LbN@Evl*%(*I+2Nbmmbii$X3^&<9;O zA5y!c?Qqkh)EjAl@FL%uD1kUYLj{2a1PG%f(YD$bUr5sJ&WcV5BVwYfN`=q&5hM^v zy@XYITh-2BtlEKP5bO0j&GlOAPPo+eiDscM(JY9{A=NCb_Zi+lib4by@Ge=zv#OLH zi4rqkCsj(nL=R+CDa(l}<v(PB|4b4HRv?VnPL%>330P}WrTi_)5i&rP@;@;zOxC7K z=}uKCg6G2CJrxN+Jbw1fhp=M)e=#4XTb3_LMWQDx;_YXnB#Ed0r%;nPQDtJ&UT!Xv zBVq^3tRXRxZImKS?ss0=ljXc+=hbmJpLl{b4nx_sXR7xt_g<5C*{nDgv{DbPDr~y0 zmr~BI-|aNgMAV)n3;y<uK3hdd8+6!0SCOrCQ(Gb3mCEba#H^zgS6_$%qa(}^MFi19 z(r2P^*cxh#3bYVa#A!l?rYb^o4+1w{V#G;41ar`eR(u7IPHKjt$ym{4oZ{Os)8Y5a zw>S}kh-fz<$WIu=il~<djf1o`<qtohL=a08Ayw-6^iGSV>CZ)R@Py~nc9y2&Pi1NH zh7w%Ss$3vU__QSom?p6zsrBQnUQqv*q)fe_fGhx*jwev5l{m9+?*+AO_E_<8MbOxl z)*{*!9|XT)9_o*$RD59afR=Yp@3Cj<`Au+x@@sGkr4L!+29^3fJ>h#sl{i#<u%S~y z?k}Z_B3I7gs~i`@v2z(*+@K3b;?x`>3olmBR4Lw)JL565=)hN_lebVM8F)KGh^8}z za1}P!|FqPsT7X+$5^p9mM*(jVZGWp7;_l2&wv&v1&oAY3vmi{ToMwRpY#-VxlPLoR znw`9DVv0iYPU;*fW(hIlh4tlSC#3fvou1gww@XvgrtMeY`4^k*#8O6^mpCz*%YK5L znEbvrShV=I+~*`IeFaCqS#cr+HG2Nhc`^|c4^GIj?oHThk(p7_PQ3CG>mA*3?ziZA z?rUSpSiwYFfZY}obPd*@Saj%>7y4@soC9He9IwL-F&LNXF2lRolS!RXFxnuM>1<kS zaB~csE@_2AVd1v_5&Z0|h3lx?lD|pImbl|BT#nzwWvi_ZnQ^kR<}AQX%?ZGzj$e4A za87s1%+2YWccw4tc3P@?@V7>1pfNDo!uG+{xwQq*CJG|-TI{|Udyc{-67Jkm+57RB z*GTYw>^GV*K@|zq#F8VDs0~jv{Irj&=l}v`BQSaO#x+rsh0L1_DD9E-i(8aBsgA_T z6mu>>Zg=1tYpgX$oH3|CG62IuVdhk;QD_K8pqIDu86uM7ulNjo4==x3hM?znRO%## zAeeh;_1?ondwA$K0T1ojfkY3on{MIhjItxpOEfSoXdnen8Hm^P+La?rsgpSB+T!Y6 znw^~0>)4jQ-m&(lbJ0?EXA2Kj<SA#-#hC&)@Ynnh5J(z1#7V0S_kmlmCAQ!P%M(~q z-vNN0O7K%Do^0jJ)@f-U?ca`570xDnaB)%sNQs!WvvYH^UJ0^JPb6&R-rU+yPuh`^ zrN2qK%_W%xwpQ@``rDFHBq04kByfpHfH;ZnAy1f+T68!69IyEL)Y>_kl5oBiC(`1V zJP)hEgB2<gtx}1Plxe5lx|~`QR}q?d^ntb>^>I#YH$O;-bkX6Jt|HpC_Xo<mNM{|; zq$lx?8F5%mGI~f4P0dfm$n?_|;;CtiY2aKduHfO{JvDg1p_D!7fKxepUbDXeC(53g zD&>~H96p^U<&2zT8OAV5(x<B*mvPa;#GBt3pmR~wPKi&WbBV|2jtjBb+!>PjrXnR} zC$ktMal5_+ez?o=QY^dj*oc$vDz`p(^@S^ASf8{O&q5a?1cl<WQN;);QOD@r{Z6Ww z(P_A!UNUcvtU-eVPi`oFaDX8;ge5u;dS!1ABT!!g)q&{ksE-gg8&T$2COR$T^bJQ{ zU7sDa7_50Br=3+sLPlHW=ouU93q{CNT?k4|i4gcD+MTR`3mwrp{c>6muGKM|Ne&y5 zdF`M}0}Q{!trgs4ykgqSRAQGBPZ@EWeH|G)sWyt^h}cD)2Dugpjmi+m;4HlgO$71` zRKHlH^vNflec}nI<n)v1WT4FgPz@_g&wp6_)jRkN{{RmMw@ARB70;ZqaimCoc!vjo ziJ?B}<{cim9s^+K6CfR2nIKnpz>pMw_DO6$`INgf;4d4;4oGZI@`-CZK&m(S9F)(# z<a56&#)o>|0Ap8u4=O*`@hTASfWoC6S#hLIj(;O0@nxlmhlL93#b3HdiPnZ>^pUJG zUVy!Dj1IU8s0%On6bn@upW<gzMvWB^653Wxca#G0jWQ9f57g!H7CP0XjxJP^3<<t` z`z7^z<uZ&0QMvqQ6cie1Rjwa`!v7W4kH7RMmS%blFHmlwQC0=d0_URZ`3V;&X*D<* zJ<jDyqg_ZjEneZ`C#D-ohR+eiG=0W(EDI@~$75F%fkpE57py<~Nnuz#qnewbrfYs0 zZ|$8gvAbMz^7Z{Mpyrf+U2}>|d(9<wmupVGe((j<+)Qge(xK)OyUR5vUw_rH=G};q zaefjnTa9zv!BY}lfF9nX95Y2Ohi$zqv*RufYO?g%Gp;626#t4<lPvwsGp^>jU%hIQ zrN7TsQ=f2>lSSn+Z(t~w<yd>Uyyn~WDnGewmCLYvmdo0`S&-WWgz5uH(B0widqbxG zqRh}TS;@E+ftK!O$<1X+-oC_B?L{J!KV`+aZW68m#PuHRZvL0GieRP-zcPB)@q*DC z;6gFrwVbNr^fazc!u4qS6Ph4{7dio&*?Dyl7z~G$E&^=fX!S)b<}XtD1SJ;W4xYd| zxF!vG^d|riUc~WcK~ze-Xo>0~Vu$cg@JQ^#mRymeFUaAIB<?z#^so(C#4ZKb#bD1O zCok);-{M$idQ?yFe&8(g0-wySJ<D|*SH&I&M^EcCV>@QW4``Fdjw0NM5g#rJF!i2k zT*y!^a9s)a&-&J?6y?HxT%>%+&fu!QwgwX|(J#Y~Go1cq+T@=E6D@^b$D@QRRW@)` zeBpL-!OB9syIHte2Txw~fxgXW;o4@c>IY7+P+D=o+I6{*A=H?V-8J*!1vy)XO&Mye z1vc}32PWh9oJRB<lHPdl+K1(<?-z^Lrf19Vm#!5fLj7;nouKgn-5;-QYO?HxO6b~E z85G6e!l&d9$w7Q2gha`f=K-jb5x`=(9Rl`tT(*XPU$&e_^Z;zTxuVQtz~w{~{)vNt zU8A~tjDxwsT$j<S|Kn&LhD8oHI3S6D)pQ~I2?AoN$I(O?2WybpoT4`wL2DQ9Fw@8% zGR_gvrFdAcOErF1G_&|bHY9^iHm^3vDgIOUhUIny=wIa)FpQ!Hc@>m6uOQLPdP(7D z4#Oh&Of_B+4wS0)i;q7p5X3zO3E8>z&s09zCztB|wZe6I_~s>fbKY|ZAC&MPG2AoM zUF0eWs+tyQmQ`4$GU;46A?hQW>}m1IbbpTOk5ZDwx(~^^a2_{V6(o7_8p4a$8A(6J z(v5eWNDJr;PHKuQVgqGGQ6TSi&#m~jBZo#sWc<Juk>Pzx!i12wYHq}77Q{-p%PS%+ zdQqT?O5I%Jy*}5108dIU6iK8h0ov2^w-MT8tjN8moPu4k!tx6I(aROw(IAIPE5+N0 z+#OjZJZhI!x@44V4QYgbr>MS)M9Mg7oXU3@gZUm~zg#%d2T{eh@jSlw;WytDTF&7z zfBy_G6k3RkTzbc;T4eJg1P!zGMNHS2t+P`#Qp?qs@g$vGhzAmob38GHQ{=jpv8^2A z4oJu>ZYqi8cuB1<X*vF}tOaQ?IMk}G9R0C0ukMTQ=70qwKw^xRF17yS_zVhSOX3Es z1=r;;mg(0$%{P9!Y*g`9ap@MDkzY!R%#sz(PGQ9J#+AT<Nva$RWqGl_v=rZCgATB( zRS{VcbKF8md2AE!xeOq9j|JaiA)MhK;65j(id>v@+ogC;2AC+dGV(ghyp(S}?_wN= zkqi;ARs1Hxi$$hDtrSAe?~cr#K<OQ2R=4VZH$^r(vmP{FX%XFn^n%IBJj)8FBKtLD z&x&k3=Nc-WZTa1$s$FVL=2ip3n4W$<!rNRRO~4-lC5SZyW#HD=)y$j;F~+RHocpPA z;B*b~me17#G803*IjtX5tB3f#ikmk@6SXQgvvMBqRk*(C<35?kd-Xhyvsg#eBe@9{ zgNpM1Lj@T_qM7v{D*Vhn!UdFX)4#d{i${e;Oz1d<^@4gND+1<yjsj%aiJA4c4O-iJ zF*+!F@wCoWOyp<Pv-B>COSDU6m6jwXP<nDdhBpyPD+sKHh`r44b+34zQACY#Kmp_m zwW<|C9lNI0pX|Rm*PC*dMD}k_-Yw5e&fXA$A33-@P6(E`pkPFh#hcSG5>H>fR=j}^ zJ&11NO~z+wrFv&^H9CxM47cku<=GEst|gd7QcT0@{ZOwKkzc}n0^YJvjZhLlisJY$ zFuiqDz88<m;xvfs0|l~FERu`+e6Wdx7KT_kbU$*6_ZZCeO_q_&KxD1;FyEb_$Uf^h z6wyIP(98PHDl8I*j6=CYST+WY*RhObmk@>x86!C@9v^_9)E%223m1Qtr2}s_fL!HH zhT9DwT;5-)w>q-Rd7TZDZgBMWhdZB;^WNFB+ToWclwJ$Xvu8u*$%c-K3u1ar<w$%f z*vOdZ{6h8y93thw>1*L75DCW+H1GroA1<98sDxy1r_|8v>TAhH#>8pw$@Eb7%3Yhb zIg&{%+DFk)w%u>54?z+ywRoX~9gdpHzClt|66e8YQ0hexa_!2h<7HdXavDmAw;duG zm43O1ys~zcaoL&N4hmK6l8?<SyGSO8H7mZ510ap_aWiFE;&CC19Jdj)l_gSq8>x%m zARUhCWLA(JG`J6<ko_xhyxx}#$W-8mdRxI=MrH{W#qMc_iEPOZnk%Z-3#C#fbAZ3N zid~!RYl~A%Q{n?^cU27d;A&c=L>JlY#XETD#g)Ld?r|2Ax?xr;zR47v;-pJO>gkcA zZ^xsmUlv^k6*)^ahr7IeiQ9N-$;(<Zait%ugujPJPcN)5UGOx`J&!$1KNQb{#u3<P zXs7A#?$7n-hu#``XJ~Zj!qD48<3ksYp6fr>f1>|*|M5Y9$V0{e03^XA|323}2x!@Z dolWz9Pp&`Ljd^0faT0$I#(xLnzlZVne*vAFU=#oV diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/__init__.py deleted file mode 100644 index 8fdee66..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -"""CacheControl import Interface. - -Make it easy to import from cachecontrol without long namespaces. -""" -__author__ = "Eric Larson" -__email__ = "eric@ionrock.org" -__version__ = "0.12.5" - -from .wrapper import CacheControl -from .adapter import CacheControlAdapter -from .controller import CacheController diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/__init__.pyc deleted file mode 100644 index b0b9ef60da087ecea05a6bd292208b835235ad03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 630 zcmZ8e+iDvz5S{hi+nb?3phr{4uHB1Cp_G)+heA?{+oy#hl$GoVYbA9g+i~9d&HaIn zye<vVqO)_3G&6@$_s_HZ)$iv&YdEbA{V!;TD*_2n5oS<jAUjZXKz5<(g6x6pgXuxj zhpG=*;sY=PXogS?TRsFcf@TcWnD_|3Psge14Z)?TZ`Gx<5uIVW@eU*VVxz*9s8x~Y z*J7iXj!cPgVA1`%vO?FeI_1`<+`W#sZX20#cFnA4RPa<G6nS_;Z9b!}*_FWHY?u&N z#4oh7=;}@3a2*CD&Wic#;+@VYoF<4*2_713)t8UdPf~a?+#bGobZ8WQo#v_7kbraP zYR+R4I2T*8j6~BkI9H9(hFJ2;`A%UVgTzzf9)<S`mlU>@MB8+E^qI<?=0N?H>Di{~ z=6?v0Xz5Y!L{#NYV7YQeQj7Bbt~|WK8@u1k7r*Rmfo~V}dANHo?{P+J?aLpf*Zxe~ z5QQ;kaelq#-;#9P<kL!r<-@lqIoDQ4&I^BtBWnDiadK<a#~#HY4Rw$mzs@9^WPbs$ C#G!To diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/_cmd.py b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/_cmd.py deleted file mode 100644 index f1e0ad9..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/_cmd.py +++ /dev/null @@ -1,57 +0,0 @@ -import logging - -from pip._vendor import requests - -from pip._vendor.cachecontrol.adapter import CacheControlAdapter -from pip._vendor.cachecontrol.cache import DictCache -from pip._vendor.cachecontrol.controller import logger - -from argparse import ArgumentParser - - -def setup_logging(): - logger.setLevel(logging.DEBUG) - handler = logging.StreamHandler() - logger.addHandler(handler) - - -def get_session(): - adapter = CacheControlAdapter( - DictCache(), cache_etags=True, serializer=None, heuristic=None - ) - sess = requests.Session() - sess.mount("http://", adapter) - sess.mount("https://", adapter) - - sess.cache_controller = adapter.controller - return sess - - -def get_args(): - parser = ArgumentParser() - parser.add_argument("url", help="The URL to try and cache") - return parser.parse_args() - - -def main(args=None): - args = get_args() - sess = get_session() - - # Make a request to get a response - resp = sess.get(args.url) - - # Turn on logging - setup_logging() - - # try setting the cache - sess.cache_controller.cache_response(resp.request, resp.raw) - - # Now try to get it - if sess.cache_controller.cached_request(resp.request): - print("Cached!") - else: - print("Not cached :(") - - -if __name__ == "__main__": - main() diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/_cmd.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/_cmd.pyc deleted file mode 100644 index f3ba99d7991dd6cc9a79ee715be5091620ae93dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2288 zcmc&#OK;mo5S}IVwB<xi($}GZiatOTu$iER(FR4))G6#kDg=~s5fBipxRvOT6tlZ> zV#7WZ&Y$R^zp_7|oo|+{dugv0$kFV~K4!mfW*Gjlv-QQVw_Yr${RRC0J-_yM7CAqP zN}{>f11c3&0nGza@P$-{RCQ?H@#7AaU8;IC@A+|;%05*Cnh*TAN9B;JEt+rfxKD3+ z<88_ZqKqgXin4<<^DTO-XnvdYnDT9U8Ibvn^liE#Qnf@ii$)w_@hAVLkz&;iSQ!0k zqph>va+fU!*<z&+*0nS1@^PLuP8;tWvhzu?a5BN0dTc7!%jMrwZt?iBS#By_yJwlP z+6YcK4LBX}Yj;^Vq7y|fpp%fU6e(yO#Cqv{UAiD~FlaM5Y8v6JB*bFGZMA!<Pj%_~ zJU|FVy>wmHpZxg4^Fz18+RPc9RYzH!m)f{3wq$wU4t@AoyYl{sRT5zv*5bw#r<v37 zX=dVI)@81ZjnCi2XJ4A1>(?(I?!T%Z?3=Il7hl^q-{j}!0sodwd>l7Lvs={GWo5bR z9{#jUpTQ(=daCPuZQ=z0UU-1xbW!Dd&6xzuciJ>*dl`^rac5FvHBy2jFvR5r#}}+H zj!pqL&H%<R=SQ-P<&_EnW`|C?0<5A7MJGMVJAy4IWIOg)W6Y%VF)JNF&IIwP+vam5 z<W#$CX$43ow#drjoN+}~tn|hd))fmYh&tCiiermNSFBqeM3|N!4-#C0!y-C18!gIo zUF(DmBxKICwFRRCGOP8bc5-5i7nmHg!v}P2jAU1wp81rOjV*6=)5HS4rFJP|;cMOD zp+%XH3f28!#N>`y3cY{_zzDscv%>T;w@f3b;Tq?M8Aiz{VJm=p7GcfQg)BFwl#8!) z+1L-*aJ<r!=gHHFTTh%hn{cjA1iA>b6D)K{G%k!ZYwK3vZcw~1wT%IZC^mD`cp|HS zCt|zLdRrqybyqC_ATEaY0KO9z|A6Q#<<b{IAec(`xeSnxSIh`1qKhKA;C{rVz;ZxW zZK<$h*gCjnnGAFs9@SlNa(I-32%I~W8aP0W=O0`2q3POr(DTWoC_*1fK7x3kg|Nog zNkCSDTuJW1j0_Q?Qlo9NuDLZJx!Z0nt4#L#dRor&q>)Puk^=xJc@LX`W^8lQ)FF;4 zE9y`A-=d014b?Eb6ZXRo!*|snkj|c_n3JZ_J3Jvl;z<kQF1putP~R&i?D>~*PvB}h z!d}}2q~kcG$$!q2WxgqW^1t(Z!{!Eb{Sjh_r6{D3JbNJ3(~AoxpRs6fRcDpvTd~1^ qXGFW1j}2<*+iIO}O8p&b#v)Bd!8qV%#O-Jt4tvAVus6ClQhxz1O%^i% diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/adapter.py b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/adapter.py deleted file mode 100644 index 780eb28..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/adapter.py +++ /dev/null @@ -1,133 +0,0 @@ -import types -import functools -import zlib - -from pip._vendor.requests.adapters import HTTPAdapter - -from .controller import CacheController -from .cache import DictCache -from .filewrapper import CallbackFileWrapper - - -class CacheControlAdapter(HTTPAdapter): - invalidating_methods = {"PUT", "DELETE"} - - def __init__( - self, - cache=None, - cache_etags=True, - controller_class=None, - serializer=None, - heuristic=None, - cacheable_methods=None, - *args, - **kw - ): - super(CacheControlAdapter, self).__init__(*args, **kw) - self.cache = cache or DictCache() - self.heuristic = heuristic - self.cacheable_methods = cacheable_methods or ("GET",) - - controller_factory = controller_class or CacheController - self.controller = controller_factory( - self.cache, cache_etags=cache_etags, serializer=serializer - ) - - def send(self, request, cacheable_methods=None, **kw): - """ - Send a request. Use the request information to see if it - exists in the cache and cache the response if we need to and can. - """ - cacheable = cacheable_methods or self.cacheable_methods - if request.method in cacheable: - try: - cached_response = self.controller.cached_request(request) - except zlib.error: - cached_response = None - if cached_response: - return self.build_response(request, cached_response, from_cache=True) - - # check for etags and add headers if appropriate - request.headers.update(self.controller.conditional_headers(request)) - - resp = super(CacheControlAdapter, self).send(request, **kw) - - return resp - - def build_response( - self, request, response, from_cache=False, cacheable_methods=None - ): - """ - Build a response by making a request or using the cache. - - This will end up calling send and returning a potentially - cached response - """ - cacheable = cacheable_methods or self.cacheable_methods - if not from_cache and request.method in cacheable: - # Check for any heuristics that might update headers - # before trying to cache. - if self.heuristic: - response = self.heuristic.apply(response) - - # apply any expiration heuristics - if response.status == 304: - # We must have sent an ETag request. This could mean - # that we've been expired already or that we simply - # have an etag. In either case, we want to try and - # update the cache if that is the case. - cached_response = self.controller.update_cached_response( - request, response - ) - - if cached_response is not response: - from_cache = True - - # We are done with the server response, read a - # possible response body (compliant servers will - # not return one, but we cannot be 100% sure) and - # release the connection back to the pool. - response.read(decode_content=False) - response.release_conn() - - response = cached_response - - # We always cache the 301 responses - elif response.status == 301: - self.controller.cache_response(request, response) - else: - # Wrap the response file with a wrapper that will cache the - # response when the stream has been consumed. - response._fp = CallbackFileWrapper( - response._fp, - functools.partial( - self.controller.cache_response, request, response - ), - ) - if response.chunked: - super_update_chunk_length = response._update_chunk_length - - def _update_chunk_length(self): - super_update_chunk_length() - if self.chunk_left == 0: - self._fp._close() - - response._update_chunk_length = types.MethodType( - _update_chunk_length, response - ) - - resp = super(CacheControlAdapter, self).build_response(request, response) - - # See if we should invalidate the cache. - if request.method in self.invalidating_methods and resp.ok: - cache_url = self.controller.cache_url(request.url) - self.cache.delete(cache_url) - - # Give the request a from_cache attr to let people use it - resp.from_cache = from_cache - - return resp - - def close(self): - self.cache.close() - super(CacheControlAdapter, self).close() diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/adapter.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/adapter.pyc deleted file mode 100644 index d8aeaf797ffc5dc6c75cc3523491c2c477aa28f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4045 zcmd5<ZI2sC5w4!Gy=%uCZ!ToHWba^jH<7Z=@e(-1A-G)b4so|cvpyYILZewvdw1;d z%%r=W%|;FqN(6@le1gw>;uC*^f5Z=fr>gxD3BKpNp4y(C>YD1Rr=Bi{|K97|{@vBz zjA``=@&Bi|>~A45d=(W$qs>^+NUi4s8U->As0eA^pizTV7E;!rqDk`>javS`NyQG$ zcWJci?^{%~Y2Kkx2lqRq8#IB@U3x+Eoaoo1EBxA%ej6_2|H0?DuP}61AU+%pAO0*$ zYo|@llm1B$qx<RjT;H!sXR4ym#y?;a@8x4B5B=12(JhM8bUb@MFZ8D-t!r(ZpWoV8 zy=4=b9jtp7mpy^dh{-w*=ROWC-bdDY=^M}s#GolNA-zE8ptB>l4SIo9yOcF~)1x-U zCw+c_<M==PWawJ>|K5X-9t<ChdA@^-r+$gcK7w%gDq1370Zjv1?$C0V{z9adit2B$ z9Yhk3lLjrDGJtGR{SIe`=UcQ4ss4!E4n1qr5?`VzHUL{lYDmilJy!v1!b?Innt1E6 z`1iqsq2yxB5l^&B&#YqyEpn0;`O{VKE$;=ol1InO?E-<08yLA=h$P9&+$BjI@C+-6 zMaM}y*9((dhtyqL&!?w_PUhO3SDB3k5d6~dHsgHj*t*rlB<^Am^K0Bb#8xdC7pb)| zza-vcag}v=S!%Em_GNbAUc<ka)=bi|tITB|vn0Y=j0UyIAE!<a9;aq7sftV+J9zqJ zaQR(xT3*cFy7#EOd(V9D-uQ?1$=lgea~GepdN3T+d3`4@txJpIj(h9lv*aO9$(20T zWmcJigkt5vAoYkpsxM<M0*1R~x9Q4F^_ps{UeHyc8gsxIEgZ^U;IjXOKsxKLWS8g} za<6C#;52B~BJ(G@Jdj5K5mK&@a(dRJPs>}>KuD%dnsvxLB&8I9fhVP+Uja{ME~@}K zm;%5RC-ixsPS|>zrk%CXD=VY0t4f5qOKy*!F>0^M>X817cLI$qV2n3l{|eEGR-Y3@ zBT6HqA1$<XN6{x%NA6s&C!)NZRA!#KyecDCMON!5pG3La7|>4uBMUuQCQ*%2*z_ZB z%GOm0yI6Rkqf+aPO?jpAXk$q*J~7oik+sKtPJ>4em!?N%%#)6DBT8Aa@>~G+w8&2d z=h~Rc$kcIFYEeI3<OOScU*y@)EHuiKiy>ub2`Mb<42To90y?sscb*o>N+sqR@D=6@ zq0EF=Vy*$Pwem;&j+yhM+{9TfFvtFHTz|<K_Uv;2{|N4V9hW_Tpk`0?0Q>{BuR5xw z4#F=7hryWP&vD?a2%`Q5wgBR{WdJS=scUXCTXHo3=coqUf&&9G_t)@6O$1UC0Rg=j zGeatxLFezH)1)b&3ky&~fe4H-p0&v=g<8Y)La=DSv3`zXVnZD!Xa&?i3+NHv>}`i) z`(JC@Qa;|cf)dJy_4XKG)879mf%ApE6O<U#_GL#HT%$h{{ek3=ZP4#Q13LtQn_ib= zLp+Cma*h4qBK-on8*H456!fs!-7b$gT!_*aC1Rf`oI2Cj$zXs<MB}FD+>)UAGv$z` zZ}9oDq5uRQYmzrv`a{M3gY&g6_;<Muq~cdqd3qVm(^+1gZD}B?Oti2(#q}#_J?d;M z49{~LUF1a(F?TF#C=>-NTj3JS8SNIP^d{@d>C)lcDlRt`JpQ5PUD(X$cL5}+)=ZD9 zOef6Gy!sC2$9yF5#U}_Cmc0$}nY1(#9ciW*I^UECB9sU{mLTLAAF#acIENtNL7|)R z`J$X9g`PM$d6P*kB!DxlvRe8Xschfb+{98jViQji$$E8p=FVT~sRc;kxc@(1Vee$Q zPD$;cl>1-8$Ws&7x17&Hm}t?8OW8UOO}DU~W?5%#lzWjaf5va%k&vhXcZ!Mk)52<0 z5RuV^POW6G+*0+1d*hH_{Vg`YO~PbR;_R;qEA&~XhQT6Z39rs#&a=G2UDi0Hn0h{z zHf4zWEhEQ=tjCea%g5-Gz~g}6x}%ZCqnd5mI9ZrNl8*n<%*ggL`0jLk16KO{B1wPz z6}G$!v4*TD_&|P@wZ6uJ{fwDB<F_F^nKNMHZ$rGYhK8fU{@5QuP`d{fZ>t+&uh~}J zu&dfFaC^`WG2aNm@hx?T=k1`^Y(eWVJXAN-^{^dm%8#>mpY8EZnU(NGV*`XC#0V&+ znArT36duRmxZi;Eah6V$3v8Ramr4z4ueb$#2OeNQWZ7j>d+J!Au<EJHbgq*`P?#k1 zDqEmyPU0UxGrq-wD?_@-IO5TO1?M1UvmO)}yy7kL&bU-9mrF}^k^1#t_iFc`_w&BA z_ut3U_&Y3Khj4E~ppQOU_0UJFUdJA-`ez$MfrLBc2ZaBPz`QHJXD0YHc;SBydJbSO dJ|_{8<o?*F^Ct{g>HoV5f5CpRj|ONz{4X3XkO}|* diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/cache.py b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/cache.py deleted file mode 100644 index 94e0773..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/cache.py +++ /dev/null @@ -1,39 +0,0 @@ -""" -The cache object API for implementing caches. The default is a thread -safe in-memory dictionary. -""" -from threading import Lock - - -class BaseCache(object): - - def get(self, key): - raise NotImplementedError() - - def set(self, key, value): - raise NotImplementedError() - - def delete(self, key): - raise NotImplementedError() - - def close(self): - pass - - -class DictCache(BaseCache): - - def __init__(self, init_dict=None): - self.lock = Lock() - self.data = init_dict or {} - - def get(self, key): - return self.data.get(key, None) - - def set(self, key, value): - with self.lock: - self.data.update({key: value}) - - def delete(self, key): - with self.lock: - if key in self.data: - self.data.pop(key) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/cache.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/cache.pyc deleted file mode 100644 index ca0844ea06fc7f8c4867704888b2f11062245bb5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2923 zcmd5;-*4Mg6h1djvn_PLG!29V!VgG9u-2P4MVo{Wv;%1pM8ll~RGKW;_oj2}*q(h` zmT50g-uYws1IG6qCym$(@RT|^C&xF}*XR4rxt|^Ub#?gpZ`Yn@vN!_#ehq8CgR>(0 z@J4J;3L~?g?DxdjKwKbGjP~UZku#BB_WNQt#PxM_a6Y;r_LA(4E_1yDxZ$%GF3i#l zzB)K^nGe5t`XroIO_<N>!p&Ui^YXBp(Qb#FZQV3IDSVi>VH)}ujZ5vYO{Xr*%dMH4 zRn0uKdFJz~Oq==kFn^0<WN<Ivhx@+Dj{Ow`J8A27dE;}SoU;RK@4z_#1s-AMfC$74 z0^()>bb$sN67P-rxFGAn(YVYmti1~7m5twZr9I7J(&cgse@-g@WQo$*Z=0rSMqEJ? zZCx?-0nU!ye1soS*S<s))lGhydKaChO*E|v>zX!t{VJN@Zw|^|kME6NmUqX^gK_q- zef7w`ZtmhZtfOa9o!47=+4{67w*0*x4wI)GQcF%<X{#pET4Yt}o2uwew(Gg(ap?RI zH*cAtn2f2>{uA7o7mYYQR!7482Ha^{oVW`CuXUaUTf$?)wEqE*(^v4;4r+jOtSg*% zHxMmx5zo?gInGj8!Jg#kq|2J2B3U~K_DEJ#t>b=KU>FgZzYLcoWjb?7qK%m(v&x<n zIE{H#e2I>;Vs7^p5{=fgk75$blv=t$?@GXr%F$y;)<5Nl?X<(W5!^zKAUjYbqe9dv z5=J^jg0gmsG@v3WZ(Lz%TI)|R&?(XzkZ0tLk@~jeB0Po2t=d3$DQ0(CR8TavQBt3( zL}_<u;(3|-go3+bcs=AUIzsbFK1Ax;+F~}%xik}%62Wc)<|BNS1t34`o$mn!e+^T# zkreo(D%}crOfJ@qSCjh~i7dA^)26Yv6y+BPI+TBYB!-cZqn_k|++*#>XGY9V!2aXU za7zVH^pwJw6nJj7liK2O^NxPU{AcYXaF>U$MX`sgVlzFZVT@ow!)KrY=#`1%fi!m( zF<8Mk=_p11jS&)5SM^0}2bTR)SWDnyhUU7Nj8p{q*pA<$yGh5#!8;PUDx*g0*}(B8 z68iwQP{++a)UiM5<eos1#8w&9o_gNB_~G3!#!1(u-3z2@tS)sSK&dKy**%%QqHJh+ L2IfZa{`J2Brjeu| diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/__init__.py deleted file mode 100644 index 0e1658f..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -from .file_cache import FileCache # noqa -from .redis_cache import RedisCache # noqa diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/__init__.pyc deleted file mode 100644 index 47ac069467d831f0a0275ae0d28bdd181c1c3883..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 329 zcmX|7!Ab)$5S{FL(2B*6@URFqEy|)GA_(4;QhO>$Sd+93W|Nr2wXG+=*&pa6Egfdw z<h{HkL(2cN-sNBaox?r~?2lOC0zqIB&;Tug83B@b0lI*;gjtEagtzJljfx;t3E~OD zv(oaZ;Y+!bdMHh#P$6rt`9w_O9DR%@;{+MRQv{!kdokadcB%t}UtCh>Ro6sGyT;SG z)k69}H!Hfn_8;cwb5wtsVeM~fej8SIV&jJx3rDBaDK}6i#765u9K9^qI7zu!CylV4 l=5e?+(ObPEfik9yii};kbv(xR?^`RrwR}kPh4f?RWD8T^O`!k) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py deleted file mode 100644 index 1ba0080..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py +++ /dev/null @@ -1,146 +0,0 @@ -import hashlib -import os -from textwrap import dedent - -from ..cache import BaseCache -from ..controller import CacheController - -try: - FileNotFoundError -except NameError: - # py2.X - FileNotFoundError = (IOError, OSError) - - -def _secure_open_write(filename, fmode): - # We only want to write to this file, so open it in write only mode - flags = os.O_WRONLY - - # os.O_CREAT | os.O_EXCL will fail if the file already exists, so we only - # will open *new* files. - # We specify this because we want to ensure that the mode we pass is the - # mode of the file. - flags |= os.O_CREAT | os.O_EXCL - - # Do not follow symlinks to prevent someone from making a symlink that - # we follow and insecurely open a cache file. - if hasattr(os, "O_NOFOLLOW"): - flags |= os.O_NOFOLLOW - - # On Windows we'll mark this file as binary - if hasattr(os, "O_BINARY"): - flags |= os.O_BINARY - - # Before we open our file, we want to delete any existing file that is - # there - try: - os.remove(filename) - except (IOError, OSError): - # The file must not exist already, so we can just skip ahead to opening - pass - - # Open our file, the use of os.O_CREAT | os.O_EXCL will ensure that if a - # race condition happens between the os.remove and this line, that an - # error will be raised. Because we utilize a lockfile this should only - # happen if someone is attempting to attack us. - fd = os.open(filename, flags, fmode) - try: - return os.fdopen(fd, "wb") - - except: - # An error occurred wrapping our FD in a file object - os.close(fd) - raise - - -class FileCache(BaseCache): - - def __init__( - self, - directory, - forever=False, - filemode=0o0600, - dirmode=0o0700, - use_dir_lock=None, - lock_class=None, - ): - - if use_dir_lock is not None and lock_class is not None: - raise ValueError("Cannot use use_dir_lock and lock_class together") - - try: - from pip._vendor.lockfile import LockFile - from pip._vendor.lockfile.mkdirlockfile import MkdirLockFile - except ImportError: - notice = dedent( - """ - NOTE: In order to use the FileCache you must have - lockfile installed. You can install it via pip: - pip install lockfile - """ - ) - raise ImportError(notice) - - else: - if use_dir_lock: - lock_class = MkdirLockFile - - elif lock_class is None: - lock_class = LockFile - - self.directory = directory - self.forever = forever - self.filemode = filemode - self.dirmode = dirmode - self.lock_class = lock_class - - @staticmethod - def encode(x): - return hashlib.sha224(x.encode()).hexdigest() - - def _fn(self, name): - # NOTE: This method should not change as some may depend on it. - # See: https://github.com/ionrock/cachecontrol/issues/63 - hashed = self.encode(name) - parts = list(hashed[:5]) + [hashed] - return os.path.join(self.directory, *parts) - - def get(self, key): - name = self._fn(key) - try: - with open(name, "rb") as fh: - return fh.read() - - except FileNotFoundError: - return None - - def set(self, key, value): - name = self._fn(key) - - # Make sure the directory exists - try: - os.makedirs(os.path.dirname(name), self.dirmode) - except (IOError, OSError): - pass - - with self.lock_class(name) as lock: - # Write our actual file - with _secure_open_write(lock.path, self.filemode) as fh: - fh.write(value) - - def delete(self, key): - name = self._fn(key) - if not self.forever: - try: - os.remove(name) - except FileNotFoundError: - pass - - -def url_to_file_path(url, filecache): - """Return the file cache path based on the URL. - - This does not ensure the file exists! - """ - key = CacheController.cache_url(url) - return filecache._fn(key) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/file_cache.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/file_cache.pyc deleted file mode 100644 index 99dc852cabcdc0f744fffd1de5d33406080fff6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4755 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 G{rJE2G&dap diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py deleted file mode 100644 index ed705ce..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py +++ /dev/null @@ -1,33 +0,0 @@ -from __future__ import division - -from datetime import datetime -from pip._vendor.cachecontrol.cache import BaseCache - - -class RedisCache(BaseCache): - - def __init__(self, conn): - self.conn = conn - - def get(self, key): - return self.conn.get(key) - - def set(self, key, value, expires=None): - if not expires: - self.conn.set(key, value) - else: - expires = expires - datetime.utcnow() - self.conn.setex(key, int(expires.total_seconds()), value) - - def delete(self, key): - self.conn.delete(key) - - def clear(self): - """Helper for clearing all the keys in a database. Use with - caution!""" - for key in self.conn.keys(): - self.conn.delete(key) - - def close(self): - """Redis uses connection pooling, no need to close the connection.""" - pass diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.pyc deleted file mode 100644 index 2ae4a062ae460f74ae97e5d3619e6422a9b58e25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2500 zcmd5-?T*t%6uq{yS#||&M5`4@6%4<KsuDw6t%`)8E&Ko^BIIpVH4?InJ=yi*jDu&A z&7!4JwY+g3pqw*K2+%%2tc-K-oe!UT=FFYwpG&*n{{6*^T$WFS|DTnJeF~$%FOW)P z638f!fPN@dD3ee|Ve3ayMKbBgr~|(vx+CL2iY<93axU`cXiJK&9Q3!bT=_4aegMl| z;OgbPv}J8Rieyf^a-!SF4#xbNS^Y4}kF?u`m*}Fj-u-|#<RAsSzrfH!m_Uh-10S%{ zh=>5V-ysR0iF^=|jyJZKU`H1uX<_DEbJZSl?Mn!p1#%{mdQuKNz+nrsgU-A*rq3yk zp4HVjq0vWcU-mCp@w6%DNHLygO+2ovLN_*kvxrZBXkMC=S9kVbo7?-%kNf#gc5%0O z)7-{$IE{acr{(lkX{^ht>Xy6n>@a=KkZ<W+o1$*woFoB;YwD_XY}}Bp)b|Xgr=IgP zElugtl-ybZmf*kX_7Fy{$M_-XK+XefAh&JkbM&b>3gu9{HnIiBM_%dEjY>M9?k=LO zlI6Cnn%~<5fwM^LH=m?@7RosUZoX%q3*|VXny<W#R--y3#%;0txXV6}#7U7q6)U>< z^)+2qyTq%%i}1|lrar+6)Qi&#PhV-Aqu5-Hy-qDRw6J~RO*k;&vGG&pSvAv+%j?Co zY_#1h)+w(q(JTQ=&<*y&-v0>gYjl1lG}f3Ed(>yk9tkUS1)kP=^JHvR+B`UWXe+UC zvzY|XiWl1e#^UBWXXxh9i#>VkYYWd?xIAyc>z@39`gP#*wNEhbv96}NQRBK%d8M<a zG=~ZWLAfKXaO|uqjmlJ!x$Gs1=0N>!wK^%?(XLuPc{Xz>w>O4;;%SMcv^Y5-^iAg0 ztKR2*6-X^{OSBi{q<Gal#q3!V_W+*1HPp;%t5~OXP8QU(t}9UZoiepDS{KUI;I#&6 zBy>G+Fl;r(kN88lQIcEI0@&Aquhm^R?DPCB>%GY)I!*ocnWmGvm{o8S9w=WM{e?BG zjZQen%OJT->npt0sd{SzF0q8tW!bYV>fLZB+KDc1<J}$hnbR`Q@yyK{=82HBHTN1U mT$+RBg*o{6!fc(y*BgFd^YZqad9U5R`;?+(wmnqUUi2Pjrdt#M diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/compat.py b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/compat.py deleted file mode 100644 index 33b5aed..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/compat.py +++ /dev/null @@ -1,29 +0,0 @@ -try: - from urllib.parse import urljoin -except ImportError: - from urlparse import urljoin - - -try: - import cPickle as pickle -except ImportError: - import pickle - - -# Handle the case where the requests module has been patched to not have -# urllib3 bundled as part of its source. -try: - from pip._vendor.requests.packages.urllib3.response import HTTPResponse -except ImportError: - from pip._vendor.urllib3.response import HTTPResponse - -try: - from pip._vendor.requests.packages.urllib3.util import is_fp_closed -except ImportError: - from pip._vendor.urllib3.util import is_fp_closed - -# Replicate some six behaviour -try: - text_type = unicode -except NameError: - text_type = str diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/compat.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/compat.pyc deleted file mode 100644 index d8b2821a619083c796d5507cd5de2ae86a8a5aa1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 849 zcmZ{hQE$^Q5Xa9+yKdP!`cMfT;DHxZO<J;PsB98Kydc2?Q&lPrMM72Pc*WGQJ=-nK z-uNVZEItU2Jis|=D651epM7_~zwdGhe|DpzZ-<{KtXCV)*SIYZfU*xcKu$ma6a-QN z<Vrq;77Jh=fq4OhkTnoCfF$s->{Yq|L<`b3T*)VYHM2&8$+k~cd|f95u>(a1($4)l z-y01AyAAM<t_5NbiU`u^zV1h(LtwuFDqRHZ0MagY_7FQetiI-#r`ZD^_DmkYhk>64 z|BY*a(*V~&voPX|;_|YN9AM<_WHK5vtCh5D6XkY#qo-6T%kn|bt38Wq!LMVT8Oz4# zgWE^*uF%T3H^!jdt*MHr3epj$bHUsWCUkv`tE-NuOD1z=V#971%sPwj(s?#xHm>WO zVW#eDT=oBWOSetAqb=b74=)@S;{b8@XiL*P>WO+{l2es4x94fLa#L68+PlmOR)2Mf zIqS>-57-!M&`q@A%gnK4nVIB9iJTdm+^v%G%v{T_^V8w2JQ<qjLwask7x|qz!8Oy# zB+*<Sb7@^B#IZYlKbwwxsM_nnB{ZX-8CB95B@(I%ow-<-)jxPysC*&VD?d2<3{6P- Uq)Yl?NP2ko+G{`9#3PLV0bWGOOaK4? diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/controller.py b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/controller.py deleted file mode 100644 index 1b2b943..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/controller.py +++ /dev/null @@ -1,367 +0,0 @@ -""" -The httplib2 algorithms ported for use with requests. -""" -import logging -import re -import calendar -import time -from email.utils import parsedate_tz - -from pip._vendor.requests.structures import CaseInsensitiveDict - -from .cache import DictCache -from .serialize import Serializer - - -logger = logging.getLogger(__name__) - -URI = re.compile(r"^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?") - - -def parse_uri(uri): - """Parses a URI using the regex given in Appendix B of RFC 3986. - - (scheme, authority, path, query, fragment) = parse_uri(uri) - """ - groups = URI.match(uri).groups() - return (groups[1], groups[3], groups[4], groups[6], groups[8]) - - -class CacheController(object): - """An interface to see if request should cached or not. - """ - - def __init__( - self, cache=None, cache_etags=True, serializer=None, status_codes=None - ): - self.cache = cache or DictCache() - self.cache_etags = cache_etags - self.serializer = serializer or Serializer() - self.cacheable_status_codes = status_codes or (200, 203, 300, 301) - - @classmethod - def _urlnorm(cls, uri): - """Normalize the URL to create a safe key for the cache""" - (scheme, authority, path, query, fragment) = parse_uri(uri) - if not scheme or not authority: - raise Exception("Only absolute URIs are allowed. uri = %s" % uri) - - scheme = scheme.lower() - authority = authority.lower() - - if not path: - path = "/" - - # Could do syntax based normalization of the URI before - # computing the digest. See Section 6.2.2 of Std 66. - request_uri = query and "?".join([path, query]) or path - defrag_uri = scheme + "://" + authority + request_uri - - return defrag_uri - - @classmethod - def cache_url(cls, uri): - return cls._urlnorm(uri) - - def parse_cache_control(self, headers): - known_directives = { - # https://tools.ietf.org/html/rfc7234#section-5.2 - "max-age": (int, True), - "max-stale": (int, False), - "min-fresh": (int, True), - "no-cache": (None, False), - "no-store": (None, False), - "no-transform": (None, False), - "only-if-cached": (None, False), - "must-revalidate": (None, False), - "public": (None, False), - "private": (None, False), - "proxy-revalidate": (None, False), - "s-maxage": (int, True), - } - - cc_headers = headers.get("cache-control", headers.get("Cache-Control", "")) - - retval = {} - - for cc_directive in cc_headers.split(","): - if not cc_directive.strip(): - continue - - parts = cc_directive.split("=", 1) - directive = parts[0].strip() - - try: - typ, required = known_directives[directive] - except KeyError: - logger.debug("Ignoring unknown cache-control directive: %s", directive) - continue - - if not typ or not required: - retval[directive] = None - if typ: - try: - retval[directive] = typ(parts[1].strip()) - except IndexError: - if required: - logger.debug( - "Missing value for cache-control " "directive: %s", - directive, - ) - except ValueError: - logger.debug( - "Invalid value for cache-control directive " "%s, must be %s", - directive, - typ.__name__, - ) - - return retval - - def cached_request(self, request): - """ - Return a cached response if it exists in the cache, otherwise - return False. - """ - cache_url = self.cache_url(request.url) - logger.debug('Looking up "%s" in the cache', cache_url) - cc = self.parse_cache_control(request.headers) - - # Bail out if the request insists on fresh data - if "no-cache" in cc: - logger.debug('Request header has "no-cache", cache bypassed') - return False - - if "max-age" in cc and cc["max-age"] == 0: - logger.debug('Request header has "max_age" as 0, cache bypassed') - return False - - # Request allows serving from the cache, let's see if we find something - cache_data = self.cache.get(cache_url) - if cache_data is None: - logger.debug("No cache entry available") - return False - - # Check whether it can be deserialized - resp = self.serializer.loads(request, cache_data) - if not resp: - logger.warning("Cache entry deserialization failed, entry ignored") - return False - - # If we have a cached 301, return it immediately. We don't - # need to test our response for other headers b/c it is - # intrinsically "cacheable" as it is Permanent. - # See: - # https://tools.ietf.org/html/rfc7231#section-6.4.2 - # - # Client can try to refresh the value by repeating the request - # with cache busting headers as usual (ie no-cache). - if resp.status == 301: - msg = ( - 'Returning cached "301 Moved Permanently" response ' - "(ignoring date and etag information)" - ) - logger.debug(msg) - return resp - - headers = CaseInsensitiveDict(resp.headers) - if not headers or "date" not in headers: - if "etag" not in headers: - # Without date or etag, the cached response can never be used - # and should be deleted. - logger.debug("Purging cached response: no date or etag") - self.cache.delete(cache_url) - logger.debug("Ignoring cached response: no date") - return False - - now = time.time() - date = calendar.timegm(parsedate_tz(headers["date"])) - current_age = max(0, now - date) - logger.debug("Current age based on date: %i", current_age) - - # TODO: There is an assumption that the result will be a - # urllib3 response object. This may not be best since we - # could probably avoid instantiating or constructing the - # response until we know we need it. - resp_cc = self.parse_cache_control(headers) - - # determine freshness - freshness_lifetime = 0 - - # Check the max-age pragma in the cache control header - if "max-age" in resp_cc: - freshness_lifetime = resp_cc["max-age"] - logger.debug("Freshness lifetime from max-age: %i", freshness_lifetime) - - # If there isn't a max-age, check for an expires header - elif "expires" in headers: - expires = parsedate_tz(headers["expires"]) - if expires is not None: - expire_time = calendar.timegm(expires) - date - freshness_lifetime = max(0, expire_time) - logger.debug("Freshness lifetime from expires: %i", freshness_lifetime) - - # Determine if we are setting freshness limit in the - # request. Note, this overrides what was in the response. - if "max-age" in cc: - freshness_lifetime = cc["max-age"] - logger.debug( - "Freshness lifetime from request max-age: %i", freshness_lifetime - ) - - if "min-fresh" in cc: - min_fresh = cc["min-fresh"] - # adjust our current age by our min fresh - current_age += min_fresh - logger.debug("Adjusted current age from min-fresh: %i", current_age) - - # Return entry if it is fresh enough - if freshness_lifetime > current_age: - logger.debug('The response is "fresh", returning cached response') - logger.debug("%i > %i", freshness_lifetime, current_age) - return resp - - # we're not fresh. If we don't have an Etag, clear it out - if "etag" not in headers: - logger.debug('The cached response is "stale" with no etag, purging') - self.cache.delete(cache_url) - - # return the original handler - return False - - def conditional_headers(self, request): - cache_url = self.cache_url(request.url) - resp = self.serializer.loads(request, self.cache.get(cache_url)) - new_headers = {} - - if resp: - headers = CaseInsensitiveDict(resp.headers) - - if "etag" in headers: - new_headers["If-None-Match"] = headers["ETag"] - - if "last-modified" in headers: - new_headers["If-Modified-Since"] = headers["Last-Modified"] - - return new_headers - - def cache_response(self, request, response, body=None, status_codes=None): - """ - Algorithm for caching requests. - - This assumes a requests Response object. - """ - # From httplib2: Don't cache 206's since we aren't going to - # handle byte range requests - cacheable_status_codes = status_codes or self.cacheable_status_codes - if response.status not in cacheable_status_codes: - logger.debug( - "Status code %s not in %s", response.status, cacheable_status_codes - ) - return - - response_headers = CaseInsensitiveDict(response.headers) - - # If we've been given a body, our response has a Content-Length, that - # Content-Length is valid then we can check to see if the body we've - # been given matches the expected size, and if it doesn't we'll just - # skip trying to cache it. - if ( - body is not None - and "content-length" in response_headers - and response_headers["content-length"].isdigit() - and int(response_headers["content-length"]) != len(body) - ): - return - - cc_req = self.parse_cache_control(request.headers) - cc = self.parse_cache_control(response_headers) - - cache_url = self.cache_url(request.url) - logger.debug('Updating cache with response from "%s"', cache_url) - - # Delete it from the cache if we happen to have it stored there - no_store = False - if "no-store" in cc: - no_store = True - logger.debug('Response header has "no-store"') - if "no-store" in cc_req: - no_store = True - logger.debug('Request header has "no-store"') - if no_store and self.cache.get(cache_url): - logger.debug('Purging existing cache entry to honor "no-store"') - self.cache.delete(cache_url) - if no_store: - return - - # If we've been given an etag, then keep the response - if self.cache_etags and "etag" in response_headers: - logger.debug("Caching due to etag") - self.cache.set( - cache_url, self.serializer.dumps(request, response, body=body) - ) - - # Add to the cache any 301s. We do this before looking that - # the Date headers. - elif response.status == 301: - logger.debug("Caching permanant redirect") - self.cache.set(cache_url, self.serializer.dumps(request, response)) - - # Add to the cache if the response headers demand it. If there - # is no date header then we can't do anything about expiring - # the cache. - elif "date" in response_headers: - # cache when there is a max-age > 0 - if "max-age" in cc and cc["max-age"] > 0: - logger.debug("Caching b/c date exists and max-age > 0") - self.cache.set( - cache_url, self.serializer.dumps(request, response, body=body) - ) - - # If the request can expire, it means we should cache it - # in the meantime. - elif "expires" in response_headers: - if response_headers["expires"]: - logger.debug("Caching b/c of expires header") - self.cache.set( - cache_url, self.serializer.dumps(request, response, body=body) - ) - - def update_cached_response(self, request, response): - """On a 304 we will get a new set of headers that we want to - update our cached value with, assuming we have one. - - This should only ever be called when we've sent an ETag and - gotten a 304 as the response. - """ - cache_url = self.cache_url(request.url) - - cached_response = self.serializer.loads(request, self.cache.get(cache_url)) - - if not cached_response: - # we didn't have a cached response - return response - - # Lets update our headers with the headers from the new request: - # http://tools.ietf.org/html/draft-ietf-httpbis-p4-conditional-26#section-4.1 - # - # The server isn't supposed to send headers that would make - # the cached body invalid. But... just in case, we'll be sure - # to strip out ones we know that might be problmatic due to - # typical assumptions. - excluded_headers = ["content-length"] - - cached_response.headers.update( - dict( - (k, v) - for k, v in response.headers.items() - if k.lower() not in excluded_headers - ) - ) - - # we want a 200 b/c we have content via the cache - cached_response.status = 200 - - # update our cache - self.cache.set(cache_url, self.serializer.dumps(request, cached_response)) - - return cached_response diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/controller.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/controller.pyc deleted file mode 100644 index f448c395b11dcb3ded12b26fd4c91d20d23e7eed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10121 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 U5^3D*zgZXmVD1`jqg1W_KfcK?o&W#< diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/filewrapper.py b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/filewrapper.py deleted file mode 100644 index 30ed4c5..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/filewrapper.py +++ /dev/null @@ -1,80 +0,0 @@ -from io import BytesIO - - -class CallbackFileWrapper(object): - """ - Small wrapper around a fp object which will tee everything read into a - buffer, and when that file is closed it will execute a callback with the - contents of that buffer. - - All attributes are proxied to the underlying file object. - - This class uses members with a double underscore (__) leading prefix so as - not to accidentally shadow an attribute. - """ - - def __init__(self, fp, callback): - self.__buf = BytesIO() - self.__fp = fp - self.__callback = callback - - def __getattr__(self, name): - # The vaguaries of garbage collection means that self.__fp is - # not always set. By using __getattribute__ and the private - # name[0] allows looking up the attribute value and raising an - # AttributeError when it doesn't exist. This stop thigns from - # infinitely recursing calls to getattr in the case where - # self.__fp hasn't been set. - # - # [0] https://docs.python.org/2/reference/expressions.html#atom-identifiers - fp = self.__getattribute__("_CallbackFileWrapper__fp") - return getattr(fp, name) - - def __is_fp_closed(self): - try: - return self.__fp.fp is None - - except AttributeError: - pass - - try: - return self.__fp.closed - - except AttributeError: - pass - - # We just don't cache it then. - # TODO: Add some logging here... - return False - - def _close(self): - if self.__callback: - self.__callback(self.__buf.getvalue()) - - # We assign this to None here, because otherwise we can get into - # really tricky problems where the CPython interpreter dead locks - # because the callback is holding a reference to something which - # has a __del__ method. Setting this to None breaks the cycle - # and allows the garbage collector to do it's thing normally. - self.__callback = None - - def read(self, amt=None): - data = self.__fp.read(amt) - self.__buf.write(data) - if self.__is_fp_closed(): - self._close() - - return data - - def _safe_read(self, amt): - data = self.__fp._safe_read(amt) - if amt == 2 and data == b"\r\n": - # urllib executes this read to toss the CRLF at the end - # of the chunk. - return data - - self.__buf.write(data) - if self.__is_fp_closed(): - self._close() - - return data diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/filewrapper.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/filewrapper.pyc deleted file mode 100644 index b4bb91ec759892f77dce78b3221bc9674a131694..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3043 zcmd5;-)|d55T3oWlh{o{S^~5ZLQ7sS6^&a!5s06qYEd6B=u#;VgjVajz4(&z-Lbp2 z<0?F$^gregfSEb_l8WTHIeFJ}d%H8=d^5AV;XfPQ`+sl#5yRpM@&9{l?ml)2{siOz zV*!T(L=u1rAQg~=@Cx7@;J3pNk{0au+BiM?7oVO$$**Gf!`vJ9{Ad3*%1?Bj4|RO< zEX&P-)m3F|V=|z**xZlU86Zn&_%I;bXoV~UEVLGO58GsuKCM8q3P~GYA-*+8R(P-j z(SC1@6iyLKSK_ljM*DJB8<yIZlOmB?rj;y*$0qi2Hp=3WoMkx68zars*ts8N#gVi| zCo(I1DK)DaPSVuaPozc-vymyJA89XB^h;(=#(C)s&PR=;%bc2c;tiUL7X;wAAK@Cq z%Hp!{rtnUdX|1Q$zT4%mk5Pm6-eyD8;Sjcwl`T&*G=OkWheS7w&F6%Z5!Bu+mcJM= zAnlx-I9xwA<Ds#xMxbR<PKF4YRk*lB<vpc7mO1)M`YLPE>{L4R+cBD=^ki1Yah4!v z^k**JNGIhCxwyc&TRRpa|I{eBPbd~U*m=&GGXN#v41XvDaE3n=Fv@^=MA<XwwXlz{ zfxm~Hx*~g&LaO}TYrm$I|KQq>%V6{fp(kU`<f$jDxQ<e%nSnC&sB<&y`jyS5+ME7V z+kRT+$iC~pJnhdvv%_L`@@VhR;^ChCd@ugOoqn0Tv=8w)s`@YbRaQO73P-Fx@Q;2v zQoqm;H#IdyQrdp3<B_3+uw~w-XfD!qx0*8~rLrRPN^KFC6@nzzMMuPhddW63{XPyL zqsLsl=K}r;z$4j6vw-seIi?kZh}N*^NuyFn#y82P6j$(Kh-r$b!kMc=k4;1Xn3p$C z&aKPvm3jwX9mNznZ;6=li5j72b_OWSw-*E*^Hy`R2KxuaZD{!rPP$+}0wF{p;Me)) zavpARmuEa*&hYIfXNeIemAPT224!LVCXPQ|R`FA7OY3QBy;I<NfM+^)hBKc@z9F;{ zZp=BS(n{4}Kg1Dt2Rjg<*bX*CD+t9V{kIyPDYuyCJ_>af+MR_!uL6z(Iyf*dMZqTw zjw%*jD}LSqNEzooCgN1*6BBLV$c<x)!dX-FDN2jl?1+1-O>H);e1{WiR*(s*M=nnq z3E()SA|+zzy+th9uXuKwWTFedFIj5RjWdl-sfg*KgqqpR8^1%auG~5=2Q{MO`BH_4 z_^QXAwI<r@n~{ytHp2P_o9ki+;*QwD-ESlKKf}M{=PMY-LKkonfZZh$@j}ta``5F7 za0UCs&mbeJ9d#Ss-bEw`n{qles)<KL+fno`b*~d0y+>nofZY&=>7;#%%~9bK!*|10 zP_sPfk!Oojh_-(`AJ|tlE|W=4uXN#4Dk)>7qBWGGb?O?wxo|m%5!tzLnWZ;*wnlV1 z@D+gkUg@p`opxuvbGvhEeXYKT@Vy`_>-z`=yS`=d!W-lWhv(}$Am5TxoS$3af1#b} AlmGw# diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/heuristics.py b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/heuristics.py deleted file mode 100644 index 6c0e979..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/heuristics.py +++ /dev/null @@ -1,135 +0,0 @@ -import calendar -import time - -from email.utils import formatdate, parsedate, parsedate_tz - -from datetime import datetime, timedelta - -TIME_FMT = "%a, %d %b %Y %H:%M:%S GMT" - - -def expire_after(delta, date=None): - date = date or datetime.utcnow() - return date + delta - - -def datetime_to_header(dt): - return formatdate(calendar.timegm(dt.timetuple())) - - -class BaseHeuristic(object): - - def warning(self, response): - """ - Return a valid 1xx warning header value describing the cache - adjustments. - - The response is provided too allow warnings like 113 - http://tools.ietf.org/html/rfc7234#section-5.5.4 where we need - to explicitly say response is over 24 hours old. - """ - return '110 - "Response is Stale"' - - def update_headers(self, response): - """Update the response headers with any new headers. - - NOTE: This SHOULD always include some Warning header to - signify that the response was cached by the client, not - by way of the provided headers. - """ - return {} - - def apply(self, response): - updated_headers = self.update_headers(response) - - if updated_headers: - response.headers.update(updated_headers) - warning_header_value = self.warning(response) - if warning_header_value is not None: - response.headers.update({"Warning": warning_header_value}) - - return response - - -class OneDayCache(BaseHeuristic): - """ - Cache the response by providing an expires 1 day in the - future. - """ - - def update_headers(self, response): - headers = {} - - if "expires" not in response.headers: - date = parsedate(response.headers["date"]) - expires = expire_after(timedelta(days=1), date=datetime(*date[:6])) - headers["expires"] = datetime_to_header(expires) - headers["cache-control"] = "public" - return headers - - -class ExpiresAfter(BaseHeuristic): - """ - Cache **all** requests for a defined time period. - """ - - def __init__(self, **kw): - self.delta = timedelta(**kw) - - def update_headers(self, response): - expires = expire_after(self.delta) - return {"expires": datetime_to_header(expires), "cache-control": "public"} - - def warning(self, response): - tmpl = "110 - Automatically cached for %s. Response might be stale" - return tmpl % self.delta - - -class LastModified(BaseHeuristic): - """ - If there is no Expires header already, fall back on Last-Modified - using the heuristic from - http://tools.ietf.org/html/rfc7234#section-4.2.2 - to calculate a reasonable value. - - Firefox also does something like this per - https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching_FAQ - http://lxr.mozilla.org/mozilla-release/source/netwerk/protocol/http/nsHttpResponseHead.cpp#397 - Unlike mozilla we limit this to 24-hr. - """ - cacheable_by_default_statuses = { - 200, 203, 204, 206, 300, 301, 404, 405, 410, 414, 501 - } - - def update_headers(self, resp): - headers = resp.headers - - if "expires" in headers: - return {} - - if "cache-control" in headers and headers["cache-control"] != "public": - return {} - - if resp.status not in self.cacheable_by_default_statuses: - return {} - - if "date" not in headers or "last-modified" not in headers: - return {} - - date = calendar.timegm(parsedate_tz(headers["date"])) - last_modified = parsedate(headers["last-modified"]) - if date is None or last_modified is None: - return {} - - now = time.time() - current_age = max(0, now - date) - delta = date - calendar.timegm(last_modified) - freshness_lifetime = max(0, min(delta / 10, 24 * 3600)) - if freshness_lifetime <= current_age: - return {} - - expires = date + freshness_lifetime - return {"expires": time.strftime(TIME_FMT, time.gmtime(expires))} - - def warning(self, resp): - return None diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/heuristics.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/heuristics.pyc deleted file mode 100644 index fb4b21d8b802c7d56aac6b6ca24912108863c98a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6673 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 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/serialize.py b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/serialize.py deleted file mode 100644 index ec43ff2..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/serialize.py +++ /dev/null @@ -1,186 +0,0 @@ -import base64 -import io -import json -import zlib - -from pip._vendor import msgpack -from pip._vendor.requests.structures import CaseInsensitiveDict - -from .compat import HTTPResponse, pickle, text_type - - -def _b64_decode_bytes(b): - return base64.b64decode(b.encode("ascii")) - - -def _b64_decode_str(s): - return _b64_decode_bytes(s).decode("utf8") - - -class Serializer(object): - - def dumps(self, request, response, body=None): - response_headers = CaseInsensitiveDict(response.headers) - - if body is None: - body = response.read(decode_content=False) - - # NOTE: 99% sure this is dead code. I'm only leaving it - # here b/c I don't have a test yet to prove - # it. Basically, before using - # `cachecontrol.filewrapper.CallbackFileWrapper`, - # this made an effort to reset the file handle. The - # `CallbackFileWrapper` short circuits this code by - # setting the body as the content is consumed, the - # result being a `body` argument is *always* passed - # into cache_response, and in turn, - # `Serializer.dump`. - response._fp = io.BytesIO(body) - - # NOTE: This is all a bit weird, but it's really important that on - # Python 2.x these objects are unicode and not str, even when - # they contain only ascii. The problem here is that msgpack - # understands the difference between unicode and bytes and we - # have it set to differentiate between them, however Python 2 - # doesn't know the difference. Forcing these to unicode will be - # enough to have msgpack know the difference. - data = { - u"response": { - u"body": body, - u"headers": dict( - (text_type(k), text_type(v)) for k, v in response.headers.items() - ), - u"status": response.status, - u"version": response.version, - u"reason": text_type(response.reason), - u"strict": response.strict, - u"decode_content": response.decode_content, - } - } - - # Construct our vary headers - data[u"vary"] = {} - if u"vary" in response_headers: - varied_headers = response_headers[u"vary"].split(",") - for header in varied_headers: - header = text_type(header).strip() - header_value = request.headers.get(header, None) - if header_value is not None: - header_value = text_type(header_value) - data[u"vary"][header] = header_value - - return b",".join([b"cc=4", msgpack.dumps(data, use_bin_type=True)]) - - def loads(self, request, data): - # Short circuit if we've been given an empty set of data - if not data: - return - - # Determine what version of the serializer the data was serialized - # with - try: - ver, data = data.split(b",", 1) - except ValueError: - ver = b"cc=0" - - # Make sure that our "ver" is actually a version and isn't a false - # positive from a , being in the data stream. - if ver[:3] != b"cc=": - data = ver + data - ver = b"cc=0" - - # Get the version number out of the cc=N - ver = ver.split(b"=", 1)[-1].decode("ascii") - - # Dispatch to the actual load method for the given version - try: - return getattr(self, "_loads_v{}".format(ver))(request, data) - - except AttributeError: - # This is a version we don't have a loads function for, so we'll - # just treat it as a miss and return None - return - - def prepare_response(self, request, cached): - """Verify our vary headers match and construct a real urllib3 - HTTPResponse object. - """ - # Special case the '*' Vary value as it means we cannot actually - # determine if the cached response is suitable for this request. - if "*" in cached.get("vary", {}): - return - - # Ensure that the Vary headers for the cached response match our - # request - for header, value in cached.get("vary", {}).items(): - if request.headers.get(header, None) != value: - return - - body_raw = cached["response"].pop("body") - - headers = CaseInsensitiveDict(data=cached["response"]["headers"]) - if headers.get("transfer-encoding", "") == "chunked": - headers.pop("transfer-encoding") - - cached["response"]["headers"] = headers - - try: - body = io.BytesIO(body_raw) - except TypeError: - # This can happen if cachecontrol serialized to v1 format (pickle) - # using Python 2. A Python 2 str(byte string) will be unpickled as - # a Python 3 str (unicode string), which will cause the above to - # fail with: - # - # TypeError: 'str' does not support the buffer interface - body = io.BytesIO(body_raw.encode("utf8")) - - return HTTPResponse(body=body, preload_content=False, **cached["response"]) - - def _loads_v0(self, request, data): - # The original legacy cache data. This doesn't contain enough - # information to construct everything we need, so we'll treat this as - # a miss. - return - - def _loads_v1(self, request, data): - try: - cached = pickle.loads(data) - except ValueError: - return - - return self.prepare_response(request, cached) - - def _loads_v2(self, request, data): - try: - cached = json.loads(zlib.decompress(data).decode("utf8")) - except (ValueError, zlib.error): - return - - # We need to decode the items that we've base64 encoded - cached["response"]["body"] = _b64_decode_bytes(cached["response"]["body"]) - cached["response"]["headers"] = dict( - (_b64_decode_str(k), _b64_decode_str(v)) - for k, v in cached["response"]["headers"].items() - ) - cached["response"]["reason"] = _b64_decode_str(cached["response"]["reason"]) - cached["vary"] = dict( - (_b64_decode_str(k), _b64_decode_str(v) if v is not None else v) - for k, v in cached["vary"].items() - ) - - return self.prepare_response(request, cached) - - def _loads_v3(self, request, data): - # Due to Python 2 encoding issues, it's impossible to know for sure - # exactly how to load v3 entries, thus we'll treat these as a miss so - # that they get rewritten out as v4 entries. - return - - def _loads_v4(self, request, data): - try: - cached = msgpack.loads(data, encoding="utf-8") - except ValueError: - return - - return self.prepare_response(request, cached) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/serialize.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/serialize.pyc deleted file mode 100644 index e60a6f11a860376cd043ddee28b79878511c35b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6411 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 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/wrapper.py b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/wrapper.py deleted file mode 100644 index 265bfc8..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/wrapper.py +++ /dev/null @@ -1,29 +0,0 @@ -from .adapter import CacheControlAdapter -from .cache import DictCache - - -def CacheControl( - sess, - cache=None, - cache_etags=True, - serializer=None, - heuristic=None, - controller_class=None, - adapter_class=None, - cacheable_methods=None, -): - - cache = cache or DictCache() - adapter_class = adapter_class or CacheControlAdapter - adapter = adapter_class( - cache, - cache_etags=cache_etags, - serializer=serializer, - heuristic=heuristic, - controller_class=controller_class, - cacheable_methods=cacheable_methods, - ) - sess.mount("http://", adapter) - sess.mount("https://", adapter) - - return sess diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/wrapper.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/wrapper.pyc deleted file mode 100644 index e5ae62dc2eb7db09fb931153cd20c7011c33e6b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 906 zcmc&yUvJYe5I-kN+ie{b@v@H)Aq{T=Re%rz#w!)d_EZT)USisSlNkHjZB_b!$~Wc< zaOZX~J^``)%l)zMes^~K>*(Ogj|ZO%*nI=~zoq5h6O=Rs7=T*9RDfVT0uw<U!!#y+ z4|D>A|I8SE_F>v%<3*ZKm`V_&4EUJfTorSD-Zto3^R84Dwc9%P$@!rwFl;E830sDI zgqE)eIstYF2(STI3+Q@aj{ya&dn}We_;wMq>|!Wm=mNKnNG8zrVIz|D06KuLw1@T& zU=xAZ>HT~9Mat<Xct}_<-&~`bc|2eu+EvO_EA5c^&Go`n9*OseH*f1Q+U12&-s7XY z2<pn{yw*5xOYi%95YfJp(sL%3Jt=8SO2)0qXaREj>UPm!%BgUVz-x-i_P{HPNXo(~ zc4q9rBLcPU?3P8=V>2h+nNt!WfcGRx>#C(fEtks4FRdxH^Kx|~Z=boV=K9;&_<M6Y zcF)Jf3xD&nT)9*FW>#KGTiKJU@u-YB!LyIE{1cnP%9pw+TPFj}U0dX}Q`Tzt)ZSva z*LzQanfqhrb@)&WMJ#%M#(p#sqiB+H0U2LOXimm03B3w^nY4`#!lhg2jHCZ8^8Z#k ZATF=#wp<wfhOgH1L!pY2n5w)RzX4-V$iM&q diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/certifi/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/certifi/__init__.py deleted file mode 100644 index 632db8e..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/certifi/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from .core import where - -__version__ = "2019.03.09" diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/certifi/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/certifi/__init__.pyc deleted file mode 100644 index c5ffda5c5ee4db273359c2b420df0e0b255a57b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 287 zcmYL_T}s3-5P&DGf~+V$dx9ctle$tYh<E{IQJ)qh)F!(Ivq_x9?$4WN_5w~saG3e# z7lxVg`($$Qb^0>EpA_Wp$l^IckutCVYX%DjOck&wK$Y-R9Z=gaLY0vY37a>KI!-9M z6iru)SuMJUs?6;?J$TfQ<RKjsq#QLy<DHaMF8(8WN_jvt_DS=xN51q{(J<d{`EG`< zZu8!>A5OG*)ehHj+o?SYl2zc(JeV*wE~ehvX=?6Qa-K`SMjM^-$OnzdEDe{^IFqET W!!8}s&YQJYpH|=IgJS-}S@8o(d_ma& diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/certifi/__main__.py b/venv/lib/python2.7/site-packages/pip/_vendor/certifi/__main__.py deleted file mode 100644 index ae2aff5..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/certifi/__main__.py +++ /dev/null @@ -1,2 +0,0 @@ -from pip._vendor.certifi import where -print(where()) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/certifi/__main__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/certifi/__main__.pyc deleted file mode 100644 index 2e3c9ff971084c2df15f64c61ddd32d77ca4bc0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 273 zcmY*UO-lno49&C%MW_f~`vVrCo0gVEp@_G7QKaojkYU}K*1_4?F*9yIZsJe&2WYnJ zrH|z0gOHbWfBWax-xse1wCHfWXAc7=#U{W4lmcD^2rb|TVE&*wuuQr<VE!11;4Gdo zZQnKNr=-~tub8~?sjRhA6{UryXx3)IZAeZjR9vGcQ|D1*ofEDrt26~X>~KG!H@E#5 zXP<7A(KIV=!tPcbXvElfTp^1LjSDfib{NNx8~NO{j^1ixtBq2Yxp7jaejj_RIV&sm NW%XV2KxnSM6#q-$MCAYg diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/certifi/cacert.pem b/venv/lib/python2.7/site-packages/pip/_vendor/certifi/cacert.pem deleted file mode 100644 index 84636dd..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/certifi/cacert.pem +++ /dev/null @@ -1,4658 +0,0 @@ - -# Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA -# Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA -# Label: "GlobalSign Root CA" -# Serial: 4835703278459707669005204 -# MD5 Fingerprint: 3e:45:52:15:09:51:92:e1:b7:5d:37:9f:b1:87:29:8a -# SHA1 Fingerprint: b1:bc:96:8b:d4:f4:9d:62:2a:a8:9a:81:f2:15:01:52:a4:1d:82:9c -# SHA256 Fingerprint: eb:d4:10:40:e4:bb:3e:c7:42:c9:e3:81:d3:1e:f2:a4:1a:48:b6:68:5c:96:e7:ce:f3:c1:df:6c:d4:33:1c:99 ------BEGIN CERTIFICATE----- -MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG -A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv -b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw -MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i -YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT -aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ -jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp -xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp -1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG -snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ -U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 -9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E -BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B -AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz -yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE -38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP -AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad -DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME -HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 -# Label: "GlobalSign Root CA - R2" -# Serial: 4835703278459682885658125 -# MD5 Fingerprint: 94:14:77:7e:3e:5e:fd:8f:30:bd:41:b0:cf:e7:d0:30 -# SHA1 Fingerprint: 75:e0:ab:b6:13:85:12:27:1c:04:f8:5f:dd:de:38:e4:b7:24:2e:fe -# SHA256 Fingerprint: ca:42:dd:41:74:5f:d0:b8:1e:b9:02:36:2c:f9:d8:bf:71:9d:a1:bd:1b:1e:fc:94:6f:5b:4c:99:f4:2c:1b:9e ------BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G -A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp -Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 -MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG -A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL -v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 -eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq -tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd -C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa -zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB -mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH -V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n -bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG -3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs -J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO -291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS -ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd -AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 -TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== ------END CERTIFICATE----- - -# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only -# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only -# Label: "Verisign Class 3 Public Primary Certification Authority - G3" -# Serial: 206684696279472310254277870180966723415 -# MD5 Fingerprint: cd:68:b6:a7:c7:c4:ce:75:e0:1d:4f:57:44:61:92:09 -# SHA1 Fingerprint: 13:2d:0d:45:53:4b:69:97:cd:b2:d5:c3:39:e2:55:76:60:9b:5c:c6 -# SHA256 Fingerprint: eb:04:cf:5e:b1:f3:9a:fa:76:2f:2b:b1:20:f2:96:cb:a5:20:c1:b9:7d:b1:58:95:65:b8:1c:b9:a1:7b:72:44 ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl -cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu -LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT -aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD -VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT -aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ -bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu -IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg -LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b -N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t -KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu -kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm -CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ -Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu -imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te -2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe -DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC -/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p -F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt -TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== ------END CERTIFICATE----- - -# Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited -# Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited -# Label: "Entrust.net Premium 2048 Secure Server CA" -# Serial: 946069240 -# MD5 Fingerprint: ee:29:31:bc:32:7e:9a:e6:e8:b5:f7:51:b4:34:71:90 -# SHA1 Fingerprint: 50:30:06:09:1d:97:d4:f5:ae:39:f7:cb:e7:92:7d:7d:65:2d:34:31 -# SHA256 Fingerprint: 6d:c4:71:72:e0:1c:bc:b0:bf:62:58:0d:89:5f:e2:b8:ac:9a:d4:f8:73:80:1e:0c:10:b9:c8:37:d2:1e:b1:77 ------BEGIN CERTIFICATE----- -MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML -RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp -bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 -IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3 -MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 -LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp -YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG -A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq -K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe -sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX -MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT -XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ -HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH -4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV -HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub -j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo -U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf -zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b -u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+ -bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er -fF6adulZkMV8gzURZVE= ------END CERTIFICATE----- - -# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust -# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust -# Label: "Baltimore CyberTrust Root" -# Serial: 33554617 -# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4 -# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74 -# SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ -RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD -VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX -DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y -ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy -VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr -mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr -IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK -mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu -XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy -dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye -jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 -BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 -DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 -9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx -jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 -Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz -ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS -R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp ------END CERTIFICATE----- - -# Issuer: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network -# Subject: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network -# Label: "AddTrust External Root" -# Serial: 1 -# MD5 Fingerprint: 1d:35:54:04:85:78:b0:3f:42:42:4d:bf:20:73:0a:3f -# SHA1 Fingerprint: 02:fa:f3:e2:91:43:54:68:60:78:57:69:4d:f5:e4:5b:68:85:18:68 -# SHA256 Fingerprint: 68:7f:a4:51:38:22:78:ff:f0:c8:b1:1f:8d:43:d5:76:67:1c:6e:b2:bc:ea:b4:13:fb:83:d9:65:d0:6d:2f:f2 ------BEGIN CERTIFICATE----- -MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU -MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs -IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 -MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux -FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h -bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v -dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt -H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 -uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX -mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX -a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN -E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 -WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD -VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 -Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU -cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx -IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN -AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH -YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 -6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC -Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX -c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a -mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= ------END CERTIFICATE----- - -# Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. -# Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. -# Label: "Entrust Root Certification Authority" -# Serial: 1164660820 -# MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4 -# SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9 -# SHA256 Fingerprint: 73:c1:76:43:4f:1b:c6:d5:ad:f4:5b:0e:76:e7:27:28:7c:8d:e5:76:16:c1:e6:e6:14:1a:2b:2c:bc:7d:8e:4c ------BEGIN CERTIFICATE----- -MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC -VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 -Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW -KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl -cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw -NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw -NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy -ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV -BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ -KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo -Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 -4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 -KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI -rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi -94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB -sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi -gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo -kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE -vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA -A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t -O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua -AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP -9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ -eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m -0vdXcDazv/wor3ElhVsT/h5/WrQ8 ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Global CA O=GeoTrust Inc. -# Subject: CN=GeoTrust Global CA O=GeoTrust Inc. -# Label: "GeoTrust Global CA" -# Serial: 144470 -# MD5 Fingerprint: f7:75:ab:29:fb:51:4e:b7:77:5e:ff:05:3c:99:8e:f5 -# SHA1 Fingerprint: de:28:f4:a4:ff:e5:b9:2f:a3:c5:03:d1:a3:49:a7:f9:96:2a:82:12 -# SHA256 Fingerprint: ff:85:6a:2d:25:1d:cd:88:d3:66:56:f4:50:12:67:98:cf:ab:aa:de:40:79:9c:72:2d:e4:d2:b5:db:36:a7:3a ------BEGIN CERTIFICATE----- -MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT -MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i -YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG -EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg -R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 -9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq -fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv -iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU -1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ -bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW -MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA -ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l -uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn -Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS -tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF -PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un -hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV -5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Universal CA O=GeoTrust Inc. -# Subject: CN=GeoTrust Universal CA O=GeoTrust Inc. -# Label: "GeoTrust Universal CA" -# Serial: 1 -# MD5 Fingerprint: 92:65:58:8b:a2:1a:31:72:73:68:5c:b4:a5:7a:07:48 -# SHA1 Fingerprint: e6:21:f3:35:43:79:05:9a:4b:68:30:9d:8a:2f:74:22:15:87:ec:79 -# SHA256 Fingerprint: a0:45:9b:9f:63:b2:25:59:f5:fa:5d:4c:6d:b3:f9:f7:2f:f1:93:42:03:35:78:f0:73:bf:1d:1b:46:cb:b9:12 ------BEGIN CERTIFICATE----- -MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW -MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy -c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE -BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0 -IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV -VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8 -cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT -QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh -F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v -c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w -mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd -VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX -teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ -f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe -Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+ -nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB -/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY -MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG -9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc -aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX -IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn -ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z -uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN -Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja -QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW -koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9 -ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt -DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm -bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw= ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. -# Subject: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. -# Label: "GeoTrust Universal CA 2" -# Serial: 1 -# MD5 Fingerprint: 34:fc:b8:d0:36:db:9e:14:b3:c2:f2:db:8f:e4:94:c7 -# SHA1 Fingerprint: 37:9a:19:7b:41:85:45:35:0c:a6:03:69:f3:3c:2e:af:47:4f:20:79 -# SHA256 Fingerprint: a0:23:4f:3b:c8:52:7c:a5:62:8e:ec:81:ad:5d:69:89:5d:a5:68:0d:c9:1d:1c:b8:47:7f:33:f8:78:b9:5b:0b ------BEGIN CERTIFICATE----- -MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW -MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy -c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD -VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1 -c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC -AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81 -WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG -FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq -XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL -se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb -KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd -IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73 -y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt -hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc -QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4 -Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV -HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ -KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z -dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ -L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr -Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo -ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY -T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz -GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m -1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV -OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH -6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX -QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS ------END CERTIFICATE----- - -# Issuer: CN=AAA Certificate Services O=Comodo CA Limited -# Subject: CN=AAA Certificate Services O=Comodo CA Limited -# Label: "Comodo AAA Services root" -# Serial: 1 -# MD5 Fingerprint: 49:79:04:b0:eb:87:19:ac:47:b0:bc:11:51:9b:74:d0 -# SHA1 Fingerprint: d1:eb:23:a4:6d:17:d6:8f:d9:25:64:c2:f1:f1:60:17:64:d8:e3:49 -# SHA256 Fingerprint: d7:a7:a0:fb:5d:7e:27:31:d7:71:e9:48:4e:bc:de:f7:1d:5f:0c:3e:0a:29:48:78:2b:c8:3e:e0:ea:69:9e:f4 ------BEGIN CERTIFICATE----- -MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb -MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow -GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj -YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL -MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE -BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM -GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua -BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe -3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 -YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR -rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm -ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU -oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF -MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v -QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t -b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF -AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q -GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz -Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 -G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi -l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 -smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority -# Subject: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority -# Label: "QuoVadis Root CA" -# Serial: 985026699 -# MD5 Fingerprint: 27:de:36:fe:72:b7:00:03:00:9d:f4:f0:1e:6c:04:24 -# SHA1 Fingerprint: de:3f:40:bd:50:93:d3:9b:6c:60:f6:da:bc:07:62:01:00:89:76:c9 -# SHA256 Fingerprint: a4:5e:de:3b:bb:f0:9c:8a:e1:5c:72:ef:c0:72:68:d6:93:a2:1c:99:6f:d5:1e:67:ca:07:94:60:fd:6d:88:73 ------BEGIN CERTIFICATE----- -MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC -TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz -MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw -IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR -dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp -li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D -rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ -WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug -F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU -xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC -Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv -dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw -ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl -IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh -c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy -ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh -Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI -KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T -KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq -y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p -dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD -VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL -MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk -fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8 -7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R -cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y -mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW -xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK -SnQ2+Q== ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 2 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 2 O=QuoVadis Limited -# Label: "QuoVadis Root CA 2" -# Serial: 1289 -# MD5 Fingerprint: 5e:39:7b:dd:f8:ba:ec:82:e9:ac:62:ba:0c:54:00:2b -# SHA1 Fingerprint: ca:3a:fb:cf:12:40:36:4b:44:b2:16:20:88:80:48:39:19:93:7c:f7 -# SHA256 Fingerprint: 85:a0:dd:7d:d7:20:ad:b7:ff:05:f8:3d:54:2b:20:9d:c7:ff:45:28:f7:d6:77:b1:83:89:fe:a5:e5:c4:9e:86 ------BEGIN CERTIFICATE----- -MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x -GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv -b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV -BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W -YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa -GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg -Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J -WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB -rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp -+ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 -ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i -Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz -PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og -/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH -oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI -yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud -EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 -A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL -MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT -ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f -BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn -g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl -fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K -WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha -B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc -hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR -TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD -mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z -ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y -4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza -8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 3" -# Serial: 1478 -# MD5 Fingerprint: 31:85:3c:62:94:97:63:b9:aa:fd:89:4e:af:6f:e0:cf -# SHA1 Fingerprint: 1f:49:14:f7:d8:74:95:1d:dd:ae:02:c0:be:fd:3a:2d:82:75:51:85 -# SHA256 Fingerprint: 18:f1:fc:7f:20:5d:f8:ad:dd:eb:7f:e0:07:dd:57:e3:af:37:5a:9c:4d:8d:73:54:6b:f4:f1:fe:d1:e1:8d:35 ------BEGIN CERTIFICATE----- -MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x -GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv -b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV -BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W -YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM -V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB -4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr -H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd -8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv -vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT -mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe -btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc -T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt -WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ -c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A -4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD -VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG -CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 -aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 -aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu -dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw -czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G -A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC -TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg -Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 -7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem -d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd -+LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B -4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN -t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x -DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 -k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s -zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j -Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT -mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK -4SVhM7JZG+Ju1zdXtg2pEto= ------END CERTIFICATE----- - -# Issuer: O=SECOM Trust.net OU=Security Communication RootCA1 -# Subject: O=SECOM Trust.net OU=Security Communication RootCA1 -# Label: "Security Communication Root CA" -# Serial: 0 -# MD5 Fingerprint: f1:bc:63:6a:54:e0:b5:27:f5:cd:e7:1a:e3:4d:6e:4a -# SHA1 Fingerprint: 36:b1:2b:49:f9:81:9e:d7:4c:9e:bc:38:0f:c6:56:8f:5d:ac:b2:f7 -# SHA256 Fingerprint: e7:5e:72:ed:9f:56:0e:ec:6e:b4:80:00:73:a4:3f:c3:ad:19:19:5a:39:22:82:01:78:95:97:4a:99:02:6b:6c ------BEGIN CERTIFICATE----- -MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY -MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t -dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5 -WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD -VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8 -9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ -DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9 -Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N -QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ -xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G -A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T -AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG -kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr -Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5 -Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU -JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot -RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw== ------END CERTIFICATE----- - -# Issuer: CN=Sonera Class2 CA O=Sonera -# Subject: CN=Sonera Class2 CA O=Sonera -# Label: "Sonera Class 2 Root CA" -# Serial: 29 -# MD5 Fingerprint: a3:ec:75:0f:2e:88:df:fa:48:01:4e:0b:5c:48:6f:fb -# SHA1 Fingerprint: 37:f7:6d:e6:07:7c:90:c5:b1:3e:93:1a:b7:41:10:b4:f2:e4:9a:27 -# SHA256 Fingerprint: 79:08:b4:03:14:c1:38:10:0b:51:8d:07:35:80:7f:fb:fc:f8:51:8a:00:95:33:71:05:ba:38:6b:15:3d:d9:27 ------BEGIN CERTIFICATE----- -MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP -MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx -MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV -BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o -Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt -5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s -3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej -vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu -8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw -DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG -MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil -zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/ -3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD -FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6 -Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2 -ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M ------END CERTIFICATE----- - -# Issuer: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com -# Subject: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com -# Label: "XRamp Global CA Root" -# Serial: 107108908803651509692980124233745014957 -# MD5 Fingerprint: a1:0b:44:b3:ca:10:d8:00:6e:9d:0f:d8:0f:92:0a:d1 -# SHA1 Fingerprint: b8:01:86:d1:eb:9c:86:a5:41:04:cf:30:54:f3:4c:52:b7:e5:58:c6 -# SHA256 Fingerprint: ce:cd:dc:90:50:99:d8:da:df:c5:b1:d2:09:b7:37:cb:e2:c1:8c:fb:2c:10:c0:ff:0b:cf:0d:32:86:fc:1a:a2 ------BEGIN CERTIFICATE----- -MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB -gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk -MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY -UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx -NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 -dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy -dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 -38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP -KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q -DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 -qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa -JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi -PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P -BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs -jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 -eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD -ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR -vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt -qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa -IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy -i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ -O+7ETPTsJ3xCwnR8gooJybQDJbw= ------END CERTIFICATE----- - -# Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority -# Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority -# Label: "Go Daddy Class 2 CA" -# Serial: 0 -# MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67 -# SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4 -# SHA256 Fingerprint: c3:84:6b:f2:4b:9e:93:ca:64:27:4c:0e:c6:7c:1e:cc:5e:02:4f:fc:ac:d2:d7:40:19:35:0e:81:fe:54:6a:e4 ------BEGIN CERTIFICATE----- -MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh -MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE -YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 -MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo -ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg -MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN -ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA -PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w -wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi -EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY -avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ -YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE -sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h -/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 -IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD -ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy -OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P -TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ -HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER -dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf -ReYNnyicsbkqWletNw+vHX/bvZ8= ------END CERTIFICATE----- - -# Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority -# Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority -# Label: "Starfield Class 2 CA" -# Serial: 0 -# MD5 Fingerprint: 32:4a:4b:bb:c8:63:69:9b:be:74:9a:c6:dd:1d:46:24 -# SHA1 Fingerprint: ad:7e:1c:28:b0:64:ef:8f:60:03:40:20:14:c3:d0:e3:37:0e:b5:8a -# SHA256 Fingerprint: 14:65:fa:20:53:97:b8:76:fa:a6:f0:a9:95:8e:55:90:e4:0f:cc:7f:aa:4f:b7:c2:c8:67:75:21:fb:5f:b6:58 ------BEGIN CERTIFICATE----- -MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl -MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp -U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw -NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE -ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp -ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 -DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf -8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN -+lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 -X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa -K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA -1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G -A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR -zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 -YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD -bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w -DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 -L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D -eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl -xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp -VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY -WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= ------END CERTIFICATE----- - -# Issuer: O=Government Root Certification Authority -# Subject: O=Government Root Certification Authority -# Label: "Taiwan GRCA" -# Serial: 42023070807708724159991140556527066870 -# MD5 Fingerprint: 37:85:44:53:32:45:1f:20:f0:f3:95:e1:25:c4:43:4e -# SHA1 Fingerprint: f4:8b:11:bf:de:ab:be:94:54:20:71:e6:41:de:6b:be:88:2b:40:b9 -# SHA256 Fingerprint: 76:00:29:5e:ef:e8:5b:9e:1f:d6:24:db:76:06:2a:aa:ae:59:81:8a:54:d2:77:4c:d4:c0:b2:c0:11:31:e1:b3 ------BEGIN CERTIFICATE----- -MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/ -MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1ow -PzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQgUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB -AJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qNw8XR -IePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1q -gQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKy -yhwOeYHWtXBiCAEuTk8O1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAts -F/tnyMKtsc2AtJfcdgEWFelq16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2 -jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvx -ls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FC -VGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHK -YS1tB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoH -EgKXTiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN -Xo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1Ud -DgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkGBGcqBwAE -MTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg209yewDL7MTqK -UWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ -TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyf -qzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaK -ZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFE -JPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7 -hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1 -EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6Mm -nD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WX -udpVBrkk7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44Vbnz -ssQwmSNOXfJIoRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDe -LMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl -pYYsfPQS ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Assured ID Root CA" -# Serial: 17154717934120587862167794914071425081 -# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72 -# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43 -# SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c ------BEGIN CERTIFICATE----- -MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv -b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl -cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c -JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP -mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ -wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 -VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ -AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB -AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW -BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun -pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC -dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf -fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm -NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx -H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe -+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Global Root CA" -# Serial: 10944719598952040374951832963794454346 -# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e -# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36 -# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61 ------BEGIN CERTIFICATE----- -MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD -QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB -CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 -nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt -43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P -T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 -gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO -BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR -TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw -DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr -hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg -06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF -PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls -YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk -CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= ------END CERTIFICATE----- - -# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert High Assurance EV Root CA" -# Serial: 3553400076410547919724730734378100087 -# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a -# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25 -# SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j -ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL -MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 -LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug -RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm -+9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW -PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM -xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB -Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 -hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg -EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA -FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec -nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z -eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF -hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 -Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe -vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep -+OkuE6N36B9K ------END CERTIFICATE----- - -# Issuer: CN=Class 2 Primary CA O=Certplus -# Subject: CN=Class 2 Primary CA O=Certplus -# Label: "Certplus Class 2 Primary CA" -# Serial: 177770208045934040241468760488327595043 -# MD5 Fingerprint: 88:2c:8c:52:b8:a2:3c:f3:f7:bb:03:ea:ae:ac:42:0b -# SHA1 Fingerprint: 74:20:74:41:72:9c:dd:92:ec:79:31:d8:23:10:8d:c2:81:92:e2:bb -# SHA256 Fingerprint: 0f:99:3c:8a:ef:97:ba:af:56:87:14:0e:d5:9a:d1:82:1b:b4:af:ac:f0:aa:9a:58:b5:d5:7a:33:8a:3a:fb:cb ------BEGIN CERTIFICATE----- -MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw -PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz -cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9 -MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz -IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ -ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR -VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL -kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd -EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas -H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0 -HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud -DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4 -QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu -Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/ -AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8 -yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR -FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA -ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB -kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 -l7+ijrRU ------END CERTIFICATE----- - -# Issuer: CN=DST Root CA X3 O=Digital Signature Trust Co. -# Subject: CN=DST Root CA X3 O=Digital Signature Trust Co. -# Label: "DST Root CA X3" -# Serial: 91299735575339953335919266965803778155 -# MD5 Fingerprint: 41:03:52:dc:0f:f7:50:1b:16:f0:02:8e:ba:6f:45:c5 -# SHA1 Fingerprint: da:c9:02:4f:54:d8:f6:df:94:93:5f:b1:73:26:38:ca:6a:d7:7c:13 -# SHA256 Fingerprint: 06:87:26:03:31:a7:24:03:d9:09:f1:05:e6:9b:cf:0d:32:e1:bd:24:93:ff:c6:d9:20:6d:11:bc:d6:77:07:39 ------BEGIN CERTIFICATE----- -MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/ -MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT -DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow -PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD -Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O -rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq -OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b -xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw -7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD -aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV -HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG -SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69 -ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr -AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz -R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 -JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo -Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ ------END CERTIFICATE----- - -# Issuer: CN=SwissSign Gold CA - G2 O=SwissSign AG -# Subject: CN=SwissSign Gold CA - G2 O=SwissSign AG -# Label: "SwissSign Gold CA - G2" -# Serial: 13492815561806991280 -# MD5 Fingerprint: 24:77:d9:a8:91:d1:3b:fa:88:2d:c2:ff:f8:cd:33:93 -# SHA1 Fingerprint: d8:c5:38:8a:b7:30:1b:1b:6e:d4:7a:e6:45:25:3a:6f:9f:1a:27:61 -# SHA256 Fingerprint: 62:dd:0b:e9:b9:f5:0a:16:3e:a0:f8:e7:5c:05:3b:1e:ca:57:ea:55:c8:68:8f:64:7c:68:81:f2:c8:35:7b:95 ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -# Issuer: CN=SwissSign Silver CA - G2 O=SwissSign AG -# Subject: CN=SwissSign Silver CA - G2 O=SwissSign AG -# Label: "SwissSign Silver CA - G2" -# Serial: 5700383053117599563 -# MD5 Fingerprint: e0:06:a1:c9:7d:cf:c9:fc:0d:c0:56:75:96:d8:62:13 -# SHA1 Fingerprint: 9b:aa:e5:9f:56:ee:21:cb:43:5a:be:25:93:df:a7:f0:40:d1:1d:cb -# SHA256 Fingerprint: be:6c:4d:a2:bb:b9:ba:59:b6:f3:93:97:68:37:42:46:c3:c0:05:99:3f:a9:8f:02:0d:1d:ed:be:d4:8a:81:d5 ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. -# Subject: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. -# Label: "GeoTrust Primary Certification Authority" -# Serial: 32798226551256963324313806436981982369 -# MD5 Fingerprint: 02:26:c3:01:5e:08:30:37:43:a9:d0:7d:cf:37:e6:bf -# SHA1 Fingerprint: 32:3c:11:8e:1b:f7:b8:b6:52:54:e2:e2:10:0d:d6:02:90:37:f0:96 -# SHA256 Fingerprint: 37:d5:10:06:c5:12:ea:ab:62:64:21:f1:ec:8c:92:01:3f:c5:f8:2a:e9:8e:e5:33:eb:46:19:b8:de:b4:d0:6c ------BEGIN CERTIFICATE----- -MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY -MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo -R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx -MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK -Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9 -AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA -ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0 -7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W -kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI -mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G -A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ -KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1 -6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl -4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K -oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj -UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU -AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= ------END CERTIFICATE----- - -# Issuer: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only -# Subject: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only -# Label: "thawte Primary Root CA" -# Serial: 69529181992039203566298953787712940909 -# MD5 Fingerprint: 8c:ca:dc:0b:22:ce:f5:be:72:ac:41:1a:11:a8:d8:12 -# SHA1 Fingerprint: 91:c6:d6:ee:3e:8a:c8:63:84:e5:48:c2:99:29:5c:75:6c:81:7b:81 -# SHA256 Fingerprint: 8d:72:2f:81:a9:c1:13:c0:79:1d:f1:36:a2:96:6d:b2:6c:95:0a:97:1d:b4:6b:41:99:f4:ea:54:b7:8b:fb:9f ------BEGIN CERTIFICATE----- -MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB -qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf -Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw -MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV -BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw -NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j -LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG -A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs -W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta -3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk -6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6 -Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J -NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA -MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP -r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU -DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz -YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX -xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2 -/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/ -LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7 -jVaMaA== ------END CERTIFICATE----- - -# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only -# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only -# Label: "VeriSign Class 3 Public Primary Certification Authority - G5" -# Serial: 33037644167568058970164719475676101450 -# MD5 Fingerprint: cb:17:e4:31:67:3e:e2:09:fe:45:57:93:f3:0a:fa:1c -# SHA1 Fingerprint: 4e:b6:d5:78:49:9b:1c:cf:5f:58:1e:ad:56:be:3d:9b:67:44:a5:e5 -# SHA256 Fingerprint: 9a:cf:ab:7e:43:c8:d8:80:d0:6b:26:2a:94:de:ee:e4:b4:65:99:89:c3:d0:ca:f1:9b:af:64:05:e4:1a:b7:df ------BEGIN CERTIFICATE----- -MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB -yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL -ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp -U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW -ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL -MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW -ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp -U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y -aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1 -nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex -t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz -SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG -BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ -rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/ -NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E -BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH -BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy -aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv -MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE -p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y -5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK -WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ -4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N -hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq ------END CERTIFICATE----- - -# Issuer: CN=SecureTrust CA O=SecureTrust Corporation -# Subject: CN=SecureTrust CA O=SecureTrust Corporation -# Label: "SecureTrust CA" -# Serial: 17199774589125277788362757014266862032 -# MD5 Fingerprint: dc:32:c3:a7:6d:25:57:c7:68:09:9d:ea:2d:a9:a2:d1 -# SHA1 Fingerprint: 87:82:c6:c3:04:35:3b:cf:d2:96:92:d2:59:3e:7d:44:d9:34:ff:11 -# SHA256 Fingerprint: f1:c1:b5:0a:e5:a2:0d:d8:03:0e:c9:f6:bc:24:82:3d:d3:67:b5:25:57:59:b4:e7:1b:61:fc:e9:f7:37:5d:73 ------BEGIN CERTIFICATE----- -MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x -FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz -MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv -cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN -AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz -Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO -0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao -wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj -7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS -8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT -BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB -/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg -JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC -NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 -6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ -3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm -D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS -CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR -3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= ------END CERTIFICATE----- - -# Issuer: CN=Secure Global CA O=SecureTrust Corporation -# Subject: CN=Secure Global CA O=SecureTrust Corporation -# Label: "Secure Global CA" -# Serial: 9751836167731051554232119481456978597 -# MD5 Fingerprint: cf:f4:27:0d:d4:ed:dc:65:16:49:6d:3d:da:bf:6e:de -# SHA1 Fingerprint: 3a:44:73:5a:e5:81:90:1f:24:86:61:46:1e:3b:9c:c4:5f:f5:3a:1b -# SHA256 Fingerprint: 42:00:f5:04:3a:c8:59:0e:bb:52:7d:20:9e:d1:50:30:29:fb:cb:d4:1c:a1:b5:06:ec:27:f1:5a:de:7d:ac:69 ------BEGIN CERTIFICATE----- -MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x -GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx -MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg -Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ -iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa -/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ -jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI -HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 -sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w -gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw -KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG -AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L -URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO -H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm -I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY -iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc -f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW ------END CERTIFICATE----- - -# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited -# Subject: CN=COMODO Certification Authority O=COMODO CA Limited -# Label: "COMODO Certification Authority" -# Serial: 104350513648249232941998508985834464573 -# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75 -# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b -# SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66 ------BEGIN CERTIFICATE----- -MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB -gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G -A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV -BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw -MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl -YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P -RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 -UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI -2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 -Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp -+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ -DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O -nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW -/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g -PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u -QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY -SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv -IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ -RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 -zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd -BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB -ZQ== ------END CERTIFICATE----- - -# Issuer: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. -# Subject: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. -# Label: "Network Solutions Certificate Authority" -# Serial: 116697915152937497490437556386812487904 -# MD5 Fingerprint: d3:f3:a6:16:c0:fa:6b:1d:59:b1:2d:96:4d:0e:11:2e -# SHA1 Fingerprint: 74:f8:a3:c3:ef:e7:b3:90:06:4b:83:90:3c:21:64:60:20:e5:df:ce -# SHA256 Fingerprint: 15:f0:ba:00:a3:ac:7a:f3:ac:88:4c:07:2b:10:11:a0:77:bd:77:c0:97:f4:01:64:b2:f8:59:8a:bd:83:86:0c ------BEGIN CERTIFICATE----- -MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi -MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu -MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp -dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV -UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO -ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz -c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP -OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl -mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF -BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4 -qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw -gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB -BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu -bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp -dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8 -6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/ -h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH -/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv -wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN -pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey ------END CERTIFICATE----- - -# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited -# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited -# Label: "COMODO ECC Certification Authority" -# Serial: 41578283867086692638256921589707938090 -# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23 -# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11 -# SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7 ------BEGIN CERTIFICATE----- -MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL -MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE -BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT -IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw -MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy -ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N -T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv -biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR -FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J -cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW -BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm -fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv -GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= ------END CERTIFICATE----- - -# Issuer: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed -# Subject: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed -# Label: "OISTE WISeKey Global Root GA CA" -# Serial: 86718877871133159090080555911823548314 -# MD5 Fingerprint: bc:6c:51:33:a7:e9:d3:66:63:54:15:72:1b:21:92:93 -# SHA1 Fingerprint: 59:22:a1:e1:5a:ea:16:35:21:f8:98:39:6a:46:46:b0:44:1b:0f:a9 -# SHA256 Fingerprint: 41:c9:23:86:6a:b4:ca:d6:b7:ad:57:80:81:58:2e:02:07:97:a6:cb:df:4f:ff:78:ce:83:96:b3:89:37:d7:f5 ------BEGIN CERTIFICATE----- -MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCB -ijELMAkGA1UEBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHly -aWdodCAoYykgMjAwNTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl -ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQTAeFw0w -NTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYDVQQGEwJDSDEQMA4G -A1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIwIAYD -VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBX -SVNlS2V5IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAy0+zAJs9Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxR -VVuuk+g3/ytr6dTqvirdqFEr12bDYVxgAsj1znJ7O7jyTmUIms2kahnBAbtzptf2 -w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbDd50kc3vkDIzh2TbhmYsF -mQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ/yxViJGg -4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t9 -4B3RLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYw -DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQw -EAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOx -SPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vImMMkQyh2I+3QZH4VFvbBsUfk2 -ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4+vg1YFkCExh8 -vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa -hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZi -Fj4A4xylNoEYokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ -/L7fCg0= ------END CERTIFICATE----- - -# Issuer: CN=Certigna O=Dhimyotis -# Subject: CN=Certigna O=Dhimyotis -# Label: "Certigna" -# Serial: 18364802974209362175 -# MD5 Fingerprint: ab:57:a6:5b:7d:42:82:19:b5:d8:58:26:28:5e:fd:ff -# SHA1 Fingerprint: b1:2e:13:63:45:86:a4:6f:1a:b2:60:68:37:58:2d:c4:ac:fd:94:97 -# SHA256 Fingerprint: e3:b6:a2:db:2e:d7:ce:48:84:2f:7a:c5:32:41:c7:b7:1d:54:14:4b:fb:40:c1:1f:3f:1d:0b:42:f5:ee:a1:2d ------BEGIN CERTIFICATE----- -MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV -BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X -DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ -BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4 -QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny -gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw -zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q -130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2 -JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw -DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw -ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT -AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj -AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG -9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h -bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc -fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu -HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w -t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw -WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== ------END CERTIFICATE----- - -# Issuer: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center -# Subject: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center -# Label: "Deutsche Telekom Root CA 2" -# Serial: 38 -# MD5 Fingerprint: 74:01:4a:91:b1:08:c4:58:ce:47:cd:f0:dd:11:53:08 -# SHA1 Fingerprint: 85:a4:08:c0:9c:19:3e:5d:51:58:7d:cd:d6:13:30:fd:8c:de:37:bf -# SHA256 Fingerprint: b6:19:1a:50:d0:c3:97:7f:7d:a9:9b:cd:aa:c8:6a:22:7d:ae:b9:67:9e:c7:0b:a3:b0:c9:d9:22:71:c1:70:d3 ------BEGIN CERTIFICATE----- -MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc -MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj -IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB -IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE -RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl -U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290 -IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU -ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC -QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr -rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S -NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc -QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH -txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP -BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC -AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp -tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa -IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl -6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+ -xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU -Cm26OWMohpLzGITY+9HPBVZkVw== ------END CERTIFICATE----- - -# Issuer: CN=Cybertrust Global Root O=Cybertrust, Inc -# Subject: CN=Cybertrust Global Root O=Cybertrust, Inc -# Label: "Cybertrust Global Root" -# Serial: 4835703278459682877484360 -# MD5 Fingerprint: 72:e4:4a:87:e3:69:40:80:77:ea:bc:e3:f4:ff:f0:e1 -# SHA1 Fingerprint: 5f:43:e5:b1:bf:f8:78:8c:ac:1c:c7:ca:4a:9a:c6:22:2b:cc:34:c6 -# SHA256 Fingerprint: 96:0a:df:00:63:e9:63:56:75:0c:29:65:dd:0a:08:67:da:0b:9c:bd:6e:77:71:4a:ea:fb:23:49:ab:39:3d:a3 ------BEGIN CERTIFICATE----- -MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG -A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh -bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE -ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS -b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5 -7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS -J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y -HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP -t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz -FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY -XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/ -MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw -hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js -MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA -A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj -Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx -XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o -omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc -A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW -WL1WMRJOEcgh4LMRkWXbtKaIOM5V ------END CERTIFICATE----- - -# Issuer: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority -# Subject: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority -# Label: "ePKI Root Certification Authority" -# Serial: 28956088682735189655030529057352760477 -# MD5 Fingerprint: 1b:2e:00:ca:26:06:90:3d:ad:fe:6f:15:68:d3:6b:b3 -# SHA1 Fingerprint: 67:65:0d:f1:7e:8e:7e:5b:82:40:a4:f4:56:4b:cf:e2:3d:69:c6:f0 -# SHA256 Fingerprint: c0:a6:f4:dc:63:a2:4b:fd:cf:54:ef:2a:6a:08:2a:0a:72:de:35:80:3e:2f:f5:ff:52:7a:e5:d8:72:06:df:d5 ------BEGIN CERTIFICATE----- -MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe -MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 -ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe -Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw -IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL -SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF -AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH -SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh -ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X -DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1 -TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ -fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA -sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU -WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS -nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH -dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip -NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC -AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF -MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH -ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB -uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl -PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP -JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/ -gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2 -j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6 -5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB -o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS -/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z -Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE -W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D -hNQ+IIX3Sj0rnP0qCglN6oH4EZw= ------END CERTIFICATE----- - -# Issuer: O=certSIGN OU=certSIGN ROOT CA -# Subject: O=certSIGN OU=certSIGN ROOT CA -# Label: "certSIGN ROOT CA" -# Serial: 35210227249154 -# MD5 Fingerprint: 18:98:c0:d6:e9:3a:fc:f9:b0:f5:0c:f7:4b:01:44:17 -# SHA1 Fingerprint: fa:b7:ee:36:97:26:62:fb:2d:b0:2a:f6:bf:03:fd:e8:7c:4b:2f:9b -# SHA256 Fingerprint: ea:a9:62:c4:fa:4a:6b:af:eb:e4:15:19:6d:35:1c:cd:88:8d:4f:53:f3:fa:8a:e6:d7:c4:66:a9:4e:60:42:bb ------BEGIN CERTIFICATE----- -MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT -AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD -QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP -MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC -ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do -0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ -UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d -RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ -OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv -JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C -AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O -BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ -LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY -MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ -44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I -Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw -i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN -9u6wWk5JRFRYX0KD ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only -# Subject: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only -# Label: "GeoTrust Primary Certification Authority - G3" -# Serial: 28809105769928564313984085209975885599 -# MD5 Fingerprint: b5:e8:34:36:c9:10:44:58:48:70:6d:2e:83:d4:b8:05 -# SHA1 Fingerprint: 03:9e:ed:b8:0b:e7:a0:3c:69:53:89:3b:20:d2:d9:32:3a:4c:2a:fd -# SHA256 Fingerprint: b4:78:b8:12:25:0d:f8:78:63:5c:2a:a7:ec:7d:15:5e:aa:62:5e:e8:29:16:e2:cd:29:43:61:88:6c:d1:fb:d4 ------BEGIN CERTIFICATE----- -MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB -mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT -MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s -eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ -BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg -MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0 -BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg -LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz -+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm -hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn -5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W -JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL -DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC -huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw -HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB -AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB -zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN -kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD -AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH -SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G -spki4cErx5z481+oghLrGREt ------END CERTIFICATE----- - -# Issuer: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only -# Subject: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only -# Label: "thawte Primary Root CA - G2" -# Serial: 71758320672825410020661621085256472406 -# MD5 Fingerprint: 74:9d:ea:60:24:c4:fd:22:53:3e:cc:3a:72:d9:29:4f -# SHA1 Fingerprint: aa:db:bc:22:23:8f:c4:01:a1:27:bb:38:dd:f4:1d:db:08:9e:f0:12 -# SHA256 Fingerprint: a4:31:0d:50:af:18:a6:44:71:90:37:2a:86:af:af:8b:95:1f:fb:43:1d:83:7f:1e:56:88:b4:59:71:ed:15:57 ------BEGIN CERTIFICATE----- -MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL -MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp -IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi -BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw -MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh -d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig -YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v -dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/ -BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6 -papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K -DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3 -KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox -XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== ------END CERTIFICATE----- - -# Issuer: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only -# Subject: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only -# Label: "thawte Primary Root CA - G3" -# Serial: 127614157056681299805556476275995414779 -# MD5 Fingerprint: fb:1b:5d:43:8a:94:cd:44:c6:76:f2:43:4b:47:e7:31 -# SHA1 Fingerprint: f1:8b:53:8d:1b:e9:03:b6:a6:f0:56:43:5b:17:15:89:ca:f3:6b:f2 -# SHA256 Fingerprint: 4b:03:f4:58:07:ad:70:f2:1b:fc:2c:ae:71:c9:fd:e4:60:4c:06:4c:f5:ff:b6:86:ba:e5:db:aa:d7:fd:d3:4c ------BEGIN CERTIFICATE----- -MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB -rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf -Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw -MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV -BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa -Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl -LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u -MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl -ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm -gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8 -YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf -b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9 -9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S -zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk -OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV -HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA -2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW -oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu -t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c -KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM -m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu -MdRAGmI0Nj81Aa6sY6A= ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only -# Subject: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only -# Label: "GeoTrust Primary Certification Authority - G2" -# Serial: 80682863203381065782177908751794619243 -# MD5 Fingerprint: 01:5e:d8:6b:bd:6f:3d:8e:a1:31:f8:12:e0:98:73:6a -# SHA1 Fingerprint: 8d:17:84:d5:37:f3:03:7d:ec:70:fe:57:8b:51:9a:99:e6:10:d7:b0 -# SHA256 Fingerprint: 5e:db:7a:c4:3b:82:a0:6a:87:61:e8:d7:be:49:79:eb:f2:61:1f:7d:d7:9b:f9:1c:1c:6b:56:6a:21:9e:d7:66 ------BEGIN CERTIFICATE----- -MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL -MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj -KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2 -MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 -eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV -BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw -NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV -BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH -MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL -So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal -tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO -BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG -CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT -qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz -rD6ogRLQy7rQkgu2npaqBA+K ------END CERTIFICATE----- - -# Issuer: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only -# Subject: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only -# Label: "VeriSign Universal Root Certification Authority" -# Serial: 85209574734084581917763752644031726877 -# MD5 Fingerprint: 8e:ad:b5:01:aa:4d:81:e4:8c:1d:d1:e1:14:00:95:19 -# SHA1 Fingerprint: 36:79:ca:35:66:87:72:30:4d:30:a5:fb:87:3b:0f:a7:7b:b7:0d:54 -# SHA256 Fingerprint: 23:99:56:11:27:a5:71:25:de:8c:ef:ea:61:0d:df:2f:a0:78:b5:c8:06:7f:4e:82:82:90:bf:b8:60:e8:4b:3c ------BEGIN CERTIFICATE----- -MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB -vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL -ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp -U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W -ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe -Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX -MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0 -IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y -IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh -bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF -9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH -H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H -LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN -/BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT -rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud -EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw -WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs -exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud -DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4 -sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+ -seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz -4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+ -BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR -lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3 -7M2CYfE45k+XmCpajQ== ------END CERTIFICATE----- - -# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only -# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only -# Label: "VeriSign Class 3 Public Primary Certification Authority - G4" -# Serial: 63143484348153506665311985501458640051 -# MD5 Fingerprint: 3a:52:e1:e7:fd:6f:3a:e3:6f:f3:6f:99:1b:f9:22:41 -# SHA1 Fingerprint: 22:d5:d8:df:8f:02:31:d1:8d:f7:9d:b7:cf:8a:2d:64:c9:3f:6c:3a -# SHA256 Fingerprint: 69:dd:d7:ea:90:bb:57:c9:3e:13:5d:c8:5e:a6:fc:d5:48:0b:60:32:39:bd:c4:54:fc:75:8b:2a:26:cf:7f:79 ------BEGIN CERTIFICATE----- -MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL -MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW -ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp -U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y -aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG -A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp -U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg -SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln -biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm -GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve -fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw -AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ -aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj -aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW -kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC -4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga -FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== ------END CERTIFICATE----- - -# Issuer: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) -# Subject: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) -# Label: "NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny" -# Serial: 80544274841616 -# MD5 Fingerprint: c5:a1:b7:ff:73:dd:d6:d7:34:32:18:df:fc:3c:ad:88 -# SHA1 Fingerprint: 06:08:3f:59:3f:15:a1:04:a0:69:a4:6b:a9:03:d0:06:b7:97:09:91 -# SHA256 Fingerprint: 6c:61:da:c3:a2:de:f0:31:50:6b:e0:36:d2:a6:fe:40:19:94:fb:d1:3d:f9:c8:d4:66:59:92:74:c4:46:ec:98 ------BEGIN CERTIFICATE----- -MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG -EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3 -MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl -cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR -dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB -pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM -b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm -aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz -IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT -lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz -AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5 -VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG -ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2 -BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG -AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M -U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh -bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C -+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC -bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F -uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2 -XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= ------END CERTIFICATE----- - -# Issuer: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden -# Subject: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden -# Label: "Staat der Nederlanden Root CA - G2" -# Serial: 10000012 -# MD5 Fingerprint: 7c:a5:0f:f8:5b:9a:7d:6d:30:ae:54:5a:e3:42:a2:8a -# SHA1 Fingerprint: 59:af:82:79:91:86:c7:b4:75:07:cb:cf:03:57:46:eb:04:dd:b7:16 -# SHA256 Fingerprint: 66:8c:83:94:7d:a6:3b:72:4b:ec:e1:74:3c:31:a0:e6:ae:d0:db:8e:c5:b3:1b:e3:77:bb:78:4f:91:b6:71:6f ------BEGIN CERTIFICATE----- -MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO -TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh -dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oX -DTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl -ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv -b3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ5291 -qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8Sp -uOUfiUtnvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPU -Z5uW6M7XxgpT0GtJlvOjCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvE -pMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiile7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp -5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCROME4HYYEhLoaJXhena/M -UGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpICT0ugpTN -GmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy -5V6548r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv -6q012iDTiIJh8BIitrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEK -eN5KzlW/HdXZt1bv8Hb/C3m1r737qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6 -B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMBAAGjgZcwgZQwDwYDVR0TAQH/ -BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcCARYxaHR0cDov -L3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV -HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqG -SIb3DQEBCwUAA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLyS -CZa59sCrI2AGeYwRTlHSeYAz+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen -5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwjf/ST7ZwaUb7dRUG/kSS0H4zpX897 -IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaNkqbG9AclVMwWVxJK -gnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfkCpYL -+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxL -vJxxcypFURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkm -bEgeqmiSBeGCc1qb3AdbCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvk -N1trSt8sV4pAWja63XVECDdCcAz+3F4hoKOKwJCcaNpQ5kUQR3i2TtJlycM33+FC -Y7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoVIPVVYpbtbZNQvOSqeK3Z -ywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm66+KAQ== ------END CERTIFICATE----- - -# Issuer: CN=Hongkong Post Root CA 1 O=Hongkong Post -# Subject: CN=Hongkong Post Root CA 1 O=Hongkong Post -# Label: "Hongkong Post Root CA 1" -# Serial: 1000 -# MD5 Fingerprint: a8:0d:6f:39:78:b9:43:6d:77:42:6d:98:5a:cc:23:ca -# SHA1 Fingerprint: d6:da:a8:20:8d:09:d2:15:4d:24:b5:2f:cb:34:6e:b2:58:b2:8a:58 -# SHA256 Fingerprint: f9:e6:7d:33:6c:51:00:2a:c0:54:c6:32:02:2d:66:dd:a2:e7:e3:ff:f1:0a:d0:61:ed:31:d8:bb:b4:10:cf:b2 ------BEGIN CERTIFICATE----- -MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx -FjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg -Um9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkG -A1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdr -b25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQ -jVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEn -PzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjh -ZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9 -nnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/h -q5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgED -MA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsC -mEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI3 -7piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clB -oiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJs -EhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO -fMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi -AmvZWg== ------END CERTIFICATE----- - -# Issuer: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. -# Subject: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. -# Label: "SecureSign RootCA11" -# Serial: 1 -# MD5 Fingerprint: b7:52:74:e2:92:b4:80:93:f2:75:e4:cc:d7:f2:ea:26 -# SHA1 Fingerprint: 3b:c4:9f:48:f8:f3:73:a0:9c:1e:bd:f8:5b:b1:c3:65:c7:d8:11:b3 -# SHA256 Fingerprint: bf:0f:ee:fb:9e:3a:58:1a:d5:f9:e9:db:75:89:98:57:43:d2:61:08:5c:4d:31:4f:6f:5d:72:59:aa:42:16:12 ------BEGIN CERTIFICATE----- -MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr -MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG -A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0 -MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp -Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD -QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz -i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8 -h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV -MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9 -UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni -8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC -h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD -VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB -AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm -KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ -X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr -QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5 -pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN -QSdJQO7e5iNEOdyhIta6A/I= ------END CERTIFICATE----- - -# Issuer: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. -# Subject: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. -# Label: "Microsec e-Szigno Root CA 2009" -# Serial: 14014712776195784473 -# MD5 Fingerprint: f8:49:f4:03:bc:44:2d:83:be:48:69:7d:29:64:fc:b1 -# SHA1 Fingerprint: 89:df:74:fe:5c:f4:0f:4a:80:f9:e3:37:7d:54:da:91:e1:01:31:8e -# SHA256 Fingerprint: 3c:5f:81:fe:a5:fa:b8:2c:64:bf:a2:ea:ec:af:cd:e8:e0:77:fc:86:20:a7:ca:e5:37:16:3d:f3:6e:db:f3:78 ------BEGIN CERTIFICATE----- -MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD -VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0 -ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G -CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y -OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx -FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp -Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o -dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP -kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc -cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U -fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7 -N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC -xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1 -+rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G -A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM -Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG -SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h -mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk -ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 -tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c -2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t -HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 -# Label: "GlobalSign Root CA - R3" -# Serial: 4835703278459759426209954 -# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28 -# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad -# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b ------BEGIN CERTIFICATE----- -MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G -A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp -Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 -MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG -A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 -RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT -gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm -KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd -QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ -XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw -DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o -LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU -RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp -jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK -6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX -mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs -Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH -WD9f ------END CERTIFICATE----- - -# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 -# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 -# Label: "Autoridad de Certificacion Firmaprofesional CIF A62634068" -# Serial: 6047274297262753887 -# MD5 Fingerprint: 73:3a:74:7a:ec:bb:a3:96:a6:c2:e4:e2:c8:9b:c0:c3 -# SHA1 Fingerprint: ae:c5:fb:3f:c8:e1:bf:c4:e5:4f:03:07:5a:9a:e8:00:b7:f7:b6:fa -# SHA256 Fingerprint: 04:04:80:28:bf:1f:28:64:d4:8f:9a:d4:d8:32:94:36:6a:82:88:56:55:3f:3b:14:30:3f:90:14:7f:5d:40:ef ------BEGIN CERTIFICATE----- -MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE -BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h -cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEy -MzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg -Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9 -thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM -cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG -L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i -NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h -X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b -m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy -Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja -EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T -KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF -6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh -OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD -VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD -VR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp -cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBv -ACAAZABlACAAbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBl -AGwAbwBuAGEAIAAwADgAMAAxADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF -661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx51tkljYyGOylMnfX40S2wBEqgLk9 -am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qkR71kMrv2JYSiJ0L1 -ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaPT481 -PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS -3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k -SeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF -3dvd6qJ2gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVM -ZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0g -StRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/icz -Q0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQB -jLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V ------END CERTIFICATE----- - -# Issuer: CN=Izenpe.com O=IZENPE S.A. -# Subject: CN=Izenpe.com O=IZENPE S.A. -# Label: "Izenpe.com" -# Serial: 917563065490389241595536686991402621 -# MD5 Fingerprint: a6:b0:cd:85:80:da:5c:50:34:a3:39:90:2f:55:67:73 -# SHA1 Fingerprint: 2f:78:3d:25:52:18:a7:4a:65:39:71:b5:2c:a2:9c:45:15:6f:e9:19 -# SHA256 Fingerprint: 25:30:cc:8e:98:32:15:02:ba:d9:6f:9b:1f:ba:1b:09:9e:2d:29:9e:0f:45:48:bb:91:4f:36:3b:c0:d4:53:1f ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -# Issuer: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. -# Subject: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. -# Label: "Chambers of Commerce Root - 2008" -# Serial: 11806822484801597146 -# MD5 Fingerprint: 5e:80:9e:84:5a:0e:65:0b:17:02:f3:55:18:2a:3e:d7 -# SHA1 Fingerprint: 78:6a:74:ac:76:ab:14:7f:9c:6a:30:50:ba:9e:a8:7e:fe:9a:ce:3c -# SHA256 Fingerprint: 06:3e:4a:fa:c4:91:df:d3:32:f3:08:9b:85:42:e9:46:17:d8:93:d7:fe:94:4e:10:a7:93:7e:e2:9d:96:93:c0 ------BEGIN CERTIFICATE----- -MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYD -VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 -IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 -MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xKTAnBgNVBAMTIENoYW1iZXJz -IG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEyMjk1MFoXDTM4MDcz -MTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBj -dXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIw -EAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEp -MCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0G -CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW9 -28sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKAXuFixrYp4YFs8r/lfTJq -VKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorjh40G072Q -DuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR -5gN/ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfL -ZEFHcpOrUMPrCXZkNNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05a -Sd+pZgvMPMZ4fKecHePOjlO+Bd5gD2vlGts/4+EhySnB8esHnFIbAURRPHsl18Tl -UlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331lubKgdaX8ZSD6e2wsWsSaR6s -+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ0wlf2eOKNcx5 -Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj -ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAx -hduub+84Mxh2EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNV -HQ4EFgQU+SSsD7K1+HnA+mCIG8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1 -+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpN -YWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29t -L2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVy -ZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAt -IDIwMDiCCQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRV -HSAAMCowKAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20w -DQYJKoZIhvcNAQEFBQADggIBAJASryI1wqM58C7e6bXpeHxIvj99RZJe6dqxGfwW -PJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH3qLPaYRgM+gQDROpI9CF -5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbURWpGqOt1 -glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaH -FoI6M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2 -pSB7+R5KBWIBpih1YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MD -xvbxrN8y8NmBGuScvfaAFPDRLLmF9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QG -tjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcKzBIKinmwPQN/aUv0NCB9szTq -jktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvGnrDQWzilm1De -fhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg -OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZ -d0jQ ------END CERTIFICATE----- - -# Issuer: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. -# Subject: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. -# Label: "Global Chambersign Root - 2008" -# Serial: 14541511773111788494 -# MD5 Fingerprint: 9e:80:ff:78:01:0c:2e:c1:36:bd:fe:96:90:6e:08:f3 -# SHA1 Fingerprint: 4a:bd:ee:ec:95:0d:35:9c:89:ae:c7:52:a1:2c:5b:29:f6:d6:aa:0c -# SHA256 Fingerprint: 13:63:35:43:93:34:a7:69:80:16:a0:d3:24:de:72:28:4e:07:9d:7b:52:20:bb:8f:bd:74:78:16:ee:be:ba:ca ------BEGIN CERTIFICATE----- -MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYD -VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 -IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 -MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD -aGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMxNDBaFw0zODA3MzEx -MjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3Vy -cmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAG -A1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAl -BgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZI -hvcNAQEBBQADggIPADCCAgoCggIBAMDfVtPkOpt2RbQT2//BthmLN0EYlVJH6xed -KYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXfXjaOcNFccUMd2drvXNL7 -G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0ZJJ0YPP2 -zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4 -ddPB/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyG -HoiMvvKRhI9lNNgATH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2 -Id3UwD2ln58fQ1DJu7xsepeY7s2MH/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3V -yJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfeOx2YItaswTXbo6Al/3K1dh3e -beksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSFHTynyQbehP9r -6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh -wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsog -zCtLkykPAgMBAAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQW -BBS5CcqcHtvTbDprru1U8VuTBjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDpr -ru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UEBhMCRVUxQzBBBgNVBAcTOk1hZHJp -ZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJmaXJtYS5jb20vYWRk -cmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJmaXJt -YSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiC -CQDJzdPp1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCow -KAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZI -hvcNAQEFBQADggIBAICIf3DekijZBZRG/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZ -UohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6ReAJ3spED8IXDneRRXoz -X1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/sdZ7LoR/x -fxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVz -a2Mg9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yyd -Yhz2rXzdpjEetrHHfoUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMd -SqlapskD7+3056huirRXhOukP9DuqqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9O -AP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETrP3iZ8ntxPjzxmKfFGBI/5rso -M0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVqc5iJWzouE4ge -v8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z -09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B ------END CERTIFICATE----- - -# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. -# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. -# Label: "Go Daddy Root Certificate Authority - G2" -# Serial: 0 -# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01 -# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b -# SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT -EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp -ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz -NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH -EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE -AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw -DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD -E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH -/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy -DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh -GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR -tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA -AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE -FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX -WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu -9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr -gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo -2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO -LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI -4uJEvlz36hz1 ------END CERTIFICATE----- - -# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Label: "Starfield Root Certificate Authority - G2" -# Serial: 0 -# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96 -# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e -# SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5 ------BEGIN CERTIFICATE----- -MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT -HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs -ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw -MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 -b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj -aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp -Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg -nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 -HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N -Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN -dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 -HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO -BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G -CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU -sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 -4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg -8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K -pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 -mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 ------END CERTIFICATE----- - -# Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Label: "Starfield Services Root Certificate Authority - G2" -# Serial: 0 -# MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2 -# SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f -# SHA256 Fingerprint: 56:8d:69:05:a2:c8:87:08:a4:b3:02:51:90:ed:cf:ed:b1:97:4a:60:6a:13:c6:e5:29:0f:cb:2a:e6:3e:da:b5 ------BEGIN CERTIFICATE----- -MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT -HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs -ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 -MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD -VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy -ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy -dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p -OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2 -8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K -Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe -hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk -6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw -DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q -AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI -bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB -ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z -qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd -iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn -0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN -sSi6 ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Commercial O=AffirmTrust -# Subject: CN=AffirmTrust Commercial O=AffirmTrust -# Label: "AffirmTrust Commercial" -# Serial: 8608355977964138876 -# MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7 -# SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7 -# SHA256 Fingerprint: 03:76:ab:1d:54:c5:f9:80:3c:e4:b2:e2:01:a0:ee:7e:ef:7b:57:b6:36:e8:a9:3c:9b:8d:48:60:c9:6f:5f:a7 ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE -BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz -dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL -MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp -cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP -Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr -ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL -MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1 -yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr -VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/ -nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ -KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG -XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj -vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt -Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g -N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC -nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Networking O=AffirmTrust -# Subject: CN=AffirmTrust Networking O=AffirmTrust -# Label: "AffirmTrust Networking" -# Serial: 8957382827206547757 -# MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f -# SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f -# SHA256 Fingerprint: 0a:81:ec:5a:92:97:77:f1:45:90:4a:f3:8d:5d:50:9f:66:b5:e2:c5:8f:cd:b5:31:05:8b:0e:17:f3:f0:b4:1b ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE -BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz -dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL -MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp -cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y -YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua -kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL -QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp -6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG -yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i -QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ -KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO -tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu -QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ -Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u -olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48 -x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Premium O=AffirmTrust -# Subject: CN=AffirmTrust Premium O=AffirmTrust -# Label: "AffirmTrust Premium" -# Serial: 7893706540734352110 -# MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57 -# SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27 -# SHA256 Fingerprint: 70:a7:3f:7f:37:6b:60:07:42:48:90:45:34:b1:14:82:d5:bf:0e:69:8e:cc:49:8d:f5:25:77:eb:f2:e9:3b:9a ------BEGIN CERTIFICATE----- -MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE -BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz -dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG -A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U -cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf -qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ -JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ -+jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS -s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5 -HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7 -70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG -V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S -qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S -5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia -C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX -OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE -FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ -BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2 -KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg -Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B -8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ -MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc -0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ -u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF -u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH -YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8 -GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO -RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e -KeC2uAloGRwYQw== ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust -# Subject: CN=AffirmTrust Premium ECC O=AffirmTrust -# Label: "AffirmTrust Premium ECC" -# Serial: 8401224907861490260 -# MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d -# SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb -# SHA256 Fingerprint: bd:71:fd:f6:da:97:e4:cf:62:d1:64:7a:dd:25:81:b0:7d:79:ad:f8:39:7e:b4:ec:ba:9c:5e:84:88:82:14:23 ------BEGIN CERTIFICATE----- -MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC -VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ -cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ -BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt -VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D -0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9 -ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G -A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G -A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs -aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I -flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ== ------END CERTIFICATE----- - -# Issuer: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Subject: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Label: "Certum Trusted Network CA" -# Serial: 279744 -# MD5 Fingerprint: d5:e9:81:40:c5:18:69:fc:46:2c:89:75:62:0f:aa:78 -# SHA1 Fingerprint: 07:e0:32:e0:20:b7:2c:3f:19:2f:06:28:a2:59:3a:19:a7:0f:06:9e -# SHA256 Fingerprint: 5c:58:46:8d:55:f5:8e:49:7e:74:39:82:d2:b5:00:10:b6:d1:65:37:4a:cf:83:a7:d4:a3:2d:b7:68:c4:40:8e ------BEGIN CERTIFICATE----- -MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM -MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D -ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU -cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3 -WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg -Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw -IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B -AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH -UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM -TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU -BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM -kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x -AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV -HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y -sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL -I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8 -J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY -VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI -03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= ------END CERTIFICATE----- - -# Issuer: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA -# Subject: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA -# Label: "TWCA Root Certification Authority" -# Serial: 1 -# MD5 Fingerprint: aa:08:8f:f6:f9:7b:b7:f2:b1:a7:1e:9b:ea:ea:bd:79 -# SHA1 Fingerprint: cf:9e:87:6d:d3:eb:fc:42:26:97:a3:b5:a3:7a:a0:76:a9:06:23:48 -# SHA256 Fingerprint: bf:d8:8f:e1:10:1c:41:ae:3e:80:1b:f8:be:56:35:0e:e9:ba:d1:a6:b9:bd:51:5e:dc:5c:6d:5b:87:11:ac:44 ------BEGIN CERTIFICATE----- -MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES -MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU -V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz -WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO -LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB -AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE -AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH -K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX -RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z -rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx -3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq -hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC -MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls -XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D -lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn -aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ -YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== ------END CERTIFICATE----- - -# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 -# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 -# Label: "Security Communication RootCA2" -# Serial: 0 -# MD5 Fingerprint: 6c:39:7d:a4:0e:55:59:b2:3f:d6:41:b1:12:50:de:43 -# SHA1 Fingerprint: 5f:3b:8c:f2:f8:10:b3:7d:78:b4:ce:ec:19:19:c3:73:34:b9:c7:74 -# SHA256 Fingerprint: 51:3b:2c:ec:b8:10:d4:cd:e5:dd:85:39:1a:df:c6:c2:dd:60:d8:7b:b7:36:d2:b5:21:48:4a:a4:7a:0e:be:f6 ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl -MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe -U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX -DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy -dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj -YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV -OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr -zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM -VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ -hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO -ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw -awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs -OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 -DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF -coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc -okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8 -t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy -1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/ -SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 ------END CERTIFICATE----- - -# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority -# Subject: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority -# Label: "Hellenic Academic and Research Institutions RootCA 2011" -# Serial: 0 -# MD5 Fingerprint: 73:9f:4c:4b:73:5b:79:e9:fa:ba:1c:ef:6e:cb:d5:c9 -# SHA1 Fingerprint: fe:45:65:9b:79:03:5b:98:a1:61:b5:51:2e:ac:da:58:09:48:22:4d -# SHA256 Fingerprint: bc:10:4f:15:a4:8b:e7:09:dc:a5:42:a7:e1:d4:b9:df:6f:05:45:27:e8:02:ea:a9:2d:59:54:44:25:8a:fe:71 ------BEGIN CERTIFICATE----- -MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1Ix -RDBCBgNVBAoTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 -dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1p -YyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExMB4XDTExMTIw -NjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYTAkdSMUQwQgYDVQQK -EztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENl -cnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl -c2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBAKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPz -dYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJ -fel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa71HFK9+WXesyHgLacEns -bgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u8yBRQlqD -75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSP -FEDH3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNV -HRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp -5dgTBCPuQSUwRwYDVR0eBEAwPqA8MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQu -b3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQub3JnMA0GCSqGSIb3DQEBBQUA -A4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVtXdMiKahsog2p -6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 -TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7 -dIsXRSZMFpGD/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8Acys -Nnq/onN694/BtZqhFLKPM58N7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXI -l7WdmplNsDz4SgCbZN2fOUvRJ9e4 ------END CERTIFICATE----- - -# Issuer: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 -# Subject: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 -# Label: "Actalis Authentication Root CA" -# Serial: 6271844772424770508 -# MD5 Fingerprint: 69:c1:0d:4f:07:a3:1b:c3:fe:56:3d:04:bc:11:f6:a6 -# SHA1 Fingerprint: f3:73:b3:87:06:5a:28:84:8a:f2:f3:4a:ce:19:2b:dd:c7:8e:9c:ac -# SHA256 Fingerprint: 55:92:60:84:ec:96:3a:64:b9:6e:2a:be:01:ce:0b:a8:6a:64:fb:fe:bc:c7:aa:b5:af:c1:55:b3:7f:d7:60:66 ------BEGIN CERTIFICATE----- -MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE -BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w -MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 -IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC -SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1 -ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv -UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX -4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9 -KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/ -gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb -rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ -51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F -be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe -KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F -v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn -fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7 -jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz -ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt -ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL -e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70 -jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz -WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V -SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j -pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX -X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok -fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R -K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU -ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU -LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT -LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== ------END CERTIFICATE----- - -# Issuer: O=Trustis Limited OU=Trustis FPS Root CA -# Subject: O=Trustis Limited OU=Trustis FPS Root CA -# Label: "Trustis FPS Root CA" -# Serial: 36053640375399034304724988975563710553 -# MD5 Fingerprint: 30:c9:e7:1e:6b:e6:14:eb:65:b2:16:69:20:31:67:4d -# SHA1 Fingerprint: 3b:c0:38:0b:33:c3:f6:a6:0c:86:15:22:93:d9:df:f5:4b:81:c0:04 -# SHA256 Fingerprint: c1:b4:82:99:ab:a5:20:8f:e9:63:0a:ce:55:ca:68:a0:3e:da:5a:51:9c:88:02:a0:d3:a6:73:be:8f:8e:55:7d ------BEGIN CERTIFICATE----- -MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBF -MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQL -ExNUcnVzdGlzIEZQUyBSb290IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTEx -MzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1RydXN0aXMgTGltaXRlZDEc -MBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQRUN+ -AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihH -iTHcDnlkH5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjj -vSkCqPoc4Vu5g6hBSLwacY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA -0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zto3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlB -OrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEAAaNTMFEwDwYDVR0TAQH/ -BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAdBgNVHQ4E -FgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01 -GX2cGE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmW -zaD+vkAMXBJV+JOCyinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP4 -1BIy+Q7DsdwyhEQsb8tGD+pmQQ9P8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZE -f1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHVl/9D7S3B2l0pKoU/rGXuhg8F -jZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYliB6XzCGcKQEN -ZetX2fNXlrtIzYE= ------END CERTIFICATE----- - -# Issuer: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 -# Subject: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 -# Label: "Buypass Class 2 Root CA" -# Serial: 2 -# MD5 Fingerprint: 46:a7:d2:fe:45:fb:64:5a:a8:59:90:9b:78:44:9b:29 -# SHA1 Fingerprint: 49:0a:75:74:de:87:0a:47:fe:58:ee:f6:c7:6b:eb:c6:0b:12:40:99 -# SHA256 Fingerprint: 9a:11:40:25:19:7c:5b:b9:5d:94:e6:3d:55:cd:43:79:08:47:b6:46:b2:3c:df:11:ad:a4:a0:0e:ff:15:fb:48 ------BEGIN CERTIFICATE----- -MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd -MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg -Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow -TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw -HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB -BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr -6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV -L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91 -1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx -MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ -QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB -arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr -Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi -FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS -P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN -9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP -AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz -uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h -9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s -A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t -OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo -+fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7 -KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2 -DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us -H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ -I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7 -5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h -3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz -Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA= ------END CERTIFICATE----- - -# Issuer: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 -# Subject: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 -# Label: "Buypass Class 3 Root CA" -# Serial: 2 -# MD5 Fingerprint: 3d:3b:18:9e:2c:64:5a:e8:d5:88:ce:0e:f9:37:c2:ec -# SHA1 Fingerprint: da:fa:f7:fa:66:84:ec:06:8f:14:50:bd:c7:c2:81:a5:bc:a9:64:57 -# SHA256 Fingerprint: ed:f7:eb:bc:a2:7a:2a:38:4d:38:7b:7d:40:10:c6:66:e2:ed:b4:84:3e:4c:29:b4:ae:1d:5b:93:32:e6:b2:4d ------BEGIN CERTIFICATE----- -MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd -MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg -Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow -TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw -HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB -BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y -ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E -N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9 -tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX -0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c -/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X -KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY -zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS -O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D -34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP -K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3 -AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv -Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj -QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV -cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS -IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2 -HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa -O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv -033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u -dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE -kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41 -3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD -u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq -4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc= ------END CERTIFICATE----- - -# Issuer: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Subject: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Label: "T-TeleSec GlobalRoot Class 3" -# Serial: 1 -# MD5 Fingerprint: ca:fb:40:a8:4e:39:92:8a:1d:fe:8e:2f:c4:27:ea:ef -# SHA1 Fingerprint: 55:a6:72:3e:cb:f2:ec:cd:c3:23:74:70:19:9d:2a:be:11:e3:81:d1 -# SHA256 Fingerprint: fd:73:da:d3:1c:64:4f:f1:b4:3b:ef:0c:cd:da:96:71:0b:9c:d9:87:5e:ca:7e:31:70:7a:f3:e9:6d:52:2b:bd ------BEGIN CERTIFICATE----- -MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx -KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd -BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl -YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1 -OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy -aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 -ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN -8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/ -RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4 -hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5 -ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM -EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj -QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1 -A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy -WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ -1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30 -6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT -91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml -e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p -TpPDpFQUWw== ------END CERTIFICATE----- - -# Issuer: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus -# Subject: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus -# Label: "EE Certification Centre Root CA" -# Serial: 112324828676200291871926431888494945866 -# MD5 Fingerprint: 43:5e:88:d4:7d:1a:4a:7e:fd:84:2e:52:eb:01:d4:6f -# SHA1 Fingerprint: c9:a8:b9:e7:55:80:5e:58:e3:53:77:a7:25:eb:af:c3:7b:27:cc:d7 -# SHA256 Fingerprint: 3e:84:ba:43:42:90:85:16:e7:75:73:c0:99:2f:09:79:ca:08:4e:46:85:68:1f:f1:95:cc:ba:8a:22:9b:8a:76 ------BEGIN CERTIFICATE----- -MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1 -MQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1 -czEoMCYGA1UEAwwfRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYG -CSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIwMTAxMDMwMTAxMDMwWhgPMjAzMDEy -MTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlBUyBTZXJ0aWZpdHNl -ZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBS -b290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEB -AQUAA4IBDwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUy -euuOF0+W2Ap7kaJjbMeMTC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvO -bntl8jixwKIy72KyaOBhU8E2lf/slLo2rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIw -WFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw93X2PaRka9ZP585ArQ/d -MtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtNP2MbRMNE -1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYD -VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/ -zQas8fElyalL1BSZMEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYB -BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEF -BQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+RjxY6hUFaTlrg4wCQiZrxTFGGV -v9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqMlIpPnTX/dqQG -E5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u -uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIW -iAYLtqZLICjU3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/v -GVCJYMzpJJUPwssd8m92kMfMdcGWxZ0= ------END CERTIFICATE----- - -# Issuer: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH -# Subject: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH -# Label: "D-TRUST Root Class 3 CA 2 2009" -# Serial: 623603 -# MD5 Fingerprint: cd:e0:25:69:8d:47:ac:9c:89:35:90:f7:fd:51:3d:2f -# SHA1 Fingerprint: 58:e8:ab:b0:36:15:33:fb:80:f7:9b:1b:6d:29:d3:ff:8d:5f:00:f0 -# SHA256 Fingerprint: 49:e7:a4:42:ac:f0:ea:62:87:05:00:54:b5:25:64:b6:50:e4:f4:9e:42:e3:48:d6:aa:38:e0:39:e9:57:b1:c1 ------BEGIN CERTIFICATE----- -MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF -MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD -bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha -ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM -HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03 -UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42 -tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R -ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM -lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp -/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G -A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G -A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj -dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy -MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl -cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js -L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL -BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni -acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 -o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K -zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8 -PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y -Johw1+qRzT65ysCQblrGXnRl11z+o+I= ------END CERTIFICATE----- - -# Issuer: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH -# Subject: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH -# Label: "D-TRUST Root Class 3 CA 2 EV 2009" -# Serial: 623604 -# MD5 Fingerprint: aa:c6:43:2c:5e:2d:cd:c4:34:c0:50:4f:11:02:4f:b6 -# SHA1 Fingerprint: 96:c9:1b:0b:95:b4:10:98:42:fa:d0:d8:22:79:fe:60:fa:b9:16:83 -# SHA256 Fingerprint: ee:c5:49:6b:98:8c:e9:86:25:b9:34:09:2e:ec:29:08:be:d0:b0:f3:16:c2:d4:73:0c:84:ea:f1:f3:d3:48:81 ------BEGIN CERTIFICATE----- -MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF -MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD -bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw -NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV -BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn -ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0 -3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z -qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR -p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8 -HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw -ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea -HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw -Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh -c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E -RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt -dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku -Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp -3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 -nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF -CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na -xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX -KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1 ------END CERTIFICATE----- - -# Issuer: CN=CA Disig Root R2 O=Disig a.s. -# Subject: CN=CA Disig Root R2 O=Disig a.s. -# Label: "CA Disig Root R2" -# Serial: 10572350602393338211 -# MD5 Fingerprint: 26:01:fb:d8:27:a7:17:9a:45:54:38:1a:43:01:3b:03 -# SHA1 Fingerprint: b5:61:eb:ea:a4:de:e4:25:4b:69:1a:98:a5:57:47:c2:34:c7:d9:71 -# SHA256 Fingerprint: e2:3d:4a:03:6d:7b:70:e9:f5:95:b1:42:20:79:d2:b9:1e:df:bb:1f:b6:51:a0:63:3e:aa:8a:9d:c5:f8:07:03 ------BEGIN CERTIFICATE----- -MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV -BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu -MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy -MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx -EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw -ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe -NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH -PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I -x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe -QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR -yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO -QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912 -H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ -QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD -i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs -nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1 -rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud -DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI -hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM -tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf -GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb -lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka -+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal -TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i -nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3 -gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr -G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os -zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x -L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL ------END CERTIFICATE----- - -# Issuer: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV -# Subject: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV -# Label: "ACCVRAIZ1" -# Serial: 6828503384748696800 -# MD5 Fingerprint: d0:a0:5a:ee:05:b6:09:94:21:a1:7d:f1:b2:29:82:02 -# SHA1 Fingerprint: 93:05:7a:88:15:c6:4f:ce:88:2f:fa:91:16:52:28:78:bc:53:64:17 -# SHA256 Fingerprint: 9a:6e:c0:12:e1:a7:da:9d:be:34:19:4d:47:8a:d7:c0:db:18:22:fb:07:1d:f1:29:81:49:6e:d1:04:38:41:13 ------BEGIN CERTIFICATE----- -MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE -AwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw -CQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQ -BgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUND -VjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCb -qau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoY -HtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWo -G2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpA -lHPrzg5XPAOBOp0KoVdDaaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhr -IA8wKFSVf+DuzgpmndFALW4ir50awQUZ0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/ -0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eH -k6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/47 -4KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMO -m3WR5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpa -cXpkatcnYGMN285J9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPl -uUsXQA+xtrn13k/c4LOsOxFwYIRKQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYI -KwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRwOi8vd3d3LmFjY3YuZXMvZmls -ZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEuY3J0MB8GCCsG -AQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 -VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeT -VfZW6oHlNsyMHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIG -CCsGAQUFBwICMIIBFB6CARAAQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUA -cgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBhAO0AegAgAGQAZQAgAGwAYQAgAEEA -QwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUAYwBuAG8AbABvAGcA -7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBjAHQA -cgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAA -QwBQAFMAIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUA -czAwBggrBgEFBQcCARYkaHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2Mu -aHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRt -aW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2MV9kZXIuY3JsMA4GA1Ud -DwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZIhvcNAQEF -BQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdp -D70ER9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gU -JyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+m -AM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepD -vV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlms -tn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH -7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h -I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szA -h1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xF -d3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H -pPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7 ------END CERTIFICATE----- - -# Issuer: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA -# Subject: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA -# Label: "TWCA Global Root CA" -# Serial: 3262 -# MD5 Fingerprint: f9:03:7e:cf:e6:9e:3c:73:7a:2a:90:07:69:ff:2b:96 -# SHA1 Fingerprint: 9c:bb:48:53:f6:a4:f6:d3:52:a4:e8:32:52:55:60:13:f5:ad:af:65 -# SHA256 Fingerprint: 59:76:90:07:f7:68:5d:0f:cd:50:87:2f:9f:95:d5:75:5a:5b:2b:45:7d:81:f3:69:2b:61:0a:98:67:2f:0e:1b ------BEGIN CERTIFICATE----- -MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcx -EjAQBgNVBAoTCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMT -VFdDQSBHbG9iYWwgUm9vdCBDQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5 -NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQKEwlUQUlXQU4tQ0ExEDAOBgNVBAsT -B1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3QgQ0EwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2CnJfF -10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz -0ALfUPZVr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfCh -MBwqoJimFb3u/Rk28OKRQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbH -zIh1HrtsBv+baz4X7GGqcXzGHaL3SekVtTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc -46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1WKKD+u4ZqyPpcC1jcxkt2 -yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99sy2sbZCi -laLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYP -oA/pyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQA -BDzfuBSO6N+pjWxnkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcE -qYSjMq+u7msXi7Kx/mzhkIyIqJdIzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm -4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6gcFGn90xHNcgL -1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn -LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WF -H6vPNOw/KP4M8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNo -RI2T9GRwoD2dKAXDOXC4Ynsg/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+ -nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlglPx4mI88k1HtQJAH32RjJMtOcQWh -15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryPA9gK8kxkRr05YuWW -6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3mi4TW -nsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5j -wa19hAM8EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWz -aGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmy -KwbQBM0= ------END CERTIFICATE----- - -# Issuer: CN=TeliaSonera Root CA v1 O=TeliaSonera -# Subject: CN=TeliaSonera Root CA v1 O=TeliaSonera -# Label: "TeliaSonera Root CA v1" -# Serial: 199041966741090107964904287217786801558 -# MD5 Fingerprint: 37:41:49:1b:18:56:9a:26:f5:ad:c2:66:fb:40:a5:4c -# SHA1 Fingerprint: 43:13:bb:96:f1:d5:86:9b:c1:4e:6a:92:f6:cf:f6:34:69:87:82:37 -# SHA256 Fingerprint: dd:69:36:fe:21:f8:f0:77:c1:23:a1:a5:21:c1:22:24:f7:22:55:b7:3e:03:a7:26:06:93:e8:a2:4b:0f:a3:89 ------BEGIN CERTIFICATE----- -MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAw -NzEUMBIGA1UECgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJv -b3QgQ0EgdjEwHhcNMDcxMDE4MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYD -VQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwWVGVsaWFTb25lcmEgUm9vdCBDQSB2 -MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+6yfwIaPzaSZVfp3F -VRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA3GV1 -7CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+X -Z75Ljo1kB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+ -/jXh7VB7qTCNGdMJjmhnXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs -81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxHoLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkm -dtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3F0fUTPHSiXk+TT2YqGHe -Oh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJoWjiUIMu -sDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4 -pgd7gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fs -slESl1MpWtTwEhDcTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQ -arMCpgKIv7NHfirZ1fpoeDVNAgMBAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYD -VR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qWDNXr+nuqF+gTEjANBgkqhkiG -9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNmzqjMDfz1mgbl -dxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx -0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1Tj -TQpgcmLNkQfWpb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBed -Y2gea+zDTYa4EzAvXUYNR0PVG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7 -Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpcc41teyWRyu5FrgZLAMzTsVlQ2jqI -OylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOTJsjrDNYmiLbAJM+7 -vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2qReW -t88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcn -HL/EVlP6Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVx -SK236thZiNSQvxaz2emsWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= ------END CERTIFICATE----- - -# Issuer: CN=E-Tugra Certification Authority O=E-Tu\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. OU=E-Tugra Sertifikasyon Merkezi -# Subject: CN=E-Tugra Certification Authority O=E-Tu\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. OU=E-Tugra Sertifikasyon Merkezi -# Label: "E-Tugra Certification Authority" -# Serial: 7667447206703254355 -# MD5 Fingerprint: b8:a1:03:63:b0:bd:21:71:70:8a:6f:13:3a:bb:79:49 -# SHA1 Fingerprint: 51:c6:e7:08:49:06:6e:f3:92:d4:5c:a0:0d:6d:a3:62:8f:c3:52:39 -# SHA256 Fingerprint: b0:bf:d5:2b:b0:d7:d9:bd:92:bf:5d:4d:c1:3d:a2:55:c0:2c:54:2f:37:83:65:ea:89:39:11:f5:5e:55:f2:3c ------BEGIN CERTIFICATE----- -MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNV -BAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBC -aWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNV -BAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQDDB9FLVR1 -Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMwNTEyMDk0OFoXDTIz -MDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+ -BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhp -em1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN -ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4vU/kwVRHoViVF56C/UY -B4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vdhQd2h8y/L5VMzH2nPbxH -D5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5KCKpbknSF -Q9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEo -q1+gElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3D -k14opz8n8Y4e0ypQBaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcH -fC425lAcP9tDJMW/hkd5s3kc91r0E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsut -dEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gzrt48Ue7LE3wBf4QOXVGUnhMM -ti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAqjqFGOjGY5RH8 -zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn -rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUX -U8u3Zg5mTPj5dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6 -Jyr+zE7S6E5UMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5 -XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAF -Nzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAKkEh47U6YA5n+KGCR -HTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jOXKqY -GwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c -77NCR807VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3 -+GbHeJAAFS6LrVE1Uweoa2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WK -vJUawSg5TB9D0pH0clmKuVb8P7Sd2nCcdlqMQ1DujjByTd//SffGqWfZbawCEeI6 -FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEVKV0jq9BgoRJP3vQXzTLl -yb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gTDx4JnW2P -AJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpD -y4Q08ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8d -NL/+I5c30jn6PQ0GC7TbO6Orb1wdtn7os4I07QZcJA== ------END CERTIFICATE----- - -# Issuer: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Subject: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Label: "T-TeleSec GlobalRoot Class 2" -# Serial: 1 -# MD5 Fingerprint: 2b:9b:9e:e4:7b:6c:1f:00:72:1a:cc:c1:77:79:df:6a -# SHA1 Fingerprint: 59:0d:2d:7d:88:4f:40:2e:61:7e:a5:62:32:17:65:cf:17:d8:94:e9 -# SHA256 Fingerprint: 91:e2:f5:78:8d:58:10:eb:a7:ba:58:73:7d:e1:54:8a:8e:ca:cd:01:45:98:bc:0b:14:3e:04:1b:17:05:25:52 ------BEGIN CERTIFICATE----- -MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx -KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd -BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl -YyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgxMDAxMTA0MDE0WhcNMzMxMDAxMjM1 -OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy -aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 -ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUd -AqSzm1nzHoqvNK38DcLZSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiC -FoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/FvudocP05l03Sx5iRUKrERLMjfTlH6VJi -1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx9702cu+fjOlbpSD8DT6Iavq -jnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGVWOHAD3bZ -wI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGj -QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/ -WSA2AHmgoCJrjNXyYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhy -NsZt+U2e+iKo4YFWz827n+qrkRk4r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPAC -uvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNfvNoBYimipidx5joifsFvHZVw -IEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR3p1m0IvVVGb6 -g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN -9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlP -BSeOE6Fuwg== ------END CERTIFICATE----- - -# Issuer: CN=Atos TrustedRoot 2011 O=Atos -# Subject: CN=Atos TrustedRoot 2011 O=Atos -# Label: "Atos TrustedRoot 2011" -# Serial: 6643877497813316402 -# MD5 Fingerprint: ae:b9:c4:32:4b:ac:7f:5d:66:cc:77:94:bb:2a:77:56 -# SHA1 Fingerprint: 2b:b1:f5:3e:55:0c:1d:c5:f1:d4:e6:b7:6a:46:4b:55:06:02:ac:21 -# SHA256 Fingerprint: f3:56:be:a2:44:b7:a9:1e:b3:5d:53:ca:9a:d7:86:4a:ce:01:8e:2d:35:d5:f8:f9:6d:df:68:a6:f4:1a:a4:74 ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UE -AwwVQXRvcyBUcnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQG -EwJERTAeFw0xMTA3MDcxNDU4MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMM -FUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsGA1UECgwEQXRvczELMAkGA1UEBhMC -REUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVhTuXbyo7LjvPpvMp -Nb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr54rM -VD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+ -SZFhyBH+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ -4J7sVaE3IqKHBAUsR320HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0L -cp2AMBYHlT8oDv3FdU9T1nSatCQujgKRz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQi -eowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7Rl+lwrrw7GWzbITAPBgNV -HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZbNshMBgG -A1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3 -DQEBCwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8j -vZfza1zv7v1Apt+hk6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kP -DpFrdRbhIfzYJsdHt6bPWHJxfrrhTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pc -maHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a961qn8FYiqTxlVMYVqL2Gns2D -lmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G3mB/ufNPRJLv -KrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 1 G3" -# Serial: 687049649626669250736271037606554624078720034195 -# MD5 Fingerprint: a4:bc:5b:3f:fe:37:9a:fa:64:f0:e2:fa:05:3d:0b:ab -# SHA1 Fingerprint: 1b:8e:ea:57:96:29:1a:c9:39:ea:b8:0a:81:1a:73:73:c0:93:79:67 -# SHA256 Fingerprint: 8a:86:6f:d1:b2:76:b5:7e:57:8e:92:1c:65:82:8a:2b:ed:58:e9:f2:f2:88:05:41:34:b7:f1:f4:bf:c9:cc:74 ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQEL -BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc -BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00 -MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEgRzMwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakEPBtV -wedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWe -rNrwU8lmPNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF341 -68Xfuw6cwI2H44g4hWf6Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh -4Pw5qlPafX7PGglTvF0FBM+hSo+LdoINofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXp -UhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/lg6AnhF4EwfWQvTA9xO+o -abw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV7qJZjqlc -3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/G -KubX9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSt -hfbZxbGL0eUQMk1fiyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KO -Tk0k+17kBL5yG6YnLUlamXrXXAkgt3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOt -zCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZIhvcNAQELBQAD -ggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC -MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2 -cDMT/uFPpiN3GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUN -qXsCHKnQO18LwIE6PWThv6ctTr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5 -YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP+V04ikkwj+3x6xn0dxoxGE1nVGwv -b2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh3jRJjehZrJ3ydlo2 -8hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fawx/k -NSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNj -ZgKAvQU6O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhp -q1467HxpvMc7hU6eFbm0FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFt -nh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOVhMJKzRwuJIczYOXD ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 2 G3" -# Serial: 390156079458959257446133169266079962026824725800 -# MD5 Fingerprint: af:0c:86:6e:bf:40:2d:7f:0b:3e:12:50:ba:12:3d:06 -# SHA1 Fingerprint: 09:3c:61:f3:8b:8b:dc:7d:55:df:75:38:02:05:00:e1:25:f5:c8:36 -# SHA256 Fingerprint: 8f:e4:fb:0a:f9:3a:4d:0d:67:db:0b:eb:b2:3e:37:c7:1b:f3:25:dc:bc:dd:24:0e:a0:4d:af:58:b4:7e:18:40 ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQEL -BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc -BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00 -MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIgRzMwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFhZiFf -qq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMW -n4rjyduYNM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ym -c5GQYaYDFCDy54ejiK2toIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+ -O7q414AB+6XrW7PFXmAqMaCvN+ggOp+oMiwMzAkd056OXbxMmO7FGmh77FOm6RQ1 -o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+lV0POKa2Mq1W/xPtbAd0j -IaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZoL1NesNKq -IcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz -8eQQsSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43eh -vNURG3YBZwjgQQvD6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l -7ZizlWNof/k19N+IxWA1ksB8aRxhlRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALG -cC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZIhvcNAQELBQAD -ggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 -AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RC -roijQ1h5fq7KpVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0Ga -W/ZZGYjeVYg3UQt4XAoeo0L9x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4n -lv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgzdWqTHBLmYF5vHX/JHyPLhGGfHoJE -+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6XU/IyAgkwo1jwDQHV -csaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+NwmNtd -dbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNg -KCLjsZWDzYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeM -HVOyToV7BjjHLPj4sHKNJeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4 -WSr2Rz0ZiC3oheGe7IUIarFsNMkd7EgrO3jtZsSOeWmD3n+M ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 3 G3" -# Serial: 268090761170461462463995952157327242137089239581 -# MD5 Fingerprint: df:7d:b9:ad:54:6f:68:a1:df:89:57:03:97:43:b0:d7 -# SHA1 Fingerprint: 48:12:bd:92:3c:a8:c4:39:06:e7:30:6d:27:96:e6:a4:cf:22:2e:7d -# SHA256 Fingerprint: 88:ef:81:de:20:2e:b0:18:45:2e:43:f8:64:72:5c:ea:5f:bd:1f:c2:d9:d2:05:73:07:09:c5:d8:b8:69:0f:46 ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQEL -BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc -BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00 -MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMgRzMwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286IxSR -/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNu -FoM7pmRLMon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXR -U7Ox7sWTaYI+FrUoRqHe6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+c -ra1AdHkrAj80//ogaX3T7mH1urPnMNA3I4ZyYUUpSFlob3emLoG+B01vr87ERROR -FHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3UVDmrJqMz6nWB2i3ND0/k -A9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f75li59wzw -eyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634Ryl -sSqiMd5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBp -VzgeAVuNVejH38DMdyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0Q -A4XN8f+MFrXBsj6IbGB/kE+V9/YtrQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ -ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZIhvcNAQELBQAD -ggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px -KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnI -FUBhynLWcKzSt/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5Wvv -oxXqA/4Ti2Tk08HS6IT7SdEQTXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFg -u/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9DuDcpmvJRPpq3t/O5jrFc/ZSXPsoaP -0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGibIh6BJpsQBJFxwAYf -3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmDhPbl -8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+ -DhcI00iX0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HN -PlopNLk9hM6xZdRZkZFWdSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ -ywaZWWDYWGWVjUTR939+J399roD1B0y2PpxxVJkES/1Y+Zj0 ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Assured ID Root G2" -# Serial: 15385348160840213938643033620894905419 -# MD5 Fingerprint: 92:38:b9:f8:63:24:82:65:2c:57:33:e6:fe:81:8f:9d -# SHA1 Fingerprint: a1:4b:48:d9:43:ee:0a:0e:40:90:4f:3c:e0:a4:c0:91:93:51:5d:3f -# SHA256 Fingerprint: 7d:05:eb:b6:82:33:9f:8c:94:51:ee:09:4e:eb:fe:fa:79:53:a1:14:ed:b2:f4:49:49:45:2f:ab:7d:2f:c1:85 ------BEGIN CERTIFICATE----- -MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBl -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv -b3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl -cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSA -n61UQbVH35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4Htecc -biJVMWWXvdMX0h5i89vqbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9Hp -EgjAALAcKxHad3A2m67OeYfcgnDmCXRwVWmvo2ifv922ebPynXApVfSr/5Vh88lA -bx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OPYLfykqGxvYmJHzDNw6Yu -YjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+RnlTGNAgMB -AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQW -BBTOw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPI -QW5pJ6d1Ee88hjZv0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I -0jJmwYrA8y8678Dj1JGG0VDjA9tzd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4Gni -lmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAWhsI6yLETcDbYz+70CjTVW0z9 -B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0MjomZmWzwPDCv -ON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo -IhNzbM8m9Yop5w== ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Assured ID Root G3" -# Serial: 15459312981008553731928384953135426796 -# MD5 Fingerprint: 7c:7f:65:31:0c:81:df:8d:ba:3e:99:e2:5c:ad:6e:fb -# SHA1 Fingerprint: f5:17:a2:4f:9a:48:c6:c9:f8:a2:00:26:9f:dc:0f:48:2c:ab:30:89 -# SHA256 Fingerprint: 7e:37:cb:8b:4c:47:09:0c:ab:36:55:1b:a6:f4:5d:b8:40:68:0f:ba:16:6a:95:2d:b1:00:71:7f:43:05:3f:c2 ------BEGIN CERTIFICATE----- -MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQsw -CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu -ZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg -RzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJV -UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu -Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQBgcq -hkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJf -Zn4f5dwbRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17Q -RSAPWXYQ1qAk8C3eNvJsKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ -BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgFUaFNN6KDec6NHSrkhDAKBggqhkjOPQQD -AwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5FyYZ5eEJJZVrmDxxDnOOlY -JjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy1vUhZscv -6pZjamVFkpUBtA== ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Global Root G2" -# Serial: 4293743540046975378534879503202253541 -# MD5 Fingerprint: e4:a6:8a:c8:54:ac:52:42:46:0a:fd:72:48:1b:2a:44 -# SHA1 Fingerprint: df:3c:24:f9:bf:d6:66:76:1b:26:80:73:fe:06:d1:cc:8d:4f:82:a4 -# SHA256 Fingerprint: cb:3c:cb:b7:60:31:e5:e0:13:8f:8d:d3:9a:23:f9:de:47:ff:c3:5e:43:c1:14:4c:ea:27:d4:6a:5a:b1:cb:5f ------BEGIN CERTIFICATE----- -MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH -MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI -2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx -1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ -q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz -tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ -vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP -BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV -5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY -1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4 -NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG -Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91 -8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe -pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl -MrY= ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Global Root G3" -# Serial: 7089244469030293291760083333884364146 -# MD5 Fingerprint: f5:5d:a4:50:a5:fb:28:7e:1e:0f:0d:cc:96:57:56:ca -# SHA1 Fingerprint: 7e:04:de:89:6a:3e:66:6d:00:e6:87:d3:3f:fa:d9:3b:e8:3d:34:9e -# SHA256 Fingerprint: 31:ad:66:48:f8:10:41:38:c7:38:f3:9e:a4:32:01:33:39:3e:3a:18:cc:02:29:6e:f9:7c:2a:c9:ef:67:31:d0 ------BEGIN CERTIFICATE----- -MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw -CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu -ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe -Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw -EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x -IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF -K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG -fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO -Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd -BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx -AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/ -oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8 -sycX ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Trusted Root G4" -# Serial: 7451500558977370777930084869016614236 -# MD5 Fingerprint: 78:f2:fc:aa:60:1f:2f:b4:eb:c9:37:ba:53:2e:75:49 -# SHA1 Fingerprint: dd:fb:16:cd:49:31:c9:73:a2:03:7d:3f:c8:3a:4d:7d:77:5d:05:e4 -# SHA256 Fingerprint: 55:2f:7b:dc:f1:a7:af:9e:6c:e6:72:01:7f:4f:12:ab:f7:72:40:c7:8e:76:1a:c2:03:d1:d9:d2:0a:c8:99:88 ------BEGIN CERTIFICATE----- -MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBi -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg -RzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJV -UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu -Y29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3y -ithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1If -xp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDV -ySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiO -DCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQ -jdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/ -CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCi -EhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADM -fRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QY -uKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXK -chYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t -9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -hjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD -ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2 -SV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd -+SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWc -fFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqa -sjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9N -cCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N -0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie -4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mI -r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1 -/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm -gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+ ------END CERTIFICATE----- - -# Issuer: CN=COMODO RSA Certification Authority O=COMODO CA Limited -# Subject: CN=COMODO RSA Certification Authority O=COMODO CA Limited -# Label: "COMODO RSA Certification Authority" -# Serial: 101909084537582093308941363524873193117 -# MD5 Fingerprint: 1b:31:b0:71:40:36:cc:14:36:91:ad:c4:3e:fd:ec:18 -# SHA1 Fingerprint: af:e5:d2:44:a8:d1:19:42:30:ff:47:9f:e2:f8:97:bb:cd:7a:8c:b4 -# SHA256 Fingerprint: 52:f0:e1:c4:e5:8e:c6:29:29:1b:60:31:7f:07:46:71:b8:5d:7e:a8:0d:5b:07:27:34:63:53:4b:32:b4:02:34 ------BEGIN CERTIFICATE----- -MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB -hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G -A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV -BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5 -MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT -EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR -Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR -6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X -pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC -9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV -/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf -Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z -+pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w -qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah -SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC -u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf -Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq -crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E -FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB -/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl -wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM -4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV -2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna -FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ -CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK -boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke -jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL -S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb -QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl -0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB -NVOFBkpdn627G190 ------END CERTIFICATE----- - -# Issuer: CN=USERTrust RSA Certification Authority O=The USERTRUST Network -# Subject: CN=USERTrust RSA Certification Authority O=The USERTRUST Network -# Label: "USERTrust RSA Certification Authority" -# Serial: 2645093764781058787591871645665788717 -# MD5 Fingerprint: 1b:fe:69:d1:91:b7:19:33:a3:72:a8:0f:e1:55:e5:b5 -# SHA1 Fingerprint: 2b:8f:1b:57:33:0d:bb:a2:d0:7a:6c:51:f7:0e:e9:0d:da:b9:ad:8e -# SHA256 Fingerprint: e7:93:c9:b0:2f:d8:aa:13:e2:1c:31:22:8a:cc:b0:81:19:64:3b:74:9c:89:89:64:b1:74:6d:46:c3:d4:cb:d2 ------BEGIN CERTIFICATE----- -MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB -iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl -cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV -BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw -MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV -BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU -aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy -dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B -3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY -tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/ -Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2 -VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT -79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6 -c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT -Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l -c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee -UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE -Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd -BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G -A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF -Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO -VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3 -ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs -8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR -iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze -Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ -XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/ -qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB -VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB -L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG -jjxDah2nGN59PRbxYvnKkKj9 ------END CERTIFICATE----- - -# Issuer: CN=USERTrust ECC Certification Authority O=The USERTRUST Network -# Subject: CN=USERTrust ECC Certification Authority O=The USERTRUST Network -# Label: "USERTrust ECC Certification Authority" -# Serial: 123013823720199481456569720443997572134 -# MD5 Fingerprint: fa:68:bc:d9:b5:7f:ad:fd:c9:1d:06:83:28:cc:24:c1 -# SHA1 Fingerprint: d1:cb:ca:5d:b2:d5:2a:7f:69:3b:67:4d:e5:f0:5a:1d:0c:95:7d:f0 -# SHA256 Fingerprint: 4f:f4:60:d5:4b:9c:86:da:bf:bc:fc:57:12:e0:40:0d:2b:ed:3f:bc:4d:4f:bd:aa:86:e0:6a:dc:d2:a9:ad:7a ------BEGIN CERTIFICATE----- -MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL -MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl -eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT -JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx -MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT -Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg -VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo -I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng -o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G -A1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB -zzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW -RNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 -# Label: "GlobalSign ECC Root CA - R4" -# Serial: 14367148294922964480859022125800977897474 -# MD5 Fingerprint: 20:f0:27:68:d1:7e:a0:9d:0e:e6:2a:ca:df:5c:89:8e -# SHA1 Fingerprint: 69:69:56:2e:40:80:f4:24:a1:e7:19:9f:14:ba:f3:ee:58:ab:6a:bb -# SHA256 Fingerprint: be:c9:49:11:c2:95:56:76:db:6c:0a:55:09:86:d7:6e:3b:a0:05:66:7c:44:2c:97:62:b4:fb:b7:73:de:22:8c ------BEGIN CERTIFICATE----- -MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEk -MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpH -bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX -DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD -QSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu -MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprlOQcJ -FspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAw -DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61F -uOJAf/sKbvu+M8k8o4TVMAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGX -kPoUVy0D7O48027KqGx2vKLeuwIgJ6iFJzWbVsaj8kfSt24bAgAXqmemFZHe+pTs -ewv4n4Q= ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 -# Label: "GlobalSign ECC Root CA - R5" -# Serial: 32785792099990507226680698011560947931244 -# MD5 Fingerprint: 9f:ad:3b:1c:02:1e:8a:ba:17:74:38:81:0c:a2:bc:08 -# SHA1 Fingerprint: 1f:24:c6:30:cd:a4:18:ef:20:69:ff:ad:4f:dd:5f:46:3a:1b:69:aa -# SHA256 Fingerprint: 17:9f:bc:14:8a:3d:d0:0f:d2:4e:a1:34:58:cc:43:bf:a7:f5:9c:81:82:d7:83:a5:13:f6:eb:ec:10:0c:89:24 ------BEGIN CERTIFICATE----- -MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEk -MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpH -bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX -DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD -QSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu -MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6SFkc -8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8ke -hOvRnkmSh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYI -KoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg -515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7yFz9SO8NdCKoCOJuxUnO -xwy8p2Fp8fc74SrL+SvzZpA3 ------END CERTIFICATE----- - -# Issuer: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden -# Subject: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden -# Label: "Staat der Nederlanden Root CA - G3" -# Serial: 10003001 -# MD5 Fingerprint: 0b:46:67:07:db:10:2f:19:8c:35:50:60:d1:0b:f4:37 -# SHA1 Fingerprint: d8:eb:6b:41:51:92:59:e0:f3:e7:85:00:c0:3d:b6:88:97:c9:ee:fc -# SHA256 Fingerprint: 3c:4f:b0:b9:5a:b8:b3:00:32:f4:32:b8:6f:53:5f:e1:72:c1:85:d0:fd:39:86:58:37:cf:36:18:7f:a6:f4:28 ------BEGIN CERTIFICATE----- -MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO -TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh -dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloX -DTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl -ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv -b3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4yolQP -cPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WW -IkYFsO2tx1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqX -xz8ecAgwoNzFs21v0IJyEavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFy -KJLZWyNtZrVtB0LrpjPOktvA9mxjeM3KTj215VKb8b475lRgsGYeCasH/lSJEULR -9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUurmkVLoR9BvUhTFXFkC4az -5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU51nus6+N8 -6U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7 -Ngzp07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHP -bMk7ccHViLVlvMDoFxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXt -BznaqB16nzaeErAMZRKQFWDZJkBE41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTt -XUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMBAAGjQjBAMA8GA1UdEwEB/wQF -MAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleuyjWcLhL75Lpd -INyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD -U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwp -LiniyMMB8jPqKqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8 -Ipf3YF3qKS9Ysr1YvY2WTxB1v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixp -gZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA8KCWAg8zxXHzniN9lLf9OtMJgwYh -/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b8KKaa8MFSu1BYBQw -0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0rmj1A -fsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq -4BZ+Extq1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR -1VmiiXTTn74eS9fGbbeIJG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/ -QFH1T/U67cjF68IeHRaVesd+QnGTbksVtzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM -94B7IWcnMFk= ------END CERTIFICATE----- - -# Issuer: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden -# Subject: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden -# Label: "Staat der Nederlanden EV Root CA" -# Serial: 10000013 -# MD5 Fingerprint: fc:06:af:7b:e8:1a:f1:9a:b4:e8:d2:70:1f:c0:f5:ba -# SHA1 Fingerprint: 76:e2:7e:c1:4f:db:82:c1:c0:a6:75:b5:05:be:3d:29:b4:ed:db:bb -# SHA256 Fingerprint: 4d:24:91:41:4c:fe:95:67:46:ec:4c:ef:a6:cf:6f:72:e2:8a:13:29:43:2f:9d:8a:90:7a:c4:cb:5d:ad:c1:5a ------BEGIN CERTIFICATE----- -MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJO -TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFh -dCBkZXIgTmVkZXJsYW5kZW4gRVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0y -MjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5MMR4wHAYDVQQKDBVTdGFhdCBkZXIg -TmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRlcmxhbmRlbiBFViBS -b290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkkSzrS -M4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nC -UiY4iKTWO0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3d -Z//BYY1jTw+bbRcwJu+r0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46p -rfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13l -pJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gVXJrm0w912fxBmJc+qiXb -j5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr08C+eKxC -KFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS -/ZbV0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0X -cgOPvZuM5l5Tnrmd74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH -1vI4gnPah1vlPNOePqc7nvQDs/nxfRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrP -px9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB -/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwaivsnuL8wbqg7 -MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI -eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u -2dfOWBfoqSmuc0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHS -v4ilf0X8rLiltTMMgsT7B/Zq5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTC -wPTxGfARKbalGAKb12NMcIxHowNDXLldRqANb/9Zjr7dn3LDWyvfjFvO5QxGbJKy -CqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tNf1zuacpzEPuKqf2e -vTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi5Dp6 -Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIa -Gl6I6lD4WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeL -eG9QgkRQP2YGiqtDhFZKDyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8 -FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGyeUN51q1veieQA6TqJIc/2b3Z6fJfUEkc -7uzXLg== ------END CERTIFICATE----- - -# Issuer: CN=IdenTrust Commercial Root CA 1 O=IdenTrust -# Subject: CN=IdenTrust Commercial Root CA 1 O=IdenTrust -# Label: "IdenTrust Commercial Root CA 1" -# Serial: 13298821034946342390520003877796839426 -# MD5 Fingerprint: b3:3e:77:73:75:ee:a0:d3:e3:7e:49:63:49:59:bb:c7 -# SHA1 Fingerprint: df:71:7e:aa:4a:d9:4e:c9:55:84:99:60:2d:48:de:5f:bc:f0:3a:25 -# SHA256 Fingerprint: 5d:56:49:9b:e4:d2:e0:8b:cf:ca:d0:8a:3e:38:72:3d:50:50:3b:de:70:69:48:e4:2f:55:60:30:19:e5:28:ae ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBK -MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVu -VHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQw -MTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScw -JQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ldhNlT -3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU -+ehcCuz/mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gp -S0l4PJNgiCL8mdo2yMKi1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1 -bVoE/c40yiTcdCMbXTMTEl3EASX2MN0CXZ/g1Ue9tOsbobtJSdifWwLziuQkkORi -T0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl3ZBWzvurpWCdxJ35UrCL -vYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzyNeVJSQjK -Vsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZK -dHzVWYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHT -c+XvvqDtMwt0viAgxGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hv -l7yTmvmcEpB4eoCHFddydJxVdHixuuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5N -iGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZIhvcNAQELBQAD -ggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH -6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwt -LRvM7Kqas6pgghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93 -nAbowacYXVKV7cndJZ5t+qntozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3 -+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmVYjzlVYA211QC//G5Xc7UI2/YRYRK -W2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUXfeu+h1sXIFRRk0pT -AwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/rokTLq -l1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG -4iZZRHUe2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZ -mUlO+KWA2yUPHGNiiskzZ2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A -7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7RcGzM7vRX+Bi6hG6H ------END CERTIFICATE----- - -# Issuer: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust -# Subject: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust -# Label: "IdenTrust Public Sector Root CA 1" -# Serial: 13298821034946342390521976156843933698 -# MD5 Fingerprint: 37:06:a5:b0:fc:89:9d:ba:f4:6b:8c:1a:64:cd:d5:ba -# SHA1 Fingerprint: ba:29:41:60:77:98:3f:f4:f3:ef:f2:31:05:3b:2e:ea:6d:4d:45:fd -# SHA256 Fingerprint: 30:d0:89:5a:9a:44:8a:26:20:91:63:55:22:d1:f5:20:10:b5:86:7a:ca:e1:2c:78:ef:95:8f:d4:f4:38:9f:2f ------BEGIN CERTIFICATE----- -MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBN -MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVu -VHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcN -MzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0 -MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTyP4o7 -ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGy -RBb06tD6Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlS -bdsHyo+1W/CD80/HLaXIrcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF -/YTLNiCBWS2ab21ISGHKTN9T0a9SvESfqy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R -3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoSmJxZZoY+rfGwyj4GD3vw -EUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFnol57plzy -9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9V -GxyhLrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ -2fjXctscvG29ZV/viDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsV -WaFHVCkugyhfHMKiq3IXAAaOReyL4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gD -W/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMwDQYJKoZIhvcN -AQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj -t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHV -DRDtfULAj+7AmgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9 -TaDKQGXSc3z1i9kKlT/YPyNtGtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8G -lwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFtm6/n6J91eEyrRjuazr8FGF1NFTwW -mhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMxNRF4eKLg6TCMf4Df -WN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4Mhn5 -+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJ -tshquDDIajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhA -GaQdp/lLQzfcaFpPz+vCZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv -8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ3Wl9af0AVqW3rLatt8o+Ae+c ------END CERTIFICATE----- - -# Issuer: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only -# Subject: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only -# Label: "Entrust Root Certification Authority - G2" -# Serial: 1246989352 -# MD5 Fingerprint: 4b:e2:c9:91:96:65:0c:f4:0e:5a:93:92:a0:0a:fe:b2 -# SHA1 Fingerprint: 8c:f4:27:fd:79:0c:3a:d1:66:06:8d:e8:1e:57:ef:bb:93:22:72:d4 -# SHA256 Fingerprint: 43:df:57:74:b0:3e:7f:ef:5f:e4:0d:93:1a:7b:ed:f1:bb:2e:6b:42:73:8c:4e:6d:38:41:10:3d:3a:a7:f3:39 ------BEGIN CERTIFICATE----- -MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC -VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50 -cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs -IEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz -dCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy -NTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu -dHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt -dGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0 -aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK -AoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T -RU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN -cCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW -wcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1 -U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0 -jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP -BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN -BgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/ -jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ -Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v -1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R -nAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH -VHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g== ------END CERTIFICATE----- - -# Issuer: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only -# Subject: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only -# Label: "Entrust Root Certification Authority - EC1" -# Serial: 51543124481930649114116133369 -# MD5 Fingerprint: b6:7e:1d:f0:58:c5:49:6c:24:3b:3d:ed:98:18:ed:bc -# SHA1 Fingerprint: 20:d8:06:40:df:9b:25:f5:12:25:3a:11:ea:f7:59:8a:eb:14:b5:47 -# SHA256 Fingerprint: 02:ed:0e:b2:8c:14:da:45:16:5c:56:67:91:70:0d:64:51:d7:fb:56:f0:b2:ab:1d:3b:8e:b0:70:e5:6e:df:f5 ------BEGIN CERTIFICATE----- -MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkG -A1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3 -d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVu -dHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMq -RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEy -MTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYD -VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0 -L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0g -Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAi -A2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBt -ByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlH -Bz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O -BBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVC -R98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nX -hTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G ------END CERTIFICATE----- - -# Issuer: CN=CFCA EV ROOT O=China Financial Certification Authority -# Subject: CN=CFCA EV ROOT O=China Financial Certification Authority -# Label: "CFCA EV ROOT" -# Serial: 407555286 -# MD5 Fingerprint: 74:e1:b6:ed:26:7a:7a:44:30:33:94:ab:7b:27:81:30 -# SHA1 Fingerprint: e2:b8:29:4b:55:84:ab:6b:58:c2:90:46:6c:ac:3f:b8:39:8f:84:83 -# SHA256 Fingerprint: 5c:c3:d7:8e:4e:1d:5e:45:54:7a:04:e6:87:3e:64:f9:0c:f9:53:6d:1c:cc:2e:f8:00:f3:55:c4:c5:fd:70:fd ------BEGIN CERTIFICATE----- -MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJD -TjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9y -aXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkx -MjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5j -aWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJP -T1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnVBU03 -sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpL -TIpTUnrD7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5 -/ZOkVIBMUtRSqy5J35DNuF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp -7hZZLDRJGqgG16iI0gNyejLi6mhNbiyWZXvKWfry4t3uMCz7zEasxGPrb382KzRz -EpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7xzbh72fROdOXW3NiGUgt -hxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9fpy25IGvP -a931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqot -aK8KgWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNg -TnYGmE69g60dWIolhdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfV -PKPtl8MeNPo4+QgO48BdK4PRVmrJtqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hv -cWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAfBgNVHSMEGDAWgBTj/i39KNAL -tbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAd -BgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB -ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObT -ej/tUxPQ4i9qecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdL -jOztUmCypAbqTuv0axn96/Ua4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBS -ESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sGE5uPhnEFtC+NiWYzKXZUmhH4J/qy -P5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfXBDrDMlI1Dlb4pd19 -xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjnaH9d -Ci77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN -5mydLIhyPDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe -/v5WOaHIz16eGWRGENoXkbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+Z -AAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3CekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ -5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su ------END CERTIFICATE----- - -# Issuer: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903 -# Subject: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903 -# Label: "Certinomis - Root CA" -# Serial: 1 -# MD5 Fingerprint: 14:0a:fd:8d:a8:28:b5:38:69:db:56:7e:61:22:03:3f -# SHA1 Fingerprint: 9d:70:bb:01:a5:a4:a0:18:11:2e:f7:1c:01:b9:32:c5:34:e7:88:a8 -# SHA256 Fingerprint: 2a:99:f5:bc:11:74:b7:3c:bb:1d:62:08:84:e0:1c:34:e5:1c:cb:39:78:da:12:5f:0e:33:26:88:83:bf:41:58 ------BEGIN CERTIFICATE----- -MIIFkjCCA3qgAwIBAgIBATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJGUjET -MBEGA1UEChMKQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxHTAb -BgNVBAMTFENlcnRpbm9taXMgLSBSb290IENBMB4XDTEzMTAyMTA5MTcxOFoXDTMz -MTAyMTA5MTcxOFowWjELMAkGA1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMx -FzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRDZXJ0aW5vbWlzIC0g -Um9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQosP5L2 -fxSeC5yaah1AMGT9qt8OHgZbn1CF6s2Nq0Nn3rD6foCWnoR4kkjW4znuzuRZWJfl -LieY6pOod5tK8O90gC3rMB+12ceAnGInkYjwSond3IjmFPnVAy//ldu9n+ws+hQV -WZUKxkd8aRi5pwP5ynapz8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDF -TKWrteoB4owuZH9kb/2jJZOLyKIOSY008B/sWEUuNKqEUL3nskoTuLAPrjhdsKkb -5nPJWqHZZkCqqU2mNAKthH6yI8H7KsZn9DS2sJVqM09xRLWtwHkziOC/7aOgFLSc -CbAK42C++PhmiM1b8XcF4LVzbsF9Ri6OSyemzTUK/eVNfaoqoynHWmgE6OXWk6Ri -wsXm9E/G+Z8ajYJJGYrKWUM66A0ywfRMEwNvbqY/kXPLynNvEiCL7sCCeN5LLsJJ -wx3tFvYk9CcbXFcx3FXuqB5vbKziRcxXV4p1VxngtViZSTYxPDMBbRZKzbgqg4SG -m/lg0h9tkQPTYKbVPZrdd5A9NaSfD171UkRpucC63M9933zZxKyGIjK8e2uR73r4 -F2iw4lNVYC2vPsKD2NkJK/DAZNuHi5HMkesE/Xa0lZrmFAYb1TQdvtj/dBxThZng -WVJKYe2InmtJiUZ+IFrZ50rlau7SZRFDAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIB -BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTvkUz1pcMw6C8I6tNxIqSSaHh0 -2TAfBgNVHSMEGDAWgBTvkUz1pcMw6C8I6tNxIqSSaHh02TANBgkqhkiG9w0BAQsF -AAOCAgEAfj1U2iJdGlg+O1QnurrMyOMaauo++RLrVl89UM7g6kgmJs95Vn6RHJk/ -0KGRHCwPT5iVWVO90CLYiF2cN/z7ZMF4jIuaYAnq1fohX9B0ZedQxb8uuQsLrbWw -F6YSjNRieOpWauwK0kDDPAUwPk2Ut59KA9N9J0u2/kTO+hkzGm2kQtHdzMjI1xZS -g081lLMSVX3l4kLr5JyTCcBMWwerx20RoFAXlCOotQqSD7J6wWAsOMwaplv/8gzj -qh8c3LigkyfeY+N/IZ865Z764BNqdeuWXGKRlI5nU7aJ+BIJy29SWwNyhlCVCNSN -h4YVH5Uk2KRvms6knZtt0rJ2BobGVgjF6wnaNsIbW0G+YSrjcOa4pvi2WsS9Iff/ -ql+hbHY5ZtbqTFXhADObE5hjyW/QASAJN1LnDE8+zbz1X5YnpyACleAu6AdBBR8V -btaw5BngDwKTACdyxYvRVB9dSsNAl35VpnzBMwQUAR1JIGkLGZOdblgi90AMRgwj -Y/M50n92Uaf0yKHxDHYiI0ZSKS3io0EHVmmY0gUJvGnHWmHNj4FgFU2A3ZDifcRQ -8ow7bkrHxuaAKzyBvBGAFhAn1/DNP3nMcyrDflOR1m749fPH0FFNjkulW+YZFzvW -gQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVrhkIGuUE= ------END CERTIFICATE----- - -# Issuer: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed -# Subject: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed -# Label: "OISTE WISeKey Global Root GB CA" -# Serial: 157768595616588414422159278966750757568 -# MD5 Fingerprint: a4:eb:b9:61:28:2e:b7:2f:98:b0:35:26:90:99:51:1d -# SHA1 Fingerprint: 0f:f9:40:76:18:d3:d7:6a:4b:98:f0:a8:35:9e:0c:fd:27:ac:cc:ed -# SHA256 Fingerprint: 6b:9c:08:e8:6e:b0:f7:67:cf:ad:65:cd:98:b6:21:49:e5:49:4a:67:f5:84:5e:7b:d1:ed:01:9f:27:b8:6b:d6 ------BEGIN CERTIFICATE----- -MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBt -MQswCQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUg -Rm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9i -YWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAwMzJaFw0zOTEyMDExNTEwMzFaMG0x -CzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBG -b3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh -bCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3 -HEokKtaXscriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGx -WuR51jIjK+FTzJlFXHtPrby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX -1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNk -u7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4oQnc/nSMbsrY9gBQHTC5P -99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvgGUpuuy9r -M2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUB -BAMCAQAwDQYJKoZIhvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrgh -cViXfa43FK8+5/ea4n32cZiZBKpDdHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5 -gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0VQreUGdNZtGn//3ZwLWoo4rO -ZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEuiHZeeevJuQHHf -aPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic -Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= ------END CERTIFICATE----- - -# Issuer: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. -# Subject: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. -# Label: "SZAFIR ROOT CA2" -# Serial: 357043034767186914217277344587386743377558296292 -# MD5 Fingerprint: 11:64:c1:89:b0:24:b1:8c:b1:07:7e:89:9e:51:9e:99 -# SHA1 Fingerprint: e2:52:fa:95:3f:ed:db:24:60:bd:6e:28:f3:9c:cc:cf:5e:b3:3f:de -# SHA256 Fingerprint: a1:33:9d:33:28:1a:0b:56:e5:57:d3:d3:2b:1c:e7:f9:36:7e:b0:94:bd:5f:a7:2a:7e:50:04:c8:de:d7:ca:fe ------BEGIN CERTIFICATE----- -MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQEL -BQAwUTELMAkGA1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6 -ZW5pb3dhIFMuQS4xGDAWBgNVBAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkw -NzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJBgNVBAYTAlBMMSgwJgYDVQQKDB9L -cmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYDVQQDDA9TWkFGSVIg -Uk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5QqEvN -QLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT -3PSQ1hNKDJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw -3gAeqDRHu5rr/gsUvTaE2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr6 -3fE9biCloBK0TXC5ztdyO4mTp4CEHCdJckm1/zuVnsHMyAHs6A6KCpbns6aH5db5 -BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwiieDhZNRnvDF5YTy7ykHN -XGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD -AgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsF -AAOCAQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw -8PRBEew/R40/cof5O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOG -nXkZ7/e7DDWQw4rtTw/1zBLZpD67oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCP -oky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul4+vJhaAlIDf7js4MNIThPIGy -d05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6+/NNIxuZMzSg -LvWpCz/UXeHPhJ/iGcJfitYgHuNztw== ------END CERTIFICATE----- - -# Issuer: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Subject: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Label: "Certum Trusted Network CA 2" -# Serial: 44979900017204383099463764357512596969 -# MD5 Fingerprint: 6d:46:9e:d9:25:6d:08:23:5b:5e:74:7d:1e:27:db:f2 -# SHA1 Fingerprint: d3:dd:48:3e:2b:bf:4c:05:e8:af:10:f5:fa:76:26:cf:d3:dc:30:92 -# SHA256 Fingerprint: b6:76:f2:ed:da:e8:77:5c:d3:6c:b0:f6:3c:d1:d4:60:39:61:f4:9e:62:65:ba:01:3a:2f:03:07:b6:d0:b8:04 ------BEGIN CERTIFICATE----- -MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCB -gDELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu -QS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIG -A1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyMCIYDzIwMTExMDA2MDgz -OTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQTDEiMCAGA1UEChMZ -VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3 -b3JrIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWA -DGSdhhuWZGc/IjoedQF97/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn -0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+oCgCXhVqqndwpyeI1B+twTUrWwbNWuKFB -OJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40bRr5HMNUuctHFY9rnY3lE -fktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2puTRZCr+E -Sv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1m -o130GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02i -sx7QBlrd9pPPV3WZ9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOW -OZV7bIBaTxNyxtd9KXpEulKkKtVBRgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgez -Tv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pyehizKV/Ma5ciSixqClnrDvFAS -adgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vMBhBgu4M1t15n -3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD -AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMC -AQYwDQYJKoZIhvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQ -F/xlhMcQSZDe28cmk4gmb3DWAl45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTf -CVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuAL55MYIR4PSFk1vtBHxgP58l1cb29 -XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMoclm2q8KMZiYcdywm -djWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tMpkT/ -WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jb -AoJnwTnbw3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksq -P/ujmv5zMnHCnsZy4YpoJ/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Ko -b7a6bINDd82Kkhehnlt4Fj1F4jNy3eFmypnTycUm/Q1oBEauttmbjL4ZvrHG8hnj -XALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLXis7VmFxWlgPF7ncGNf/P -5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7zAYspsbi -DrW5viSP ------END CERTIFICATE----- - -# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Subject: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Label: "Hellenic Academic and Research Institutions RootCA 2015" -# Serial: 0 -# MD5 Fingerprint: ca:ff:e2:db:03:d9:cb:4b:e9:0f:ad:84:fd:7b:18:ce -# SHA1 Fingerprint: 01:0c:06:95:a6:98:19:14:ff:bf:5f:c6:b0:b6:95:ea:29:e9:12:a6 -# SHA256 Fingerprint: a0:40:92:9a:02:ce:53:b4:ac:f4:f2:ff:c6:98:1c:e4:49:6f:75:5e:6d:45:fe:0b:2a:69:2b:cd:52:52:3f:36 ------BEGIN CERTIFICATE----- -MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1Ix -DzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5k -IFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMT -N0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9v -dENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAxMTIxWjCBpjELMAkG -A1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNh -ZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkx -QDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 -dGlvbnMgUm9vdENBIDIwMTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC -AQDC+Kk/G4n8PDwEXT2QNrCROnk8ZlrvbTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA -4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+ehiGsxr/CL0BgzuNtFajT0 -AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+6PAQZe10 -4S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06C -ojXdFPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV -9Cz82XBST3i4vTwri5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrD -gfgXy5I2XdGj2HUb4Ysn6npIQf1FGQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6 -Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2fu/Z8VFRfS0myGlZYeCsargq -NhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9muiNX6hME6wGko -LfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc -Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNV -HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVd -ctA4GGqd83EkVAswDQYJKoZIhvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0I -XtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+D1hYc2Ryx+hFjtyp8iY/xnmMsVMI -M4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrMd/K4kPFox/la/vot -9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+yd+2V -Z5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/ea -j8GsGsVn82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnh -X9izjFk0WaSrT2y7HxjbdavYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQ -l033DlZdwJVqwjbDG2jJ9SrcR5q+ss7FJej6A7na+RZukYT1HCjI/CbM1xyQVqdf -bzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVtJ94Cj8rDtSvK6evIIVM4 -pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGaJI7ZjnHK -e7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0 -vm9qp/UsQu0yrbYhnr68 ------END CERTIFICATE----- - -# Issuer: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Subject: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Label: "Hellenic Academic and Research Institutions ECC RootCA 2015" -# Serial: 0 -# MD5 Fingerprint: 81:e5:b4:17:eb:c2:f5:e1:4b:0d:41:7b:49:92:fe:ef -# SHA1 Fingerprint: 9f:f1:71:8d:92:d5:9a:f3:7d:74:97:b4:bc:6f:84:68:0b:ba:b6:66 -# SHA256 Fingerprint: 44:b5:45:aa:8a:25:e6:5a:73:ca:15:dc:27:fc:36:d2:4c:1c:b9:95:3a:06:65:39:b1:15:82:dc:48:7b:48:33 ------BEGIN CERTIFICATE----- -MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzAN -BgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl -c2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hl -bGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJv -b3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEwMzcxMlowgaoxCzAJ -BgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmljIEFj -YWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5 -MUQwQgYDVQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0 -dXRpb25zIEVDQyBSb290Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKg -QehLgoRc4vgxEZmGZE4JJS+dQS8KrjVPdJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJa -jq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoKVlp8aQuqgAkkbH7BRqNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFLQi -C4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaep -lSTAGiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7Sof -TUwJCA3sS61kFyjndc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR ------END CERTIFICATE----- - -# Issuer: CN=ISRG Root X1 O=Internet Security Research Group -# Subject: CN=ISRG Root X1 O=Internet Security Research Group -# Label: "ISRG Root X1" -# Serial: 172886928669790476064670243504169061120 -# MD5 Fingerprint: 0c:d2:f9:e0:da:17:73:e9:ed:86:4d:a5:e3:70:e7:4e -# SHA1 Fingerprint: ca:bd:2a:79:a1:07:6a:31:f2:1d:25:36:35:cb:03:9d:43:29:a5:e8 -# SHA256 Fingerprint: 96:bc:ec:06:26:49:76:f3:74:60:77:9a:cf:28:c5:a7:cf:e8:a3:c0:aa:e1:1a:8f:fc:ee:05:c0:bd:df:08:c6 ------BEGIN CERTIFICATE----- -MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw -TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh -cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4 -WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu -ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY -MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc -h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+ -0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U -A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW -T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH -B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC -B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv -KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn -OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn -jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw -qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI -rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq -hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL -ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ -3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK -NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5 -ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur -TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC -jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc -oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq -4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA -mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d -emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= ------END CERTIFICATE----- - -# Issuer: O=FNMT-RCM OU=AC RAIZ FNMT-RCM -# Subject: O=FNMT-RCM OU=AC RAIZ FNMT-RCM -# Label: "AC RAIZ FNMT-RCM" -# Serial: 485876308206448804701554682760554759 -# MD5 Fingerprint: e2:09:04:b4:d3:bd:d1:a0:14:fd:1a:d2:47:c4:57:1d -# SHA1 Fingerprint: ec:50:35:07:b2:15:c4:95:62:19:e2:a8:9a:5b:42:99:2c:4c:2c:20 -# SHA256 Fingerprint: eb:c5:57:0c:29:01:8c:4d:67:b1:aa:12:7b:af:12:f7:03:b4:61:1e:bc:17:b7:da:b5:57:38:94:17:9b:93:fa ------BEGIN CERTIFICATE----- -MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsx -CzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJ -WiBGTk1ULVJDTTAeFw0wODEwMjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJ -BgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBG -Tk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALpxgHpMhm5/ -yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcfqQgf -BBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAz -WHFctPVrbtQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxF -tBDXaEAUwED653cXeuYLj2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z -374jNUUeAlz+taibmSXaXvMiwzn15Cou08YfxGyqxRxqAQVKL9LFwag0Jl1mpdIC -IfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mwWsXmo8RZZUc1g16p6DUL -mbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnTtOmlcYF7 -wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peS -MKGJ47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2 -ZSysV4999AeU14ECll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMet -UqIJ5G+GR4of6ygnXYMgrwTJbFaai0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUw -AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFPd9xf3E6Jobd2Sn9R2gzL+H -YJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1odHRwOi8vd3d3 -LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD -nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1 -RXxlDPiyN8+sD8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYM -LVN0V2Ue1bLdI4E7pWYjJ2cJj+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf -77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrTQfv6MooqtyuGC2mDOL7Nii4LcK2N -JpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW+YJF1DngoABd15jm -fZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7Ixjp -6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp -1txyM/1d8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B -9kiABdcPUXmsEKvU7ANm5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wok -RqEIr9baRRmW1FMdW4R58MD3R++Lj8UGrp1MYp3/RgT408m2ECVAdf4WqslKYIYv -uu8wd+RU4riEmViAqhOLUTpPSPaLtrM= ------END CERTIFICATE----- - -# Issuer: CN=Amazon Root CA 1 O=Amazon -# Subject: CN=Amazon Root CA 1 O=Amazon -# Label: "Amazon Root CA 1" -# Serial: 143266978916655856878034712317230054538369994 -# MD5 Fingerprint: 43:c6:bf:ae:ec:fe:ad:2f:18:c6:88:68:30:fc:c8:e6 -# SHA1 Fingerprint: 8d:a7:f9:65:ec:5e:fc:37:91:0f:1c:6e:59:fd:c1:cc:6a:6e:de:16 -# SHA256 Fingerprint: 8e:cd:e6:88:4f:3d:87:b1:12:5b:a3:1a:c3:fc:b1:3d:70:16:de:7f:57:cc:90:4f:e1:cb:97:c6:ae:98:19:6e ------BEGIN CERTIFICATE----- -MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF -ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 -b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL -MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv -b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj -ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM -9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw -IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6 -VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L -93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm -jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA -A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI -U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs -N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv -o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU -5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy -rqXRfboQnoZsG4q5WTP468SQvvG5 ------END CERTIFICATE----- - -# Issuer: CN=Amazon Root CA 2 O=Amazon -# Subject: CN=Amazon Root CA 2 O=Amazon -# Label: "Amazon Root CA 2" -# Serial: 143266982885963551818349160658925006970653239 -# MD5 Fingerprint: c8:e5:8d:ce:a8:42:e2:7a:c0:2a:5c:7c:9e:26:bf:66 -# SHA1 Fingerprint: 5a:8c:ef:45:d7:a6:98:59:76:7a:8c:8b:44:96:b5:78:cf:47:4b:1a -# SHA256 Fingerprint: 1b:a5:b2:aa:8c:65:40:1a:82:96:01:18:f8:0b:ec:4f:62:30:4d:83:ce:c4:71:3a:19:c3:9c:01:1e:a4:6d:b4 ------BEGIN CERTIFICATE----- -MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwF -ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 -b24gUm9vdCBDQSAyMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTEL -MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv -b3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK2Wny2cSkxK -gXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4kHbZ -W0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg -1dKmSYXpN+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K -8nu+NQWpEjTj82R0Yiw9AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r -2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvdfLC6HM783k81ds8P+HgfajZRRidhW+me -z/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAExkv8LV/SasrlX6avvDXbR -8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSSbtqDT6Zj -mUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz -7Mt0Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6 -+XUyo05f7O0oYtlNc/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI -0u1ufm8/0i2BWSlmy5A5lREedCf+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB -Af8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSwDPBMMPQFWAJI/TPlUq9LhONm -UjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oAA7CXDpO8Wqj2 -LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY -+gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kS -k5Nrp+gvU5LEYFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl -7uxMMne0nxrpS10gxdr9HIcWxkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygm -btmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQgj9sAq+uEjonljYE1x2igGOpm/Hl -urR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbWaQbLU8uz/mtBzUF+ -fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoVYh63 -n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE -76KlXIx3KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H -9jVlpNMKVv/1F2Rs76giJUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT -4PsJYGw= ------END CERTIFICATE----- - -# Issuer: CN=Amazon Root CA 3 O=Amazon -# Subject: CN=Amazon Root CA 3 O=Amazon -# Label: "Amazon Root CA 3" -# Serial: 143266986699090766294700635381230934788665930 -# MD5 Fingerprint: a0:d4:ef:0b:f7:b5:d8:49:95:2a:ec:f5:c4:fc:81:87 -# SHA1 Fingerprint: 0d:44:dd:8c:3c:8c:1a:1a:58:75:64:81:e9:0f:2e:2a:ff:b3:d2:6e -# SHA256 Fingerprint: 18:ce:6c:fe:7b:f1:4e:60:b2:e3:47:b8:df:e8:68:cb:31:d0:2e:bb:3a:da:27:15:69:f5:03:43:b4:6d:b3:a4 ------BEGIN CERTIFICATE----- -MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5 -MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g -Um9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG -A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg -Q0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl -ui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j -QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr -ttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr -BqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM -YyRIHN8wfdVoOw== ------END CERTIFICATE----- - -# Issuer: CN=Amazon Root CA 4 O=Amazon -# Subject: CN=Amazon Root CA 4 O=Amazon -# Label: "Amazon Root CA 4" -# Serial: 143266989758080763974105200630763877849284878 -# MD5 Fingerprint: 89:bc:27:d5:eb:17:8d:06:6a:69:d5:fd:89:47:b4:cd -# SHA1 Fingerprint: f6:10:84:07:d6:f8:bb:67:98:0c:c2:e2:44:c2:eb:ae:1c:ef:63:be -# SHA256 Fingerprint: e3:5d:28:41:9e:d0:20:25:cf:a6:90:38:cd:62:39:62:45:8d:a5:c6:95:fb:de:a3:c2:2b:0b:fb:25:89:70:92 ------BEGIN CERTIFICATE----- -MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5 -MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g -Um9vdCBDQSA0MB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG -A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg -Q0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN/sGKe0uoe0ZLY7Bi -9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri83Bk -M6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB -/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WB -MAoGCCqGSM49BAMDA2gAMGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlw -CkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1AE47xDqUEpHJWEadIRNyp4iciuRMStuW -1KyLa2tJElMzrdfkviT8tQp21KW8EA== ------END CERTIFICATE----- - -# Issuer: CN=LuxTrust Global Root 2 O=LuxTrust S.A. -# Subject: CN=LuxTrust Global Root 2 O=LuxTrust S.A. -# Label: "LuxTrust Global Root 2" -# Serial: 59914338225734147123941058376788110305822489521 -# MD5 Fingerprint: b2:e1:09:00:61:af:f7:f1:91:6f:c4:ad:8d:5e:3b:7c -# SHA1 Fingerprint: 1e:0e:56:19:0a:d1:8b:25:98:b2:04:44:ff:66:8a:04:17:99:5f:3f -# SHA256 Fingerprint: 54:45:5f:71:29:c2:0b:14:47:c4:18:f9:97:16:8f:24:c5:8f:c5:02:3b:f5:da:5b:e2:eb:6e:1d:d8:90:2e:d5 ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -# Issuer: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM -# Subject: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM -# Label: "TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1" -# Serial: 1 -# MD5 Fingerprint: dc:00:81:dc:69:2f:3e:2f:b0:3b:f6:3d:5a:91:8e:49 -# SHA1 Fingerprint: 31:43:64:9b:ec:ce:27:ec:ed:3a:3f:0b:8f:0d:e4:e8:91:dd:ee:ca -# SHA256 Fingerprint: 46:ed:c3:68:90:46:d5:3a:45:3f:b3:10:4a:b8:0d:ca:ec:65:8b:26:60:ea:16:29:dd:7e:86:79:90:64:87:16 ------BEGIN CERTIFICATE----- -MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIx -GDAWBgNVBAcTD0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxp -bXNlbCB2ZSBUZWtub2xvamlrIEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0w -KwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24gTWVya2V6aSAtIEthbXUgU00xNjA0 -BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRpZmlrYXNpIC0gU3Vy -dW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYDVQQG -EwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXll -IEJpbGltc2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklU -QUsxLTArBgNVBAsTJEthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBT -TTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11IFNNIFNTTCBLb2sgU2VydGlmaWthc2kg -LSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr3UwM6q7 -a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y86Ij5iySr -LqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INr -N3wcwv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2X -YacQuFWQfw4tJzh03+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/ -iSIzL+aFCr2lqBs23tPcLG07xxO9WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4f -AJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQUZT/HiobGPN08VFw1+DrtUgxH -V8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL -BQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh -AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPf -IPP54+M638yclNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4 -lzwDGrpDxpa5RXI4s6ehlj2Re37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c -8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0jq5Rm+K37DwhuJi1/FwcJsoz7UMCf -lo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= ------END CERTIFICATE----- - -# Issuer: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. -# Subject: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. -# Label: "GDCA TrustAUTH R5 ROOT" -# Serial: 9009899650740120186 -# MD5 Fingerprint: 63:cc:d9:3d:34:35:5c:6f:53:a3:e2:08:70:48:1f:b4 -# SHA1 Fingerprint: 0f:36:38:5b:81:1a:25:c3:9b:31:4e:83:ca:e9:34:66:70:cc:74:b4 -# SHA256 Fingerprint: bf:ff:8f:d0:44:33:48:7d:6a:8a:a6:0c:1a:29:76:7a:9f:c2:bb:b0:5e:42:0f:71:3a:13:b9:92:89:1d:38:93 ------BEGIN CERTIFICATE----- -MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UE -BhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ -IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0 -MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVowYjELMAkGA1UEBhMCQ04xMjAwBgNV -BAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8w -HQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0BAQEF -AAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJj -Dp6L3TQsAlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBj -TnnEt1u9ol2x8kECK62pOqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+u -KU49tm7srsHwJ5uu4/Ts765/94Y9cnrrpftZTqfrlYwiOXnhLQiPzLyRuEH3FMEj -qcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ9Cy5WmYqsBebnh52nUpm -MUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQxXABZG12 -ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloP -zgsMR6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3Gk -L30SgLdTMEZeS1SZD2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeC -jGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4oR24qoAATILnsn8JuLwwoC8N9VKejveSswoA -HQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx9hoh49pwBiFYFIeFd3mqgnkC -AwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlRMA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg -p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZm -DRd9FBUb1Ov9H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5 -COmSdI31R9KrO9b7eGZONn356ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ry -L3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd+PwyvzeG5LuOmCd+uh8W4XAR8gPf -JWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQHtZa37dG/OaG+svg -IHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBDF8Io -2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV -09tL7ECQ8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQ -XR4EzzffHqhmsYzmIGrv/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrq -T8p+ck0LcIymSLumoRT2+1hEmRSuqguTaaApJUqlyyvdimYHFngVV3Eb7PVHhPOe -MTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== ------END CERTIFICATE----- - -# Issuer: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority -# Subject: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority -# Label: "TrustCor RootCert CA-1" -# Serial: 15752444095811006489 -# MD5 Fingerprint: 6e:85:f1:dc:1a:00:d3:22:d5:b2:b2:ac:6b:37:05:45 -# SHA1 Fingerprint: ff:bd:cd:e7:82:c8:43:5e:3c:6f:26:86:5c:ca:a8:3a:45:5b:c3:0a -# SHA256 Fingerprint: d4:0e:9c:86:cd:8f:e4:68:c1:77:69:59:f4:9e:a7:74:fa:54:86:84:b6:c4:06:f3:90:92:61:f4:dc:e2:57:5c ------BEGIN CERTIFICATE----- -MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYD -VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk -MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U -cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRydXN0Q29y -IFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkxMjMxMTcyMzE2WjCB -pDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFuYW1h -IENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUG -A1UECwweVHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZU -cnVzdENvciBSb290Q2VydCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEAv463leLCJhJrMxnHQFgKq1mqjQCj/IDHUHuO1CAmujIS2CNUSSUQIpid -RtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4pQa81QBeCQryJ3pS/C3V -seq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0JEsq1pme -9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CV -EY4hgLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorW -hnAbJN7+KIor0Gqw/Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/ -DeOxCbeKyKsZn3MzUOcwHwYDVR0jBBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcw -DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQAD -ggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5mDo4Nvu7Zp5I -/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf -ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZ -yonnMlo2HD6CqFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djts -L1Ac59v2Z3kf9YKVmgenFK+P3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdN -zl/HHk484IkzlQsPpTLWPFp5LBk= ------END CERTIFICATE----- - -# Issuer: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority -# Subject: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority -# Label: "TrustCor RootCert CA-2" -# Serial: 2711694510199101698 -# MD5 Fingerprint: a2:e1:f8:18:0b:ba:45:d5:c7:41:2a:bb:37:52:45:64 -# SHA1 Fingerprint: b8:be:6d:cb:56:f1:55:b9:63:d4:12:ca:4e:06:34:c7:94:b2:1c:c0 -# SHA256 Fingerprint: 07:53:e9:40:37:8c:1b:d5:e3:83:6e:39:5d:ae:a5:cb:83:9e:50:46:f1:bd:0e:ae:19:51:cf:10:fe:c7:c9:65 ------BEGIN CERTIFICATE----- -MIIGLzCCBBegAwIBAgIIJaHfyjPLWQIwDQYJKoZIhvcNAQELBQAwgaQxCzAJBgNV -BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw -IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy -dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEfMB0GA1UEAwwWVHJ1c3RDb3Ig -Um9vdENlcnQgQ0EtMjAeFw0xNjAyMDQxMjMyMjNaFw0zNDEyMzExNzI2MzlaMIGk -MQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEg -Q2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYD -VQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRy -dXN0Q29yIFJvb3RDZXJ0IENBLTIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQCnIG7CKqJiJJWQdsg4foDSq8GbZQWU9MEKENUCrO2fk8eHyLAnK0IMPQo+ -QVqedd2NyuCb7GgypGmSaIwLgQ5WoD4a3SwlFIIvl9NkRvRUqdw6VC0xK5mC8tkq -1+9xALgxpL56JAfDQiDyitSSBBtlVkxs1Pu2YVpHI7TYabS3OtB0PAx1oYxOdqHp -2yqlO/rOsP9+aij9JxzIsekp8VduZLTQwRVtDr4uDkbIXvRR/u8OYzo7cbrPb1nK -DOObXUm4TOJXsZiKQlecdu/vvdFoqNL0Cbt3Nb4lggjEFixEIFapRBF37120Hape -az6LMvYHL1cEksr1/p3C6eizjkxLAjHZ5DxIgif3GIJ2SDpxsROhOdUuxTTCHWKF -3wP+TfSvPd9cW436cOGlfifHhi5qjxLGhF5DUVCcGZt45vz27Ud+ez1m7xMTiF88 -oWP7+ayHNZ/zgp6kPwqcMWmLmaSISo5uZk3vFsQPeSghYA2FFn3XVDjxklb9tTNM -g9zXEJ9L/cb4Qr26fHMC4P99zVvh1Kxhe1fVSntb1IVYJ12/+CtgrKAmrhQhJ8Z3 -mjOAPF5GP/fDsaOGM8boXg25NSyqRsGFAnWAoOsk+xWq5Gd/bnc/9ASKL3x74xdh -8N0JqSDIvgmk0H5Ew7IwSjiqqewYmgeCK9u4nBit2uBGF6zPXQIDAQABo2MwYTAd -BgNVHQ4EFgQU2f4hQG6UnrybPZx9mCAZ5YwwYrIwHwYDVR0jBBgwFoAU2f4hQG6U -nrybPZx9mCAZ5YwwYrIwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYw -DQYJKoZIhvcNAQELBQADggIBAJ5Fngw7tu/hOsh80QA9z+LqBrWyOrsGS2h60COX -dKcs8AjYeVrXWoSK2BKaG9l9XE1wxaX5q+WjiYndAfrs3fnpkpfbsEZC89NiqpX+ -MWcUaViQCqoL7jcjx1BRtPV+nuN79+TMQjItSQzL/0kMmx40/W5ulop5A7Zv2wnL -/V9lFDfhOPXzYRZY5LVtDQsEGz9QLX+zx3oaFoBg+Iof6Rsqxvm6ARppv9JYx1RX -CI/hOWB3S6xZhBqI8d3LT3jX5+EzLfzuQfogsL7L9ziUwOHQhQ+77Sxzq+3+knYa -ZH9bDTMJBzN7Bj8RpFxwPIXAz+OQqIN3+tvmxYxoZxBnpVIt8MSZj3+/0WvitUfW -2dCFmU2Umw9Lje4AWkcdEQOsQRivh7dvDDqPys/cA8GiCcjl/YBeyGBCARsaU1q7 -N6a3vLqE6R5sGtRk2tRD/pOLS/IseRYQ1JMLiI+h2IYURpFHmygk71dSTlxCnKr3 -Sewn6EAes6aJInKc9Q0ztFijMDvd1GpUk74aTfOTlPf8hAs/hCBcNANExdqtvArB -As8e5ZTZ845b2EzwnexhF7sUMlQMAimTHpKG9n/v55IFDlndmQguLvqcAFLTxWYp -5KeXRKQOKIETNcX2b2TmQcTVL8w0RSXPQQCWPUouwpaYT05KnJe32x+SMsj/D1Fu -1uwJ ------END CERTIFICATE----- - -# Issuer: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority -# Subject: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority -# Label: "TrustCor ECA-1" -# Serial: 9548242946988625984 -# MD5 Fingerprint: 27:92:23:1d:0a:f5:40:7c:e9:e6:6b:9d:d8:f5:e7:6c -# SHA1 Fingerprint: 58:d1:df:95:95:67:6b:63:c0:f0:5b:1c:17:4d:8b:84:0b:c8:78:bd -# SHA256 Fingerprint: 5a:88:5d:b1:9c:01:d9:12:c5:75:93:88:93:8c:af:bb:df:03:1a:b2:d4:8e:91:ee:15:58:9b:42:97:1d:03:9c ------BEGIN CERTIFICATE----- -MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYD -VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk -MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U -cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxFzAVBgNVBAMMDlRydXN0Q29y -IEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3MjgwN1owgZwxCzAJBgNV -BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw -IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy -dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3Ig -RUNBLTEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb -3w9U73NjKYKtR8aja+3+XzP4Q1HpGjORMRegdMTUpwHmspI+ap3tDvl0mEDTPwOA -BoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23xFUfJ3zSCNV2HykVh0A5 -3ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmcp0yJF4Ou -owReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/ -wZ0+fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZF -ZtS6mFjBAgMBAAGjYzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAf -BgNVHSMEGDAWgBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/ -MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEABT41XBVwm8nHc2Fv -civUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u/ukZMjgDfxT2 -AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F -hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50 -soIipX1TH0XsJ5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BI -WJZpTdwHjFGTot+fDz2LYLSCjaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1Wi -tJ/X5g== ------END CERTIFICATE----- - -# Issuer: CN=SSL.com Root Certification Authority RSA O=SSL Corporation -# Subject: CN=SSL.com Root Certification Authority RSA O=SSL Corporation -# Label: "SSL.com Root Certification Authority RSA" -# Serial: 8875640296558310041 -# MD5 Fingerprint: 86:69:12:c0:70:f1:ec:ac:ac:c2:d5:bc:a5:5b:a1:29 -# SHA1 Fingerprint: b7:ab:33:08:d1:ea:44:77:ba:14:80:12:5a:6f:bd:a9:36:49:0c:bb -# SHA256 Fingerprint: 85:66:6a:56:2e:e0:be:5c:e9:25:c1:d8:89:0a:6f:76:a8:7e:c1:6d:4d:7d:5f:29:ea:74:19:cf:20:12:3b:69 ------BEGIN CERTIFICATE----- -MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UE -BhMCVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQK -DA9TU0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYwMjEyMTczOTM5WhcNNDEwMjEyMTcz -OTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv -dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv -bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcN -AQEBBQADggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2R -xFdHaxh3a3by/ZPkPQ/CFp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aX -qhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcC -C52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/geoeOy3ZExqysdBP+lSgQ3 -6YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkpk8zruFvh -/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrF -YD3ZfBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93E -JNyAKoFBbZQ+yODJgUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVc -US4cK38acijnALXRdMbX5J+tB5O2UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8 -ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi81xtZPCvM8hnIk2snYxnP/Okm -+Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4sbE6x/c+cCbqi -M+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV -HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4G -A1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGV -cpNxJK1ok1iOMq8bs3AD/CUrdIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBc -Hadm47GUBwwyOabqG7B52B2ccETjit3E+ZUfijhDPwGFpUenPUayvOUiaPd7nNgs -PgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAslu1OJD7OAUN5F7kR/ -q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjqerQ0 -cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jr -a6x+3uxjMxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90I -H37hVZkLId6Tngr75qNJvTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/Y -K9f1JmzJBjSWFupwWRoyeXkLtoh/D1JIPb9s2KJELtFOt3JY04kTlf5Eq/jXixtu -nLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406ywKBjYZC6VWg3dGq2ktuf -oYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NIWuuA8ShY -Ic2wBlX7Jz9TkHCpBB5XJ7k= ------END CERTIFICATE----- - -# Issuer: CN=SSL.com Root Certification Authority ECC O=SSL Corporation -# Subject: CN=SSL.com Root Certification Authority ECC O=SSL Corporation -# Label: "SSL.com Root Certification Authority ECC" -# Serial: 8495723813297216424 -# MD5 Fingerprint: 2e:da:e4:39:7f:9c:8f:37:d1:70:9f:26:17:51:3a:8e -# SHA1 Fingerprint: c3:19:7c:39:24:e6:54:af:1b:c4:ab:20:95:7a:e2:c3:0e:13:02:6a -# SHA256 Fingerprint: 34:17:bb:06:cc:60:07:da:1b:96:1c:92:0b:8a:b4:ce:3f:ad:82:0e:4a:a3:0b:9a:cb:c4:a7:4e:bd:ce:bc:65 ------BEGIN CERTIFICATE----- -MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMC -VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T -U0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0 -aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNDAzWhcNNDEwMjEyMTgxNDAz -WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hvdXN0 -b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNvbSBS -b290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB -BAAiA2IABEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI -7Z4INcgn64mMU1jrYor+8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPg -CemB+vNH06NjMGEwHQYDVR0OBBYEFILRhXMw5zUE044CkvvlpNHEIejNMA8GA1Ud -EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTTjgKS++Wk0cQh6M0wDgYD -VR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCWe+0F+S8T -kdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+ -gA0z5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl ------END CERTIFICATE----- - -# Issuer: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation -# Subject: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation -# Label: "SSL.com EV Root Certification Authority RSA R2" -# Serial: 6248227494352943350 -# MD5 Fingerprint: e1:1e:31:58:1a:ae:54:53:02:f6:17:6a:11:7b:4d:95 -# SHA1 Fingerprint: 74:3a:f0:52:9b:d0:32:a0:f4:4a:83:cd:d4:ba:a9:7b:7c:2e:c4:9a -# SHA256 Fingerprint: 2e:7b:f1:6c:c2:24:85:a7:bb:e2:aa:86:96:75:07:61:b0:ae:39:be:3b:2f:e9:d0:cc:6d:4e:f7:34:91:42:5c ------BEGIN CERTIFICATE----- -MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNV -BAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UE -CgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2Vy -dGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMB4XDTE3MDUzMTE4MTQzN1oXDTQy -MDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4G -A1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQD -DC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvq -M0fNTPl9fb69LT3w23jhhqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssuf -OePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7wcXHswxzpY6IXFJ3vG2fThVUCAtZJycxa -4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTOZw+oz12WGQvE43LrrdF9 -HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+B6KjBSYR -aZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcA -b9ZhCBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQ -Gp8hLH94t2S42Oim9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQV -PWKchjgGAGYS5Fl2WlPAApiiECtoRHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMO -pgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+SlmJuwgUHfbSguPvuUCYHBBXtSu -UDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48+qvWBkofZ6aY -MBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV -HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa4 -9QaAJadz20ZpqJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBW -s47LCp1Jjr+kxJG7ZhcFUZh1++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5 -Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nxY/hoLVUE0fKNsKTPvDxeH3jnpaAg -cLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2GguDKBAdRUNf/ktUM -79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDzOFSz -/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXt -ll9ldDz7CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEm -Kf7GUmG6sXP/wwyc5WxqlD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKK -QbNmC1r7fSOl8hqw/96bg5Qu0T/fkreRrwU7ZcegbLHNYhLDkBvjJc40vG93drEQ -w/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1hlMYegouCRw2n5H9gooi -S9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX9hwJ1C07 -mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w== ------END CERTIFICATE----- - -# Issuer: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation -# Subject: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation -# Label: "SSL.com EV Root Certification Authority ECC" -# Serial: 3182246526754555285 -# MD5 Fingerprint: 59:53:22:65:83:42:01:54:c0:ce:42:b9:5a:7c:f2:90 -# SHA1 Fingerprint: 4c:dd:51:a3:d1:f5:20:32:14:b0:c6:c5:32:23:03:91:c7:46:42:6d -# SHA256 Fingerprint: 22:a2:c1:f7:bd:ed:70:4c:c1:e7:01:b5:f4:08:c3:10:88:0f:e9:56:b5:de:2a:4a:44:f9:9c:87:3a:25:a7:c8 ------BEGIN CERTIFICATE----- -MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMC -VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T -U0wgQ29ycG9yYXRpb24xNDAyBgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNTIzWhcNNDEwMjEyMTgx -NTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv -dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NMLmNv -bSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49 -AgEGBSuBBAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMA -VIbc/R/fALhBYlzccBYy3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1Kthku -WnBaBu2+8KGwytAJKaNjMGEwHQYDVR0OBBYEFFvKXuXe0oGqzagtZFG22XKbl+ZP -MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe5d7SgarNqC1kUbbZcpuX -5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJN+vp1RPZ -ytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZg -h5Mmm7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 -# Label: "GlobalSign Root CA - R6" -# Serial: 1417766617973444989252670301619537 -# MD5 Fingerprint: 4f:dd:07:e4:d4:22:64:39:1e:0c:37:42:ea:d1:c6:ae -# SHA1 Fingerprint: 80:94:64:0e:b5:a7:a1:ca:11:9c:1f:dd:d5:9f:81:02:63:a7:fb:d1 -# SHA256 Fingerprint: 2c:ab:ea:fe:37:d0:6c:a2:2a:ba:73:91:c0:03:3d:25:98:29:52:c4:53:64:73:49:76:3a:3a:b5:ad:6c:cf:69 ------BEGIN CERTIFICATE----- -MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEg -MB4GA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2Jh -bFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQx -MjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSNjET -MBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCAiIwDQYJ -KoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQssgrRI -xutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1k -ZguSgMpE3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxD -aNc9PIrFsmbVkJq3MQbFvuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJw -LnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqMPKq0pPbzlUoSB239jLKJz9CgYXfIWHSw -1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+azayOeSsJDa38O+2HBNX -k7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05OWgtH8wY2 -SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/h -bguyCLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4n -WUx2OVvq+aWh2IMP0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpY -rZxCRXluDocZXFSxZba/jJvcE+kNb7gu3GduyYsRtYQUigAZcIN5kZeR1Bonvzce -MgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTAD -AQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNVHSMEGDAWgBSu -bAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN -nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGt -Ixg93eFyRJa0lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr61 -55wsTLxDKZmOMNOsIeDjHfrYBzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLj -vUYAGm0CuiVdjaExUd1URhxN25mW7xocBFymFe944Hn+Xds+qkxV/ZoVqW/hpvvf -cDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr3TsTjxKM4kEaSHpz -oHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB10jZp -nOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfs -pA9MRf/TuTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+v -JJUEeKgDu+6B5dpffItKoZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R -8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+tJDfLRVpOoERIyNiwmcUVhAn21klJwGW4 -5hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA= ------END CERTIFICATE----- - -# Issuer: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed -# Subject: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed -# Label: "OISTE WISeKey Global Root GC CA" -# Serial: 44084345621038548146064804565436152554 -# MD5 Fingerprint: a9:d6:b9:2d:2f:93:64:f8:a5:69:ca:91:e9:68:07:23 -# SHA1 Fingerprint: e0:11:84:5e:34:de:be:88:81:b9:9c:f6:16:26:d1:96:1f:c3:b9:31 -# SHA256 Fingerprint: 85:60:f9:1c:36:24:da:ba:95:70:b5:fe:a0:db:e3:6f:f1:1a:83:23:be:94:86:85:4f:b3:f3:4a:55:71:19:8d ------BEGIN CERTIFICATE----- -MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQsw -CQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91 -bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwg -Um9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRaFw00MjA1MDkwOTU4MzNaMG0xCzAJ -BgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBGb3Vu -ZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2JhbCBS -b290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4ni -eUqjFqdrVCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4W -p2OQ0jnUsYd4XxiWD1AbNTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8E -BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7T -rYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0EAwMDaAAwZQIwJsdpW9zV -57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtkAjEA2zQg -Mgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 ------END CERTIFICATE----- - -# Issuer: CN=GTS Root R1 O=Google Trust Services LLC -# Subject: CN=GTS Root R1 O=Google Trust Services LLC -# Label: "GTS Root R1" -# Serial: 146587175971765017618439757810265552097 -# MD5 Fingerprint: 82:1a:ef:d4:d2:4a:f2:9f:e2:3d:97:06:14:70:72:85 -# SHA1 Fingerprint: e1:c9:50:e6:ef:22:f8:4c:56:45:72:8b:92:20:60:d7:d5:a7:a3:e8 -# SHA256 Fingerprint: 2a:57:54:71:e3:13:40:bc:21:58:1c:bd:2c:f1:3e:15:84:63:20:3e:ce:94:bc:f9:d3:cc:19:6b:f0:9a:54:72 ------BEGIN CERTIFICATE----- -MIIFWjCCA0KgAwIBAgIQbkepxUtHDA3sM9CJuRz04TANBgkqhkiG9w0BAQwFADBH -MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM -QzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIy -MDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNl -cnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaM -f/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vX -mX7wCl7raKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7 -zUjwTcLCeoiKu7rPWRnWr4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0P -fyblqAj+lug8aJRT7oM6iCsVlgmy4HqMLnXWnOunVmSPlk9orj2XwoSPwLxAwAtc -vfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk9+aCEI3oncKKiPo4 -Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zqkUsp -zBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOO -Rc92wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYW -k70paDPvOmbsB4om3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+ -DVrNVjzRlwW5y0vtOUucxD/SVRNuJLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgF -lQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV -HQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQADggIBADiW -Cu49tJYeX++dnAsznyvgyv3SjgofQXSlfKqE1OXyHuY3UjKcC9FhHb8owbZEKTV1 -d5iyfNm9dKyKaOOpMQkpAWBz40d8U6iQSifvS9efk+eCNs6aaAyC58/UEBZvXw6Z -XPYfcX3v73svfuo21pdwCxXu11xWajOl40k4DLh9+42FpLFZXvRq4d2h9mREruZR -gyFmxhE+885H7pwoHyXa/6xmld01D1zvICxi/ZG6qcz8WpyTgYMpl0p8WnK0OdC3 -d8t5/Wk6kjftbjhlRn7pYL15iJdfOBL07q9bgsiG1eGZbYwE8na6SfZu6W0eX6Dv -J4J2QPim01hcDyxC2kLGe4g0x8HYRZvBPsVhHdljUEn2NIVq4BjFbkerQUIpm/Zg -DdIx02OYI5NaAIFItO/Nis3Jz5nu2Z6qNuFoS3FJFDYoOj0dzpqPJeaAcWErtXvM -+SUWgeExX6GjfhaknBZqlxi9dnKlC54dNuYvoS++cJEPqOba+MSSQGwlfnuzCdyy -F62ARPBopY+Udf90WuioAnwMCeKpSwughQtiue+hMZL77/ZRBIls6Kl0obsXs7X9 -SQ98POyDGCBDTtWTurQ0sR8WNh8M5mQ5Fkzc4P4dyKliPUDqysU0ArSuiYgzNdws -E3PYJ/HQcu51OyLemGhmW/HGY0dVHLqlCFF1pkgl ------END CERTIFICATE----- - -# Issuer: CN=GTS Root R2 O=Google Trust Services LLC -# Subject: CN=GTS Root R2 O=Google Trust Services LLC -# Label: "GTS Root R2" -# Serial: 146587176055767053814479386953112547951 -# MD5 Fingerprint: 44:ed:9a:0e:a4:09:3b:00:f2:ae:4c:a3:c6:61:b0:8b -# SHA1 Fingerprint: d2:73:96:2a:2a:5e:39:9f:73:3f:e1:c7:1e:64:3f:03:38:34:fc:4d -# SHA256 Fingerprint: c4:5d:7b:b0:8e:6d:67:e6:2e:42:35:11:0b:56:4e:5f:78:fd:92:ef:05:8c:84:0a:ea:4e:64:55:d7:58:5c:60 ------BEGIN CERTIFICATE----- -MIIFWjCCA0KgAwIBAgIQbkepxlqz5yDFMJo/aFLybzANBgkqhkiG9w0BAQwFADBH -MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM -QzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIy -MDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNl -cnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3Lv -CvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3Kg -GjSY6Dlo7JUle3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9Bu -XvAuMC6C/Pq8tBcKSOWIm8Wba96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOd -re7kRXuJVfeKH2JShBKzwkCX44ofR5GmdFrS+LFjKBC4swm4VndAoiaYecb+3yXu -PuWgf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7MkogwTZq9TwtImoS1 -mKPV+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJGr61K -8YzodDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqj -x5RWIr9qS34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsR -nTKaG73VululycslaVNVJ1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0 -kzCqgc7dGtxRcw1PcOnlthYhGXmy5okLdWTK1au8CcEYof/UVKGFPP0UJAOyh9Ok -twIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV -HQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQADggIBALZp -8KZ3/p7uC4Gt4cCpx/k1HUCCq+YEtN/L9x0Pg/B+E02NjO7jMyLDOfxA325BS0JT -vhaI8dI4XsRomRyYUpOM52jtG2pzegVATX9lO9ZY8c6DR2Dj/5epnGB3GFW1fgiT -z9D2PGcDFWEJ+YF59exTpJ/JjwGLc8R3dtyDovUMSRqodt6Sm2T4syzFJ9MHwAiA -pJiS4wGWAqoC7o87xdFtCjMwc3i5T1QWvwsHoaRc5svJXISPD+AVdyx+Jn7axEvb -pxZ3B7DNdehyQtaVhJ2Gg/LkkM0JR9SLA3DaWsYDQvTtN6LwG1BUSw7YhN4ZKJmB -R64JGz9I0cNv4rBgF/XuIwKl2gBbbZCr7qLpGzvpx0QnRY5rn/WkhLx3+WuXrD5R -RaIRpsyF7gpo8j5QOHokYh4XIDdtak23CZvJ/KRY9bb7nE4Yu5UC56GtmwfuNmsk -0jmGwZODUNKBRqhfYlcsu2xkiAhu7xNUX90txGdj08+JN7+dIPT7eoOboB6BAFDC -5AwiWVIQ7UNWhwD4FFKnHYuTjKJNRn8nxnGbJN7k2oaLDX5rIMHAnuFl2GqjpuiF -izoHCBy69Y9Vmhh1fuXsgWbRIXOhNUQLgD1bnF5vKheW0YMjiGZt5obicDIvUiLn -yOd/xCxgXS/Dr55FBcOEArf9LAhST4Ldo/DUhgkC ------END CERTIFICATE----- - -# Issuer: CN=GTS Root R3 O=Google Trust Services LLC -# Subject: CN=GTS Root R3 O=Google Trust Services LLC -# Label: "GTS Root R3" -# Serial: 146587176140553309517047991083707763997 -# MD5 Fingerprint: 1a:79:5b:6b:04:52:9c:5d:c7:74:33:1b:25:9a:f9:25 -# SHA1 Fingerprint: 30:d4:24:6f:07:ff:db:91:89:8a:0b:e9:49:66:11:eb:8c:5e:46:e5 -# SHA256 Fingerprint: 15:d5:b8:77:46:19:ea:7d:54:ce:1c:a6:d0:b0:c4:03:e0:37:a9:17:f1:31:e8:a0:4e:1e:6b:7a:71:ba:bc:e5 ------BEGIN CERTIFICATE----- -MIICDDCCAZGgAwIBAgIQbkepx2ypcyRAiQ8DVd2NHTAKBggqhkjOPQQDAzBHMQsw -CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU -MBIGA1UEAxMLR1RTIFJvb3QgUjMwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw -MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp -Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjOPQIBBgUrgQQA -IgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout -736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2A -DDL24CejQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud -DgQWBBTB8Sa6oC2uhYHP0/EqEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEAgFuk -fCPAlaUs3L6JbyO5o91lAFJekazInXJ0glMLfalAvWhgxeG4VDvBNhcl2MG9AjEA -njWSdIUlUfUk7GRSJFClH9voy8l27OyCbvWFGFPouOOaKaqW04MjyaR7YbPMAuhd ------END CERTIFICATE----- - -# Issuer: CN=GTS Root R4 O=Google Trust Services LLC -# Subject: CN=GTS Root R4 O=Google Trust Services LLC -# Label: "GTS Root R4" -# Serial: 146587176229350439916519468929765261721 -# MD5 Fingerprint: 5d:b6:6a:c4:60:17:24:6a:1a:99:a8:4b:ee:5e:b4:26 -# SHA1 Fingerprint: 2a:1d:60:27:d9:4a:b1:0a:1c:4d:91:5c:cd:33:a0:cb:3e:2d:54:cb -# SHA256 Fingerprint: 71:cc:a5:39:1f:9e:79:4b:04:80:25:30:b3:63:e1:21:da:8a:30:43:bb:26:66:2f:ea:4d:ca:7f:c9:51:a4:bd ------BEGIN CERTIFICATE----- -MIICCjCCAZGgAwIBAgIQbkepyIuUtui7OyrYorLBmTAKBggqhkjOPQQDAzBHMQsw -CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU -MBIGA1UEAxMLR1RTIFJvb3QgUjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw -MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp -Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjOPQIBBgUrgQQA -IgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzu -hXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/l -xKvRHYqjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud -DgQWBBSATNbrdP9JNqPV2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNnADBkAjBqUFJ0 -CMRw3J5QdCHojXohw0+WbhXRIjVhLfoIN+4Zba3bssx9BzT1YBkstTTZbyACMANx -sbqjYAuG7ZoIapVon+Kz4ZNkfF6Tpt95LY2F45TPI11xzPKwTdb+mciUqXWi4w== ------END CERTIFICATE----- - -# Issuer: CN=UCA Global G2 Root O=UniTrust -# Subject: CN=UCA Global G2 Root O=UniTrust -# Label: "UCA Global G2 Root" -# Serial: 124779693093741543919145257850076631279 -# MD5 Fingerprint: 80:fe:f0:c4:4a:f0:5c:62:32:9f:1c:ba:78:a9:50:f8 -# SHA1 Fingerprint: 28:f9:78:16:19:7a:ff:18:25:18:aa:44:fe:c1:a0:ce:5c:b6:4c:8a -# SHA256 Fingerprint: 9b:ea:11:c9:76:fe:01:47:64:c1:be:56:a6:f9:14:b5:a5:60:31:7a:bd:99:88:39:33:82:e5:16:1a:a0:49:3c ------BEGIN CERTIFICATE----- -MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9 -MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBH -bG9iYWwgRzIgUm9vdDAeFw0xNjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0x -CzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlUcnVzdDEbMBkGA1UEAwwSVUNBIEds -b2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxeYr -b3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmToni9 -kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzm -VHqUwCoV8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/R -VogvGjqNO7uCEeBHANBSh6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDc -C/Vkw85DvG1xudLeJ1uK6NjGruFZfc8oLTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIj -tm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/R+zvWr9LesGtOxdQXGLY -D0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBeKW4bHAyv -j5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6Dl -NaBa4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6 -iIis7nCs+dwp4wwcOxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznP -O6Q0ibd5Ei9Hxeepl2n8pndntd978XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/ -BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFIHEjMz15DD/pQwIX4wV -ZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo5sOASD0Ee/oj -L3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5 -1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl -1qnN3e92mI0ADs0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oU -b3n09tDh05S60FdRvScFDcH9yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LV -PtateJLbXDzz2K36uGt/xDYotgIVilQsnLAXc47QN6MUPJiVAAwpBVueSUmxX8fj -y88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHojhJi6IjMtX9Gl8Cb -EGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZkbxqg -DMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI -+Vg7RE+xygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGy -YiGqhkCyLmTTX8jjfhFnRR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bX -UB+K+wb1whnw0A== ------END CERTIFICATE----- - -# Issuer: CN=UCA Extended Validation Root O=UniTrust -# Subject: CN=UCA Extended Validation Root O=UniTrust -# Label: "UCA Extended Validation Root" -# Serial: 106100277556486529736699587978573607008 -# MD5 Fingerprint: a1:f3:5f:43:c6:34:9b:da:bf:8c:7e:05:53:ad:96:e2 -# SHA1 Fingerprint: a3:a1:b0:6f:24:61:23:4a:e3:36:a5:c2:37:fc:a6:ff:dd:f0:d7:3a -# SHA256 Fingerprint: d4:3a:f9:b3:54:73:75:5c:96:84:fc:06:d7:d8:cb:70:ee:5c:28:e7:73:fb:29:4e:b4:1e:e7:17:22:92:4d:24 ------BEGIN CERTIFICATE----- -MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBH -MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBF -eHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMx -MDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNV -BAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrsiWog -D4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvS -sPGP2KxFRv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aop -O2z6+I9tTcg1367r3CTueUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dk -sHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR59mzLC52LqGj3n5qiAno8geK+LLNEOfi -c0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH0mK1lTnj8/FtDw5lhIpj -VMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KRel7sFsLz -KuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/ -TuDvB0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41G -sx2VYVdWf6/wFlthWG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs -1+lvK9JKBZP8nm9rZ/+I8U6laUpSNwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQD -fwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS3H5aBZ8eNJr34RQwDwYDVR0T -AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBADaN -l8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR -ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQ -VBcZEhrxH9cMaVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5 -c6sq1WnIeJEmMX3ixzDx/BR4dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp -4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb+7lsq+KePRXBOy5nAliRn+/4Qh8s -t2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOWF3sGPjLtx7dCvHaj -2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwiGpWO -vpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2C -xR9GUeOcGMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmx -cmtpzyKEC2IPrNkZAJSidjzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbM -fjKaiJUINlK73nZfdklJrX+9ZSCyycErdhh2n1ax ------END CERTIFICATE----- - -# Issuer: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036 -# Subject: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036 -# Label: "Certigna Root CA" -# Serial: 269714418870597844693661054334862075617 -# MD5 Fingerprint: 0e:5c:30:62:27:eb:5b:bc:d7:ae:62:ba:e9:d5:df:77 -# SHA1 Fingerprint: 2d:0d:52:14:ff:9e:ad:99:24:01:74:20:47:6e:6c:85:27:27:f5:43 -# SHA256 Fingerprint: d4:8d:3d:23:ee:db:50:a4:59:e5:51:97:60:1c:27:77:4b:9d:7b:18:c9:4d:5a:05:95:11:a1:02:50:b9:31:68 ------BEGIN CERTIFICATE----- -MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAw -WjELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAw -MiA0ODE0NjMwODEwMDAzNjEZMBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0x -MzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjdaMFoxCzAJBgNVBAYTAkZSMRIwEAYD -VQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYzMDgxMDAwMzYxGTAX -BgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw -ggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sO -ty3tRQgXstmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9M -CiBtnyN6tMbaLOQdLNyzKNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPu -I9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8JXrJhFwLrN1CTivngqIkicuQstDuI7pm -TLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16XdG+RCYyKfHx9WzMfgIh -C59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq4NYKpkDf -ePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3Yz -IoejwpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWT -Co/1VTp2lc5ZmIoJlXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1k -JWumIWmbat10TWuXekG9qxf5kBdIjzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5 -hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp//TBt2dzhauH8XwIDAQABo4IB -GjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE -FBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of -1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczov -L3d3d3cuY2VydGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilo -dHRwOi8vY3JsLmNlcnRpZ25hLmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYr -aHR0cDovL2NybC5kaGlteW90aXMuY29tL2NlcnRpZ25hcm9vdGNhLmNybDANBgkq -hkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOItOoldaDgvUSILSo3L -6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxPTGRG -HVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH6 -0BGM+RFq7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncB -lA2c5uk5jR+mUYyZDDl34bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdi -o2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1 -gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS6Cvu5zHbugRqh5jnxV/v -faci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaYtlu3zM63 -Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayh -jWZSaX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw -3kAP+HwV96LOPNdeE4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0= ------END CERTIFICATE----- - -# Issuer: CN=emSign Root CA - G1 O=eMudhra Technologies Limited OU=emSign PKI -# Subject: CN=emSign Root CA - G1 O=eMudhra Technologies Limited OU=emSign PKI -# Label: "emSign Root CA - G1" -# Serial: 235931866688319308814040 -# MD5 Fingerprint: 9c:42:84:57:dd:cb:0b:a7:2e:95:ad:b6:f3:da:bc:ac -# SHA1 Fingerprint: 8a:c7:ad:8f:73:ac:4e:c1:b5:75:4d:a5:40:f4:fc:cf:7c:b5:8e:8c -# SHA256 Fingerprint: 40:f6:af:03:46:a9:9a:a1:cd:1d:55:5a:4e:9c:ce:62:c7:f9:63:46:03:ee:40:66:15:83:3d:c8:c8:d0:03:67 ------BEGIN CERTIFICATE----- -MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYD -VQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBU -ZWNobm9sb2dpZXMgTGltaXRlZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBH -MTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgxODMwMDBaMGcxCzAJBgNVBAYTAklO -MRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVkaHJhIFRlY2hub2xv -Z2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIBIjAN -BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQz -f2N4aLTNLnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO -8oG0x5ZOrRkVUkr+PHB1cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aq -d7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHWDV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhM -tTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ6DqS0hdW5TUaQBw+jSzt -Od9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrHhQIDAQAB -o0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQD -AgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31x -PaOfG1vR2vjTnGs2vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjM -wiI/aTvFthUvozXGaCocV685743QNcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6d -GNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q+Mri/Tm3R7nrft8EI6/6nAYH -6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeihU80Bv2noWgby -RQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx -iN66zB+Afko= ------END CERTIFICATE----- - -# Issuer: CN=emSign ECC Root CA - G3 O=eMudhra Technologies Limited OU=emSign PKI -# Subject: CN=emSign ECC Root CA - G3 O=eMudhra Technologies Limited OU=emSign PKI -# Label: "emSign ECC Root CA - G3" -# Serial: 287880440101571086945156 -# MD5 Fingerprint: ce:0b:72:d1:9f:88:8e:d0:50:03:e8:e3:b8:8b:67:40 -# SHA1 Fingerprint: 30:43:fa:4f:f2:57:dc:a0:c3:80:ee:2e:58:ea:78:b2:3f:e6:bb:c1 -# SHA256 Fingerprint: 86:a1:ec:ba:08:9c:4a:8d:3b:be:27:34:c6:12:ba:34:1d:81:3e:04:3c:f9:e8:a8:62:cd:5c:57:a3:6b:be:6b ------BEGIN CERTIFICATE----- -MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQG -EwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNo -bm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g -RzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4MTgzMDAwWjBrMQswCQYDVQQGEwJJ -TjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9s -b2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMw -djAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0 -WXTsuwYc58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xyS -fvalY8L1X44uT6EYGQIrMgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuB -zhccLikenEhjQjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggq -hkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+DCBeQyh+KTOgNG3qxrdWB -CUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7jHvrZQnD -+JbNR6iC8hZVdyR+EhCVBCyj ------END CERTIFICATE----- - -# Issuer: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI -# Subject: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI -# Label: "emSign Root CA - C1" -# Serial: 825510296613316004955058 -# MD5 Fingerprint: d8:e3:5d:01:21:fa:78:5a:b0:df:ba:d2:ee:2a:5f:68 -# SHA1 Fingerprint: e7:2e:f1:df:fc:b2:09:28:cf:5d:d4:d5:67:37:b1:51:cb:86:4f:01 -# SHA256 Fingerprint: 12:56:09:aa:30:1d:a0:a2:49:b9:7a:82:39:cb:6a:34:21:6f:44:dc:ac:9f:39:54:b1:42:92:f2:e8:c8:60:8f ------BEGIN CERTIFICATE----- -MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkG -A1UEBhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEg -SW5jMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAw -MFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln -biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNpZ24gUm9v -dCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+upufGZ -BczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZ -HdPIWoU/Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH -3DspVpNqs8FqOp099cGXOFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvH -GPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4VI5b2P/AgNBbeCsbEBEV5f6f9vtKppa+c -xSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleoomslMuoaJuvimUnzYnu3Yy1 -aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+XJGFehiq -TbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL -BQADggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87 -/kOXSTKZEhVb3xEp/6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4 -kqNPEjE2NuLe/gDEo2APJ62gsIq1NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrG -YQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9wC68AivTxEDkigcxHpvOJpkT -+xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQBmIMMMAVSKeo -WXzhriKi4gp6D/piq1JM4fHfyr6DDUI= ------END CERTIFICATE----- - -# Issuer: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI -# Subject: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI -# Label: "emSign ECC Root CA - C3" -# Serial: 582948710642506000014504 -# MD5 Fingerprint: 3e:53:b3:a3:81:ee:d7:10:f8:d3:b0:1d:17:92:f5:d5 -# SHA1 Fingerprint: b6:af:43:c2:9b:81:53:7d:f6:ef:6b:c3:1f:1f:60:15:0c:ee:48:66 -# SHA256 Fingerprint: bc:4d:80:9b:15:18:9d:78:db:3e:1d:8c:f4:f9:72:6a:79:5d:a1:64:3c:a5:f1:35:8e:1d:db:0e:dc:0d:7e:b3 ------BEGIN CERTIFICATE----- -MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQG -EwJVUzETMBEGA1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMx -IDAeBgNVBAMTF2VtU2lnbiBFQ0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAw -MFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln -biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQDExdlbVNpZ24gRUND -IFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd6bci -MK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4Ojavti -sIGJAnB9SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0O -BBYEFPtaSNCAIEDyqOkAB2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB -Af8EBTADAQH/MAoGCCqGSM49BAMDA2gAMGUCMQC02C8Cif22TGK6Q04ThHK1rt0c -3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwUZOR8loMRnLDRWmFLpg9J -0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ== ------END CERTIFICATE----- - -# Issuer: CN=Hongkong Post Root CA 3 O=Hongkong Post -# Subject: CN=Hongkong Post Root CA 3 O=Hongkong Post -# Label: "Hongkong Post Root CA 3" -# Serial: 46170865288971385588281144162979347873371282084 -# MD5 Fingerprint: 11:fc:9f:bd:73:30:02:8a:fd:3f:f3:58:b9:cb:20:f0 -# SHA1 Fingerprint: 58:a2:d0:ec:20:52:81:5b:c1:f3:f8:64:02:24:4e:c2:8e:02:4b:02 -# SHA256 Fingerprint: 5a:2f:c0:3f:0c:83:b0:90:bb:fa:40:60:4b:09:88:44:6c:76:36:18:3d:f9:84:6e:17:10:1a:44:7f:b8:ef:d6 ------BEGIN CERTIFICATE----- -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 -mpv0 ------END CERTIFICATE----- diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/certifi/core.py b/venv/lib/python2.7/site-packages/pip/_vendor/certifi/core.py deleted file mode 100644 index 7271acf..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/certifi/core.py +++ /dev/null @@ -1,15 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -certifi.py -~~~~~~~~~~ - -This module returns the installation location of cacert.pem. -""" -import os - - -def where(): - f = os.path.dirname(__file__) - - return os.path.join(f, 'cacert.pem') diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/certifi/core.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/certifi/core.pyc deleted file mode 100644 index d6757c3e90e324f132ad9812771d465145ac6e1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 633 zcmc(d+e*Vg5QaBNttC`1d;xPK1fks)r6`C9UR$Krn}RGc*)-dxyK#4WL<OmD>;vdb zTG~f&VE+8fp1v94{T%t{U&k*o*@g?>J4ka1k`OWgbx7ip+#v%n9{Gl%i<PIaf*YSf z{FrMiQqe4y{^u@yzn=*cOjI(>d7!zSYH0$S@jyspqdbqSP%_9>yfG>b;s|eQ7JSn5 z#V<s+By->m5Aq%#JOi<Wj2tp@iS@|ZAs@R+g}j%<YvjXby2c0H-y0s_aa>WxVgp5F zGkXXo5n4tQZfoEfOGVBZD|d{PkRc*ilr#h(rI;}|T4*tgET^+b(^TaN*M_bZba|m) z<$T=kyvbHaUv}avv$#%Hx&<*TXrC6MXlw`3u<eH-d&E+iY{q4xG~JGs#!7RTtwr{E u#x<{lF-T9G6F0=slr1opsF<-HF7&D(d)EH}t^vc%<_EY%Uouyny7vcMIH6(y diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/__init__.py deleted file mode 100644 index 0f9f820..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/__init__.py +++ /dev/null @@ -1,39 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - - -from .compat import PY2, PY3 -from .universaldetector import UniversalDetector -from .version import __version__, VERSION - - -def detect(byte_str): - """ - Detect the encoding of the given byte string. - - :param byte_str: The byte sequence to examine. - :type byte_str: ``bytes`` or ``bytearray`` - """ - if not isinstance(byte_str, bytearray): - if not isinstance(byte_str, bytes): - raise TypeError('Expected object of type bytes or bytearray, got: ' - '{0}'.format(type(byte_str))) - else: - byte_str = bytearray(byte_str) - detector = UniversalDetector() - detector.feed(byte_str) - return detector.close() diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/__init__.pyc deleted file mode 100644 index fcf05b83578c30a098a9a922f0f79dba57c06d18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1088 zcmc&yZEw>s5I(1`D;gU@Onmgm3bCeRQw7z8kYFDs#F(;yL?o1^iQ8pM;?#CWJJ<&( z|Ae2&AK=bOx1WF&Kk>ah=ezUO{%&@j{e1W}f@(SVe}h{eBgFVINC7eiK7-5w-vLHi z2htj3b@1z@T!XX$SrhywWG(PpsI9|q0KW}!1J1fljFvEjE?r=12&Z3ORR8@hS<EAZ zPkC}Jln&E(!idO7Rr)_bQxK3Pk$Di97RsNGytCtvClPTeXdU-k-1-W^0Q^8?uyR1Z zUyF_v59xla>#`1}L2fH_v)?ZUGjwK^@)jV+AWc{S+@caGt;)nmXp`a0W~l$*r5%o| zOq`nw!9^a)ILW76POLn|+HyW#8o{+uXy|n;WmtqN%&Z|m!;r%8a|}?rirE|^32r18 zi!e)a(JN_YS(HBaEIt|$NsmTcs!9lz3YVji<>&*<^Jr0EZ$-@I_!18`y>%!}JPKi1 z&-qlEA^+aL?QT$4I|zwRa&1D)$dK;N7kgPs+Un0S;*nBPVgCRoQe~kr^hT7mXQzOq zi4d`6Myb@IeC>7>h{`e~#Oq<eGjs{GL~sk0T!%)u*P(JJGL3OQ+?$2F+*jlL+tuD+ zmiGthU=Y33i&ycD>f@Rg?zvke#jY(PO?S=ShiPz1D!XyW@>nW2x(F3s>jpuRCngAb z#nKj1rt*|h*rr5UTWpJMuqO`TCOawnL?uTuD?;OulXo}Y^YwhMODa1-^IT20S0e(o h#@j-$)!xH@shghQFq82-6|W!TSyOpCY@6-W{sB+23UB}b diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/big5freq.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/big5freq.py deleted file mode 100644 index 38f3251..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/big5freq.py +++ /dev/null @@ -1,386 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# Big5 frequency table -# by Taiwan's Mandarin Promotion Council -# <http://www.edu.tw:81/mandr/> -# -# 128 --> 0.42261 -# 256 --> 0.57851 -# 512 --> 0.74851 -# 1024 --> 0.89384 -# 2048 --> 0.97583 -# -# Ideal Distribution Ratio = 0.74851/(1-0.74851) =2.98 -# Random Distribution Ration = 512/(5401-512)=0.105 -# -# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR - -BIG5_TYPICAL_DISTRIBUTION_RATIO = 0.75 - -#Char to FreqOrder table -BIG5_TABLE_SIZE = 5376 - -BIG5_CHAR_TO_FREQ_ORDER = ( - 1,1801,1506, 255,1431, 198, 9, 82, 6,5008, 177, 202,3681,1256,2821, 110, # 16 -3814, 33,3274, 261, 76, 44,2114, 16,2946,2187,1176, 659,3971, 26,3451,2653, # 32 -1198,3972,3350,4202, 410,2215, 302, 590, 361,1964, 8, 204, 58,4510,5009,1932, # 48 - 63,5010,5011, 317,1614, 75, 222, 159,4203,2417,1480,5012,3555,3091, 224,2822, # 64 -3682, 3, 10,3973,1471, 29,2787,1135,2866,1940, 873, 130,3275,1123, 312,5013, # 80 -4511,2052, 507, 252, 682,5014, 142,1915, 124, 206,2947, 34,3556,3204, 64, 604, # 96 -5015,2501,1977,1978, 155,1991, 645, 641,1606,5016,3452, 337, 72, 406,5017, 80, # 112 - 630, 238,3205,1509, 263, 939,1092,2654, 756,1440,1094,3453, 449, 69,2987, 591, # 128 - 179,2096, 471, 115,2035,1844, 60, 50,2988, 134, 806,1869, 734,2036,3454, 180, # 144 - 995,1607, 156, 537,2907, 688,5018, 319,1305, 779,2145, 514,2379, 298,4512, 359, # 160 -2502, 90,2716,1338, 663, 11, 906,1099,2553, 20,2441, 182, 532,1716,5019, 732, # 176 -1376,4204,1311,1420,3206, 25,2317,1056, 113, 399, 382,1950, 242,3455,2474, 529, # 192 -3276, 475,1447,3683,5020, 117, 21, 656, 810,1297,2300,2334,3557,5021, 126,4205, # 208 - 706, 456, 150, 613,4513, 71,1118,2037,4206, 145,3092, 85, 835, 486,2115,1246, # 224 -1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,5022,2128,2359, 347,3815, 221, # 240 -3558,3135,5023,1956,1153,4207, 83, 296,1199,3093, 192, 624, 93,5024, 822,1898, # 256 -2823,3136, 795,2065, 991,1554,1542,1592, 27, 43,2867, 859, 139,1456, 860,4514, # 272 - 437, 712,3974, 164,2397,3137, 695, 211,3037,2097, 195,3975,1608,3559,3560,3684, # 288 -3976, 234, 811,2989,2098,3977,2233,1441,3561,1615,2380, 668,2077,1638, 305, 228, # 304 -1664,4515, 467, 415,5025, 262,2099,1593, 239, 108, 300, 200,1033, 512,1247,2078, # 320 -5026,5027,2176,3207,3685,2682, 593, 845,1062,3277, 88,1723,2038,3978,1951, 212, # 336 - 266, 152, 149, 468,1899,4208,4516, 77, 187,5028,3038, 37, 5,2990,5029,3979, # 352 -5030,5031, 39,2524,4517,2908,3208,2079, 55, 148, 74,4518, 545, 483,1474,1029, # 368 -1665, 217,1870,1531,3138,1104,2655,4209, 24, 172,3562, 900,3980,3563,3564,4519, # 384 - 32,1408,2824,1312, 329, 487,2360,2251,2717, 784,2683, 4,3039,3351,1427,1789, # 400 - 188, 109, 499,5032,3686,1717,1790, 888,1217,3040,4520,5033,3565,5034,3352,1520, # 416 -3687,3981, 196,1034, 775,5035,5036, 929,1816, 249, 439, 38,5037,1063,5038, 794, # 432 -3982,1435,2301, 46, 178,3278,2066,5039,2381,5040, 214,1709,4521, 804, 35, 707, # 448 - 324,3688,1601,2554, 140, 459,4210,5041,5042,1365, 839, 272, 978,2262,2580,3456, # 464 -2129,1363,3689,1423, 697, 100,3094, 48, 70,1231, 495,3139,2196,5043,1294,5044, # 480 -2080, 462, 586,1042,3279, 853, 256, 988, 185,2382,3457,1698, 434,1084,5045,3458, # 496 - 314,2625,2788,4522,2335,2336, 569,2285, 637,1817,2525, 757,1162,1879,1616,3459, # 512 - 287,1577,2116, 768,4523,1671,2868,3566,2526,1321,3816, 909,2418,5046,4211, 933, # 528 -3817,4212,2053,2361,1222,4524, 765,2419,1322, 786,4525,5047,1920,1462,1677,2909, # 544 -1699,5048,4526,1424,2442,3140,3690,2600,3353,1775,1941,3460,3983,4213, 309,1369, # 560 -1130,2825, 364,2234,1653,1299,3984,3567,3985,3986,2656, 525,1085,3041, 902,2001, # 576 -1475, 964,4527, 421,1845,1415,1057,2286, 940,1364,3141, 376,4528,4529,1381, 7, # 592 -2527, 983,2383, 336,1710,2684,1846, 321,3461, 559,1131,3042,2752,1809,1132,1313, # 608 - 265,1481,1858,5049, 352,1203,2826,3280, 167,1089, 420,2827, 776, 792,1724,3568, # 624 -4214,2443,3281,5050,4215,5051, 446, 229, 333,2753, 901,3818,1200,1557,4530,2657, # 640 -1921, 395,2754,2685,3819,4216,1836, 125, 916,3209,2626,4531,5052,5053,3820,5054, # 656 -5055,5056,4532,3142,3691,1133,2555,1757,3462,1510,2318,1409,3569,5057,2146, 438, # 672 -2601,2910,2384,3354,1068, 958,3043, 461, 311,2869,2686,4217,1916,3210,4218,1979, # 688 - 383, 750,2755,2627,4219, 274, 539, 385,1278,1442,5058,1154,1965, 384, 561, 210, # 704 - 98,1295,2556,3570,5059,1711,2420,1482,3463,3987,2911,1257, 129,5060,3821, 642, # 720 - 523,2789,2790,2658,5061, 141,2235,1333, 68, 176, 441, 876, 907,4220, 603,2602, # 736 - 710, 171,3464, 404, 549, 18,3143,2398,1410,3692,1666,5062,3571,4533,2912,4534, # 752 -5063,2991, 368,5064, 146, 366, 99, 871,3693,1543, 748, 807,1586,1185, 22,2263, # 768 - 379,3822,3211,5065,3212, 505,1942,2628,1992,1382,2319,5066, 380,2362, 218, 702, # 784 -1818,1248,3465,3044,3572,3355,3282,5067,2992,3694, 930,3283,3823,5068, 59,5069, # 800 - 585, 601,4221, 497,3466,1112,1314,4535,1802,5070,1223,1472,2177,5071, 749,1837, # 816 - 690,1900,3824,1773,3988,1476, 429,1043,1791,2236,2117, 917,4222, 447,1086,1629, # 832 -5072, 556,5073,5074,2021,1654, 844,1090, 105, 550, 966,1758,2828,1008,1783, 686, # 848 -1095,5075,2287, 793,1602,5076,3573,2603,4536,4223,2948,2302,4537,3825, 980,2503, # 864 - 544, 353, 527,4538, 908,2687,2913,5077, 381,2629,1943,1348,5078,1341,1252, 560, # 880 -3095,5079,3467,2870,5080,2054, 973, 886,2081, 143,4539,5081,5082, 157,3989, 496, # 896 -4224, 57, 840, 540,2039,4540,4541,3468,2118,1445, 970,2264,1748,1966,2082,4225, # 912 -3144,1234,1776,3284,2829,3695, 773,1206,2130,1066,2040,1326,3990,1738,1725,4226, # 928 - 279,3145, 51,1544,2604, 423,1578,2131,2067, 173,4542,1880,5083,5084,1583, 264, # 944 - 610,3696,4543,2444, 280, 154,5085,5086,5087,1739, 338,1282,3096, 693,2871,1411, # 960 -1074,3826,2445,5088,4544,5089,5090,1240, 952,2399,5091,2914,1538,2688, 685,1483, # 976 -4227,2475,1436, 953,4228,2055,4545, 671,2400, 79,4229,2446,3285, 608, 567,2689, # 992 -3469,4230,4231,1691, 393,1261,1792,2401,5092,4546,5093,5094,5095,5096,1383,1672, # 1008 -3827,3213,1464, 522,1119, 661,1150, 216, 675,4547,3991,1432,3574, 609,4548,2690, # 1024 -2402,5097,5098,5099,4232,3045, 0,5100,2476, 315, 231,2447, 301,3356,4549,2385, # 1040 -5101, 233,4233,3697,1819,4550,4551,5102, 96,1777,1315,2083,5103, 257,5104,1810, # 1056 -3698,2718,1139,1820,4234,2022,1124,2164,2791,1778,2659,5105,3097, 363,1655,3214, # 1072 -5106,2993,5107,5108,5109,3992,1567,3993, 718, 103,3215, 849,1443, 341,3357,2949, # 1088 -1484,5110,1712, 127, 67, 339,4235,2403, 679,1412, 821,5111,5112, 834, 738, 351, # 1104 -2994,2147, 846, 235,1497,1881, 418,1993,3828,2719, 186,1100,2148,2756,3575,1545, # 1120 -1355,2950,2872,1377, 583,3994,4236,2581,2995,5113,1298,3699,1078,2557,3700,2363, # 1136 - 78,3829,3830, 267,1289,2100,2002,1594,4237, 348, 369,1274,2197,2178,1838,4552, # 1152 -1821,2830,3701,2757,2288,2003,4553,2951,2758, 144,3358, 882,4554,3995,2759,3470, # 1168 -4555,2915,5114,4238,1726, 320,5115,3996,3046, 788,2996,5116,2831,1774,1327,2873, # 1184 -3997,2832,5117,1306,4556,2004,1700,3831,3576,2364,2660, 787,2023, 506, 824,3702, # 1200 - 534, 323,4557,1044,3359,2024,1901, 946,3471,5118,1779,1500,1678,5119,1882,4558, # 1216 - 165, 243,4559,3703,2528, 123, 683,4239, 764,4560, 36,3998,1793, 589,2916, 816, # 1232 - 626,1667,3047,2237,1639,1555,1622,3832,3999,5120,4000,2874,1370,1228,1933, 891, # 1248 -2084,2917, 304,4240,5121, 292,2997,2720,3577, 691,2101,4241,1115,4561, 118, 662, # 1264 -5122, 611,1156, 854,2386,1316,2875, 2, 386, 515,2918,5123,5124,3286, 868,2238, # 1280 -1486, 855,2661, 785,2216,3048,5125,1040,3216,3578,5126,3146, 448,5127,1525,5128, # 1296 -2165,4562,5129,3833,5130,4242,2833,3579,3147, 503, 818,4001,3148,1568, 814, 676, # 1312 -1444, 306,1749,5131,3834,1416,1030, 197,1428, 805,2834,1501,4563,5132,5133,5134, # 1328 -1994,5135,4564,5136,5137,2198, 13,2792,3704,2998,3149,1229,1917,5138,3835,2132, # 1344 -5139,4243,4565,2404,3580,5140,2217,1511,1727,1120,5141,5142, 646,3836,2448, 307, # 1360 -5143,5144,1595,3217,5145,5146,5147,3705,1113,1356,4002,1465,2529,2530,5148, 519, # 1376 -5149, 128,2133, 92,2289,1980,5150,4003,1512, 342,3150,2199,5151,2793,2218,1981, # 1392 -3360,4244, 290,1656,1317, 789, 827,2365,5152,3837,4566, 562, 581,4004,5153, 401, # 1408 -4567,2252, 94,4568,5154,1399,2794,5155,1463,2025,4569,3218,1944,5156, 828,1105, # 1424 -4245,1262,1394,5157,4246, 605,4570,5158,1784,2876,5159,2835, 819,2102, 578,2200, # 1440 -2952,5160,1502, 436,3287,4247,3288,2836,4005,2919,3472,3473,5161,2721,2320,5162, # 1456 -5163,2337,2068, 23,4571, 193, 826,3838,2103, 699,1630,4248,3098, 390,1794,1064, # 1472 -3581,5164,1579,3099,3100,1400,5165,4249,1839,1640,2877,5166,4572,4573, 137,4250, # 1488 - 598,3101,1967, 780, 104, 974,2953,5167, 278, 899, 253, 402, 572, 504, 493,1339, # 1504 -5168,4006,1275,4574,2582,2558,5169,3706,3049,3102,2253, 565,1334,2722, 863, 41, # 1520 -5170,5171,4575,5172,1657,2338, 19, 463,2760,4251, 606,5173,2999,3289,1087,2085, # 1536 -1323,2662,3000,5174,1631,1623,1750,4252,2691,5175,2878, 791,2723,2663,2339, 232, # 1552 -2421,5176,3001,1498,5177,2664,2630, 755,1366,3707,3290,3151,2026,1609, 119,1918, # 1568 -3474, 862,1026,4253,5178,4007,3839,4576,4008,4577,2265,1952,2477,5179,1125, 817, # 1584 -4254,4255,4009,1513,1766,2041,1487,4256,3050,3291,2837,3840,3152,5180,5181,1507, # 1600 -5182,2692, 733, 40,1632,1106,2879, 345,4257, 841,2531, 230,4578,3002,1847,3292, # 1616 -3475,5183,1263, 986,3476,5184, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562, # 1632 -4010,4011,2954, 967,2761,2665,1349, 592,2134,1692,3361,3003,1995,4258,1679,4012, # 1648 -1902,2188,5185, 739,3708,2724,1296,1290,5186,4259,2201,2202,1922,1563,2605,2559, # 1664 -1871,2762,3004,5187, 435,5188, 343,1108, 596, 17,1751,4579,2239,3477,3709,5189, # 1680 -4580, 294,3582,2955,1693, 477, 979, 281,2042,3583, 643,2043,3710,2631,2795,2266, # 1696 -1031,2340,2135,2303,3584,4581, 367,1249,2560,5190,3585,5191,4582,1283,3362,2005, # 1712 - 240,1762,3363,4583,4584, 836,1069,3153, 474,5192,2149,2532, 268,3586,5193,3219, # 1728 -1521,1284,5194,1658,1546,4260,5195,3587,3588,5196,4261,3364,2693,1685,4262, 961, # 1744 -1673,2632, 190,2006,2203,3841,4585,4586,5197, 570,2504,3711,1490,5198,4587,2633, # 1760 -3293,1957,4588, 584,1514, 396,1045,1945,5199,4589,1968,2449,5200,5201,4590,4013, # 1776 - 619,5202,3154,3294, 215,2007,2796,2561,3220,4591,3221,4592, 763,4263,3842,4593, # 1792 -5203,5204,1958,1767,2956,3365,3712,1174, 452,1477,4594,3366,3155,5205,2838,1253, # 1808 -2387,2189,1091,2290,4264, 492,5206, 638,1169,1825,2136,1752,4014, 648, 926,1021, # 1824 -1324,4595, 520,4596, 997, 847,1007, 892,4597,3843,2267,1872,3713,2405,1785,4598, # 1840 -1953,2957,3103,3222,1728,4265,2044,3714,4599,2008,1701,3156,1551, 30,2268,4266, # 1856 -5207,2027,4600,3589,5208, 501,5209,4267, 594,3478,2166,1822,3590,3479,3591,3223, # 1872 - 829,2839,4268,5210,1680,3157,1225,4269,5211,3295,4601,4270,3158,2341,5212,4602, # 1888 -4271,5213,4015,4016,5214,1848,2388,2606,3367,5215,4603, 374,4017, 652,4272,4273, # 1904 - 375,1140, 798,5216,5217,5218,2366,4604,2269, 546,1659, 138,3051,2450,4605,5219, # 1920 -2254, 612,1849, 910, 796,3844,1740,1371, 825,3845,3846,5220,2920,2562,5221, 692, # 1936 - 444,3052,2634, 801,4606,4274,5222,1491, 244,1053,3053,4275,4276, 340,5223,4018, # 1952 -1041,3005, 293,1168, 87,1357,5224,1539, 959,5225,2240, 721, 694,4277,3847, 219, # 1968 -1478, 644,1417,3368,2666,1413,1401,1335,1389,4019,5226,5227,3006,2367,3159,1826, # 1984 - 730,1515, 184,2840, 66,4607,5228,1660,2958, 246,3369, 378,1457, 226,3480, 975, # 2000 -4020,2959,1264,3592, 674, 696,5229, 163,5230,1141,2422,2167, 713,3593,3370,4608, # 2016 -4021,5231,5232,1186, 15,5233,1079,1070,5234,1522,3224,3594, 276,1050,2725, 758, # 2032 -1126, 653,2960,3296,5235,2342, 889,3595,4022,3104,3007, 903,1250,4609,4023,3481, # 2048 -3596,1342,1681,1718, 766,3297, 286, 89,2961,3715,5236,1713,5237,2607,3371,3008, # 2064 -5238,2962,2219,3225,2880,5239,4610,2505,2533, 181, 387,1075,4024, 731,2190,3372, # 2080 -5240,3298, 310, 313,3482,2304, 770,4278, 54,3054, 189,4611,3105,3848,4025,5241, # 2096 -1230,1617,1850, 355,3597,4279,4612,3373, 111,4280,3716,1350,3160,3483,3055,4281, # 2112 -2150,3299,3598,5242,2797,4026,4027,3009, 722,2009,5243,1071, 247,1207,2343,2478, # 2128 -1378,4613,2010, 864,1437,1214,4614, 373,3849,1142,2220, 667,4615, 442,2763,2563, # 2144 -3850,4028,1969,4282,3300,1840, 837, 170,1107, 934,1336,1883,5244,5245,2119,4283, # 2160 -2841, 743,1569,5246,4616,4284, 582,2389,1418,3484,5247,1803,5248, 357,1395,1729, # 2176 -3717,3301,2423,1564,2241,5249,3106,3851,1633,4617,1114,2086,4285,1532,5250, 482, # 2192 -2451,4618,5251,5252,1492, 833,1466,5253,2726,3599,1641,2842,5254,1526,1272,3718, # 2208 -4286,1686,1795, 416,2564,1903,1954,1804,5255,3852,2798,3853,1159,2321,5256,2881, # 2224 -4619,1610,1584,3056,2424,2764, 443,3302,1163,3161,5257,5258,4029,5259,4287,2506, # 2240 -3057,4620,4030,3162,2104,1647,3600,2011,1873,4288,5260,4289, 431,3485,5261, 250, # 2256 - 97, 81,4290,5262,1648,1851,1558, 160, 848,5263, 866, 740,1694,5264,2204,2843, # 2272 -3226,4291,4621,3719,1687, 950,2479, 426, 469,3227,3720,3721,4031,5265,5266,1188, # 2288 - 424,1996, 861,3601,4292,3854,2205,2694, 168,1235,3602,4293,5267,2087,1674,4622, # 2304 -3374,3303, 220,2565,1009,5268,3855, 670,3010, 332,1208, 717,5269,5270,3603,2452, # 2320 -4032,3375,5271, 513,5272,1209,2882,3376,3163,4623,1080,5273,5274,5275,5276,2534, # 2336 -3722,3604, 815,1587,4033,4034,5277,3605,3486,3856,1254,4624,1328,3058,1390,4035, # 2352 -1741,4036,3857,4037,5278, 236,3858,2453,3304,5279,5280,3723,3859,1273,3860,4625, # 2368 -5281, 308,5282,4626, 245,4627,1852,2480,1307,2583, 430, 715,2137,2454,5283, 270, # 2384 - 199,2883,4038,5284,3606,2727,1753, 761,1754, 725,1661,1841,4628,3487,3724,5285, # 2400 -5286, 587, 14,3305, 227,2608, 326, 480,2270, 943,2765,3607, 291, 650,1884,5287, # 2416 -1702,1226, 102,1547, 62,3488, 904,4629,3489,1164,4294,5288,5289,1224,1548,2766, # 2432 - 391, 498,1493,5290,1386,1419,5291,2056,1177,4630, 813, 880,1081,2368, 566,1145, # 2448 -4631,2291,1001,1035,2566,2609,2242, 394,1286,5292,5293,2069,5294, 86,1494,1730, # 2464 -4039, 491,1588, 745, 897,2963, 843,3377,4040,2767,2884,3306,1768, 998,2221,2070, # 2480 - 397,1827,1195,1970,3725,3011,3378, 284,5295,3861,2507,2138,2120,1904,5296,4041, # 2496 -2151,4042,4295,1036,3490,1905, 114,2567,4296, 209,1527,5297,5298,2964,2844,2635, # 2512 -2390,2728,3164, 812,2568,5299,3307,5300,1559, 737,1885,3726,1210, 885, 28,2695, # 2528 -3608,3862,5301,4297,1004,1780,4632,5302, 346,1982,2222,2696,4633,3863,1742, 797, # 2544 -1642,4043,1934,1072,1384,2152, 896,4044,3308,3727,3228,2885,3609,5303,2569,1959, # 2560 -4634,2455,1786,5304,5305,5306,4045,4298,1005,1308,3728,4299,2729,4635,4636,1528, # 2576 -2610, 161,1178,4300,1983, 987,4637,1101,4301, 631,4046,1157,3229,2425,1343,1241, # 2592 -1016,2243,2570, 372, 877,2344,2508,1160, 555,1935, 911,4047,5307, 466,1170, 169, # 2608 -1051,2921,2697,3729,2481,3012,1182,2012,2571,1251,2636,5308, 992,2345,3491,1540, # 2624 -2730,1201,2071,2406,1997,2482,5309,4638, 528,1923,2191,1503,1874,1570,2369,3379, # 2640 -3309,5310, 557,1073,5311,1828,3492,2088,2271,3165,3059,3107, 767,3108,2799,4639, # 2656 -1006,4302,4640,2346,1267,2179,3730,3230, 778,4048,3231,2731,1597,2667,5312,4641, # 2672 -5313,3493,5314,5315,5316,3310,2698,1433,3311, 131, 95,1504,4049, 723,4303,3166, # 2688 -1842,3610,2768,2192,4050,2028,2105,3731,5317,3013,4051,1218,5318,3380,3232,4052, # 2704 -4304,2584, 248,1634,3864, 912,5319,2845,3732,3060,3865, 654, 53,5320,3014,5321, # 2720 -1688,4642, 777,3494,1032,4053,1425,5322, 191, 820,2121,2846, 971,4643, 931,3233, # 2736 - 135, 664, 783,3866,1998, 772,2922,1936,4054,3867,4644,2923,3234, 282,2732, 640, # 2752 -1372,3495,1127, 922, 325,3381,5323,5324, 711,2045,5325,5326,4055,2223,2800,1937, # 2768 -4056,3382,2224,2255,3868,2305,5327,4645,3869,1258,3312,4057,3235,2139,2965,4058, # 2784 -4059,5328,2225, 258,3236,4646, 101,1227,5329,3313,1755,5330,1391,3314,5331,2924, # 2800 -2057, 893,5332,5333,5334,1402,4305,2347,5335,5336,3237,3611,5337,5338, 878,1325, # 2816 -1781,2801,4647, 259,1385,2585, 744,1183,2272,4648,5339,4060,2509,5340, 684,1024, # 2832 -4306,5341, 472,3612,3496,1165,3315,4061,4062, 322,2153, 881, 455,1695,1152,1340, # 2848 - 660, 554,2154,4649,1058,4650,4307, 830,1065,3383,4063,4651,1924,5342,1703,1919, # 2864 -5343, 932,2273, 122,5344,4652, 947, 677,5345,3870,2637, 297,1906,1925,2274,4653, # 2880 -2322,3316,5346,5347,4308,5348,4309, 84,4310, 112, 989,5349, 547,1059,4064, 701, # 2896 -3613,1019,5350,4311,5351,3497, 942, 639, 457,2306,2456, 993,2966, 407, 851, 494, # 2912 -4654,3384, 927,5352,1237,5353,2426,3385, 573,4312, 680, 921,2925,1279,1875, 285, # 2928 - 790,1448,1984, 719,2168,5354,5355,4655,4065,4066,1649,5356,1541, 563,5357,1077, # 2944 -5358,3386,3061,3498, 511,3015,4067,4068,3733,4069,1268,2572,3387,3238,4656,4657, # 2960 -5359, 535,1048,1276,1189,2926,2029,3167,1438,1373,2847,2967,1134,2013,5360,4313, # 2976 -1238,2586,3109,1259,5361, 700,5362,2968,3168,3734,4314,5363,4315,1146,1876,1907, # 2992 -4658,2611,4070, 781,2427, 132,1589, 203, 147, 273,2802,2407, 898,1787,2155,4071, # 3008 -4072,5364,3871,2803,5365,5366,4659,4660,5367,3239,5368,1635,3872, 965,5369,1805, # 3024 -2699,1516,3614,1121,1082,1329,3317,4073,1449,3873, 65,1128,2848,2927,2769,1590, # 3040 -3874,5370,5371, 12,2668, 45, 976,2587,3169,4661, 517,2535,1013,1037,3240,5372, # 3056 -3875,2849,5373,3876,5374,3499,5375,2612, 614,1999,2323,3877,3110,2733,2638,5376, # 3072 -2588,4316, 599,1269,5377,1811,3735,5378,2700,3111, 759,1060, 489,1806,3388,3318, # 3088 -1358,5379,5380,2391,1387,1215,2639,2256, 490,5381,5382,4317,1759,2392,2348,5383, # 3104 -4662,3878,1908,4074,2640,1807,3241,4663,3500,3319,2770,2349, 874,5384,5385,3501, # 3120 -3736,1859, 91,2928,3737,3062,3879,4664,5386,3170,4075,2669,5387,3502,1202,1403, # 3136 -3880,2969,2536,1517,2510,4665,3503,2511,5388,4666,5389,2701,1886,1495,1731,4076, # 3152 -2370,4667,5390,2030,5391,5392,4077,2702,1216, 237,2589,4318,2324,4078,3881,4668, # 3168 -4669,2703,3615,3504, 445,4670,5393,5394,5395,5396,2771, 61,4079,3738,1823,4080, # 3184 -5397, 687,2046, 935, 925, 405,2670, 703,1096,1860,2734,4671,4081,1877,1367,2704, # 3200 -3389, 918,2106,1782,2483, 334,3320,1611,1093,4672, 564,3171,3505,3739,3390, 945, # 3216 -2641,2058,4673,5398,1926, 872,4319,5399,3506,2705,3112, 349,4320,3740,4082,4674, # 3232 -3882,4321,3741,2156,4083,4675,4676,4322,4677,2408,2047, 782,4084, 400, 251,4323, # 3248 -1624,5400,5401, 277,3742, 299,1265, 476,1191,3883,2122,4324,4325,1109, 205,5402, # 3264 -2590,1000,2157,3616,1861,5403,5404,5405,4678,5406,4679,2573, 107,2484,2158,4085, # 3280 -3507,3172,5407,1533, 541,1301, 158, 753,4326,2886,3617,5408,1696, 370,1088,4327, # 3296 -4680,3618, 579, 327, 440, 162,2244, 269,1938,1374,3508, 968,3063, 56,1396,3113, # 3312 -2107,3321,3391,5409,1927,2159,4681,3016,5410,3619,5411,5412,3743,4682,2485,5413, # 3328 -2804,5414,1650,4683,5415,2613,5416,5417,4086,2671,3392,1149,3393,4087,3884,4088, # 3344 -5418,1076, 49,5419, 951,3242,3322,3323, 450,2850, 920,5420,1812,2805,2371,4328, # 3360 -1909,1138,2372,3885,3509,5421,3243,4684,1910,1147,1518,2428,4685,3886,5422,4686, # 3376 -2393,2614, 260,1796,3244,5423,5424,3887,3324, 708,5425,3620,1704,5426,3621,1351, # 3392 -1618,3394,3017,1887, 944,4329,3395,4330,3064,3396,4331,5427,3744, 422, 413,1714, # 3408 -3325, 500,2059,2350,4332,2486,5428,1344,1911, 954,5429,1668,5430,5431,4089,2409, # 3424 -4333,3622,3888,4334,5432,2307,1318,2512,3114, 133,3115,2887,4687, 629, 31,2851, # 3440 -2706,3889,4688, 850, 949,4689,4090,2970,1732,2089,4335,1496,1853,5433,4091, 620, # 3456 -3245, 981,1242,3745,3397,1619,3746,1643,3326,2140,2457,1971,1719,3510,2169,5434, # 3472 -3246,5435,5436,3398,1829,5437,1277,4690,1565,2048,5438,1636,3623,3116,5439, 869, # 3488 -2852, 655,3890,3891,3117,4092,3018,3892,1310,3624,4691,5440,5441,5442,1733, 558, # 3504 -4692,3747, 335,1549,3065,1756,4336,3748,1946,3511,1830,1291,1192, 470,2735,2108, # 3520 -2806, 913,1054,4093,5443,1027,5444,3066,4094,4693, 982,2672,3399,3173,3512,3247, # 3536 -3248,1947,2807,5445, 571,4694,5446,1831,5447,3625,2591,1523,2429,5448,2090, 984, # 3552 -4695,3749,1960,5449,3750, 852, 923,2808,3513,3751, 969,1519, 999,2049,2325,1705, # 3568 -5450,3118, 615,1662, 151, 597,4095,2410,2326,1049, 275,4696,3752,4337, 568,3753, # 3584 -3626,2487,4338,3754,5451,2430,2275, 409,3249,5452,1566,2888,3514,1002, 769,2853, # 3600 - 194,2091,3174,3755,2226,3327,4339, 628,1505,5453,5454,1763,2180,3019,4096, 521, # 3616 -1161,2592,1788,2206,2411,4697,4097,1625,4340,4341, 412, 42,3119, 464,5455,2642, # 3632 -4698,3400,1760,1571,2889,3515,2537,1219,2207,3893,2643,2141,2373,4699,4700,3328, # 3648 -1651,3401,3627,5456,5457,3628,2488,3516,5458,3756,5459,5460,2276,2092, 460,5461, # 3664 -4701,5462,3020, 962, 588,3629, 289,3250,2644,1116, 52,5463,3067,1797,5464,5465, # 3680 -5466,1467,5467,1598,1143,3757,4342,1985,1734,1067,4702,1280,3402, 465,4703,1572, # 3696 - 510,5468,1928,2245,1813,1644,3630,5469,4704,3758,5470,5471,2673,1573,1534,5472, # 3712 -5473, 536,1808,1761,3517,3894,3175,2645,5474,5475,5476,4705,3518,2929,1912,2809, # 3728 -5477,3329,1122, 377,3251,5478, 360,5479,5480,4343,1529, 551,5481,2060,3759,1769, # 3744 -2431,5482,2930,4344,3330,3120,2327,2109,2031,4706,1404, 136,1468,1479, 672,1171, # 3760 -3252,2308, 271,3176,5483,2772,5484,2050, 678,2736, 865,1948,4707,5485,2014,4098, # 3776 -2971,5486,2737,2227,1397,3068,3760,4708,4709,1735,2931,3403,3631,5487,3895, 509, # 3792 -2854,2458,2890,3896,5488,5489,3177,3178,4710,4345,2538,4711,2309,1166,1010, 552, # 3808 - 681,1888,5490,5491,2972,2973,4099,1287,1596,1862,3179, 358, 453, 736, 175, 478, # 3824 -1117, 905,1167,1097,5492,1854,1530,5493,1706,5494,2181,3519,2292,3761,3520,3632, # 3840 -4346,2093,4347,5495,3404,1193,2489,4348,1458,2193,2208,1863,1889,1421,3331,2932, # 3856 -3069,2182,3521, 595,2123,5496,4100,5497,5498,4349,1707,2646, 223,3762,1359, 751, # 3872 -3121, 183,3522,5499,2810,3021, 419,2374, 633, 704,3897,2394, 241,5500,5501,5502, # 3888 - 838,3022,3763,2277,2773,2459,3898,1939,2051,4101,1309,3122,2246,1181,5503,1136, # 3904 -2209,3899,2375,1446,4350,2310,4712,5504,5505,4351,1055,2615, 484,3764,5506,4102, # 3920 - 625,4352,2278,3405,1499,4353,4103,5507,4104,4354,3253,2279,2280,3523,5508,5509, # 3936 -2774, 808,2616,3765,3406,4105,4355,3123,2539, 526,3407,3900,4356, 955,5510,1620, # 3952 -4357,2647,2432,5511,1429,3766,1669,1832, 994, 928,5512,3633,1260,5513,5514,5515, # 3968 -1949,2293, 741,2933,1626,4358,2738,2460, 867,1184, 362,3408,1392,5516,5517,4106, # 3984 -4359,1770,1736,3254,2934,4713,4714,1929,2707,1459,1158,5518,3070,3409,2891,1292, # 4000 -1930,2513,2855,3767,1986,1187,2072,2015,2617,4360,5519,2574,2514,2170,3768,2490, # 4016 -3332,5520,3769,4715,5521,5522, 666,1003,3023,1022,3634,4361,5523,4716,1814,2257, # 4032 - 574,3901,1603, 295,1535, 705,3902,4362, 283, 858, 417,5524,5525,3255,4717,4718, # 4048 -3071,1220,1890,1046,2281,2461,4107,1393,1599, 689,2575, 388,4363,5526,2491, 802, # 4064 -5527,2811,3903,2061,1405,2258,5528,4719,3904,2110,1052,1345,3256,1585,5529, 809, # 4080 -5530,5531,5532, 575,2739,3524, 956,1552,1469,1144,2328,5533,2329,1560,2462,3635, # 4096 -3257,4108, 616,2210,4364,3180,2183,2294,5534,1833,5535,3525,4720,5536,1319,3770, # 4112 -3771,1211,3636,1023,3258,1293,2812,5537,5538,5539,3905, 607,2311,3906, 762,2892, # 4128 -1439,4365,1360,4721,1485,3072,5540,4722,1038,4366,1450,2062,2648,4367,1379,4723, # 4144 -2593,5541,5542,4368,1352,1414,2330,2935,1172,5543,5544,3907,3908,4724,1798,1451, # 4160 -5545,5546,5547,5548,2936,4109,4110,2492,2351, 411,4111,4112,3637,3333,3124,4725, # 4176 -1561,2674,1452,4113,1375,5549,5550, 47,2974, 316,5551,1406,1591,2937,3181,5552, # 4192 -1025,2142,3125,3182, 354,2740, 884,2228,4369,2412, 508,3772, 726,3638, 996,2433, # 4208 -3639, 729,5553, 392,2194,1453,4114,4726,3773,5554,5555,2463,3640,2618,1675,2813, # 4224 - 919,2352,2975,2353,1270,4727,4115, 73,5556,5557, 647,5558,3259,2856,2259,1550, # 4240 -1346,3024,5559,1332, 883,3526,5560,5561,5562,5563,3334,2775,5564,1212, 831,1347, # 4256 -4370,4728,2331,3909,1864,3073, 720,3910,4729,4730,3911,5565,4371,5566,5567,4731, # 4272 -5568,5569,1799,4732,3774,2619,4733,3641,1645,2376,4734,5570,2938, 669,2211,2675, # 4288 -2434,5571,2893,5572,5573,1028,3260,5574,4372,2413,5575,2260,1353,5576,5577,4735, # 4304 -3183, 518,5578,4116,5579,4373,1961,5580,2143,4374,5581,5582,3025,2354,2355,3912, # 4320 - 516,1834,1454,4117,2708,4375,4736,2229,2620,1972,1129,3642,5583,2776,5584,2976, # 4336 -1422, 577,1470,3026,1524,3410,5585,5586, 432,4376,3074,3527,5587,2594,1455,2515, # 4352 -2230,1973,1175,5588,1020,2741,4118,3528,4737,5589,2742,5590,1743,1361,3075,3529, # 4368 -2649,4119,4377,4738,2295, 895, 924,4378,2171, 331,2247,3076, 166,1627,3077,1098, # 4384 -5591,1232,2894,2231,3411,4739, 657, 403,1196,2377, 542,3775,3412,1600,4379,3530, # 4400 -5592,4740,2777,3261, 576, 530,1362,4741,4742,2540,2676,3776,4120,5593, 842,3913, # 4416 -5594,2814,2032,1014,4121, 213,2709,3413, 665, 621,4380,5595,3777,2939,2435,5596, # 4432 -2436,3335,3643,3414,4743,4381,2541,4382,4744,3644,1682,4383,3531,1380,5597, 724, # 4448 -2282, 600,1670,5598,1337,1233,4745,3126,2248,5599,1621,4746,5600, 651,4384,5601, # 4464 -1612,4385,2621,5602,2857,5603,2743,2312,3078,5604, 716,2464,3079, 174,1255,2710, # 4480 -4122,3645, 548,1320,1398, 728,4123,1574,5605,1891,1197,3080,4124,5606,3081,3082, # 4496 -3778,3646,3779, 747,5607, 635,4386,4747,5608,5609,5610,4387,5611,5612,4748,5613, # 4512 -3415,4749,2437, 451,5614,3780,2542,2073,4388,2744,4389,4125,5615,1764,4750,5616, # 4528 -4390, 350,4751,2283,2395,2493,5617,4391,4126,2249,1434,4127, 488,4752, 458,4392, # 4544 -4128,3781, 771,1330,2396,3914,2576,3184,2160,2414,1553,2677,3185,4393,5618,2494, # 4560 -2895,2622,1720,2711,4394,3416,4753,5619,2543,4395,5620,3262,4396,2778,5621,2016, # 4576 -2745,5622,1155,1017,3782,3915,5623,3336,2313, 201,1865,4397,1430,5624,4129,5625, # 4592 -5626,5627,5628,5629,4398,1604,5630, 414,1866, 371,2595,4754,4755,3532,2017,3127, # 4608 -4756,1708, 960,4399, 887, 389,2172,1536,1663,1721,5631,2232,4130,2356,2940,1580, # 4624 -5632,5633,1744,4757,2544,4758,4759,5634,4760,5635,2074,5636,4761,3647,3417,2896, # 4640 -4400,5637,4401,2650,3418,2815, 673,2712,2465, 709,3533,4131,3648,4402,5638,1148, # 4656 - 502, 634,5639,5640,1204,4762,3649,1575,4763,2623,3783,5641,3784,3128, 948,3263, # 4672 - 121,1745,3916,1110,5642,4403,3083,2516,3027,4132,3785,1151,1771,3917,1488,4133, # 4688 -1987,5643,2438,3534,5644,5645,2094,5646,4404,3918,1213,1407,2816, 531,2746,2545, # 4704 -3264,1011,1537,4764,2779,4405,3129,1061,5647,3786,3787,1867,2897,5648,2018, 120, # 4720 -4406,4407,2063,3650,3265,2314,3919,2678,3419,1955,4765,4134,5649,3535,1047,2713, # 4736 -1266,5650,1368,4766,2858, 649,3420,3920,2546,2747,1102,2859,2679,5651,5652,2000, # 4752 -5653,1111,3651,2977,5654,2495,3921,3652,2817,1855,3421,3788,5655,5656,3422,2415, # 4768 -2898,3337,3266,3653,5657,2577,5658,3654,2818,4135,1460, 856,5659,3655,5660,2899, # 4784 -2978,5661,2900,3922,5662,4408, 632,2517, 875,3923,1697,3924,2296,5663,5664,4767, # 4800 -3028,1239, 580,4768,4409,5665, 914, 936,2075,1190,4136,1039,2124,5666,5667,5668, # 4816 -5669,3423,1473,5670,1354,4410,3925,4769,2173,3084,4137, 915,3338,4411,4412,3339, # 4832 -1605,1835,5671,2748, 398,3656,4413,3926,4138, 328,1913,2860,4139,3927,1331,4414, # 4848 -3029, 937,4415,5672,3657,4140,4141,3424,2161,4770,3425, 524, 742, 538,3085,1012, # 4864 -5673,5674,3928,2466,5675, 658,1103, 225,3929,5676,5677,4771,5678,4772,5679,3267, # 4880 -1243,5680,4142, 963,2250,4773,5681,2714,3658,3186,5682,5683,2596,2332,5684,4774, # 4896 -5685,5686,5687,3536, 957,3426,2547,2033,1931,2941,2467, 870,2019,3659,1746,2780, # 4912 -2781,2439,2468,5688,3930,5689,3789,3130,3790,3537,3427,3791,5690,1179,3086,5691, # 4928 -3187,2378,4416,3792,2548,3188,3131,2749,4143,5692,3428,1556,2549,2297, 977,2901, # 4944 -2034,4144,1205,3429,5693,1765,3430,3189,2125,1271, 714,1689,4775,3538,5694,2333, # 4960 -3931, 533,4417,3660,2184, 617,5695,2469,3340,3539,2315,5696,5697,3190,5698,5699, # 4976 -3932,1988, 618, 427,2651,3540,3431,5700,5701,1244,1690,5702,2819,4418,4776,5703, # 4992 -3541,4777,5704,2284,1576, 473,3661,4419,3432, 972,5705,3662,5706,3087,5707,5708, # 5008 -4778,4779,5709,3793,4145,4146,5710, 153,4780, 356,5711,1892,2902,4420,2144, 408, # 5024 - 803,2357,5712,3933,5713,4421,1646,2578,2518,4781,4782,3934,5714,3935,4422,5715, # 5040 -2416,3433, 752,5716,5717,1962,3341,2979,5718, 746,3030,2470,4783,4423,3794, 698, # 5056 -4784,1893,4424,3663,2550,4785,3664,3936,5719,3191,3434,5720,1824,1302,4147,2715, # 5072 -3937,1974,4425,5721,4426,3192, 823,1303,1288,1236,2861,3542,4148,3435, 774,3938, # 5088 -5722,1581,4786,1304,2862,3939,4787,5723,2440,2162,1083,3268,4427,4149,4428, 344, # 5104 -1173, 288,2316, 454,1683,5724,5725,1461,4788,4150,2597,5726,5727,4789, 985, 894, # 5120 -5728,3436,3193,5729,1914,2942,3795,1989,5730,2111,1975,5731,4151,5732,2579,1194, # 5136 - 425,5733,4790,3194,1245,3796,4429,5734,5735,2863,5736, 636,4791,1856,3940, 760, # 5152 -1800,5737,4430,2212,1508,4792,4152,1894,1684,2298,5738,5739,4793,4431,4432,2213, # 5168 - 479,5740,5741, 832,5742,4153,2496,5743,2980,2497,3797, 990,3132, 627,1815,2652, # 5184 -4433,1582,4434,2126,2112,3543,4794,5744, 799,4435,3195,5745,4795,2113,1737,3031, # 5200 -1018, 543, 754,4436,3342,1676,4796,4797,4154,4798,1489,5746,3544,5747,2624,2903, # 5216 -4155,5748,5749,2981,5750,5751,5752,5753,3196,4799,4800,2185,1722,5754,3269,3270, # 5232 -1843,3665,1715, 481, 365,1976,1857,5755,5756,1963,2498,4801,5757,2127,3666,3271, # 5248 - 433,1895,2064,2076,5758, 602,2750,5759,5760,5761,5762,5763,3032,1628,3437,5764, # 5264 -3197,4802,4156,2904,4803,2519,5765,2551,2782,5766,5767,5768,3343,4804,2905,5769, # 5280 -4805,5770,2864,4806,4807,1221,2982,4157,2520,5771,5772,5773,1868,1990,5774,5775, # 5296 -5776,1896,5777,5778,4808,1897,4158, 318,5779,2095,4159,4437,5780,5781, 485,5782, # 5312 - 938,3941, 553,2680, 116,5783,3942,3667,5784,3545,2681,2783,3438,3344,2820,5785, # 5328 -3668,2943,4160,1747,2944,2983,5786,5787, 207,5788,4809,5789,4810,2521,5790,3033, # 5344 - 890,3669,3943,5791,1878,3798,3439,5792,2186,2358,3440,1652,5793,5794,5795, 941, # 5360 -2299, 208,3546,4161,2020, 330,4438,3944,2906,2499,3799,4439,4811,5796,5797,5798, # 5376 -) - diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/big5freq.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/big5freq.pyc deleted file mode 100644 index 421ad27f7b1095ca535a996f661fe50468e0552a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54748 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 B2;Bex diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/big5prober.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/big5prober.py deleted file mode 100644 index 98f9970..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/big5prober.py +++ /dev/null @@ -1,47 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import Big5DistributionAnalysis -from .mbcssm import BIG5_SM_MODEL - - -class Big5Prober(MultiByteCharSetProber): - def __init__(self): - super(Big5Prober, self).__init__() - self.coding_sm = CodingStateMachine(BIG5_SM_MODEL) - self.distribution_analyzer = Big5DistributionAnalysis() - self.reset() - - @property - def charset_name(self): - return "Big5" - - @property - def language(self): - return "Chinese" diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/big5prober.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/big5prober.pyc deleted file mode 100644 index 649d83ae03e0986e9c003f9ffeb074a77657681c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1592 zcmd5+OK;RL5FRJ{YSouOAP$`15|Bz-l~y2C2)acGi7i#ag-FQCZrrU)l1=T|rCV`9 z@Q?We%-Bomjboc+CZ4e~_V>+9!r!aQPk*d^8NuQT>HV6-W~2&w1e5@kfJ}g3JAg8P zDugWbb_it)sy1Y8Z?~ZAK-Gn;OLiNSfD-{l2Yvzk1o)iwpy)yx^(ed+q#{;$pVVMl zqCS|T>YwH&Rd{SBLuLH@9h&b?3SEy=%ux;U(W$PLpL;-a2YS4Fs4W^joT8r8Z|c09 zTW$S{RbKJ_-L6ara`5r+?FU?5eB<}HLLac3#Kxo)FlfR|N6!LKA(O!{h>VsqgTH1Q zk~CuKMvR7qjXsIpCx!F~_)eb&a27BR0z<$Sha#_R19sTU<1Xv7o?AqFrw+kUw8UZB z9B|qwleE}m4yDw!Mky2CG~r#5myR4)(pCvW!h58OYxKyR`MFfag*3`4^h|MFtICsz z-r$ryr%~J(JtN-ZS#IK!Nm(dk<I9V9zGH^<x3AlK=k?Z}dA>J#VJ}`5mu8EuaT9-v z8{KT`+G1Xoo47p~%VTyqkuy~n6BCap+l9h-NGWVw%AYm!q(i$tCb0|>#9gs2R>T#% z47Sg+d|t{*8ZpcxV$_#{Kfa@cGkw!&aD@)RIEiOj=aqUww&f#3@Lx<_TGi)jx9YaR z;@p&ZJ)Y)cwMpXzq==KZs7^*JrRz5-t4T2}$#mIu3n<}K&Nxq)p=6EJzg)S|4V51k z(jyYfP%v))?t;5s>~;Uby7UK4Tw@-ND_9hEz(%KxHVU*ZPOah+f5LEo7ipTb${ bRBm3^*tdcLm!5r}u~!f2Xs#1CguBB(Z{c{Z diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/chardistribution.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/chardistribution.py deleted file mode 100644 index c0395f4..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/chardistribution.py +++ /dev/null @@ -1,233 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .euctwfreq import (EUCTW_CHAR_TO_FREQ_ORDER, EUCTW_TABLE_SIZE, - EUCTW_TYPICAL_DISTRIBUTION_RATIO) -from .euckrfreq import (EUCKR_CHAR_TO_FREQ_ORDER, EUCKR_TABLE_SIZE, - EUCKR_TYPICAL_DISTRIBUTION_RATIO) -from .gb2312freq import (GB2312_CHAR_TO_FREQ_ORDER, GB2312_TABLE_SIZE, - GB2312_TYPICAL_DISTRIBUTION_RATIO) -from .big5freq import (BIG5_CHAR_TO_FREQ_ORDER, BIG5_TABLE_SIZE, - BIG5_TYPICAL_DISTRIBUTION_RATIO) -from .jisfreq import (JIS_CHAR_TO_FREQ_ORDER, JIS_TABLE_SIZE, - JIS_TYPICAL_DISTRIBUTION_RATIO) - - -class CharDistributionAnalysis(object): - ENOUGH_DATA_THRESHOLD = 1024 - SURE_YES = 0.99 - SURE_NO = 0.01 - MINIMUM_DATA_THRESHOLD = 3 - - def __init__(self): - # Mapping table to get frequency order from char order (get from - # GetOrder()) - self._char_to_freq_order = None - self._table_size = None # Size of above table - # This is a constant value which varies from language to language, - # used in calculating confidence. See - # http://www.mozilla.org/projects/intl/UniversalCharsetDetection.html - # for further detail. - self.typical_distribution_ratio = None - self._done = None - self._total_chars = None - self._freq_chars = None - self.reset() - - def reset(self): - """reset analyser, clear any state""" - # If this flag is set to True, detection is done and conclusion has - # been made - self._done = False - self._total_chars = 0 # Total characters encountered - # The number of characters whose frequency order is less than 512 - self._freq_chars = 0 - - def feed(self, char, char_len): - """feed a character with known length""" - if char_len == 2: - # we only care about 2-bytes character in our distribution analysis - order = self.get_order(char) - else: - order = -1 - if order >= 0: - self._total_chars += 1 - # order is valid - if order < self._table_size: - if 512 > self._char_to_freq_order[order]: - self._freq_chars += 1 - - def get_confidence(self): - """return confidence based on existing data""" - # if we didn't receive any character in our consideration range, - # return negative answer - if self._total_chars <= 0 or self._freq_chars <= self.MINIMUM_DATA_THRESHOLD: - return self.SURE_NO - - if self._total_chars != self._freq_chars: - r = (self._freq_chars / ((self._total_chars - self._freq_chars) - * self.typical_distribution_ratio)) - if r < self.SURE_YES: - return r - - # normalize confidence (we don't want to be 100% sure) - return self.SURE_YES - - def got_enough_data(self): - # It is not necessary to receive all data to draw conclusion. - # For charset detection, certain amount of data is enough - return self._total_chars > self.ENOUGH_DATA_THRESHOLD - - def get_order(self, byte_str): - # We do not handle characters based on the original encoding string, - # but convert this encoding string to a number, here called order. - # This allows multiple encodings of a language to share one frequency - # table. - return -1 - - -class EUCTWDistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - super(EUCTWDistributionAnalysis, self).__init__() - self._char_to_freq_order = EUCTW_CHAR_TO_FREQ_ORDER - self._table_size = EUCTW_TABLE_SIZE - self.typical_distribution_ratio = EUCTW_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, byte_str): - # for euc-TW encoding, we are interested - # first byte range: 0xc4 -- 0xfe - # second byte range: 0xa1 -- 0xfe - # no validation needed here. State machine has done that - first_char = byte_str[0] - if first_char >= 0xC4: - return 94 * (first_char - 0xC4) + byte_str[1] - 0xA1 - else: - return -1 - - -class EUCKRDistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - super(EUCKRDistributionAnalysis, self).__init__() - self._char_to_freq_order = EUCKR_CHAR_TO_FREQ_ORDER - self._table_size = EUCKR_TABLE_SIZE - self.typical_distribution_ratio = EUCKR_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, byte_str): - # for euc-KR encoding, we are interested - # first byte range: 0xb0 -- 0xfe - # second byte range: 0xa1 -- 0xfe - # no validation needed here. State machine has done that - first_char = byte_str[0] - if first_char >= 0xB0: - return 94 * (first_char - 0xB0) + byte_str[1] - 0xA1 - else: - return -1 - - -class GB2312DistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - super(GB2312DistributionAnalysis, self).__init__() - self._char_to_freq_order = GB2312_CHAR_TO_FREQ_ORDER - self._table_size = GB2312_TABLE_SIZE - self.typical_distribution_ratio = GB2312_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, byte_str): - # for GB2312 encoding, we are interested - # first byte range: 0xb0 -- 0xfe - # second byte range: 0xa1 -- 0xfe - # no validation needed here. State machine has done that - first_char, second_char = byte_str[0], byte_str[1] - if (first_char >= 0xB0) and (second_char >= 0xA1): - return 94 * (first_char - 0xB0) + second_char - 0xA1 - else: - return -1 - - -class Big5DistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - super(Big5DistributionAnalysis, self).__init__() - self._char_to_freq_order = BIG5_CHAR_TO_FREQ_ORDER - self._table_size = BIG5_TABLE_SIZE - self.typical_distribution_ratio = BIG5_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, byte_str): - # for big5 encoding, we are interested - # first byte range: 0xa4 -- 0xfe - # second byte range: 0x40 -- 0x7e , 0xa1 -- 0xfe - # no validation needed here. State machine has done that - first_char, second_char = byte_str[0], byte_str[1] - if first_char >= 0xA4: - if second_char >= 0xA1: - return 157 * (first_char - 0xA4) + second_char - 0xA1 + 63 - else: - return 157 * (first_char - 0xA4) + second_char - 0x40 - else: - return -1 - - -class SJISDistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - super(SJISDistributionAnalysis, self).__init__() - self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER - self._table_size = JIS_TABLE_SIZE - self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, byte_str): - # for sjis encoding, we are interested - # first byte range: 0x81 -- 0x9f , 0xe0 -- 0xfe - # second byte range: 0x40 -- 0x7e, 0x81 -- oxfe - # no validation needed here. State machine has done that - first_char, second_char = byte_str[0], byte_str[1] - if (first_char >= 0x81) and (first_char <= 0x9F): - order = 188 * (first_char - 0x81) - elif (first_char >= 0xE0) and (first_char <= 0xEF): - order = 188 * (first_char - 0xE0 + 31) - else: - return -1 - order = order + second_char - 0x40 - if second_char > 0x7F: - order = -1 - return order - - -class EUCJPDistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - super(EUCJPDistributionAnalysis, self).__init__() - self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER - self._table_size = JIS_TABLE_SIZE - self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, byte_str): - # for euc-JP encoding, we are interested - # first byte range: 0xa0 -- 0xfe - # second byte range: 0xa1 -- 0xfe - # no validation needed here. State machine has done that - char = byte_str[0] - if char >= 0xA0: - return 94 * (char - 0xA1) + byte_str[1] - 0xa1 - else: - return -1 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/chardistribution.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/chardistribution.pyc deleted file mode 100644 index 5173c3b860c37f202f456e0238805b19e98c4acd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9073 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 bw{_3_Iusk>hoaZa?#G%b%}mN?W@i3BPUH39 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/charsetgroupprober.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/charsetgroupprober.py deleted file mode 100644 index 8b3738e..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/charsetgroupprober.py +++ /dev/null @@ -1,106 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .enums import ProbingState -from .charsetprober import CharSetProber - - -class CharSetGroupProber(CharSetProber): - def __init__(self, lang_filter=None): - super(CharSetGroupProber, self).__init__(lang_filter=lang_filter) - self._active_num = 0 - self.probers = [] - self._best_guess_prober = None - - def reset(self): - super(CharSetGroupProber, self).reset() - self._active_num = 0 - for prober in self.probers: - if prober: - prober.reset() - prober.active = True - self._active_num += 1 - self._best_guess_prober = None - - @property - def charset_name(self): - if not self._best_guess_prober: - self.get_confidence() - if not self._best_guess_prober: - return None - return self._best_guess_prober.charset_name - - @property - def language(self): - if not self._best_guess_prober: - self.get_confidence() - if not self._best_guess_prober: - return None - return self._best_guess_prober.language - - def feed(self, byte_str): - for prober in self.probers: - if not prober: - continue - if not prober.active: - continue - state = prober.feed(byte_str) - if not state: - continue - if state == ProbingState.FOUND_IT: - self._best_guess_prober = prober - return self.state - elif state == ProbingState.NOT_ME: - prober.active = False - self._active_num -= 1 - if self._active_num <= 0: - self._state = ProbingState.NOT_ME - return self.state - return self.state - - def get_confidence(self): - state = self.state - if state == ProbingState.FOUND_IT: - return 0.99 - elif state == ProbingState.NOT_ME: - return 0.01 - best_conf = 0.0 - self._best_guess_prober = None - for prober in self.probers: - if not prober: - continue - if not prober.active: - self.logger.debug('%s not active', prober.charset_name) - continue - conf = prober.get_confidence() - self.logger.debug('%s %s confidence = %s', prober.charset_name, prober.language, conf) - if best_conf < conf: - best_conf = conf - self._best_guess_prober = prober - if not self._best_guess_prober: - return 0.0 - return best_conf diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/charsetgroupprober.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/charsetgroupprober.pyc deleted file mode 100644 index 1600c02ae31b3c798f883639edb5cd780ff70d08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3249 zcmd5;U2hvj6uskhoY+m9Ktm;@N(4cRRaD#vR9aLh(9o8Ly45;WMWkrtcqdz@&f3`- zhomF|)V}dUc&h}@{1F~_;1}?~AK;ujPEz%~BFWD6eB7PAbMBclll*(Sap~tXYdx9# zCHVak#eW8q;W080*)p<f#IRkFK}EI_SxwMR#3iy}B&*7Ek!K>`tyU$Ql1{UR*ZT&h zNfTya9+boNevx-VH@Mh)8ojq3cgv0o9CT%P^SI|uIUJ8-_fd2e41bN{@4+}>P+5&( zK1YBFgGCq!!A&txhJ^l_Hj~5V^d#EV8AeL~x}=@vG-m8^eiou|3&mf933!a`W3q~D zR``*9gS8riPoUQ(l8aWb^jOi5I!(^f4yRxT-6FRe{XuYLA5GD(g(=khc;w2I-wZP_ z*7l2juvXu)-CpSLI9rUj0>c|AMm|(gZx0KnXxVk=gU!dzdm9~^Ivbt58*HSEqKOiX z-$Si6D*HRgLTjg6wl;=?%$2_Nbhowlak*Z6|77Xvc5&ru`N`GZHNSg3ds<$>Up{KB zv_}2W<$mEqcQCjdmhR>D0lT!=9am(-veiRAGZ*yNyO1-BF|LnBdnuRvE{f-3#k_6m z`0tS-44N@3?2l1-1@>ofC-e&V?hRHptFpYdBnO(1@*>lM{Lm55qG4<Fs&0Z975TJ+ zL~UQ>^JtPL5I{gx0@T*DM8ek5P8mu}3qvj)mXeawDHEX?SSiOYuq$RM<%&|itN5o4 z`f+%Y6x2>c21v&bQ2ab2GG~GRys4Q6e$T~BFdHnIiOZ-EYP|5CR!Ds@M_oj)ICKHh z9o^aOrs795!Wo#{1=|}I8~w}`J*QBqB#<mX))w8ZC<zMNiD4@tT0-$mrc~;R()8;< zDV@UyA}-_+^<v!3Pa-C7AiV1+uVQkzf0=k?&L61k{yrhk^4hO*0J*G)KQG%2A!VSZ zM*N2_HQ@ky897K~KM{ZXa43<GaJN6HU?=iL(9dFvgO@ewz?H+(I^3X+!o#XmR5$C? z>uVKTS8uc`^2A8_+vF8a)Hs|7ap8G1nRcQJ+zBcUP3|1s{wdEb)qoA>vJ{Od-nZ{R zY%kkyS5yU}y7R146=>gIvG=~w&fDFAcPb`2Vj-tE5Ou?-XpjKwd%<C#Ou2i~1(*}F zDR@MGh2r0b5fzUb#G_{BP-yFBTJ0R{tT_|63ssbAsMPoi6{0K??Z)v6;bwNvGhH39 zfL)1pwV1O`mXJT0zK7KB{xV70^4d>_bXk?{yGkr2ga1)IW`q=|l24lrp5W%#=@g~x z0AmOx`hipGM>{L~Re4s0)`4%}9!`O~tdPdwr!o+8;Zep+iT_g&We4u@`qR!|-1+<I z!i#@y=07a3`urv?3h~dALKpmEF$|0G{P1tZ9&{cn<>Kdy7krbx$^oTXdX`OkA0Ig{ z(UKq!hIx+56fw`-`Z!N1WKm+ceVZImrPWyjWm<0${ID`k$<5Y@VIB4HA&S2QBjDJa zscIqjc!2Tu9PF%l2c?F-Iy~CVqb+6il)=@CJ=Sgwv+=-L8$nb=xWV-nh9eudvalC% zBV;LAuLvF^qP73|K1J1CMDe^}WAU|mV{T?{roPbDBr63R?vFmI6qz(RbK|unrM&4q X=R~bbvv4D(=!^4QALVi0%qRZ=qq4i+ diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/charsetprober.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/charsetprober.py deleted file mode 100644 index eac4e59..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/charsetprober.py +++ /dev/null @@ -1,145 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -import logging -import re - -from .enums import ProbingState - - -class CharSetProber(object): - - SHORTCUT_THRESHOLD = 0.95 - - def __init__(self, lang_filter=None): - self._state = None - self.lang_filter = lang_filter - self.logger = logging.getLogger(__name__) - - def reset(self): - self._state = ProbingState.DETECTING - - @property - def charset_name(self): - return None - - def feed(self, buf): - pass - - @property - def state(self): - return self._state - - def get_confidence(self): - return 0.0 - - @staticmethod - def filter_high_byte_only(buf): - buf = re.sub(b'([\x00-\x7F])+', b' ', buf) - return buf - - @staticmethod - def filter_international_words(buf): - """ - We define three types of bytes: - alphabet: english alphabets [a-zA-Z] - international: international characters [\x80-\xFF] - marker: everything else [^a-zA-Z\x80-\xFF] - - The input buffer can be thought to contain a series of words delimited - by markers. This function works to filter all words that contain at - least one international character. All contiguous sequences of markers - are replaced by a single space ascii character. - - This filter applies to all scripts which do not use English characters. - """ - filtered = bytearray() - - # This regex expression filters out only words that have at-least one - # international character. The word may include one marker character at - # the end. - words = re.findall(b'[a-zA-Z]*[\x80-\xFF]+[a-zA-Z]*[^a-zA-Z\x80-\xFF]?', - buf) - - for word in words: - filtered.extend(word[:-1]) - - # If the last character in the word is a marker, replace it with a - # space as markers shouldn't affect our analysis (they are used - # similarly across all languages and may thus have similar - # frequencies). - last_char = word[-1:] - if not last_char.isalpha() and last_char < b'\x80': - last_char = b' ' - filtered.extend(last_char) - - return filtered - - @staticmethod - def filter_with_english_letters(buf): - """ - Returns a copy of ``buf`` that retains only the sequences of English - alphabet and high byte characters that are not between <> characters. - Also retains English alphabet and high byte characters immediately - before occurrences of >. - - This filter can be applied to all scripts which contain both English - characters and extended ASCII characters, but is currently only used by - ``Latin1Prober``. - """ - filtered = bytearray() - in_tag = False - prev = 0 - - for curr in range(len(buf)): - # Slice here to get bytes instead of an int with Python 3 - buf_char = buf[curr:curr + 1] - # Check if we're coming out of or entering an HTML tag - if buf_char == b'>': - in_tag = False - elif buf_char == b'<': - in_tag = True - - # If current character is not extended-ASCII and not alphabetic... - if buf_char < b'\x80' and not buf_char.isalpha(): - # ...and we're not in a tag - if curr > prev and not in_tag: - # Keep everything after last non-extended-ASCII, - # non-alphabetic character - filtered.extend(buf[prev:curr]) - # Output a space to delimit stretch we kept - filtered.extend(b' ') - prev = curr + 1 - - # If we're not in a tag... - if not in_tag: - # Keep everything after last non-extended-ASCII, non-alphabetic - # character - filtered.extend(buf[prev:]) - - return filtered diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/charsetprober.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/charsetprober.pyc deleted file mode 100644 index fde95b56ba982a4af6e483dc178cfef656a61957..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4666 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 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/cli/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/cli/__init__.py deleted file mode 100644 index 8b13789..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/cli/__init__.py +++ /dev/null @@ -1 +0,0 @@ - diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/cli/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/cli/__init__.pyc deleted file mode 100644 index 5eea7b314bd759ca7d6b0507406917d1aff6e7f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 202 zcmZ9GK?=e!5Je-p5JAsTggPxsQ4sM0ilAEwHHkGC(>RH>?aniM0TXfMhyMoNW`6fQ z9E@M1BO||b{9XIno(Csn9|g0GJjfrc^$rZmDt7{^9N}ClF3>_-Lo>ybeqPh;u9FOB z8JpXB!COpx3Ihi)(!^3*mn#*!bW_k>P~Xx@XkH?)OO9MPU`hg|QcFka#5At&|1NJO Me<-mE>%tE50WM}UH~;_u diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/cli/chardetect.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/cli/chardetect.py deleted file mode 100644 index c61136b..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/cli/chardetect.py +++ /dev/null @@ -1,85 +0,0 @@ -#!/usr/bin/env python -""" -Script which takes one or more file paths and reports on their detected -encodings - -Example:: - - % chardetect somefile someotherfile - somefile: windows-1252 with confidence 0.5 - someotherfile: ascii with confidence 1.0 - -If no paths are provided, it takes its input from stdin. - -""" - -from __future__ import absolute_import, print_function, unicode_literals - -import argparse -import sys - -from pip._vendor.chardet import __version__ -from pip._vendor.chardet.compat import PY2 -from pip._vendor.chardet.universaldetector import UniversalDetector - - -def description_of(lines, name='stdin'): - """ - Return a string describing the probable encoding of a file or - list of strings. - - :param lines: The lines to get the encoding of. - :type lines: Iterable of bytes - :param name: Name of file or collection of lines - :type name: str - """ - u = UniversalDetector() - for line in lines: - line = bytearray(line) - u.feed(line) - # shortcut out of the loop to save reading further - particularly useful if we read a BOM. - if u.done: - break - u.close() - result = u.result - if PY2: - name = name.decode(sys.getfilesystemencoding(), 'ignore') - if result['encoding']: - return '{0}: {1} with confidence {2}'.format(name, result['encoding'], - result['confidence']) - else: - return '{0}: no result'.format(name) - - -def main(argv=None): - """ - Handles command line arguments and gets things started. - - :param argv: List of arguments, as if specified on the command-line. - If None, ``sys.argv[1:]`` is used instead. - :type argv: list of str - """ - # Get command line arguments - parser = argparse.ArgumentParser( - description="Takes one or more file paths and reports their detected \ - encodings") - parser.add_argument('input', - help='File whose encoding we would like to determine. \ - (default: stdin)', - type=argparse.FileType('rb'), nargs='*', - default=[sys.stdin if PY2 else sys.stdin.buffer]) - parser.add_argument('--version', action='version', - version='%(prog)s {0}'.format(__version__)) - args = parser.parse_args(argv) - - for f in args.input: - if f.isatty(): - print("You are running chardetect interactively. Press " + - "CTRL-D twice at the start of a blank line to signal the " + - "end of your input. If you want help, run chardetect " + - "--help\n", file=sys.stderr) - print(description_of(f, f.name)) - - -if __name__ == '__main__': - main() diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/cli/chardetect.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/cli/chardetect.pyc deleted file mode 100644 index 367b45b8f02729b746c6cb26275e05e12183b830..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3331 zcmd5;UvC@75uZC!lz5^oCb3f_G2DGIz@#E6xsH(#MUWtFkrb&Q&`N@^aL-5Hk~-=B z(7St*8A}g=`VIP$0{sO2BKaUeKS7@h^fz;)Lc=YP#}K@|-MQJ>-I?F~W^4bx5xn=^ z%_kFD{(QVY{<uc=ALztHBeWjHKBXRIK8<|JYBZ`*R;N*&JpNXrbc044qKAHiMh)rL zDcz)Oi$+_O-Ug*j$^se%)wn_FHf1duwJ_eKc#Hn((dY&njGNNmA>F1ppi`gB_oR2| zipa~cqZ&Q#Y-5AvU5_YuJTb}Ksq^Dxa;#i*s;w$=tqP;E!e}*3Qmy8ZJGLsyV`cQb zFpgD}JJyL&v37dmbR6h>Qp8C<vqA9t=TSCK^<WSL3cq`5avYgTQQ0EXVv{=sY#1Ji z-s;mpohNx*oZIgH{rB%<;EvU#$frq+HMH96y??EKZD61xJ4upPl=pjkLGbxh<;Cg{ zIMdt|XD}A;s>CgioZw7JJ};e`nj%xy;V8WzNI0;a8XC8QCK}r!Eu9XNjNRaFLN+%^ z?!sxAPh3*ut_@L{C-8+1)5K{LrS_l$N0VcphvAtv7K&k53EB4HH}|W-YZ!c)C#({s zkHoWuDK{XM4NVwdJmTk5#@Rp7am10m^y&Enx*&S=WS1^$<UG2l(Ur&j3!hH><<R3n zjZB*kpS219uUSwRaBy#fF6-nPWE@?1bh1fqi%y#S8EC!o>Cz)$=%UW3e#`uw(R329 z>Qcn7I=yuTki{FzPuRudxB=8{V!P#k&`1D>+Lb0(5xfl_&HyC~ERMMgTyT`e(HQ7k zAxjlgC<}NBBNo!cI+j)jECR-O8_XjUWhzZ_Z3pTIrlhM}p=KHZhhWWQubSf)^QGQE zea>Oym0^0kaN4e$&7({Y)B#%lyxa}&nWo4C1eT?;-kRNN4t6QBvH=eyvmEJFZlSx{ zOnC=`7kifj^<w|>6(qm7e^~}l_$d=ghM(vI-A3CobqA8zL&k?|qT$^~#zYHO$7rf` zES(q`?pSG(7FHwLMAiHutI0Ul3}IKp*e<NQjW?Xf$K|2UR+|>(X<@R+b!1s?<ovP{ zpBzv`*k#BchJ1<+o~p4WdVOTkS>$y8EHeFRk;ce?{<qKji{F}Yetx?D@L9h1&^&lJ z`M^H^F#gu;;WwN2kNWdu-c54rqBQNg{XfmZLl(({OaqIU{*rw9lQdcN5vksMA?aIz zZqAVli|O0gi{&s-(DZJ2E$@ck^tQafYkCdu9lYD#wm;$Xu%q}Ol7|062WfZ$J{P*b zA`f}O`Qr;ABPYP{4bcHVZ*pFOu|d?}XE?@uMhM4AgYxFGgT$L5-@LlFw6aZci(>Hm zO^SEuWQ*eqD_5Q`8c0FV0J0r4@TDaDHkja#lKsfg7ALUzfgB8=D7;3$ieJa`2A*58 z;!RBUxH>=sR0rz7|D??s53Am@ztPw6ZDjD9IBEGKpPe)9Gn51X0_e{&t_~bt6`5HH zcz{q@1khNd92W+pX=G3;UQSb}pAFO(%S^tWybD5C2~vBmC&@I?@v`Ks*6Q+FRqpam zu7BYA1E70XJ$(wG_SpKL_Xkg&K2?cTrG*`ai;l1ho->fVulBIUCh|=Pdkr7uS2*|4 z&#jQ4nYHqGy}y?_t0c0*@lt;zO^$UsFaLto{=n7u{1{346J?!4Qj{rs`&2Wjab-0b zyW=I}uMRq~o<?Aa0V09=_O7hO4k)>>n6Xeo4rkbsA^x6YzFy8LnNGUhW%ZJ*kA&|^ zR$7VI`eh69dmXU&>|LusQ{^56-xMVPqLnH0oQZzzW`HsZ+J((Coi2Ln5R8O~eSk@y z9u2?fK2q*HLHUm=1{W+b*G6ibM)_%lJ$S={S))`~zI=emAOTie6s4&ud`|%*7^?Fq zcZyxT%iCGsikzw2<!^yFiFxm!!{r&}5cdExLyZA*G6R3I#QPyjjN@ZRaU4QN(m*C~ z9FO2=;nyLnh_59K;>&S4ooX{=dqd`2$J`=oupukj6+WbR*vPqs2<7@ACSXh(Gkk+h z@GYbxT+R(FoQaAUG;$)b%2A&FBB+?RnMFzd5N~@I4K<sf-j?6+ZhOD>UI+2+_-zn! z&ENKJc~UpSkZ0f`C2?Wsg<)Jw!cd$S;!cM9g$~0Zn;Y_3hm7+f^LrHo_7%!SZ&@mO zOEgvy;9BrMKK4L%xDQvA^4|Z^!40sw#8tQ6!bnM$*ogO;qK3c0WI;z5a+$<IAoyie jMh5xsvLY^1{Sjl*-a^yx@Axf*q>W&-Yppx2yDjg(rMP4B diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/codingstatemachine.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/codingstatemachine.py deleted file mode 100644 index 68fba44..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/codingstatemachine.py +++ /dev/null @@ -1,88 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -import logging - -from .enums import MachineState - - -class CodingStateMachine(object): - """ - A state machine to verify a byte sequence for a particular encoding. For - each byte the detector receives, it will feed that byte to every active - state machine available, one byte at a time. The state machine changes its - state based on its previous state and the byte it receives. There are 3 - states in a state machine that are of interest to an auto-detector: - - START state: This is the state to start with, or a legal byte sequence - (i.e. a valid code point) for character has been identified. - - ME state: This indicates that the state machine identified a byte sequence - that is specific to the charset it is designed for and that - there is no other possible encoding which can contain this byte - sequence. This will to lead to an immediate positive answer for - the detector. - - ERROR state: This indicates the state machine identified an illegal byte - sequence for that encoding. This will lead to an immediate - negative answer for this encoding. Detector will exclude this - encoding from consideration from here on. - """ - def __init__(self, sm): - self._model = sm - self._curr_byte_pos = 0 - self._curr_char_len = 0 - self._curr_state = None - self.logger = logging.getLogger(__name__) - self.reset() - - def reset(self): - self._curr_state = MachineState.START - - def next_state(self, c): - # for each byte we get its class - # if it is first byte, we also get byte length - byte_class = self._model['class_table'][c] - if self._curr_state == MachineState.START: - self._curr_byte_pos = 0 - self._curr_char_len = self._model['char_len_table'][byte_class] - # from byte's class and state_table, we get its next state - curr_state = (self._curr_state * self._model['class_factor'] - + byte_class) - self._curr_state = self._model['state_table'][curr_state] - self._curr_byte_pos += 1 - return self._curr_state - - def get_current_charlen(self): - return self._curr_char_len - - def get_coding_state_machine(self): - return self._model['name'] - - @property - def language(self): - return self._model['language'] diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/codingstatemachine.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/codingstatemachine.pyc deleted file mode 100644 index b0249348e5b94292810608356dd3571010be2851..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3736 zcmd5<U2hvj6rJ_jP8>=<LQx3tFuWPm*sY3Es1VSm<pGgUts^8Nq19w}Y)`u0b!Wy- zQl$^5@E7=_`~W!j?rt0>2#F`M$xLSF<IcJFoVl|J|9p4tvtMuil8EXF@%LL4w~Z>r zZy+)u4$x?bG!$7NCJk}W5JB1$Iuye|q%HBA5O0O}`JhSD2i-Q7n!oVunE=f$RsII5 zU6qVYt_NOu?bp$<Q=}#z@q0CP4y1wMrzq}wR2mSl6KbFcXupGy5K#l0hTLe0w8@Qj zh3Q~L=v9%nsq<|h4mu(lbXUmcA59_FB%UYI5g0iskx5_3xwd9_DwRAu#embVW;#!_ z92ORRQ)RtLW|^`Qy^Ovmzbh;o(=bx5@?$Mi?RDa@%IZX$xpw!Y@$%SYnH*}JN<UV< znq5eZU9o54F_CR8!%}l)GIf~gd$P!NxeBY5^k$-aav$3*FG$8JA8Cgj-34=p%3<Ro zr*1j5dTxrDt5&L<AXT;jv_{R=t(FSq;ldV7=h%OFS9Xae7DEhsZME|hQiZ8AUu@MO zdA!Dk2K!H<{nEr^_+VhuF^1AA7NTJ(W_}FEDgK!rsce}UHbq>XKV8#9P?Vgj%%l=5 zX*n%`=TjyTp|J?GwsNeTJk%QDNOkVb(CD;RBHMjl!>VxQsY##{f`_<MoR&RbSirtZ z!nq8O4Zu$~)d{vtC_ZG5U^(qcBN$D!Gou`2vFw-{<*%ATglTqO$O1Mj+;q-BCg<Xm z$72IgCSV{ba<4#|r$7_L%jRmS6XTe|N(Hz~D=33WG?R%=4V@QkWJs%^)*WMGz`SgZ zoT>@0!umXlevInKmV{pj?7zhn9AyjcFK;E6k12<EaXc5^{F5tJZROC|CEv=RElfVE z&o&21pCs7~BBRJ&HCL~aLt9LU1qZQM?0|E~T_6r8Chzgmgz{cpb|_apLv<F2Ga+J5 z$J9VBEPId+F^Zn1@GWuF7Jh|N9rdhIebk}M9AMI*OIG&`D$!j-<ta_a6P%9B-=t<T zvo<DS#9;SA7b!E&a6*tY#UApHf9HHUp91VDL{^MO$mPC+_DK65@T#p}rI~TACOVFJ zLz;&E7W$DLv}aUo+39TP38R~IQ46lzDO&xhHFK!0KUcOtEHZ@8^<SU#PaoRD{P^XA z?N|BzZTtCl@`XG3GJS3D;~7o+`~9hzZkZeyvuw*h*d4_$sEbQH*LhmlJ~;=K_RCz( z?o@X{Z+cq6H@Wd~{D`2@Ehd6a^|Kx%bhl9<;7r$TG&}--fu8~2fP38#LlFv51wttM zMMMG*M`ZfCI35wh-=H}1O9ZS+qMuw~H-ATi^u?0ggg!UlG`J%WAn_;^FB`({&>dZ> zvzi-<&9epyRM8T7X@Vm~hMHpYE=D)rgth4wrqU8j=UL4o-1cqpr~$o`Mf%zx@$IoB zlT0}md%7oC=B(jby=6athLrP$xC9Ez3z_z6A%C$DD-pTQ{4i(HEqY}NDG*(%m@`i+ z5>H2p4-Z@CS3Xc|`?~PTuyTFkV}|t<m>qqGiSSOa4pDD3?gT5r-Qd<j*yJ5EPH`?- zto2Mo5eI`?*Ga(sJzzr`;-rSu6_X5*!(O1f)--{pa(;A4^reT$uA5cD<lICFtURSO z`TCt#{{djJyZlL7vKv>4Y=E)<=<_O;WcY%dsnNCeJNgJfe>(TC!53RZR}d>brt58% z(cMGpjpMXP;y9w)jx$`eK`n}1^dTxv_fuO;aY3E3>BYI_*8h7OMI_cwP#ihXe!m@b zRy$$mCQ8_)8zmwq`EJqqY~sqRhEiE^c!YmNc>T5Vhy(sr$<fyz1E`~Ha-(rO{2K{A B+AshB diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/compat.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/compat.py deleted file mode 100644 index ddd7468..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/compat.py +++ /dev/null @@ -1,34 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# Contributor(s): -# Dan Blanchard -# Ian Cordasco -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -import sys - - -if sys.version_info < (3, 0): - PY2 = True - PY3 = False - base_str = (str, unicode) - text_type = unicode -else: - PY2 = False - PY3 = True - base_str = (bytes, str) - text_type = str diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/compat.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/compat.pyc deleted file mode 100644 index e6284cf877e14a77f8f4d527dc541fdb52730a79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 451 zcmYLDO;5r=5S>!KMNK?-^h``}K@8D^7*F0bBzm!lHl-bKrR>(-p;B)CW`BUr77VkU zkN4(vX8fPS_WAeGYYaQ{Ip49{Hx3DZ9;5&P00Mk?kW^s-V8(zI2z<aQ1U0}qU;}2% zG+hz2K%JE>7BI<zw$tncbtmAlPu&`?kiTq?(yf*3(5<*?4-XiUgSN2L;hdwfQmas^ znWice&t`?CV)AlHZsdKG+J9!a{g(_ixU*6+)(KLR>uF>$wA^ShAY4;OMTX^oX+dba zOv66dB}0)JnMZ^okBpe<G~rvsW-W@LnX0eFVDzc_BXc#1ukHFK*_b}tJQL3%lUYwH zOHrEkXz(x(CypvT%uyxUi1<A+e42>$GK=UUE6OX!OP#DzyglXZ_Jl*nKlbYUI$o=? F&401BV?6)> diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/cp949prober.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/cp949prober.py deleted file mode 100644 index efd793a..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/cp949prober.py +++ /dev/null @@ -1,49 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .chardistribution import EUCKRDistributionAnalysis -from .codingstatemachine import CodingStateMachine -from .mbcharsetprober import MultiByteCharSetProber -from .mbcssm import CP949_SM_MODEL - - -class CP949Prober(MultiByteCharSetProber): - def __init__(self): - super(CP949Prober, self).__init__() - self.coding_sm = CodingStateMachine(CP949_SM_MODEL) - # NOTE: CP949 is a superset of EUC-KR, so the distribution should be - # not different. - self.distribution_analyzer = EUCKRDistributionAnalysis() - self.reset() - - @property - def charset_name(self): - return "CP949" - - @property - def language(self): - return "Korean" diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/cp949prober.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/cp949prober.pyc deleted file mode 100644 index ee484cd668e5b890721ea297e086943927d46acd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1600 zcmd5+-*3|}5I!eO+l{eJAdrxFf|m$1vT4)AqzS>gJ&lekfd?WXD^0x4BfqfSvQE4p z_>cJqxU;*lHy*b%cg^`6+u!%y#s71E`NhxGFF7nOAOGK?=@eaoH-i$OVvsUm6njv5 zQ2CJhF7~19Kovk5xVQsl7pfklJ&Xeo0h}@@y6_v|7r^JV4@D1>u#d}2hAt#$o}fGW zG&qhAr8Y{Ar$#pQyE-f9T531t0Zth-g{&uu$&46g`I)SR%RR>2a9SF9FgIdwmZ?OT zk!r?5x%?`<JKEdX<H?W@KO7#tH}|fF+`MZ7JRCnj(-ArWgd1Vw=~EAcPkay(<fCIl z?<x!+PC{ZYCqQHr4AAsGI)gWZANZ;V=N?hPj1Q(mOW`OFz;tPpo_pla`*srUomdPf z;Swzq(1O!esJKHR(a5>1rQtlLO=H^C(A3;=#dQ^90Ok?8;s&`qBX%!^vP&wVg>hWb zx>}T{A-!guR`?XPO3sk?XqKtyv?&XrbaZ(U&9~LK{{D4q_glTWt9Ewt*ZN|wxKx{X zP1@*V)XH{4*4kucxnZ`36F#CLYkVf^qES(fiWR~{d5aRYR<~E}JnrJQ&(SoY1on`v z`77+2UP3#dEFBnSNkWqD#KN&!I{=oHWz5_<9<zd{AgD++ud_<L#8}gz!TT>N;^Meb zBCGElEK;Y;>d7>l2x^)Iq>zrhC{RMnxgi-iubN_7VrccX6Hs!jXfuzAp_rQWpIG+k zwknWH>lvCREM2zLU+XOTa2*G1+1_X=*J$*ea=nK&Z$#z3Q?@zH8s@6;q6S={$5a5= g`!=DmTd9F<bKeaPtU&utvo}xiY_=QMnf>{H0YLeA1ONa4 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/enums.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/enums.py deleted file mode 100644 index 0451207..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/enums.py +++ /dev/null @@ -1,76 +0,0 @@ -""" -All of the Enums that are used throughout the chardet package. - -:author: Dan Blanchard (dan.blanchard@gmail.com) -""" - - -class InputState(object): - """ - This enum represents the different states a universal detector can be in. - """ - PURE_ASCII = 0 - ESC_ASCII = 1 - HIGH_BYTE = 2 - - -class LanguageFilter(object): - """ - This enum represents the different language filters we can apply to a - ``UniversalDetector``. - """ - CHINESE_SIMPLIFIED = 0x01 - CHINESE_TRADITIONAL = 0x02 - JAPANESE = 0x04 - KOREAN = 0x08 - NON_CJK = 0x10 - ALL = 0x1F - CHINESE = CHINESE_SIMPLIFIED | CHINESE_TRADITIONAL - CJK = CHINESE | JAPANESE | KOREAN - - -class ProbingState(object): - """ - This enum represents the different states a prober can be in. - """ - DETECTING = 0 - FOUND_IT = 1 - NOT_ME = 2 - - -class MachineState(object): - """ - This enum represents the different states a state machine can be in. - """ - START = 0 - ERROR = 1 - ITS_ME = 2 - - -class SequenceLikelihood(object): - """ - This enum represents the likelihood of a character following the previous one. - """ - NEGATIVE = 0 - UNLIKELY = 1 - LIKELY = 2 - POSITIVE = 3 - - @classmethod - def get_num_categories(cls): - """:returns: The number of likelihood categories in the enum.""" - return 4 - - -class CharacterCategory(object): - """ - This enum represents the different categories language models for - ``SingleByteCharsetProber`` put characters into. - - Anything less than CONTROL is considered a letter. - """ - UNDEFINED = 255 - LINE_BREAK = 254 - SYMBOL = 253 - DIGIT = 252 - CONTROL = 251 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/enums.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/enums.pyc deleted file mode 100644 index be539ede301532733f45f9da34dccfa971bbc7d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3505 zcmd5;TW{Mo6sF_YP29__D2Ba^kM6L>?JmKV4MTlVQZ<eoNXoDn7-U6aY&NpwigeQS zZP=dod-lKfxa)Ul%T6;O$WWl2Tb`0fEO{>9`3}p!-L8H7<DDNOHvg6J?;{NL3q;IV zAF{+mi5-_%yuyBF>?g(!`ztIi7uwZ@w#?#6p{*{ot1P}zXxA3n3X9hZZEc~gviN49 zy|vKZVDW9{)$fp9IYh0QBs@FjdL+1&PR9zfQ1dVse5yo@Rh~_Uqim|pmS_~_vCw=H zMknD=Y}9I7;Z%>Ze2aI&l(&*FHCuQ+4%3aJV)<w|4rQ_tW#fA_UBk6@I+<!uhgvMc zRf4)jW^o9Ca3M;N2v3Ri5snqshx=vLuQ1oEuhLErqQ>#_M^bSC^LZ{Nxlkh2<cQ$0 zJU$jVmR!+giidof%2Sc6FyU}SL^{iP1k;ZMm+6K%P2yN4$sV}^QLjSiHHaWc!?6eg z<3bROvv``&@`m{qXVLuA{()-+O|Na+dL5rEuYF<l*xq>@v<`i%j!$eURDxw=lFL&V z+BgmK#&MR!u(a{wdE@-E{3ty;dARv3eXyB-z8QU~o_`g;$RFT0oHYE#L{9F@6iz0| zef@B680?eEjNnwHah5mcxoc3I)W+o8rTfV(MWR}+mgtWrXmrDLI7NQ9WuisCND)QD zr05AISEndmWqly9!umj5mG#${0LoWcs}HE+Z-uo)6{{L0lj5hILR>eQz?HF&9~%P| zKNBX2;bfAWbDi<foHQ656v^()b3GW$bG%5eBq&J=fqa|9M-cU!5H4+T$!E6=q2GmQ zKeipqvjWfF+wa=jw$;(^T~PaOvt#>q&uMlIV4gJho3vjOgm!zb)pQJ4oSqZ3pX_Qn zx7qC)-TY{y!?z_c%<T1}gOc(Nh9bYKt21;IvR2Z!px)23Bbg3gxsZ2o)^&5gDC7w) z7uPD@%bBF2>{!0l_HAd!Bx<{N;B*4pH;Hn3ez5oE%ahQ^F<vfD3j1CdjbtibIqVM3 z`p;oE@#o{23D=>{%h9jkR?ly`zNVSwx;@u~-S)lzL)hPkQTH%j4m%ZrC!S438i}qv z5s4gSS^RHi`~v%~!;Av7STS80-EECXkSIcZ4{>!ylEvlJwnI*=9!6kkj&_k`XDCP0 z`OpSWWj0kjOVOsONnUDelE^0_jw?o+EFd;S$Mxz&d}<3~D;Ij2r)mprR&X>Asyf_# z!IB6qYnbH{4OXV+dTKHohFWJtMt2x$ixRb@w%5*ThQx<L2QV*KTKzToN)EGfoyg%b zWY?f`tevKBe`guKIB>f5uGKv>z@1NN(|*qb|6>z1kSGb28Vfv+V)sL=mwubsYj@uL z07iU@p@>9^h7U?#(M0s^0!i&zHqRI6rsSEv{|P47LHDfh7oh$X|LbZ{FP~}4obW}H z$2&_T3i!^=DT9FrkSC&bt_9hwgr+_u^1*=PRk^GP0;A6GMkVw&({l~d9P&gc^T<tk zyXW|BugmdvjIvZoJht%S4Y5O`p5{gKH;k8mk@%CuA0&Q<s8hNx<Akt-Mq+K_mC!M- z#4ct*3ypu*K*c-UYxTN@_&W9u`VDp2xgBpD9vrqbF=p_n7QMb&a%RpFVHhv6qo;T{ pyI3-p9B`>sxkQ`>VlKz*O?zX?^qbie{ab1@bI{*izxx&j<Udf2PMZJ# diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/escprober.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/escprober.py deleted file mode 100644 index c70493f..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/escprober.py +++ /dev/null @@ -1,101 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .charsetprober import CharSetProber -from .codingstatemachine import CodingStateMachine -from .enums import LanguageFilter, ProbingState, MachineState -from .escsm import (HZ_SM_MODEL, ISO2022CN_SM_MODEL, ISO2022JP_SM_MODEL, - ISO2022KR_SM_MODEL) - - -class EscCharSetProber(CharSetProber): - """ - This CharSetProber uses a "code scheme" approach for detecting encodings, - whereby easily recognizable escape or shift sequences are relied on to - identify these encodings. - """ - - def __init__(self, lang_filter=None): - super(EscCharSetProber, self).__init__(lang_filter=lang_filter) - self.coding_sm = [] - if self.lang_filter & LanguageFilter.CHINESE_SIMPLIFIED: - self.coding_sm.append(CodingStateMachine(HZ_SM_MODEL)) - self.coding_sm.append(CodingStateMachine(ISO2022CN_SM_MODEL)) - if self.lang_filter & LanguageFilter.JAPANESE: - self.coding_sm.append(CodingStateMachine(ISO2022JP_SM_MODEL)) - if self.lang_filter & LanguageFilter.KOREAN: - self.coding_sm.append(CodingStateMachine(ISO2022KR_SM_MODEL)) - self.active_sm_count = None - self._detected_charset = None - self._detected_language = None - self._state = None - self.reset() - - def reset(self): - super(EscCharSetProber, self).reset() - for coding_sm in self.coding_sm: - if not coding_sm: - continue - coding_sm.active = True - coding_sm.reset() - self.active_sm_count = len(self.coding_sm) - self._detected_charset = None - self._detected_language = None - - @property - def charset_name(self): - return self._detected_charset - - @property - def language(self): - return self._detected_language - - def get_confidence(self): - if self._detected_charset: - return 0.99 - else: - return 0.00 - - def feed(self, byte_str): - for c in byte_str: - for coding_sm in self.coding_sm: - if not coding_sm or not coding_sm.active: - continue - coding_state = coding_sm.next_state(c) - if coding_state == MachineState.ERROR: - coding_sm.active = False - self.active_sm_count -= 1 - if self.active_sm_count <= 0: - self._state = ProbingState.NOT_ME - return self.state - elif coding_state == MachineState.ITS_ME: - self._state = ProbingState.FOUND_IT - self._detected_charset = coding_sm.get_coding_state_machine() - self._detected_language = coding_sm.language - return self.state - - return self.state diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/escprober.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/escprober.pyc deleted file mode 100644 index cb9e24967e2502f256e274dc45bb7cfe0b217191..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3607 zcmd5<&2Jl35TCUjJ9eDJ{h$HVqE!%*Rna;vRaFpzmc*f^jT5bdDlA2-&F-_a>F(Ou z_nanCb3pBh3;#(kh#Lp4NL)B`;=q{${{X+4wVMVNiCenPn|*I~-p9=R-pnNb_iW|r zw{u%Qjh{T;chU3#NPs_!BBI!$u0<A)a}?z$&Qmv^jq?;0D4wG36vajA7AY=Kx0HP= zP&7?(nYv|)E7Yw}JVV_XimTMELSl-PMLmmxB0VR1M)Xa0mVy#>>eJXfv_R@i%q+<A zj+b_n*+>W5D$UsEnLP-?q~9@~QEQ&R6DF$8DwsKthhEYjd407SMn<Kk3KmbF$O~gU zNfxLVc;*bq{jS?tbJx~anhy={((0_=T)KI4x&2!9R~xToKX6XiH7wH9{wXD1+B}Dk zU!ds@h$1#MEZxnqEnxrWFn)mz4<o_Ksz^az3<iElhK0#+nqX8GE02u|n>(2~^-oy5 zV&mD|3AKIdB=$%vZF}~jKM0hq{T&snMcW$=(*bO1_XepQD5HD>)7dJ46gv7tS?$S= zO4atEtvnq@hjyy`K|cwPyzNNYO8eeW*_f_(!k)3U+8bdy@0BWuMxhGqL1LSMEENVS zF=6k}HakjV_GF{$^3`WEaby23qv=0E4E`*73i#w`7ZyX`0+cMPPt0}mOm_=prf9cF zcT-QsdD<<JnI==FXAlRpS?VRXGT|n&$awk;rhj*OdiAw}vk?5@wBXz;g77V$tj12} z&bdkF{G@Y1CST+$!FR4xXSLgc%m|ovdjjbCTde;STVga+sZ-`5-yGKslhC*>v?I!# z<?7g}VC3*h0_o-Zt#-51bUUrJjfbt(R&&J^@eNK_N#O9cb9iZonX>9v_creF45!2# zW<OYWn)licZ)pl3?Lnf<JUSkbvahhG>kmeWG3UT@GX$x?^>LH6GIEL&E-S{DRaSO2 zUue-S1r&@JK=#lo>WL<GtVu%j5WU7Q4fippvG1jg-XIE8svAcKjl+-9?c~Yh8@Kn8 zrQ7MP+x{JW@NsaIF5&498=H+`IJ_1n*e{B%nHy_;cY|5d+<lm0kT&?hIDG?f#*IMu zxjsB}IGS8V)0aWWddDhTHR}@IwQ(zh!#|&Gc?!2c)xUAeo<3L_V`gRR13DHU>jv#z zA;?2_;M$#H3YfDvK0Jc4GT;Kj3?;;i3{$xOS*OCCj>OA$okN==gpuJaFyYuLmfcK8 znej94nLIv3Dse8b6bC`)A`=FkxWjpyhdlkPUBP;Mf~NVDWL<y@iujeSIqUqy0qg{B z%V?Sr%yv7mjNqO16HAF|XRMWEr}0&B6E9XxJ~`uvassLUqmejEbYo|owMNr8!{nN` z(Em?u_}H0$QWOLhb&&izf@20{yZ_?LKaMWG`0I1T`0UBN_GbByD-eV;gutZ7nax*g z;Ajq<1XLDslF&HDauZzsj?Teve8*R|exc(W9sE4D!^+l=bc|e<r>b7y*RDm?^cL+c zaCG2tj-DbeSagg?fpiB>fga~5{hm_<1YC&_1tdWj^iIyrA_qn}dTdepE144QPD>Oi z%cd3TVD<4@GqTo#2vsLS*khJM5l5amImEp5Yp=|Iv{#}>>`N>sm04Trx)7RDo%4c3 z5a(U=3@4~W9hfZoI|b&kZJLg=?nrOdi?qrj5+gx!MSFeIU28g*Cem5zU^BNiJNP2W zYjyqW_KMruG<**-uW${M?c~N;<(LJyE0D;d9PcfmK$h4(G)QSCMY(~jn#D~{0+R&G z8SAWX7@Mr8RKSI#UIZa)7SZq=qTxJ#WuaB8f_F7*xhyM;>jsW9s2kW3t{V@6QN%+I zm#!NOeAmqq0jn+9L#81oqWmz2&Shqc`QGCmXU7wRNbhV?H7C3G(KKJl;#4tLt(9ly z3-g6?v0Z1L{DU!$wONLDz|HEUak0zZoxp?vAaGR4DArO^ISj`W#G+C_!6o=%AWF$3 db&?cmZ-P<8bDw4|{)`=`r$K4}%Vle^@DEQ9C7%EQ diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/escsm.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/escsm.py deleted file mode 100644 index 0069523..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/escsm.py +++ /dev/null @@ -1,246 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .enums import MachineState - -HZ_CLS = ( -1,0,0,0,0,0,0,0, # 00 - 07 -0,0,0,0,0,0,0,0, # 08 - 0f -0,0,0,0,0,0,0,0, # 10 - 17 -0,0,0,1,0,0,0,0, # 18 - 1f -0,0,0,0,0,0,0,0, # 20 - 27 -0,0,0,0,0,0,0,0, # 28 - 2f -0,0,0,0,0,0,0,0, # 30 - 37 -0,0,0,0,0,0,0,0, # 38 - 3f -0,0,0,0,0,0,0,0, # 40 - 47 -0,0,0,0,0,0,0,0, # 48 - 4f -0,0,0,0,0,0,0,0, # 50 - 57 -0,0,0,0,0,0,0,0, # 58 - 5f -0,0,0,0,0,0,0,0, # 60 - 67 -0,0,0,0,0,0,0,0, # 68 - 6f -0,0,0,0,0,0,0,0, # 70 - 77 -0,0,0,4,0,5,2,0, # 78 - 7f -1,1,1,1,1,1,1,1, # 80 - 87 -1,1,1,1,1,1,1,1, # 88 - 8f -1,1,1,1,1,1,1,1, # 90 - 97 -1,1,1,1,1,1,1,1, # 98 - 9f -1,1,1,1,1,1,1,1, # a0 - a7 -1,1,1,1,1,1,1,1, # a8 - af -1,1,1,1,1,1,1,1, # b0 - b7 -1,1,1,1,1,1,1,1, # b8 - bf -1,1,1,1,1,1,1,1, # c0 - c7 -1,1,1,1,1,1,1,1, # c8 - cf -1,1,1,1,1,1,1,1, # d0 - d7 -1,1,1,1,1,1,1,1, # d8 - df -1,1,1,1,1,1,1,1, # e0 - e7 -1,1,1,1,1,1,1,1, # e8 - ef -1,1,1,1,1,1,1,1, # f0 - f7 -1,1,1,1,1,1,1,1, # f8 - ff -) - -HZ_ST = ( -MachineState.START,MachineState.ERROR, 3,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,# 00-07 -MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 08-0f -MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START, 4,MachineState.ERROR,# 10-17 - 5,MachineState.ERROR, 6,MachineState.ERROR, 5, 5, 4,MachineState.ERROR,# 18-1f - 4,MachineState.ERROR, 4, 4, 4,MachineState.ERROR, 4,MachineState.ERROR,# 20-27 - 4,MachineState.ITS_ME,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 28-2f -) - -HZ_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0) - -HZ_SM_MODEL = {'class_table': HZ_CLS, - 'class_factor': 6, - 'state_table': HZ_ST, - 'char_len_table': HZ_CHAR_LEN_TABLE, - 'name': "HZ-GB-2312", - 'language': 'Chinese'} - -ISO2022CN_CLS = ( -2,0,0,0,0,0,0,0, # 00 - 07 -0,0,0,0,0,0,0,0, # 08 - 0f -0,0,0,0,0,0,0,0, # 10 - 17 -0,0,0,1,0,0,0,0, # 18 - 1f -0,0,0,0,0,0,0,0, # 20 - 27 -0,3,0,0,0,0,0,0, # 28 - 2f -0,0,0,0,0,0,0,0, # 30 - 37 -0,0,0,0,0,0,0,0, # 38 - 3f -0,0,0,4,0,0,0,0, # 40 - 47 -0,0,0,0,0,0,0,0, # 48 - 4f -0,0,0,0,0,0,0,0, # 50 - 57 -0,0,0,0,0,0,0,0, # 58 - 5f -0,0,0,0,0,0,0,0, # 60 - 67 -0,0,0,0,0,0,0,0, # 68 - 6f -0,0,0,0,0,0,0,0, # 70 - 77 -0,0,0,0,0,0,0,0, # 78 - 7f -2,2,2,2,2,2,2,2, # 80 - 87 -2,2,2,2,2,2,2,2, # 88 - 8f -2,2,2,2,2,2,2,2, # 90 - 97 -2,2,2,2,2,2,2,2, # 98 - 9f -2,2,2,2,2,2,2,2, # a0 - a7 -2,2,2,2,2,2,2,2, # a8 - af -2,2,2,2,2,2,2,2, # b0 - b7 -2,2,2,2,2,2,2,2, # b8 - bf -2,2,2,2,2,2,2,2, # c0 - c7 -2,2,2,2,2,2,2,2, # c8 - cf -2,2,2,2,2,2,2,2, # d0 - d7 -2,2,2,2,2,2,2,2, # d8 - df -2,2,2,2,2,2,2,2, # e0 - e7 -2,2,2,2,2,2,2,2, # e8 - ef -2,2,2,2,2,2,2,2, # f0 - f7 -2,2,2,2,2,2,2,2, # f8 - ff -) - -ISO2022CN_ST = ( -MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 00-07 -MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 08-0f -MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 10-17 -MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,# 18-1f -MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 20-27 - 5, 6,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 28-2f -MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 30-37 -MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,# 38-3f -) - -ISO2022CN_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0) - -ISO2022CN_SM_MODEL = {'class_table': ISO2022CN_CLS, - 'class_factor': 9, - 'state_table': ISO2022CN_ST, - 'char_len_table': ISO2022CN_CHAR_LEN_TABLE, - 'name': "ISO-2022-CN", - 'language': 'Chinese'} - -ISO2022JP_CLS = ( -2,0,0,0,0,0,0,0, # 00 - 07 -0,0,0,0,0,0,2,2, # 08 - 0f -0,0,0,0,0,0,0,0, # 10 - 17 -0,0,0,1,0,0,0,0, # 18 - 1f -0,0,0,0,7,0,0,0, # 20 - 27 -3,0,0,0,0,0,0,0, # 28 - 2f -0,0,0,0,0,0,0,0, # 30 - 37 -0,0,0,0,0,0,0,0, # 38 - 3f -6,0,4,0,8,0,0,0, # 40 - 47 -0,9,5,0,0,0,0,0, # 48 - 4f -0,0,0,0,0,0,0,0, # 50 - 57 -0,0,0,0,0,0,0,0, # 58 - 5f -0,0,0,0,0,0,0,0, # 60 - 67 -0,0,0,0,0,0,0,0, # 68 - 6f -0,0,0,0,0,0,0,0, # 70 - 77 -0,0,0,0,0,0,0,0, # 78 - 7f -2,2,2,2,2,2,2,2, # 80 - 87 -2,2,2,2,2,2,2,2, # 88 - 8f -2,2,2,2,2,2,2,2, # 90 - 97 -2,2,2,2,2,2,2,2, # 98 - 9f -2,2,2,2,2,2,2,2, # a0 - a7 -2,2,2,2,2,2,2,2, # a8 - af -2,2,2,2,2,2,2,2, # b0 - b7 -2,2,2,2,2,2,2,2, # b8 - bf -2,2,2,2,2,2,2,2, # c0 - c7 -2,2,2,2,2,2,2,2, # c8 - cf -2,2,2,2,2,2,2,2, # d0 - d7 -2,2,2,2,2,2,2,2, # d8 - df -2,2,2,2,2,2,2,2, # e0 - e7 -2,2,2,2,2,2,2,2, # e8 - ef -2,2,2,2,2,2,2,2, # f0 - f7 -2,2,2,2,2,2,2,2, # f8 - ff -) - -ISO2022JP_ST = ( -MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 00-07 -MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 08-0f -MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 10-17 -MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,# 18-1f -MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,MachineState.ERROR,# 20-27 -MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 6,MachineState.ITS_ME,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,# 28-2f -MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,# 30-37 -MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 38-3f -MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,MachineState.START,# 40-47 -) - -ISO2022JP_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0) - -ISO2022JP_SM_MODEL = {'class_table': ISO2022JP_CLS, - 'class_factor': 10, - 'state_table': ISO2022JP_ST, - 'char_len_table': ISO2022JP_CHAR_LEN_TABLE, - 'name': "ISO-2022-JP", - 'language': 'Japanese'} - -ISO2022KR_CLS = ( -2,0,0,0,0,0,0,0, # 00 - 07 -0,0,0,0,0,0,0,0, # 08 - 0f -0,0,0,0,0,0,0,0, # 10 - 17 -0,0,0,1,0,0,0,0, # 18 - 1f -0,0,0,0,3,0,0,0, # 20 - 27 -0,4,0,0,0,0,0,0, # 28 - 2f -0,0,0,0,0,0,0,0, # 30 - 37 -0,0,0,0,0,0,0,0, # 38 - 3f -0,0,0,5,0,0,0,0, # 40 - 47 -0,0,0,0,0,0,0,0, # 48 - 4f -0,0,0,0,0,0,0,0, # 50 - 57 -0,0,0,0,0,0,0,0, # 58 - 5f -0,0,0,0,0,0,0,0, # 60 - 67 -0,0,0,0,0,0,0,0, # 68 - 6f -0,0,0,0,0,0,0,0, # 70 - 77 -0,0,0,0,0,0,0,0, # 78 - 7f -2,2,2,2,2,2,2,2, # 80 - 87 -2,2,2,2,2,2,2,2, # 88 - 8f -2,2,2,2,2,2,2,2, # 90 - 97 -2,2,2,2,2,2,2,2, # 98 - 9f -2,2,2,2,2,2,2,2, # a0 - a7 -2,2,2,2,2,2,2,2, # a8 - af -2,2,2,2,2,2,2,2, # b0 - b7 -2,2,2,2,2,2,2,2, # b8 - bf -2,2,2,2,2,2,2,2, # c0 - c7 -2,2,2,2,2,2,2,2, # c8 - cf -2,2,2,2,2,2,2,2, # d0 - d7 -2,2,2,2,2,2,2,2, # d8 - df -2,2,2,2,2,2,2,2, # e0 - e7 -2,2,2,2,2,2,2,2, # e8 - ef -2,2,2,2,2,2,2,2, # f0 - f7 -2,2,2,2,2,2,2,2, # f8 - ff -) - -ISO2022KR_ST = ( -MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,# 00-07 -MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 08-0f -MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,MachineState.ERROR,# 10-17 -MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 18-1f -MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 20-27 -) - -ISO2022KR_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0) - -ISO2022KR_SM_MODEL = {'class_table': ISO2022KR_CLS, - 'class_factor': 6, - 'state_table': ISO2022KR_ST, - 'char_len_table': ISO2022KR_CHAR_LEN_TABLE, - 'name': "ISO-2022-KR", - 'language': 'Korean'} - - diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/escsm.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/escsm.pyc deleted file mode 100644 index e0d39602683e44def3ed8c1997650a1e75f9ce3b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8062 zcmeHM>r>i55Z{QRp!l}$m;J;zlLoQFv@@Mftz~Le)B!$arjv<W(6k}YBwFpa{>}Xd zx_d`Vf&rhE>4?B_x4ZY-z1`cra3=m_(o4T5zt+J2lK?(o-<?kaFnmj30W>5~C6L%7 zP=~;f;9G*X!@!cEp&<G!5*u!d#rH=zw|5&x@bQ_ig85uF>f3`R;rmn|)Ink_ooo{} z`1rvBqm+6M)FiOSppJrx3m*bD1_jj3Qcy6Elg2L`jU#aaSO&i)flWa{9Rv0R)KuG7 zZKnz2qblN6`^$`XV>fPZ$9CgJ(M~-UuUddarwB=kf*+LlxpA`s$?nL3OgDt^+yvA= zfSLyO6x4AZwUmh3w1^sVC~D&(YBQ0jVGN&vnz?G!{JnR+!MzvKEmFPdQOwg!2^(`x za8Dx`_Gh>sRS`xG`e7r_%3l^uAcSZ6=~G_^6_f2bs8c-384=}q5oP31l&3_L7etir ziQL4E@B-ACi$(eD63$Y>OYYW>&N?>`!k@803|t+?6ncH<kc{82XF;6>wg~DRcNA{< zP!U58IciQg>b`K)1K}w2<wK}sU*hRt;wb@HYP<<-N_y?Uw2g|VdxnW)Fo&rbp=OAh z1T}b|fH#g!&C*?0^YlH-;M2vpuGhS#!v$OdY70!#gah5tEW;KgH;trqRsQ@@&aW)z zJ<?_C4Z|D7&Keow8r~T8E#2Nf)b|ZDg#(u~f2r)q`CL9PuWg$oZIYNtcv1GoE(h4q zTRNddnVV&gma^G&4Bg(&0=j|wL#!M*(6=5%q;Jamy7IfBoTn9EYLHue$OAuU+KD)D z#4S4_O9ioa;SqI`p9cNU)tjl4{8a1fVuE_mS2O+}<$V7Qn)YMaz!A6Xh-?Z|rFWg| z;NE1}48ncIguPVR<j>a~iuzSCgX1ZvnEcVd!#+ObG2+ixaojse3wF++cgrP1{D8jO zZqL#$^p3)Kf#FTo&TFUrrD|u_IvJF&Ya4V$fI(rr<W9WXsXHiNSh@PS1upW_d;x2L zM~Q9NhYhz(m4RPzuB+PGR)upa)zxy9_lo86j<^B+QmtsEA}69`rRvS#M4Gd{TGqCT z+gf$?<5rR1=n}uAm3BTAx4aBW;YBRn!>(;}1$2iTP!Q-rgwTOE8)3%5ZtQl#A|(n- zB2hC#up}L0?Pj?X7Aa9!66p#{(rwr*t^tC^#s9H_(sIlry!cj*bVsQ-EoL~b^6OYR zS#kF4pWl}YKkQt=d0nWzagX1!UrrAH_FGC-X_+nAwDHp1vSe?$w6E<FiGQ>s!)8rK zp&N8&c#7fH+{UZc3BTTc*J!ds%Xt3;mAfrGpr#XenSG5{a#)sfk}NIaYbB8!N=u{d cSNcYf2|Fh(;ivFV&<UF~{2P23v7>hX1=XWkGynhq diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/eucjpprober.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/eucjpprober.py deleted file mode 100644 index 20ce8f7..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/eucjpprober.py +++ /dev/null @@ -1,92 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .enums import ProbingState, MachineState -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import EUCJPDistributionAnalysis -from .jpcntx import EUCJPContextAnalysis -from .mbcssm import EUCJP_SM_MODEL - - -class EUCJPProber(MultiByteCharSetProber): - def __init__(self): - super(EUCJPProber, self).__init__() - self.coding_sm = CodingStateMachine(EUCJP_SM_MODEL) - self.distribution_analyzer = EUCJPDistributionAnalysis() - self.context_analyzer = EUCJPContextAnalysis() - self.reset() - - def reset(self): - super(EUCJPProber, self).reset() - self.context_analyzer.reset() - - @property - def charset_name(self): - return "EUC-JP" - - @property - def language(self): - return "Japanese" - - def feed(self, byte_str): - for i in range(len(byte_str)): - # PY3K: byte_str is a byte array, so byte_str[i] is an int, not a byte - coding_state = self.coding_sm.next_state(byte_str[i]) - if coding_state == MachineState.ERROR: - self.logger.debug('%s %s prober hit error at byte %s', - self.charset_name, self.language, i) - self._state = ProbingState.NOT_ME - break - elif coding_state == MachineState.ITS_ME: - self._state = ProbingState.FOUND_IT - break - elif coding_state == MachineState.START: - char_len = self.coding_sm.get_current_charlen() - if i == 0: - self._last_char[1] = byte_str[0] - self.context_analyzer.feed(self._last_char, char_len) - self.distribution_analyzer.feed(self._last_char, char_len) - else: - self.context_analyzer.feed(byte_str[i - 1:i + 1], - char_len) - self.distribution_analyzer.feed(byte_str[i - 1:i + 1], - char_len) - - self._last_char[0] = byte_str[-1] - - if self.state == ProbingState.DETECTING: - if (self.context_analyzer.got_enough_data() and - (self.get_confidence() > self.SHORTCUT_THRESHOLD)): - self._state = ProbingState.FOUND_IT - - return self.state - - def get_confidence(self): - context_conf = self.context_analyzer.get_confidence() - distrib_conf = self.distribution_analyzer.get_confidence() - return max(context_conf, distrib_conf) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/eucjpprober.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/eucjpprober.pyc deleted file mode 100644 index 0e95433f798fcd919075c900b1abb2ff937e451f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3422 zcmd5;>rWd;5T85036B7Qgr-tKO(ZKVHBlp!N@>)@xJ^)a=xkKQQnWgJi#c<5Hg{_Z zQ6jZ!KlU%kxBiWl`nCPdtWBs$)sMu!-P@g++nx7J?$4=-d%sM->d@$y!}~jo>}N~? z9)}{L*rB#Vu}f{29EQ3S<tWZmJ8$<niV74Lsa>@DJVhmn%hWF0eSxA1#S_$?u=^rK z*C?K(_9XTt(s?>?C@9l!M86WfY)?^8p=NagOoR@ms*A}?V%kmn`(e^;8sBIEZ26tT zFwp|2GOby}v^9)O`1H)^`k|jTwc*cnYVmWx*ZaZvl+ghew**{cufDmv5oRV0_lG9z zCr=VTI?KY$lH3@R)cc9ir{>?-=`mI{x760oM&pIKHU?QH&UMW)J;lg2F==8IL$^=? zv<$uTBFCzMwplN*K|!{;@wP}oUdT!m6l75*uURePxDIQA2OG4Gkv+p?@Hq4ahq=^q zS=Elok;(JnfT{wSB13syB2yl(D-7vP$OmAtDT>&xvS6mbhYtrj^-8=gV^S(iLZg(& zmwU{PsbK1e&Q%tBc?K<D3NC0_`K;#GIEarl*X0Y*@Hs{<OLeA=H3grO>FA(}H_4Qx zSk(q;cmn^Zo%m_(pdSS~&1$btYiD1l`^is7_t%e;we|GDdgozw`c3dUUBj<CsI_W? zaIhLCnen4&)!g6es$B-jP$xPG`f05Le+smz>0zfg7>HMWH8}HFzPlJ1yDT~L&WtmO z|7A1W0r~@GVEyLCHo2f;me6CJigvvzUU3+R{2n{o)yvLIeTk7Vvn>0$)a-!be2jrh zHzkg@Gj<6?+3M!5<(}z24q+svu#MqkD)D2z2G%l;RC51MEb;wKf8ZzZ(2q_qcB05n zx<kLKA6yWMW#fQjn~1IcfHh7ZJ0mA`I5*(gcy-Tt>q;I#?#R&_WDJ*<fO(6JB#~Z$ zj$BG(Au3W2SxM4LuPhKG5u_Xx3^PH!YYbA8w0k^1{(4Hj{+$>-eHlF?Xiy_kz`=D+ zMsM?cCh{ZS`xo<s^%7IeQjnuZyqcq){b-inAkm?KG4#eI=<&CLu;d~fPPoO#=ji6j zrBDBh0`lPbky*)~v*KD-7DTp1;r8A5wwo+SYPYv|&Fn4FQJ#Spb#eU8Ni22&fy5@; z&Q>tr&6e@lRJ42;nq{4){dCzk%loK*z=a^PWi<R7zv?I0+Dr;}&?o?K44rtKxo{s* zf}*C71daAMFom??c{?7814#Sbu1*CQ=>1{Wn*q?9<q3le2pHRGsjY@A?Lo49-fA+G z9r62}z3mP4yd}ppTTi@}nFko$sLn7=b%Hm75NruYD)KW6k>rPhMRcHb;JvRv(hqPJ z-e|NM_15$49}F|r?Hi?&{;+$f0v|M-G3Aziau5bO>1f04K=av-*Q)QeRO^}7z~;q< zC|GimFwCliC@IP(bZN81sGP~oEEIFBz_JZ}0O+c!(Py~(A>Yq|PR^3MDD`L_6)7(( zp1DHJI*Y*Gc1q4|XWE^0=Kx)B=4`5C$KX-N$iBeDo{0zf0HJ3?8<A+YF2Rv(Qb3H2 zI|M0TT(7*(c@lH+k+FYT<+oKZ6Lf4drSLuw^^RHt0bIRCnf;d-Qo2aAS7mP-^*dZC zl(N36;(joUu$87jO14lTLeV9evkL*kb`s6J7f@DL<u}~H-C-%&B1NZCs^n+zudHlW zIdCLebux@I33ZztILhMvQOUGf$m5zKab;UR$tAJv)1@c0%^i1A7y3Wj6>|FM4LXTA kwQV5paeRiZk(bg2eH_{nqdv06e*7tT6Rj;e*T?_dKVw$`^Z)<= diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/euckrfreq.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/euckrfreq.py deleted file mode 100644 index b68078c..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/euckrfreq.py +++ /dev/null @@ -1,195 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# Sampling from about 20M text materials include literature and computer technology - -# 128 --> 0.79 -# 256 --> 0.92 -# 512 --> 0.986 -# 1024 --> 0.99944 -# 2048 --> 0.99999 -# -# Idea Distribution Ratio = 0.98653 / (1-0.98653) = 73.24 -# Random Distribution Ration = 512 / (2350-512) = 0.279. -# -# Typical Distribution Ratio - -EUCKR_TYPICAL_DISTRIBUTION_RATIO = 6.0 - -EUCKR_TABLE_SIZE = 2352 - -# Char to FreqOrder table , -EUCKR_CHAR_TO_FREQ_ORDER = ( - 13, 130, 120,1396, 481,1719,1720, 328, 609, 212,1721, 707, 400, 299,1722, 87, -1397,1723, 104, 536,1117,1203,1724,1267, 685,1268, 508,1725,1726,1727,1728,1398, -1399,1729,1730,1731, 141, 621, 326,1057, 368,1732, 267, 488, 20,1733,1269,1734, - 945,1400,1735, 47, 904,1270,1736,1737, 773, 248,1738, 409, 313, 786, 429,1739, - 116, 987, 813,1401, 683, 75,1204, 145,1740,1741,1742,1743, 16, 847, 667, 622, - 708,1744,1745,1746, 966, 787, 304, 129,1747, 60, 820, 123, 676,1748,1749,1750, -1751, 617,1752, 626,1753,1754,1755,1756, 653,1757,1758,1759,1760,1761,1762, 856, - 344,1763,1764,1765,1766, 89, 401, 418, 806, 905, 848,1767,1768,1769, 946,1205, - 709,1770,1118,1771, 241,1772,1773,1774,1271,1775, 569,1776, 999,1777,1778,1779, -1780, 337, 751,1058, 28, 628, 254,1781, 177, 906, 270, 349, 891,1079,1782, 19, -1783, 379,1784, 315,1785, 629, 754,1402, 559,1786, 636, 203,1206,1787, 710, 567, -1788, 935, 814,1789,1790,1207, 766, 528,1791,1792,1208,1793,1794,1795,1796,1797, -1403,1798,1799, 533,1059,1404,1405,1156,1406, 936, 884,1080,1800, 351,1801,1802, -1803,1804,1805, 801,1806,1807,1808,1119,1809,1157, 714, 474,1407,1810, 298, 899, - 885,1811,1120, 802,1158,1812, 892,1813,1814,1408, 659,1815,1816,1121,1817,1818, -1819,1820,1821,1822, 319,1823, 594, 545,1824, 815, 937,1209,1825,1826, 573,1409, -1022,1827,1210,1828,1829,1830,1831,1832,1833, 556, 722, 807,1122,1060,1834, 697, -1835, 900, 557, 715,1836,1410, 540,1411, 752,1159, 294, 597,1211, 976, 803, 770, -1412,1837,1838, 39, 794,1413, 358,1839, 371, 925,1840, 453, 661, 788, 531, 723, - 544,1023,1081, 869, 91,1841, 392, 430, 790, 602,1414, 677,1082, 457,1415,1416, -1842,1843, 475, 327,1024,1417, 795, 121,1844, 733, 403,1418,1845,1846,1847, 300, - 119, 711,1212, 627,1848,1272, 207,1849,1850, 796,1213, 382,1851, 519,1852,1083, - 893,1853,1854,1855, 367, 809, 487, 671,1856, 663,1857,1858, 956, 471, 306, 857, -1859,1860,1160,1084,1861,1862,1863,1864,1865,1061,1866,1867,1868,1869,1870,1871, - 282, 96, 574,1872, 502,1085,1873,1214,1874, 907,1875,1876, 827, 977,1419,1420, -1421, 268,1877,1422,1878,1879,1880, 308,1881, 2, 537,1882,1883,1215,1884,1885, - 127, 791,1886,1273,1423,1887, 34, 336, 404, 643,1888, 571, 654, 894, 840,1889, - 0, 886,1274, 122, 575, 260, 908, 938,1890,1275, 410, 316,1891,1892, 100,1893, -1894,1123, 48,1161,1124,1025,1895, 633, 901,1276,1896,1897, 115, 816,1898, 317, -1899, 694,1900, 909, 734,1424, 572, 866,1425, 691, 85, 524,1010, 543, 394, 841, -1901,1902,1903,1026,1904,1905,1906,1907,1908,1909, 30, 451, 651, 988, 310,1910, -1911,1426, 810,1216, 93,1912,1913,1277,1217,1914, 858, 759, 45, 58, 181, 610, - 269,1915,1916, 131,1062, 551, 443,1000, 821,1427, 957, 895,1086,1917,1918, 375, -1919, 359,1920, 687,1921, 822,1922, 293,1923,1924, 40, 662, 118, 692, 29, 939, - 887, 640, 482, 174,1925, 69,1162, 728,1428, 910,1926,1278,1218,1279, 386, 870, - 217, 854,1163, 823,1927,1928,1929,1930, 834,1931, 78,1932, 859,1933,1063,1934, -1935,1936,1937, 438,1164, 208, 595,1938,1939,1940,1941,1219,1125,1942, 280, 888, -1429,1430,1220,1431,1943,1944,1945,1946,1947,1280, 150, 510,1432,1948,1949,1950, -1951,1952,1953,1954,1011,1087,1955,1433,1043,1956, 881,1957, 614, 958,1064,1065, -1221,1958, 638,1001, 860, 967, 896,1434, 989, 492, 553,1281,1165,1959,1282,1002, -1283,1222,1960,1961,1962,1963, 36, 383, 228, 753, 247, 454,1964, 876, 678,1965, -1966,1284, 126, 464, 490, 835, 136, 672, 529, 940,1088,1435, 473,1967,1968, 467, - 50, 390, 227, 587, 279, 378, 598, 792, 968, 240, 151, 160, 849, 882,1126,1285, - 639,1044, 133, 140, 288, 360, 811, 563,1027, 561, 142, 523,1969,1970,1971, 7, - 103, 296, 439, 407, 506, 634, 990,1972,1973,1974,1975, 645,1976,1977,1978,1979, -1980,1981, 236,1982,1436,1983,1984,1089, 192, 828, 618, 518,1166, 333,1127,1985, - 818,1223,1986,1987,1988,1989,1990,1991,1992,1993, 342,1128,1286, 746, 842,1994, -1995, 560, 223,1287, 98, 8, 189, 650, 978,1288,1996,1437,1997, 17, 345, 250, - 423, 277, 234, 512, 226, 97, 289, 42, 167,1998, 201,1999,2000, 843, 836, 824, - 532, 338, 783,1090, 182, 576, 436,1438,1439, 527, 500,2001, 947, 889,2002,2003, -2004,2005, 262, 600, 314, 447,2006, 547,2007, 693, 738,1129,2008, 71,1440, 745, - 619, 688,2009, 829,2010,2011, 147,2012, 33, 948,2013,2014, 74, 224,2015, 61, - 191, 918, 399, 637,2016,1028,1130, 257, 902,2017,2018,2019,2020,2021,2022,2023, -2024,2025,2026, 837,2027,2028,2029,2030, 179, 874, 591, 52, 724, 246,2031,2032, -2033,2034,1167, 969,2035,1289, 630, 605, 911,1091,1168,2036,2037,2038,1441, 912, -2039, 623,2040,2041, 253,1169,1290,2042,1442, 146, 620, 611, 577, 433,2043,1224, - 719,1170, 959, 440, 437, 534, 84, 388, 480,1131, 159, 220, 198, 679,2044,1012, - 819,1066,1443, 113,1225, 194, 318,1003,1029,2045,2046,2047,2048,1067,2049,2050, -2051,2052,2053, 59, 913, 112,2054, 632,2055, 455, 144, 739,1291,2056, 273, 681, - 499,2057, 448,2058,2059, 760,2060,2061, 970, 384, 169, 245,1132,2062,2063, 414, -1444,2064,2065, 41, 235,2066, 157, 252, 877, 568, 919, 789, 580,2067, 725,2068, -2069,1292,2070,2071,1445,2072,1446,2073,2074, 55, 588, 66,1447, 271,1092,2075, -1226,2076, 960,1013, 372,2077,2078,2079,2080,2081,1293,2082,2083,2084,2085, 850, -2086,2087,2088,2089,2090, 186,2091,1068, 180,2092,2093,2094, 109,1227, 522, 606, -2095, 867,1448,1093, 991,1171, 926, 353,1133,2096, 581,2097,2098,2099,1294,1449, -1450,2100, 596,1172,1014,1228,2101,1451,1295,1173,1229,2102,2103,1296,1134,1452, - 949,1135,2104,2105,1094,1453,1454,1455,2106,1095,2107,2108,2109,2110,2111,2112, -2113,2114,2115,2116,2117, 804,2118,2119,1230,1231, 805,1456, 405,1136,2120,2121, -2122,2123,2124, 720, 701,1297, 992,1457, 927,1004,2125,2126,2127,2128,2129,2130, - 22, 417,2131, 303,2132, 385,2133, 971, 520, 513,2134,1174, 73,1096, 231, 274, - 962,1458, 673,2135,1459,2136, 152,1137,2137,2138,2139,2140,1005,1138,1460,1139, -2141,2142,2143,2144, 11, 374, 844,2145, 154,1232, 46,1461,2146, 838, 830, 721, -1233, 106,2147, 90, 428, 462, 578, 566,1175, 352,2148,2149, 538,1234, 124,1298, -2150,1462, 761, 565,2151, 686,2152, 649,2153, 72, 173,2154, 460, 415,2155,1463, -2156,1235, 305,2157,2158,2159,2160,2161,2162, 579,2163,2164,2165,2166,2167, 747, -2168,2169,2170,2171,1464, 669,2172,2173,2174,2175,2176,1465,2177, 23, 530, 285, -2178, 335, 729,2179, 397,2180,2181,2182,1030,2183,2184, 698,2185,2186, 325,2187, -2188, 369,2189, 799,1097,1015, 348,2190,1069, 680,2191, 851,1466,2192,2193, 10, -2194, 613, 424,2195, 979, 108, 449, 589, 27, 172, 81,1031, 80, 774, 281, 350, -1032, 525, 301, 582,1176,2196, 674,1045,2197,2198,1467, 730, 762,2199,2200,2201, -2202,1468,2203, 993,2204,2205, 266,1070, 963,1140,2206,2207,2208, 664,1098, 972, -2209,2210,2211,1177,1469,1470, 871,2212,2213,2214,2215,2216,1471,2217,2218,2219, -2220,2221,2222,2223,2224,2225,2226,2227,1472,1236,2228,2229,2230,2231,2232,2233, -2234,2235,1299,2236,2237, 200,2238, 477, 373,2239,2240, 731, 825, 777,2241,2242, -2243, 521, 486, 548,2244,2245,2246,1473,1300, 53, 549, 137, 875, 76, 158,2247, -1301,1474, 469, 396,1016, 278, 712,2248, 321, 442, 503, 767, 744, 941,1237,1178, -1475,2249, 82, 178,1141,1179, 973,2250,1302,2251, 297,2252,2253, 570,2254,2255, -2256, 18, 450, 206,2257, 290, 292,1142,2258, 511, 162, 99, 346, 164, 735,2259, -1476,1477, 4, 554, 343, 798,1099,2260,1100,2261, 43, 171,1303, 139, 215,2262, -2263, 717, 775,2264,1033, 322, 216,2265, 831,2266, 149,2267,1304,2268,2269, 702, -1238, 135, 845, 347, 309,2270, 484,2271, 878, 655, 238,1006,1478,2272, 67,2273, - 295,2274,2275, 461,2276, 478, 942, 412,2277,1034,2278,2279,2280, 265,2281, 541, -2282,2283,2284,2285,2286, 70, 852,1071,2287,2288,2289,2290, 21, 56, 509, 117, - 432,2291,2292, 331, 980, 552,1101, 148, 284, 105, 393,1180,1239, 755,2293, 187, -2294,1046,1479,2295, 340,2296, 63,1047, 230,2297,2298,1305, 763,1306, 101, 800, - 808, 494,2299,2300,2301, 903,2302, 37,1072, 14, 5,2303, 79, 675,2304, 312, -2305,2306,2307,2308,2309,1480, 6,1307,2310,2311,2312, 1, 470, 35, 24, 229, -2313, 695, 210, 86, 778, 15, 784, 592, 779, 32, 77, 855, 964,2314, 259,2315, - 501, 380,2316,2317, 83, 981, 153, 689,1308,1481,1482,1483,2318,2319, 716,1484, -2320,2321,2322,2323,2324,2325,1485,2326,2327, 128, 57, 68, 261,1048, 211, 170, -1240, 31,2328, 51, 435, 742,2329,2330,2331, 635,2332, 264, 456,2333,2334,2335, - 425,2336,1486, 143, 507, 263, 943,2337, 363, 920,1487, 256,1488,1102, 243, 601, -1489,2338,2339,2340,2341,2342,2343,2344, 861,2345,2346,2347,2348,2349,2350, 395, -2351,1490,1491, 62, 535, 166, 225,2352,2353, 668, 419,1241, 138, 604, 928,2354, -1181,2355,1492,1493,2356,2357,2358,1143,2359, 696,2360, 387, 307,1309, 682, 476, -2361,2362, 332, 12, 222, 156,2363, 232,2364, 641, 276, 656, 517,1494,1495,1035, - 416, 736,1496,2365,1017, 586,2366,2367,2368,1497,2369, 242,2370,2371,2372,1498, -2373, 965, 713,2374,2375,2376,2377, 740, 982,1499, 944,1500,1007,2378,2379,1310, -1501,2380,2381,2382, 785, 329,2383,2384,1502,2385,2386,2387, 932,2388,1503,2389, -2390,2391,2392,1242,2393,2394,2395,2396,2397, 994, 950,2398,2399,2400,2401,1504, -1311,2402,2403,2404,2405,1049, 749,2406,2407, 853, 718,1144,1312,2408,1182,1505, -2409,2410, 255, 516, 479, 564, 550, 214,1506,1507,1313, 413, 239, 444, 339,1145, -1036,1508,1509,1314,1037,1510,1315,2411,1511,2412,2413,2414, 176, 703, 497, 624, - 593, 921, 302,2415, 341, 165,1103,1512,2416,1513,2417,2418,2419, 376,2420, 700, -2421,2422,2423, 258, 768,1316,2424,1183,2425, 995, 608,2426,2427,2428,2429, 221, -2430,2431,2432,2433,2434,2435,2436,2437, 195, 323, 726, 188, 897, 983,1317, 377, - 644,1050, 879,2438, 452,2439,2440,2441,2442,2443,2444, 914,2445,2446,2447,2448, - 915, 489,2449,1514,1184,2450,2451, 515, 64, 427, 495,2452, 583,2453, 483, 485, -1038, 562, 213,1515, 748, 666,2454,2455,2456,2457, 334,2458, 780, 996,1008, 705, -1243,2459,2460,2461,2462,2463, 114,2464, 493,1146, 366, 163,1516, 961,1104,2465, - 291,2466,1318,1105,2467,1517, 365,2468, 355, 951,1244,2469,1319,2470, 631,2471, -2472, 218,1320, 364, 320, 756,1518,1519,1321,1520,1322,2473,2474,2475,2476, 997, -2477,2478,2479,2480, 665,1185,2481, 916,1521,2482,2483,2484, 584, 684,2485,2486, - 797,2487,1051,1186,2488,2489,2490,1522,2491,2492, 370,2493,1039,1187, 65,2494, - 434, 205, 463,1188,2495, 125, 812, 391, 402, 826, 699, 286, 398, 155, 781, 771, - 585,2496, 590, 505,1073,2497, 599, 244, 219, 917,1018, 952, 646,1523,2498,1323, -2499,2500, 49, 984, 354, 741,2501, 625,2502,1324,2503,1019, 190, 357, 757, 491, - 95, 782, 868,2504,2505,2506,2507,2508,2509, 134,1524,1074, 422,1525, 898,2510, - 161,2511,2512,2513,2514, 769,2515,1526,2516,2517, 411,1325,2518, 472,1527,2519, -2520,2521,2522,2523,2524, 985,2525,2526,2527,2528,2529,2530, 764,2531,1245,2532, -2533, 25, 204, 311,2534, 496,2535,1052,2536,2537,2538,2539,2540,2541,2542, 199, - 704, 504, 468, 758, 657,1528, 196, 44, 839,1246, 272, 750,2543, 765, 862,2544, -2545,1326,2546, 132, 615, 933,2547, 732,2548,2549,2550,1189,1529,2551, 283,1247, -1053, 607, 929,2552,2553,2554, 930, 183, 872, 616,1040,1147,2555,1148,1020, 441, - 249,1075,2556,2557,2558, 466, 743,2559,2560,2561, 92, 514, 426, 420, 526,2562, -2563,2564,2565,2566,2567,2568, 185,2569,2570,2571,2572, 776,1530, 658,2573, 362, -2574, 361, 922,1076, 793,2575,2576,2577,2578,2579,2580,1531, 251,2581,2582,2583, -2584,1532, 54, 612, 237,1327,2585,2586, 275, 408, 647, 111,2587,1533,1106, 465, - 3, 458, 9, 38,2588, 107, 110, 890, 209, 26, 737, 498,2589,1534,2590, 431, - 202, 88,1535, 356, 287,1107, 660,1149,2591, 381,1536, 986,1150, 445,1248,1151, - 974,2592,2593, 846,2594, 446, 953, 184,1249,1250, 727,2595, 923, 193, 883,2596, -2597,2598, 102, 324, 539, 817,2599, 421,1041,2600, 832,2601, 94, 175, 197, 406, -2602, 459,2603,2604,2605,2606,2607, 330, 555,2608,2609,2610, 706,1108, 389,2611, -2612,2613,2614, 233,2615, 833, 558, 931, 954,1251,2616,2617,1537, 546,2618,2619, -1009,2620,2621,2622,1538, 690,1328,2623, 955,2624,1539,2625,2626, 772,2627,2628, -2629,2630,2631, 924, 648, 863, 603,2632,2633, 934,1540, 864, 865,2634, 642,1042, - 670,1190,2635,2636,2637,2638, 168,2639, 652, 873, 542,1054,1541,2640,2641,2642, # 512, 256 -) - diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/euckrfreq.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/euckrfreq.pyc deleted file mode 100644 index 5e799b4b3b373faa1765e6489999a9fd8615c8c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24134 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 O@PCO8{qO(h3H%Q}>Qt`) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/euckrprober.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/euckrprober.py deleted file mode 100644 index 345a060..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/euckrprober.py +++ /dev/null @@ -1,47 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import EUCKRDistributionAnalysis -from .mbcssm import EUCKR_SM_MODEL - - -class EUCKRProber(MultiByteCharSetProber): - def __init__(self): - super(EUCKRProber, self).__init__() - self.coding_sm = CodingStateMachine(EUCKR_SM_MODEL) - self.distribution_analyzer = EUCKRDistributionAnalysis() - self.reset() - - @property - def charset_name(self): - return "EUC-KR" - - @property - def language(self): - return "Korean" diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/euckrprober.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/euckrprober.pyc deleted file mode 100644 index 888fd4e07d01181a864e26b39a92ea3b6a27f980..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1601 zcmd5+-A~j&5T9-D1CXz1G%@i>U#iJj2!?1vjB@aVhosd9o0v_nU5-M(+?_*?_+s=w z_8)L&_dwo!gtjx?ncdFr?>95`|Ew&%___KugZbst`yGi%NagehC;=(~i2%X22c-v< z4~g$=AIc6?T}Zml?m*dtst-w@>@Fw)#{%*m{08_1@FiJ*ybp1(K;a8PDqw|=NR6f? z7P~W4!;@6U3XgO%R@%+qr}<%%7xg5@6xArrPKsK&xyLlO|9N;2?G*-fF`i=4)bH!G zoSDM7C979UWIU3ik9+$c@ZOcnZF5b4NB&(B6OvNExCu6$KJh^L%m*VOK04O)uFNh( zalq_l42Xq|A&J=`h4cvcL7#eX>M<1peZUTfBCqTM_SnngKI_v3yNLFVEr!Ejk;8O3 z;Ivgb>afW)N?FteN*VE{5$}q;G_!O`Q$-93ACk&%5F}G(=u&ALQY)j-am8_sDvtwt zgH=Y;C~S3cPSl6zsSb~uGFRG!mlxq|OONaCXPevK>WyvvYCC&vF5cvqdV{V>8-5Dg zq8${q!L%#~xH+20BX(Jl=c>*d9cGm9Tw$oD*_m!_+F!P_s7KpABQcB;!~?M=mc=!_ zjCRPgd|*mT95Bv9!(UN33=SfPz_PML&RYkB%XA9HN?gl2t<-a}4WAmk|G}c_061v0 zO6xlZi_=r4^<<h()PTlwNC6*tUZIRuO5`+1SvC2zB-19?E})!KN#iWyu8dYl{Y#b| z-Bt;5Z9OHiRn-%Vy|vD~5!c9Djpx~PH5-u&kbhOK_o(JkRqj`1n-kZ0j*I<9Bf9ov gt|*+LcI6JX-F-JWunF36IeYtr&Su+jUD(_I3;TS14FCWD diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwfreq.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwfreq.py deleted file mode 100644 index ed7a995..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwfreq.py +++ /dev/null @@ -1,387 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# EUCTW frequency table -# Converted from big5 work -# by Taiwan's Mandarin Promotion Council -# <http:#www.edu.tw:81/mandr/> - -# 128 --> 0.42261 -# 256 --> 0.57851 -# 512 --> 0.74851 -# 1024 --> 0.89384 -# 2048 --> 0.97583 -# -# Idea Distribution Ratio = 0.74851/(1-0.74851) =2.98 -# Random Distribution Ration = 512/(5401-512)=0.105 -# -# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR - -EUCTW_TYPICAL_DISTRIBUTION_RATIO = 0.75 - -# Char to FreqOrder table , -EUCTW_TABLE_SIZE = 5376 - -EUCTW_CHAR_TO_FREQ_ORDER = ( - 1,1800,1506, 255,1431, 198, 9, 82, 6,7310, 177, 202,3615,1256,2808, 110, # 2742 -3735, 33,3241, 261, 76, 44,2113, 16,2931,2184,1176, 659,3868, 26,3404,2643, # 2758 -1198,3869,3313,4060, 410,2211, 302, 590, 361,1963, 8, 204, 58,4296,7311,1931, # 2774 - 63,7312,7313, 317,1614, 75, 222, 159,4061,2412,1480,7314,3500,3068, 224,2809, # 2790 -3616, 3, 10,3870,1471, 29,2774,1135,2852,1939, 873, 130,3242,1123, 312,7315, # 2806 -4297,2051, 507, 252, 682,7316, 142,1914, 124, 206,2932, 34,3501,3173, 64, 604, # 2822 -7317,2494,1976,1977, 155,1990, 645, 641,1606,7318,3405, 337, 72, 406,7319, 80, # 2838 - 630, 238,3174,1509, 263, 939,1092,2644, 756,1440,1094,3406, 449, 69,2969, 591, # 2854 - 179,2095, 471, 115,2034,1843, 60, 50,2970, 134, 806,1868, 734,2035,3407, 180, # 2870 - 995,1607, 156, 537,2893, 688,7320, 319,1305, 779,2144, 514,2374, 298,4298, 359, # 2886 -2495, 90,2707,1338, 663, 11, 906,1099,2545, 20,2436, 182, 532,1716,7321, 732, # 2902 -1376,4062,1311,1420,3175, 25,2312,1056, 113, 399, 382,1949, 242,3408,2467, 529, # 2918 -3243, 475,1447,3617,7322, 117, 21, 656, 810,1297,2295,2329,3502,7323, 126,4063, # 2934 - 706, 456, 150, 613,4299, 71,1118,2036,4064, 145,3069, 85, 835, 486,2114,1246, # 2950 -1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,7324,2127,2354, 347,3736, 221, # 2966 -3503,3110,7325,1955,1153,4065, 83, 296,1199,3070, 192, 624, 93,7326, 822,1897, # 2982 -2810,3111, 795,2064, 991,1554,1542,1592, 27, 43,2853, 859, 139,1456, 860,4300, # 2998 - 437, 712,3871, 164,2392,3112, 695, 211,3017,2096, 195,3872,1608,3504,3505,3618, # 3014 -3873, 234, 811,2971,2097,3874,2229,1441,3506,1615,2375, 668,2076,1638, 305, 228, # 3030 -1664,4301, 467, 415,7327, 262,2098,1593, 239, 108, 300, 200,1033, 512,1247,2077, # 3046 -7328,7329,2173,3176,3619,2673, 593, 845,1062,3244, 88,1723,2037,3875,1950, 212, # 3062 - 266, 152, 149, 468,1898,4066,4302, 77, 187,7330,3018, 37, 5,2972,7331,3876, # 3078 -7332,7333, 39,2517,4303,2894,3177,2078, 55, 148, 74,4304, 545, 483,1474,1029, # 3094 -1665, 217,1869,1531,3113,1104,2645,4067, 24, 172,3507, 900,3877,3508,3509,4305, # 3110 - 32,1408,2811,1312, 329, 487,2355,2247,2708, 784,2674, 4,3019,3314,1427,1788, # 3126 - 188, 109, 499,7334,3620,1717,1789, 888,1217,3020,4306,7335,3510,7336,3315,1520, # 3142 -3621,3878, 196,1034, 775,7337,7338, 929,1815, 249, 439, 38,7339,1063,7340, 794, # 3158 -3879,1435,2296, 46, 178,3245,2065,7341,2376,7342, 214,1709,4307, 804, 35, 707, # 3174 - 324,3622,1601,2546, 140, 459,4068,7343,7344,1365, 839, 272, 978,2257,2572,3409, # 3190 -2128,1363,3623,1423, 697, 100,3071, 48, 70,1231, 495,3114,2193,7345,1294,7346, # 3206 -2079, 462, 586,1042,3246, 853, 256, 988, 185,2377,3410,1698, 434,1084,7347,3411, # 3222 - 314,2615,2775,4308,2330,2331, 569,2280, 637,1816,2518, 757,1162,1878,1616,3412, # 3238 - 287,1577,2115, 768,4309,1671,2854,3511,2519,1321,3737, 909,2413,7348,4069, 933, # 3254 -3738,7349,2052,2356,1222,4310, 765,2414,1322, 786,4311,7350,1919,1462,1677,2895, # 3270 -1699,7351,4312,1424,2437,3115,3624,2590,3316,1774,1940,3413,3880,4070, 309,1369, # 3286 -1130,2812, 364,2230,1653,1299,3881,3512,3882,3883,2646, 525,1085,3021, 902,2000, # 3302 -1475, 964,4313, 421,1844,1415,1057,2281, 940,1364,3116, 376,4314,4315,1381, 7, # 3318 -2520, 983,2378, 336,1710,2675,1845, 321,3414, 559,1131,3022,2742,1808,1132,1313, # 3334 - 265,1481,1857,7352, 352,1203,2813,3247, 167,1089, 420,2814, 776, 792,1724,3513, # 3350 -4071,2438,3248,7353,4072,7354, 446, 229, 333,2743, 901,3739,1200,1557,4316,2647, # 3366 -1920, 395,2744,2676,3740,4073,1835, 125, 916,3178,2616,4317,7355,7356,3741,7357, # 3382 -7358,7359,4318,3117,3625,1133,2547,1757,3415,1510,2313,1409,3514,7360,2145, 438, # 3398 -2591,2896,2379,3317,1068, 958,3023, 461, 311,2855,2677,4074,1915,3179,4075,1978, # 3414 - 383, 750,2745,2617,4076, 274, 539, 385,1278,1442,7361,1154,1964, 384, 561, 210, # 3430 - 98,1295,2548,3515,7362,1711,2415,1482,3416,3884,2897,1257, 129,7363,3742, 642, # 3446 - 523,2776,2777,2648,7364, 141,2231,1333, 68, 176, 441, 876, 907,4077, 603,2592, # 3462 - 710, 171,3417, 404, 549, 18,3118,2393,1410,3626,1666,7365,3516,4319,2898,4320, # 3478 -7366,2973, 368,7367, 146, 366, 99, 871,3627,1543, 748, 807,1586,1185, 22,2258, # 3494 - 379,3743,3180,7368,3181, 505,1941,2618,1991,1382,2314,7369, 380,2357, 218, 702, # 3510 -1817,1248,3418,3024,3517,3318,3249,7370,2974,3628, 930,3250,3744,7371, 59,7372, # 3526 - 585, 601,4078, 497,3419,1112,1314,4321,1801,7373,1223,1472,2174,7374, 749,1836, # 3542 - 690,1899,3745,1772,3885,1476, 429,1043,1790,2232,2116, 917,4079, 447,1086,1629, # 3558 -7375, 556,7376,7377,2020,1654, 844,1090, 105, 550, 966,1758,2815,1008,1782, 686, # 3574 -1095,7378,2282, 793,1602,7379,3518,2593,4322,4080,2933,2297,4323,3746, 980,2496, # 3590 - 544, 353, 527,4324, 908,2678,2899,7380, 381,2619,1942,1348,7381,1341,1252, 560, # 3606 -3072,7382,3420,2856,7383,2053, 973, 886,2080, 143,4325,7384,7385, 157,3886, 496, # 3622 -4081, 57, 840, 540,2038,4326,4327,3421,2117,1445, 970,2259,1748,1965,2081,4082, # 3638 -3119,1234,1775,3251,2816,3629, 773,1206,2129,1066,2039,1326,3887,1738,1725,4083, # 3654 - 279,3120, 51,1544,2594, 423,1578,2130,2066, 173,4328,1879,7386,7387,1583, 264, # 3670 - 610,3630,4329,2439, 280, 154,7388,7389,7390,1739, 338,1282,3073, 693,2857,1411, # 3686 -1074,3747,2440,7391,4330,7392,7393,1240, 952,2394,7394,2900,1538,2679, 685,1483, # 3702 -4084,2468,1436, 953,4085,2054,4331, 671,2395, 79,4086,2441,3252, 608, 567,2680, # 3718 -3422,4087,4088,1691, 393,1261,1791,2396,7395,4332,7396,7397,7398,7399,1383,1672, # 3734 -3748,3182,1464, 522,1119, 661,1150, 216, 675,4333,3888,1432,3519, 609,4334,2681, # 3750 -2397,7400,7401,7402,4089,3025, 0,7403,2469, 315, 231,2442, 301,3319,4335,2380, # 3766 -7404, 233,4090,3631,1818,4336,4337,7405, 96,1776,1315,2082,7406, 257,7407,1809, # 3782 -3632,2709,1139,1819,4091,2021,1124,2163,2778,1777,2649,7408,3074, 363,1655,3183, # 3798 -7409,2975,7410,7411,7412,3889,1567,3890, 718, 103,3184, 849,1443, 341,3320,2934, # 3814 -1484,7413,1712, 127, 67, 339,4092,2398, 679,1412, 821,7414,7415, 834, 738, 351, # 3830 -2976,2146, 846, 235,1497,1880, 418,1992,3749,2710, 186,1100,2147,2746,3520,1545, # 3846 -1355,2935,2858,1377, 583,3891,4093,2573,2977,7416,1298,3633,1078,2549,3634,2358, # 3862 - 78,3750,3751, 267,1289,2099,2001,1594,4094, 348, 369,1274,2194,2175,1837,4338, # 3878 -1820,2817,3635,2747,2283,2002,4339,2936,2748, 144,3321, 882,4340,3892,2749,3423, # 3894 -4341,2901,7417,4095,1726, 320,7418,3893,3026, 788,2978,7419,2818,1773,1327,2859, # 3910 -3894,2819,7420,1306,4342,2003,1700,3752,3521,2359,2650, 787,2022, 506, 824,3636, # 3926 - 534, 323,4343,1044,3322,2023,1900, 946,3424,7421,1778,1500,1678,7422,1881,4344, # 3942 - 165, 243,4345,3637,2521, 123, 683,4096, 764,4346, 36,3895,1792, 589,2902, 816, # 3958 - 626,1667,3027,2233,1639,1555,1622,3753,3896,7423,3897,2860,1370,1228,1932, 891, # 3974 -2083,2903, 304,4097,7424, 292,2979,2711,3522, 691,2100,4098,1115,4347, 118, 662, # 3990 -7425, 611,1156, 854,2381,1316,2861, 2, 386, 515,2904,7426,7427,3253, 868,2234, # 4006 -1486, 855,2651, 785,2212,3028,7428,1040,3185,3523,7429,3121, 448,7430,1525,7431, # 4022 -2164,4348,7432,3754,7433,4099,2820,3524,3122, 503, 818,3898,3123,1568, 814, 676, # 4038 -1444, 306,1749,7434,3755,1416,1030, 197,1428, 805,2821,1501,4349,7435,7436,7437, # 4054 -1993,7438,4350,7439,7440,2195, 13,2779,3638,2980,3124,1229,1916,7441,3756,2131, # 4070 -7442,4100,4351,2399,3525,7443,2213,1511,1727,1120,7444,7445, 646,3757,2443, 307, # 4086 -7446,7447,1595,3186,7448,7449,7450,3639,1113,1356,3899,1465,2522,2523,7451, 519, # 4102 -7452, 128,2132, 92,2284,1979,7453,3900,1512, 342,3125,2196,7454,2780,2214,1980, # 4118 -3323,7455, 290,1656,1317, 789, 827,2360,7456,3758,4352, 562, 581,3901,7457, 401, # 4134 -4353,2248, 94,4354,1399,2781,7458,1463,2024,4355,3187,1943,7459, 828,1105,4101, # 4150 -1262,1394,7460,4102, 605,4356,7461,1783,2862,7462,2822, 819,2101, 578,2197,2937, # 4166 -7463,1502, 436,3254,4103,3255,2823,3902,2905,3425,3426,7464,2712,2315,7465,7466, # 4182 -2332,2067, 23,4357, 193, 826,3759,2102, 699,1630,4104,3075, 390,1793,1064,3526, # 4198 -7467,1579,3076,3077,1400,7468,4105,1838,1640,2863,7469,4358,4359, 137,4106, 598, # 4214 -3078,1966, 780, 104, 974,2938,7470, 278, 899, 253, 402, 572, 504, 493,1339,7471, # 4230 -3903,1275,4360,2574,2550,7472,3640,3029,3079,2249, 565,1334,2713, 863, 41,7473, # 4246 -7474,4361,7475,1657,2333, 19, 463,2750,4107, 606,7476,2981,3256,1087,2084,1323, # 4262 -2652,2982,7477,1631,1623,1750,4108,2682,7478,2864, 791,2714,2653,2334, 232,2416, # 4278 -7479,2983,1498,7480,2654,2620, 755,1366,3641,3257,3126,2025,1609, 119,1917,3427, # 4294 - 862,1026,4109,7481,3904,3760,4362,3905,4363,2260,1951,2470,7482,1125, 817,4110, # 4310 -4111,3906,1513,1766,2040,1487,4112,3030,3258,2824,3761,3127,7483,7484,1507,7485, # 4326 -2683, 733, 40,1632,1106,2865, 345,4113, 841,2524, 230,4364,2984,1846,3259,3428, # 4342 -7486,1263, 986,3429,7487, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562,3907, # 4358 -3908,2939, 967,2751,2655,1349, 592,2133,1692,3324,2985,1994,4114,1679,3909,1901, # 4374 -2185,7488, 739,3642,2715,1296,1290,7489,4115,2198,2199,1921,1563,2595,2551,1870, # 4390 -2752,2986,7490, 435,7491, 343,1108, 596, 17,1751,4365,2235,3430,3643,7492,4366, # 4406 - 294,3527,2940,1693, 477, 979, 281,2041,3528, 643,2042,3644,2621,2782,2261,1031, # 4422 -2335,2134,2298,3529,4367, 367,1249,2552,7493,3530,7494,4368,1283,3325,2004, 240, # 4438 -1762,3326,4369,4370, 836,1069,3128, 474,7495,2148,2525, 268,3531,7496,3188,1521, # 4454 -1284,7497,1658,1546,4116,7498,3532,3533,7499,4117,3327,2684,1685,4118, 961,1673, # 4470 -2622, 190,2005,2200,3762,4371,4372,7500, 570,2497,3645,1490,7501,4373,2623,3260, # 4486 -1956,4374, 584,1514, 396,1045,1944,7502,4375,1967,2444,7503,7504,4376,3910, 619, # 4502 -7505,3129,3261, 215,2006,2783,2553,3189,4377,3190,4378, 763,4119,3763,4379,7506, # 4518 -7507,1957,1767,2941,3328,3646,1174, 452,1477,4380,3329,3130,7508,2825,1253,2382, # 4534 -2186,1091,2285,4120, 492,7509, 638,1169,1824,2135,1752,3911, 648, 926,1021,1324, # 4550 -4381, 520,4382, 997, 847,1007, 892,4383,3764,2262,1871,3647,7510,2400,1784,4384, # 4566 -1952,2942,3080,3191,1728,4121,2043,3648,4385,2007,1701,3131,1551, 30,2263,4122, # 4582 -7511,2026,4386,3534,7512, 501,7513,4123, 594,3431,2165,1821,3535,3432,3536,3192, # 4598 - 829,2826,4124,7514,1680,3132,1225,4125,7515,3262,4387,4126,3133,2336,7516,4388, # 4614 -4127,7517,3912,3913,7518,1847,2383,2596,3330,7519,4389, 374,3914, 652,4128,4129, # 4630 - 375,1140, 798,7520,7521,7522,2361,4390,2264, 546,1659, 138,3031,2445,4391,7523, # 4646 -2250, 612,1848, 910, 796,3765,1740,1371, 825,3766,3767,7524,2906,2554,7525, 692, # 4662 - 444,3032,2624, 801,4392,4130,7526,1491, 244,1053,3033,4131,4132, 340,7527,3915, # 4678 -1041,2987, 293,1168, 87,1357,7528,1539, 959,7529,2236, 721, 694,4133,3768, 219, # 4694 -1478, 644,1417,3331,2656,1413,1401,1335,1389,3916,7530,7531,2988,2362,3134,1825, # 4710 - 730,1515, 184,2827, 66,4393,7532,1660,2943, 246,3332, 378,1457, 226,3433, 975, # 4726 -3917,2944,1264,3537, 674, 696,7533, 163,7534,1141,2417,2166, 713,3538,3333,4394, # 4742 -3918,7535,7536,1186, 15,7537,1079,1070,7538,1522,3193,3539, 276,1050,2716, 758, # 4758 -1126, 653,2945,3263,7539,2337, 889,3540,3919,3081,2989, 903,1250,4395,3920,3434, # 4774 -3541,1342,1681,1718, 766,3264, 286, 89,2946,3649,7540,1713,7541,2597,3334,2990, # 4790 -7542,2947,2215,3194,2866,7543,4396,2498,2526, 181, 387,1075,3921, 731,2187,3335, # 4806 -7544,3265, 310, 313,3435,2299, 770,4134, 54,3034, 189,4397,3082,3769,3922,7545, # 4822 -1230,1617,1849, 355,3542,4135,4398,3336, 111,4136,3650,1350,3135,3436,3035,4137, # 4838 -2149,3266,3543,7546,2784,3923,3924,2991, 722,2008,7547,1071, 247,1207,2338,2471, # 4854 -1378,4399,2009, 864,1437,1214,4400, 373,3770,1142,2216, 667,4401, 442,2753,2555, # 4870 -3771,3925,1968,4138,3267,1839, 837, 170,1107, 934,1336,1882,7548,7549,2118,4139, # 4886 -2828, 743,1569,7550,4402,4140, 582,2384,1418,3437,7551,1802,7552, 357,1395,1729, # 4902 -3651,3268,2418,1564,2237,7553,3083,3772,1633,4403,1114,2085,4141,1532,7554, 482, # 4918 -2446,4404,7555,7556,1492, 833,1466,7557,2717,3544,1641,2829,7558,1526,1272,3652, # 4934 -4142,1686,1794, 416,2556,1902,1953,1803,7559,3773,2785,3774,1159,2316,7560,2867, # 4950 -4405,1610,1584,3036,2419,2754, 443,3269,1163,3136,7561,7562,3926,7563,4143,2499, # 4966 -3037,4406,3927,3137,2103,1647,3545,2010,1872,4144,7564,4145, 431,3438,7565, 250, # 4982 - 97, 81,4146,7566,1648,1850,1558, 160, 848,7567, 866, 740,1694,7568,2201,2830, # 4998 -3195,4147,4407,3653,1687, 950,2472, 426, 469,3196,3654,3655,3928,7569,7570,1188, # 5014 - 424,1995, 861,3546,4148,3775,2202,2685, 168,1235,3547,4149,7571,2086,1674,4408, # 5030 -3337,3270, 220,2557,1009,7572,3776, 670,2992, 332,1208, 717,7573,7574,3548,2447, # 5046 -3929,3338,7575, 513,7576,1209,2868,3339,3138,4409,1080,7577,7578,7579,7580,2527, # 5062 -3656,3549, 815,1587,3930,3931,7581,3550,3439,3777,1254,4410,1328,3038,1390,3932, # 5078 -1741,3933,3778,3934,7582, 236,3779,2448,3271,7583,7584,3657,3780,1273,3781,4411, # 5094 -7585, 308,7586,4412, 245,4413,1851,2473,1307,2575, 430, 715,2136,2449,7587, 270, # 5110 - 199,2869,3935,7588,3551,2718,1753, 761,1754, 725,1661,1840,4414,3440,3658,7589, # 5126 -7590, 587, 14,3272, 227,2598, 326, 480,2265, 943,2755,3552, 291, 650,1883,7591, # 5142 -1702,1226, 102,1547, 62,3441, 904,4415,3442,1164,4150,7592,7593,1224,1548,2756, # 5158 - 391, 498,1493,7594,1386,1419,7595,2055,1177,4416, 813, 880,1081,2363, 566,1145, # 5174 -4417,2286,1001,1035,2558,2599,2238, 394,1286,7596,7597,2068,7598, 86,1494,1730, # 5190 -3936, 491,1588, 745, 897,2948, 843,3340,3937,2757,2870,3273,1768, 998,2217,2069, # 5206 - 397,1826,1195,1969,3659,2993,3341, 284,7599,3782,2500,2137,2119,1903,7600,3938, # 5222 -2150,3939,4151,1036,3443,1904, 114,2559,4152, 209,1527,7601,7602,2949,2831,2625, # 5238 -2385,2719,3139, 812,2560,7603,3274,7604,1559, 737,1884,3660,1210, 885, 28,2686, # 5254 -3553,3783,7605,4153,1004,1779,4418,7606, 346,1981,2218,2687,4419,3784,1742, 797, # 5270 -1642,3940,1933,1072,1384,2151, 896,3941,3275,3661,3197,2871,3554,7607,2561,1958, # 5286 -4420,2450,1785,7608,7609,7610,3942,4154,1005,1308,3662,4155,2720,4421,4422,1528, # 5302 -2600, 161,1178,4156,1982, 987,4423,1101,4157, 631,3943,1157,3198,2420,1343,1241, # 5318 -1016,2239,2562, 372, 877,2339,2501,1160, 555,1934, 911,3944,7611, 466,1170, 169, # 5334 -1051,2907,2688,3663,2474,2994,1182,2011,2563,1251,2626,7612, 992,2340,3444,1540, # 5350 -2721,1201,2070,2401,1996,2475,7613,4424, 528,1922,2188,1503,1873,1570,2364,3342, # 5366 -3276,7614, 557,1073,7615,1827,3445,2087,2266,3140,3039,3084, 767,3085,2786,4425, # 5382 -1006,4158,4426,2341,1267,2176,3664,3199, 778,3945,3200,2722,1597,2657,7616,4427, # 5398 -7617,3446,7618,7619,7620,3277,2689,1433,3278, 131, 95,1504,3946, 723,4159,3141, # 5414 -1841,3555,2758,2189,3947,2027,2104,3665,7621,2995,3948,1218,7622,3343,3201,3949, # 5430 -4160,2576, 248,1634,3785, 912,7623,2832,3666,3040,3786, 654, 53,7624,2996,7625, # 5446 -1688,4428, 777,3447,1032,3950,1425,7626, 191, 820,2120,2833, 971,4429, 931,3202, # 5462 - 135, 664, 783,3787,1997, 772,2908,1935,3951,3788,4430,2909,3203, 282,2723, 640, # 5478 -1372,3448,1127, 922, 325,3344,7627,7628, 711,2044,7629,7630,3952,2219,2787,1936, # 5494 -3953,3345,2220,2251,3789,2300,7631,4431,3790,1258,3279,3954,3204,2138,2950,3955, # 5510 -3956,7632,2221, 258,3205,4432, 101,1227,7633,3280,1755,7634,1391,3281,7635,2910, # 5526 -2056, 893,7636,7637,7638,1402,4161,2342,7639,7640,3206,3556,7641,7642, 878,1325, # 5542 -1780,2788,4433, 259,1385,2577, 744,1183,2267,4434,7643,3957,2502,7644, 684,1024, # 5558 -4162,7645, 472,3557,3449,1165,3282,3958,3959, 322,2152, 881, 455,1695,1152,1340, # 5574 - 660, 554,2153,4435,1058,4436,4163, 830,1065,3346,3960,4437,1923,7646,1703,1918, # 5590 -7647, 932,2268, 122,7648,4438, 947, 677,7649,3791,2627, 297,1905,1924,2269,4439, # 5606 -2317,3283,7650,7651,4164,7652,4165, 84,4166, 112, 989,7653, 547,1059,3961, 701, # 5622 -3558,1019,7654,4167,7655,3450, 942, 639, 457,2301,2451, 993,2951, 407, 851, 494, # 5638 -4440,3347, 927,7656,1237,7657,2421,3348, 573,4168, 680, 921,2911,1279,1874, 285, # 5654 - 790,1448,1983, 719,2167,7658,7659,4441,3962,3963,1649,7660,1541, 563,7661,1077, # 5670 -7662,3349,3041,3451, 511,2997,3964,3965,3667,3966,1268,2564,3350,3207,4442,4443, # 5686 -7663, 535,1048,1276,1189,2912,2028,3142,1438,1373,2834,2952,1134,2012,7664,4169, # 5702 -1238,2578,3086,1259,7665, 700,7666,2953,3143,3668,4170,7667,4171,1146,1875,1906, # 5718 -4444,2601,3967, 781,2422, 132,1589, 203, 147, 273,2789,2402, 898,1786,2154,3968, # 5734 -3969,7668,3792,2790,7669,7670,4445,4446,7671,3208,7672,1635,3793, 965,7673,1804, # 5750 -2690,1516,3559,1121,1082,1329,3284,3970,1449,3794, 65,1128,2835,2913,2759,1590, # 5766 -3795,7674,7675, 12,2658, 45, 976,2579,3144,4447, 517,2528,1013,1037,3209,7676, # 5782 -3796,2836,7677,3797,7678,3452,7679,2602, 614,1998,2318,3798,3087,2724,2628,7680, # 5798 -2580,4172, 599,1269,7681,1810,3669,7682,2691,3088, 759,1060, 489,1805,3351,3285, # 5814 -1358,7683,7684,2386,1387,1215,2629,2252, 490,7685,7686,4173,1759,2387,2343,7687, # 5830 -4448,3799,1907,3971,2630,1806,3210,4449,3453,3286,2760,2344, 874,7688,7689,3454, # 5846 -3670,1858, 91,2914,3671,3042,3800,4450,7690,3145,3972,2659,7691,3455,1202,1403, # 5862 -3801,2954,2529,1517,2503,4451,3456,2504,7692,4452,7693,2692,1885,1495,1731,3973, # 5878 -2365,4453,7694,2029,7695,7696,3974,2693,1216, 237,2581,4174,2319,3975,3802,4454, # 5894 -4455,2694,3560,3457, 445,4456,7697,7698,7699,7700,2761, 61,3976,3672,1822,3977, # 5910 -7701, 687,2045, 935, 925, 405,2660, 703,1096,1859,2725,4457,3978,1876,1367,2695, # 5926 -3352, 918,2105,1781,2476, 334,3287,1611,1093,4458, 564,3146,3458,3673,3353, 945, # 5942 -2631,2057,4459,7702,1925, 872,4175,7703,3459,2696,3089, 349,4176,3674,3979,4460, # 5958 -3803,4177,3675,2155,3980,4461,4462,4178,4463,2403,2046, 782,3981, 400, 251,4179, # 5974 -1624,7704,7705, 277,3676, 299,1265, 476,1191,3804,2121,4180,4181,1109, 205,7706, # 5990 -2582,1000,2156,3561,1860,7707,7708,7709,4464,7710,4465,2565, 107,2477,2157,3982, # 6006 -3460,3147,7711,1533, 541,1301, 158, 753,4182,2872,3562,7712,1696, 370,1088,4183, # 6022 -4466,3563, 579, 327, 440, 162,2240, 269,1937,1374,3461, 968,3043, 56,1396,3090, # 6038 -2106,3288,3354,7713,1926,2158,4467,2998,7714,3564,7715,7716,3677,4468,2478,7717, # 6054 -2791,7718,1650,4469,7719,2603,7720,7721,3983,2661,3355,1149,3356,3984,3805,3985, # 6070 -7722,1076, 49,7723, 951,3211,3289,3290, 450,2837, 920,7724,1811,2792,2366,4184, # 6086 -1908,1138,2367,3806,3462,7725,3212,4470,1909,1147,1518,2423,4471,3807,7726,4472, # 6102 -2388,2604, 260,1795,3213,7727,7728,3808,3291, 708,7729,3565,1704,7730,3566,1351, # 6118 -1618,3357,2999,1886, 944,4185,3358,4186,3044,3359,4187,7731,3678, 422, 413,1714, # 6134 -3292, 500,2058,2345,4188,2479,7732,1344,1910, 954,7733,1668,7734,7735,3986,2404, # 6150 -4189,3567,3809,4190,7736,2302,1318,2505,3091, 133,3092,2873,4473, 629, 31,2838, # 6166 -2697,3810,4474, 850, 949,4475,3987,2955,1732,2088,4191,1496,1852,7737,3988, 620, # 6182 -3214, 981,1242,3679,3360,1619,3680,1643,3293,2139,2452,1970,1719,3463,2168,7738, # 6198 -3215,7739,7740,3361,1828,7741,1277,4476,1565,2047,7742,1636,3568,3093,7743, 869, # 6214 -2839, 655,3811,3812,3094,3989,3000,3813,1310,3569,4477,7744,7745,7746,1733, 558, # 6230 -4478,3681, 335,1549,3045,1756,4192,3682,1945,3464,1829,1291,1192, 470,2726,2107, # 6246 -2793, 913,1054,3990,7747,1027,7748,3046,3991,4479, 982,2662,3362,3148,3465,3216, # 6262 -3217,1946,2794,7749, 571,4480,7750,1830,7751,3570,2583,1523,2424,7752,2089, 984, # 6278 -4481,3683,1959,7753,3684, 852, 923,2795,3466,3685, 969,1519, 999,2048,2320,1705, # 6294 -7754,3095, 615,1662, 151, 597,3992,2405,2321,1049, 275,4482,3686,4193, 568,3687, # 6310 -3571,2480,4194,3688,7755,2425,2270, 409,3218,7756,1566,2874,3467,1002, 769,2840, # 6326 - 194,2090,3149,3689,2222,3294,4195, 628,1505,7757,7758,1763,2177,3001,3993, 521, # 6342 -1161,2584,1787,2203,2406,4483,3994,1625,4196,4197, 412, 42,3096, 464,7759,2632, # 6358 -4484,3363,1760,1571,2875,3468,2530,1219,2204,3814,2633,2140,2368,4485,4486,3295, # 6374 -1651,3364,3572,7760,7761,3573,2481,3469,7762,3690,7763,7764,2271,2091, 460,7765, # 6390 -4487,7766,3002, 962, 588,3574, 289,3219,2634,1116, 52,7767,3047,1796,7768,7769, # 6406 -7770,1467,7771,1598,1143,3691,4198,1984,1734,1067,4488,1280,3365, 465,4489,1572, # 6422 - 510,7772,1927,2241,1812,1644,3575,7773,4490,3692,7774,7775,2663,1573,1534,7776, # 6438 -7777,4199, 536,1807,1761,3470,3815,3150,2635,7778,7779,7780,4491,3471,2915,1911, # 6454 -2796,7781,3296,1122, 377,3220,7782, 360,7783,7784,4200,1529, 551,7785,2059,3693, # 6470 -1769,2426,7786,2916,4201,3297,3097,2322,2108,2030,4492,1404, 136,1468,1479, 672, # 6486 -1171,3221,2303, 271,3151,7787,2762,7788,2049, 678,2727, 865,1947,4493,7789,2013, # 6502 -3995,2956,7790,2728,2223,1397,3048,3694,4494,4495,1735,2917,3366,3576,7791,3816, # 6518 - 509,2841,2453,2876,3817,7792,7793,3152,3153,4496,4202,2531,4497,2304,1166,1010, # 6534 - 552, 681,1887,7794,7795,2957,2958,3996,1287,1596,1861,3154, 358, 453, 736, 175, # 6550 - 478,1117, 905,1167,1097,7796,1853,1530,7797,1706,7798,2178,3472,2287,3695,3473, # 6566 -3577,4203,2092,4204,7799,3367,1193,2482,4205,1458,2190,2205,1862,1888,1421,3298, # 6582 -2918,3049,2179,3474, 595,2122,7800,3997,7801,7802,4206,1707,2636, 223,3696,1359, # 6598 - 751,3098, 183,3475,7803,2797,3003, 419,2369, 633, 704,3818,2389, 241,7804,7805, # 6614 -7806, 838,3004,3697,2272,2763,2454,3819,1938,2050,3998,1309,3099,2242,1181,7807, # 6630 -1136,2206,3820,2370,1446,4207,2305,4498,7808,7809,4208,1055,2605, 484,3698,7810, # 6646 -3999, 625,4209,2273,3368,1499,4210,4000,7811,4001,4211,3222,2274,2275,3476,7812, # 6662 -7813,2764, 808,2606,3699,3369,4002,4212,3100,2532, 526,3370,3821,4213, 955,7814, # 6678 -1620,4214,2637,2427,7815,1429,3700,1669,1831, 994, 928,7816,3578,1260,7817,7818, # 6694 -7819,1948,2288, 741,2919,1626,4215,2729,2455, 867,1184, 362,3371,1392,7820,7821, # 6710 -4003,4216,1770,1736,3223,2920,4499,4500,1928,2698,1459,1158,7822,3050,3372,2877, # 6726 -1292,1929,2506,2842,3701,1985,1187,2071,2014,2607,4217,7823,2566,2507,2169,3702, # 6742 -2483,3299,7824,3703,4501,7825,7826, 666,1003,3005,1022,3579,4218,7827,4502,1813, # 6758 -2253, 574,3822,1603, 295,1535, 705,3823,4219, 283, 858, 417,7828,7829,3224,4503, # 6774 -4504,3051,1220,1889,1046,2276,2456,4004,1393,1599, 689,2567, 388,4220,7830,2484, # 6790 - 802,7831,2798,3824,2060,1405,2254,7832,4505,3825,2109,1052,1345,3225,1585,7833, # 6806 - 809,7834,7835,7836, 575,2730,3477, 956,1552,1469,1144,2323,7837,2324,1560,2457, # 6822 -3580,3226,4005, 616,2207,3155,2180,2289,7838,1832,7839,3478,4506,7840,1319,3704, # 6838 -3705,1211,3581,1023,3227,1293,2799,7841,7842,7843,3826, 607,2306,3827, 762,2878, # 6854 -1439,4221,1360,7844,1485,3052,7845,4507,1038,4222,1450,2061,2638,4223,1379,4508, # 6870 -2585,7846,7847,4224,1352,1414,2325,2921,1172,7848,7849,3828,3829,7850,1797,1451, # 6886 -7851,7852,7853,7854,2922,4006,4007,2485,2346, 411,4008,4009,3582,3300,3101,4509, # 6902 -1561,2664,1452,4010,1375,7855,7856, 47,2959, 316,7857,1406,1591,2923,3156,7858, # 6918 -1025,2141,3102,3157, 354,2731, 884,2224,4225,2407, 508,3706, 726,3583, 996,2428, # 6934 -3584, 729,7859, 392,2191,1453,4011,4510,3707,7860,7861,2458,3585,2608,1675,2800, # 6950 - 919,2347,2960,2348,1270,4511,4012, 73,7862,7863, 647,7864,3228,2843,2255,1550, # 6966 -1346,3006,7865,1332, 883,3479,7866,7867,7868,7869,3301,2765,7870,1212, 831,1347, # 6982 -4226,4512,2326,3830,1863,3053, 720,3831,4513,4514,3832,7871,4227,7872,7873,4515, # 6998 -7874,7875,1798,4516,3708,2609,4517,3586,1645,2371,7876,7877,2924, 669,2208,2665, # 7014 -2429,7878,2879,7879,7880,1028,3229,7881,4228,2408,7882,2256,1353,7883,7884,4518, # 7030 -3158, 518,7885,4013,7886,4229,1960,7887,2142,4230,7888,7889,3007,2349,2350,3833, # 7046 - 516,1833,1454,4014,2699,4231,4519,2225,2610,1971,1129,3587,7890,2766,7891,2961, # 7062 -1422, 577,1470,3008,1524,3373,7892,7893, 432,4232,3054,3480,7894,2586,1455,2508, # 7078 -2226,1972,1175,7895,1020,2732,4015,3481,4520,7896,2733,7897,1743,1361,3055,3482, # 7094 -2639,4016,4233,4521,2290, 895, 924,4234,2170, 331,2243,3056, 166,1627,3057,1098, # 7110 -7898,1232,2880,2227,3374,4522, 657, 403,1196,2372, 542,3709,3375,1600,4235,3483, # 7126 -7899,4523,2767,3230, 576, 530,1362,7900,4524,2533,2666,3710,4017,7901, 842,3834, # 7142 -7902,2801,2031,1014,4018, 213,2700,3376, 665, 621,4236,7903,3711,2925,2430,7904, # 7158 -2431,3302,3588,3377,7905,4237,2534,4238,4525,3589,1682,4239,3484,1380,7906, 724, # 7174 -2277, 600,1670,7907,1337,1233,4526,3103,2244,7908,1621,4527,7909, 651,4240,7910, # 7190 -1612,4241,2611,7911,2844,7912,2734,2307,3058,7913, 716,2459,3059, 174,1255,2701, # 7206 -4019,3590, 548,1320,1398, 728,4020,1574,7914,1890,1197,3060,4021,7915,3061,3062, # 7222 -3712,3591,3713, 747,7916, 635,4242,4528,7917,7918,7919,4243,7920,7921,4529,7922, # 7238 -3378,4530,2432, 451,7923,3714,2535,2072,4244,2735,4245,4022,7924,1764,4531,7925, # 7254 -4246, 350,7926,2278,2390,2486,7927,4247,4023,2245,1434,4024, 488,4532, 458,4248, # 7270 -4025,3715, 771,1330,2391,3835,2568,3159,2159,2409,1553,2667,3160,4249,7928,2487, # 7286 -2881,2612,1720,2702,4250,3379,4533,7929,2536,4251,7930,3231,4252,2768,7931,2015, # 7302 -2736,7932,1155,1017,3716,3836,7933,3303,2308, 201,1864,4253,1430,7934,4026,7935, # 7318 -7936,7937,7938,7939,4254,1604,7940, 414,1865, 371,2587,4534,4535,3485,2016,3104, # 7334 -4536,1708, 960,4255, 887, 389,2171,1536,1663,1721,7941,2228,4027,2351,2926,1580, # 7350 -7942,7943,7944,1744,7945,2537,4537,4538,7946,4539,7947,2073,7948,7949,3592,3380, # 7366 -2882,4256,7950,4257,2640,3381,2802, 673,2703,2460, 709,3486,4028,3593,4258,7951, # 7382 -1148, 502, 634,7952,7953,1204,4540,3594,1575,4541,2613,3717,7954,3718,3105, 948, # 7398 -3232, 121,1745,3837,1110,7955,4259,3063,2509,3009,4029,3719,1151,1771,3838,1488, # 7414 -4030,1986,7956,2433,3487,7957,7958,2093,7959,4260,3839,1213,1407,2803, 531,2737, # 7430 -2538,3233,1011,1537,7960,2769,4261,3106,1061,7961,3720,3721,1866,2883,7962,2017, # 7446 - 120,4262,4263,2062,3595,3234,2309,3840,2668,3382,1954,4542,7963,7964,3488,1047, # 7462 -2704,1266,7965,1368,4543,2845, 649,3383,3841,2539,2738,1102,2846,2669,7966,7967, # 7478 -1999,7968,1111,3596,2962,7969,2488,3842,3597,2804,1854,3384,3722,7970,7971,3385, # 7494 -2410,2884,3304,3235,3598,7972,2569,7973,3599,2805,4031,1460, 856,7974,3600,7975, # 7510 -2885,2963,7976,2886,3843,7977,4264, 632,2510, 875,3844,1697,3845,2291,7978,7979, # 7526 -4544,3010,1239, 580,4545,4265,7980, 914, 936,2074,1190,4032,1039,2123,7981,7982, # 7542 -7983,3386,1473,7984,1354,4266,3846,7985,2172,3064,4033, 915,3305,4267,4268,3306, # 7558 -1605,1834,7986,2739, 398,3601,4269,3847,4034, 328,1912,2847,4035,3848,1331,4270, # 7574 -3011, 937,4271,7987,3602,4036,4037,3387,2160,4546,3388, 524, 742, 538,3065,1012, # 7590 -7988,7989,3849,2461,7990, 658,1103, 225,3850,7991,7992,4547,7993,4548,7994,3236, # 7606 -1243,7995,4038, 963,2246,4549,7996,2705,3603,3161,7997,7998,2588,2327,7999,4550, # 7622 -8000,8001,8002,3489,3307, 957,3389,2540,2032,1930,2927,2462, 870,2018,3604,1746, # 7638 -2770,2771,2434,2463,8003,3851,8004,3723,3107,3724,3490,3390,3725,8005,1179,3066, # 7654 -8006,3162,2373,4272,3726,2541,3163,3108,2740,4039,8007,3391,1556,2542,2292, 977, # 7670 -2887,2033,4040,1205,3392,8008,1765,3393,3164,2124,1271,1689, 714,4551,3491,8009, # 7686 -2328,3852, 533,4273,3605,2181, 617,8010,2464,3308,3492,2310,8011,8012,3165,8013, # 7702 -8014,3853,1987, 618, 427,2641,3493,3394,8015,8016,1244,1690,8017,2806,4274,4552, # 7718 -8018,3494,8019,8020,2279,1576, 473,3606,4275,3395, 972,8021,3607,8022,3067,8023, # 7734 -8024,4553,4554,8025,3727,4041,4042,8026, 153,4555, 356,8027,1891,2888,4276,2143, # 7750 - 408, 803,2352,8028,3854,8029,4277,1646,2570,2511,4556,4557,3855,8030,3856,4278, # 7766 -8031,2411,3396, 752,8032,8033,1961,2964,8034, 746,3012,2465,8035,4279,3728, 698, # 7782 -4558,1892,4280,3608,2543,4559,3609,3857,8036,3166,3397,8037,1823,1302,4043,2706, # 7798 -3858,1973,4281,8038,4282,3167, 823,1303,1288,1236,2848,3495,4044,3398, 774,3859, # 7814 -8039,1581,4560,1304,2849,3860,4561,8040,2435,2161,1083,3237,4283,4045,4284, 344, # 7830 -1173, 288,2311, 454,1683,8041,8042,1461,4562,4046,2589,8043,8044,4563, 985, 894, # 7846 -8045,3399,3168,8046,1913,2928,3729,1988,8047,2110,1974,8048,4047,8049,2571,1194, # 7862 - 425,8050,4564,3169,1245,3730,4285,8051,8052,2850,8053, 636,4565,1855,3861, 760, # 7878 -1799,8054,4286,2209,1508,4566,4048,1893,1684,2293,8055,8056,8057,4287,4288,2210, # 7894 - 479,8058,8059, 832,8060,4049,2489,8061,2965,2490,3731, 990,3109, 627,1814,2642, # 7910 -4289,1582,4290,2125,2111,3496,4567,8062, 799,4291,3170,8063,4568,2112,1737,3013, # 7926 -1018, 543, 754,4292,3309,1676,4569,4570,4050,8064,1489,8065,3497,8066,2614,2889, # 7942 -4051,8067,8068,2966,8069,8070,8071,8072,3171,4571,4572,2182,1722,8073,3238,3239, # 7958 -1842,3610,1715, 481, 365,1975,1856,8074,8075,1962,2491,4573,8076,2126,3611,3240, # 7974 - 433,1894,2063,2075,8077, 602,2741,8078,8079,8080,8081,8082,3014,1628,3400,8083, # 7990 -3172,4574,4052,2890,4575,2512,8084,2544,2772,8085,8086,8087,3310,4576,2891,8088, # 8006 -4577,8089,2851,4578,4579,1221,2967,4053,2513,8090,8091,8092,1867,1989,8093,8094, # 8022 -8095,1895,8096,8097,4580,1896,4054, 318,8098,2094,4055,4293,8099,8100, 485,8101, # 8038 - 938,3862, 553,2670, 116,8102,3863,3612,8103,3498,2671,2773,3401,3311,2807,8104, # 8054 -3613,2929,4056,1747,2930,2968,8105,8106, 207,8107,8108,2672,4581,2514,8109,3015, # 8070 - 890,3614,3864,8110,1877,3732,3402,8111,2183,2353,3403,1652,8112,8113,8114, 941, # 8086 -2294, 208,3499,4057,2019, 330,4294,3865,2892,2492,3733,4295,8115,8116,8117,8118, # 8102 -) - diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwfreq.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwfreq.pyc deleted file mode 100644 index 4368c72ac2c2db9adb4ba14830dcca65041847c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54757 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 Kf&X7O@P7cvlTs4^ diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwprober.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwprober.py deleted file mode 100644 index 35669cc..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwprober.py +++ /dev/null @@ -1,46 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import EUCTWDistributionAnalysis -from .mbcssm import EUCTW_SM_MODEL - -class EUCTWProber(MultiByteCharSetProber): - def __init__(self): - super(EUCTWProber, self).__init__() - self.coding_sm = CodingStateMachine(EUCTW_SM_MODEL) - self.distribution_analyzer = EUCTWDistributionAnalysis() - self.reset() - - @property - def charset_name(self): - return "EUC-TW" - - @property - def language(self): - return "Taiwan" diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwprober.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwprober.pyc deleted file mode 100644 index 691d4b9cc263f569c24dffcc2fee50550188dff5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1601 zcmd5+-A~j&5T9-D3*;*rO-y{zr^bkdXox1nC<kvIlJ*R-iP`kpy<@TM)!jMZh%ZL} zWB&nXwg>X&Beb3A&g^z~e!rQi|7Ugi`Omel87wZJ-tS3lLMo?6Kmkw+NCXJBJt#aV zeMtPq_MvD&*@mRu*exhJP<A2dlHCR+U@Rc-z;A$G0AG?G<Xwn^9&N7$selzeA~l#5 zsQ2cm`X{N06&{)CNSS8-KF#;1xvnNLrl<yKcA_iQ%sr;LgU|ip@xHcb^k{~9T79U} zVs5o<maJVZk?}wdKJ6cT#Cun+=9p^&Jo4|6*pQS0#!av(`osg}GarnE_-HxPyE5Al z#R0RIF(4K;`XqLj6w)K$2Yu?nsmD|Z^Z{GE6?tVFu)|&+cUhnI+#)(Vb{GzWCEljZ z8_sHFq86J>qm;VRC}qTlMtmyr(#+8%Z5c5nd`K$4L6A(Dp-W}lmPT2H4OhIcRmC`< zH#lVtjl$aKGon5`OHDYQ7P&Guyu1kKugs`A|F*sJz1rF_uXnOH_Tp`RX}0K^)Zs9! zb-k%8i)m48;`U%7kJ#lzo~bIInlPh;=L$nL%kaE*X@6PIqYfSWjKnfZ5D&z<SP|Fs zGFnG32TW;+1IBr1`70`i&Eau_z_GGS&RYkBD-;D|C9Y+amWm^?95s0VgGJQ=FiiD% zTHQHVJqoQztH~^#s24O|KnghIMTIh2DUs74WjW1f1(`0vZUN<-N*d=8cV)Cn>R+<l z=(b9bYwIbAtE!Gz>a4dGjkr$Ua<s^1Q?n7d0Qpzd^d8kbs<Qc2x#q+Tp5tP_(TGiZ hGFP;nrFP{GcHMn9IB*HtZF2VR3B~5xaYMM<`wN#keTo18 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/gb2312freq.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/gb2312freq.py deleted file mode 100644 index 697837b..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/gb2312freq.py +++ /dev/null @@ -1,283 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# GB2312 most frequently used character table -# -# Char to FreqOrder table , from hz6763 - -# 512 --> 0.79 -- 0.79 -# 1024 --> 0.92 -- 0.13 -# 2048 --> 0.98 -- 0.06 -# 6768 --> 1.00 -- 0.02 -# -# Ideal Distribution Ratio = 0.79135/(1-0.79135) = 3.79 -# Random Distribution Ration = 512 / (3755 - 512) = 0.157 -# -# Typical Distribution Ratio about 25% of Ideal one, still much higher that RDR - -GB2312_TYPICAL_DISTRIBUTION_RATIO = 0.9 - -GB2312_TABLE_SIZE = 3760 - -GB2312_CHAR_TO_FREQ_ORDER = ( -1671, 749,1443,2364,3924,3807,2330,3921,1704,3463,2691,1511,1515, 572,3191,2205, -2361, 224,2558, 479,1711, 963,3162, 440,4060,1905,2966,2947,3580,2647,3961,3842, -2204, 869,4207, 970,2678,5626,2944,2956,1479,4048, 514,3595, 588,1346,2820,3409, - 249,4088,1746,1873,2047,1774, 581,1813, 358,1174,3590,1014,1561,4844,2245, 670, -1636,3112, 889,1286, 953, 556,2327,3060,1290,3141, 613, 185,3477,1367, 850,3820, -1715,2428,2642,2303,2732,3041,2562,2648,3566,3946,1349, 388,3098,2091,1360,3585, - 152,1687,1539, 738,1559, 59,1232,2925,2267,1388,1249,1741,1679,2960, 151,1566, -1125,1352,4271, 924,4296, 385,3166,4459, 310,1245,2850, 70,3285,2729,3534,3575, -2398,3298,3466,1960,2265, 217,3647, 864,1909,2084,4401,2773,1010,3269,5152, 853, -3051,3121,1244,4251,1895, 364,1499,1540,2313,1180,3655,2268, 562, 715,2417,3061, - 544, 336,3768,2380,1752,4075, 950, 280,2425,4382, 183,2759,3272, 333,4297,2155, -1688,2356,1444,1039,4540, 736,1177,3349,2443,2368,2144,2225, 565, 196,1482,3406, - 927,1335,4147, 692, 878,1311,1653,3911,3622,1378,4200,1840,2969,3149,2126,1816, -2534,1546,2393,2760, 737,2494, 13, 447, 245,2747, 38,2765,2129,2589,1079, 606, - 360, 471,3755,2890, 404, 848, 699,1785,1236, 370,2221,1023,3746,2074,2026,2023, -2388,1581,2119, 812,1141,3091,2536,1519, 804,2053, 406,1596,1090, 784, 548,4414, -1806,2264,2936,1100, 343,4114,5096, 622,3358, 743,3668,1510,1626,5020,3567,2513, -3195,4115,5627,2489,2991, 24,2065,2697,1087,2719, 48,1634, 315, 68, 985,2052, - 198,2239,1347,1107,1439, 597,2366,2172, 871,3307, 919,2487,2790,1867, 236,2570, -1413,3794, 906,3365,3381,1701,1982,1818,1524,2924,1205, 616,2586,2072,2004, 575, - 253,3099, 32,1365,1182, 197,1714,2454,1201, 554,3388,3224,2748, 756,2587, 250, -2567,1507,1517,3529,1922,2761,2337,3416,1961,1677,2452,2238,3153, 615, 911,1506, -1474,2495,1265,1906,2749,3756,3280,2161, 898,2714,1759,3450,2243,2444, 563, 26, -3286,2266,3769,3344,2707,3677, 611,1402, 531,1028,2871,4548,1375, 261,2948, 835, -1190,4134, 353, 840,2684,1900,3082,1435,2109,1207,1674, 329,1872,2781,4055,2686, -2104, 608,3318,2423,2957,2768,1108,3739,3512,3271,3985,2203,1771,3520,1418,2054, -1681,1153, 225,1627,2929, 162,2050,2511,3687,1954, 124,1859,2431,1684,3032,2894, - 585,4805,3969,2869,2704,2088,2032,2095,3656,2635,4362,2209, 256, 518,2042,2105, -3777,3657, 643,2298,1148,1779, 190, 989,3544, 414, 11,2135,2063,2979,1471, 403, -3678, 126, 770,1563, 671,2499,3216,2877, 600,1179, 307,2805,4937,1268,1297,2694, - 252,4032,1448,1494,1331,1394, 127,2256, 222,1647,1035,1481,3056,1915,1048, 873, -3651, 210, 33,1608,2516, 200,1520, 415, 102, 0,3389,1287, 817, 91,3299,2940, - 836,1814, 549,2197,1396,1669,2987,3582,2297,2848,4528,1070, 687, 20,1819, 121, -1552,1364,1461,1968,2617,3540,2824,2083, 177, 948,4938,2291, 110,4549,2066, 648, -3359,1755,2110,2114,4642,4845,1693,3937,3308,1257,1869,2123, 208,1804,3159,2992, -2531,2549,3361,2418,1350,2347,2800,2568,1291,2036,2680, 72, 842,1990, 212,1233, -1154,1586, 75,2027,3410,4900,1823,1337,2710,2676, 728,2810,1522,3026,4995, 157, - 755,1050,4022, 710, 785,1936,2194,2085,1406,2777,2400, 150,1250,4049,1206, 807, -1910, 534, 529,3309,1721,1660, 274, 39,2827, 661,2670,1578, 925,3248,3815,1094, -4278,4901,4252, 41,1150,3747,2572,2227,4501,3658,4902,3813,3357,3617,2884,2258, - 887, 538,4187,3199,1294,2439,3042,2329,2343,2497,1255, 107, 543,1527, 521,3478, -3568, 194,5062, 15, 961,3870,1241,1192,2664, 66,5215,3260,2111,1295,1127,2152, -3805,4135, 901,1164,1976, 398,1278, 530,1460, 748, 904,1054,1966,1426, 53,2909, - 509, 523,2279,1534, 536,1019, 239,1685, 460,2353, 673,1065,2401,3600,4298,2272, -1272,2363, 284,1753,3679,4064,1695, 81, 815,2677,2757,2731,1386, 859, 500,4221, -2190,2566, 757,1006,2519,2068,1166,1455, 337,2654,3203,1863,1682,1914,3025,1252, -1409,1366, 847, 714,2834,2038,3209, 964,2970,1901, 885,2553,1078,1756,3049, 301, -1572,3326, 688,2130,1996,2429,1805,1648,2930,3421,2750,3652,3088, 262,1158,1254, - 389,1641,1812, 526,1719, 923,2073,1073,1902, 468, 489,4625,1140, 857,2375,3070, -3319,2863, 380, 116,1328,2693,1161,2244, 273,1212,1884,2769,3011,1775,1142, 461, -3066,1200,2147,2212, 790, 702,2695,4222,1601,1058, 434,2338,5153,3640, 67,2360, -4099,2502, 618,3472,1329, 416,1132, 830,2782,1807,2653,3211,3510,1662, 192,2124, - 296,3979,1739,1611,3684, 23, 118, 324, 446,1239,1225, 293,2520,3814,3795,2535, -3116, 17,1074, 467,2692,2201, 387,2922, 45,1326,3055,1645,3659,2817, 958, 243, -1903,2320,1339,2825,1784,3289, 356, 576, 865,2315,2381,3377,3916,1088,3122,1713, -1655, 935, 628,4689,1034,1327, 441, 800, 720, 894,1979,2183,1528,5289,2702,1071, -4046,3572,2399,1571,3281, 79, 761,1103, 327, 134, 758,1899,1371,1615, 879, 442, - 215,2605,2579, 173,2048,2485,1057,2975,3317,1097,2253,3801,4263,1403,1650,2946, - 814,4968,3487,1548,2644,1567,1285, 2, 295,2636, 97, 946,3576, 832, 141,4257, -3273, 760,3821,3521,3156,2607, 949,1024,1733,1516,1803,1920,2125,2283,2665,3180, -1501,2064,3560,2171,1592, 803,3518,1416, 732,3897,4258,1363,1362,2458, 119,1427, - 602,1525,2608,1605,1639,3175, 694,3064, 10, 465, 76,2000,4846,4208, 444,3781, -1619,3353,2206,1273,3796, 740,2483, 320,1723,2377,3660,2619,1359,1137,1762,1724, -2345,2842,1850,1862, 912, 821,1866, 612,2625,1735,2573,3369,1093, 844, 89, 937, - 930,1424,3564,2413,2972,1004,3046,3019,2011, 711,3171,1452,4178, 428, 801,1943, - 432, 445,2811, 206,4136,1472, 730, 349, 73, 397,2802,2547, 998,1637,1167, 789, - 396,3217, 154,1218, 716,1120,1780,2819,4826,1931,3334,3762,2139,1215,2627, 552, -3664,3628,3232,1405,2383,3111,1356,2652,3577,3320,3101,1703, 640,1045,1370,1246, -4996, 371,1575,2436,1621,2210, 984,4033,1734,2638, 16,4529, 663,2755,3255,1451, -3917,2257,1253,1955,2234,1263,2951, 214,1229, 617, 485, 359,1831,1969, 473,2310, - 750,2058, 165, 80,2864,2419, 361,4344,2416,2479,1134, 796,3726,1266,2943, 860, -2715, 938, 390,2734,1313,1384, 248, 202, 877,1064,2854, 522,3907, 279,1602, 297, -2357, 395,3740, 137,2075, 944,4089,2584,1267,3802, 62,1533,2285, 178, 176, 780, -2440, 201,3707, 590, 478,1560,4354,2117,1075, 30, 74,4643,4004,1635,1441,2745, - 776,2596, 238,1077,1692,1912,2844, 605, 499,1742,3947, 241,3053, 980,1749, 936, -2640,4511,2582, 515,1543,2162,5322,2892,2993, 890,2148,1924, 665,1827,3581,1032, - 968,3163, 339,1044,1896, 270, 583,1791,1720,4367,1194,3488,3669, 43,2523,1657, - 163,2167, 290,1209,1622,3378, 550, 634,2508,2510, 695,2634,2384,2512,1476,1414, - 220,1469,2341,2138,2852,3183,2900,4939,2865,3502,1211,3680, 854,3227,1299,2976, -3172, 186,2998,1459, 443,1067,3251,1495, 321,1932,3054, 909, 753,1410,1828, 436, -2441,1119,1587,3164,2186,1258, 227, 231,1425,1890,3200,3942, 247, 959, 725,5254, -2741, 577,2158,2079, 929, 120, 174, 838,2813, 591,1115, 417,2024, 40,3240,1536, -1037, 291,4151,2354, 632,1298,2406,2500,3535,1825,1846,3451, 205,1171, 345,4238, - 18,1163, 811, 685,2208,1217, 425,1312,1508,1175,4308,2552,1033, 587,1381,3059, -2984,3482, 340,1316,4023,3972, 792,3176, 519, 777,4690, 918, 933,4130,2981,3741, - 90,3360,2911,2200,5184,4550, 609,3079,2030, 272,3379,2736, 363,3881,1130,1447, - 286, 779, 357,1169,3350,3137,1630,1220,2687,2391, 747,1277,3688,2618,2682,2601, -1156,3196,5290,4034,3102,1689,3596,3128, 874, 219,2783, 798, 508,1843,2461, 269, -1658,1776,1392,1913,2983,3287,2866,2159,2372, 829,4076, 46,4253,2873,1889,1894, - 915,1834,1631,2181,2318, 298, 664,2818,3555,2735, 954,3228,3117, 527,3511,2173, - 681,2712,3033,2247,2346,3467,1652, 155,2164,3382, 113,1994, 450, 899, 494, 994, -1237,2958,1875,2336,1926,3727, 545,1577,1550, 633,3473, 204,1305,3072,2410,1956, -2471, 707,2134, 841,2195,2196,2663,3843,1026,4940, 990,3252,4997, 368,1092, 437, -3212,3258,1933,1829, 675,2977,2893, 412, 943,3723,4644,3294,3283,2230,2373,5154, -2389,2241,2661,2323,1404,2524, 593, 787, 677,3008,1275,2059, 438,2709,2609,2240, -2269,2246,1446, 36,1568,1373,3892,1574,2301,1456,3962, 693,2276,5216,2035,1143, -2720,1919,1797,1811,2763,4137,2597,1830,1699,1488,1198,2090, 424,1694, 312,3634, -3390,4179,3335,2252,1214, 561,1059,3243,2295,2561, 975,5155,2321,2751,3772, 472, -1537,3282,3398,1047,2077,2348,2878,1323,3340,3076, 690,2906, 51, 369, 170,3541, -1060,2187,2688,3670,2541,1083,1683, 928,3918, 459, 109,4427, 599,3744,4286, 143, -2101,2730,2490, 82,1588,3036,2121, 281,1860, 477,4035,1238,2812,3020,2716,3312, -1530,2188,2055,1317, 843, 636,1808,1173,3495, 649, 181,1002, 147,3641,1159,2414, -3750,2289,2795, 813,3123,2610,1136,4368, 5,3391,4541,2174, 420, 429,1728, 754, -1228,2115,2219, 347,2223,2733, 735,1518,3003,2355,3134,1764,3948,3329,1888,2424, -1001,1234,1972,3321,3363,1672,1021,1450,1584, 226, 765, 655,2526,3404,3244,2302, -3665, 731, 594,2184, 319,1576, 621, 658,2656,4299,2099,3864,1279,2071,2598,2739, - 795,3086,3699,3908,1707,2352,2402,1382,3136,2475,1465,4847,3496,3865,1085,3004, -2591,1084, 213,2287,1963,3565,2250, 822, 793,4574,3187,1772,1789,3050, 595,1484, -1959,2770,1080,2650, 456, 422,2996, 940,3322,4328,4345,3092,2742, 965,2784, 739, -4124, 952,1358,2498,2949,2565, 332,2698,2378, 660,2260,2473,4194,3856,2919, 535, -1260,2651,1208,1428,1300,1949,1303,2942, 433,2455,2450,1251,1946, 614,1269, 641, -1306,1810,2737,3078,2912, 564,2365,1419,1415,1497,4460,2367,2185,1379,3005,1307, -3218,2175,1897,3063, 682,1157,4040,4005,1712,1160,1941,1399, 394, 402,2952,1573, -1151,2986,2404, 862, 299,2033,1489,3006, 346, 171,2886,3401,1726,2932, 168,2533, - 47,2507,1030,3735,1145,3370,1395,1318,1579,3609,4560,2857,4116,1457,2529,1965, - 504,1036,2690,2988,2405, 745,5871, 849,2397,2056,3081, 863,2359,3857,2096, 99, -1397,1769,2300,4428,1643,3455,1978,1757,3718,1440, 35,4879,3742,1296,4228,2280, - 160,5063,1599,2013, 166, 520,3479,1646,3345,3012, 490,1937,1545,1264,2182,2505, -1096,1188,1369,1436,2421,1667,2792,2460,1270,2122, 727,3167,2143, 806,1706,1012, -1800,3037, 960,2218,1882, 805, 139,2456,1139,1521, 851,1052,3093,3089, 342,2039, - 744,5097,1468,1502,1585,2087, 223, 939, 326,2140,2577, 892,2481,1623,4077, 982, -3708, 135,2131, 87,2503,3114,2326,1106, 876,1616, 547,2997,2831,2093,3441,4530, -4314, 9,3256,4229,4148, 659,1462,1986,1710,2046,2913,2231,4090,4880,5255,3392, -3274,1368,3689,4645,1477, 705,3384,3635,1068,1529,2941,1458,3782,1509, 100,1656, -2548, 718,2339, 408,1590,2780,3548,1838,4117,3719,1345,3530, 717,3442,2778,3220, -2898,1892,4590,3614,3371,2043,1998,1224,3483, 891, 635, 584,2559,3355, 733,1766, -1729,1172,3789,1891,2307, 781,2982,2271,1957,1580,5773,2633,2005,4195,3097,1535, -3213,1189,1934,5693,3262, 586,3118,1324,1598, 517,1564,2217,1868,1893,4445,3728, -2703,3139,1526,1787,1992,3882,2875,1549,1199,1056,2224,1904,2711,5098,4287, 338, -1993,3129,3489,2689,1809,2815,1997, 957,1855,3898,2550,3275,3057,1105,1319, 627, -1505,1911,1883,3526, 698,3629,3456,1833,1431, 746, 77,1261,2017,2296,1977,1885, - 125,1334,1600, 525,1798,1109,2222,1470,1945, 559,2236,1186,3443,2476,1929,1411, -2411,3135,1777,3372,2621,1841,1613,3229, 668,1430,1839,2643,2916, 195,1989,2671, -2358,1387, 629,3205,2293,5256,4439, 123,1310, 888,1879,4300,3021,3605,1003,1162, -3192,2910,2010, 140,2395,2859, 55,1082,2012,2901, 662, 419,2081,1438, 680,2774, -4654,3912,1620,1731,1625,5035,4065,2328, 512,1344, 802,5443,2163,2311,2537, 524, -3399, 98,1155,2103,1918,2606,3925,2816,1393,2465,1504,3773,2177,3963,1478,4346, - 180,1113,4655,3461,2028,1698, 833,2696,1235,1322,1594,4408,3623,3013,3225,2040, -3022, 541,2881, 607,3632,2029,1665,1219, 639,1385,1686,1099,2803,3231,1938,3188, -2858, 427, 676,2772,1168,2025, 454,3253,2486,3556, 230,1950, 580, 791,1991,1280, -1086,1974,2034, 630, 257,3338,2788,4903,1017, 86,4790, 966,2789,1995,1696,1131, - 259,3095,4188,1308, 179,1463,5257, 289,4107,1248, 42,3413,1725,2288, 896,1947, - 774,4474,4254, 604,3430,4264, 392,2514,2588, 452, 237,1408,3018, 988,4531,1970, -3034,3310, 540,2370,1562,1288,2990, 502,4765,1147, 4,1853,2708, 207, 294,2814, -4078,2902,2509, 684, 34,3105,3532,2551, 644, 709,2801,2344, 573,1727,3573,3557, -2021,1081,3100,4315,2100,3681, 199,2263,1837,2385, 146,3484,1195,2776,3949, 997, -1939,3973,1008,1091,1202,1962,1847,1149,4209,5444,1076, 493, 117,5400,2521, 972, -1490,2934,1796,4542,2374,1512,2933,2657, 413,2888,1135,2762,2314,2156,1355,2369, - 766,2007,2527,2170,3124,2491,2593,2632,4757,2437, 234,3125,3591,1898,1750,1376, -1942,3468,3138, 570,2127,2145,3276,4131, 962, 132,1445,4196, 19, 941,3624,3480, -3366,1973,1374,4461,3431,2629, 283,2415,2275, 808,2887,3620,2112,2563,1353,3610, - 955,1089,3103,1053, 96, 88,4097, 823,3808,1583, 399, 292,4091,3313, 421,1128, - 642,4006, 903,2539,1877,2082, 596, 29,4066,1790, 722,2157, 130, 995,1569, 769, -1485, 464, 513,2213, 288,1923,1101,2453,4316, 133, 486,2445, 50, 625, 487,2207, - 57, 423, 481,2962, 159,3729,1558, 491, 303, 482, 501, 240,2837, 112,3648,2392, -1783, 362, 8,3433,3422, 610,2793,3277,1390,1284,1654, 21,3823, 734, 367, 623, - 193, 287, 374,1009,1483, 816, 476, 313,2255,2340,1262,2150,2899,1146,2581, 782, -2116,1659,2018,1880, 255,3586,3314,1110,2867,2137,2564, 986,2767,5185,2006, 650, - 158, 926, 762, 881,3157,2717,2362,3587, 306,3690,3245,1542,3077,2427,1691,2478, -2118,2985,3490,2438, 539,2305, 983, 129,1754, 355,4201,2386, 827,2923, 104,1773, -2838,2771, 411,2905,3919, 376, 767, 122,1114, 828,2422,1817,3506, 266,3460,1007, -1609,4998, 945,2612,4429,2274, 726,1247,1964,2914,2199,2070,4002,4108, 657,3323, -1422, 579, 455,2764,4737,1222,2895,1670, 824,1223,1487,2525, 558, 861,3080, 598, -2659,2515,1967, 752,2583,2376,2214,4180, 977, 704,2464,4999,2622,4109,1210,2961, - 819,1541, 142,2284, 44, 418, 457,1126,3730,4347,4626,1644,1876,3671,1864, 302, -1063,5694, 624, 723,1984,3745,1314,1676,2488,1610,1449,3558,3569,2166,2098, 409, -1011,2325,3704,2306, 818,1732,1383,1824,1844,3757, 999,2705,3497,1216,1423,2683, -2426,2954,2501,2726,2229,1475,2554,5064,1971,1794,1666,2014,1343, 783, 724, 191, -2434,1354,2220,5065,1763,2752,2472,4152, 131, 175,2885,3434, 92,1466,4920,2616, -3871,3872,3866, 128,1551,1632, 669,1854,3682,4691,4125,1230, 188,2973,3290,1302, -1213, 560,3266, 917, 763,3909,3249,1760, 868,1958, 764,1782,2097, 145,2277,3774, -4462, 64,1491,3062, 971,2132,3606,2442, 221,1226,1617, 218, 323,1185,3207,3147, - 571, 619,1473,1005,1744,2281, 449,1887,2396,3685, 275, 375,3816,1743,3844,3731, - 845,1983,2350,4210,1377, 773, 967,3499,3052,3743,2725,4007,1697,1022,3943,1464, -3264,2855,2722,1952,1029,2839,2467, 84,4383,2215, 820,1391,2015,2448,3672, 377, -1948,2168, 797,2545,3536,2578,2645, 94,2874,1678, 405,1259,3071, 771, 546,1315, - 470,1243,3083, 895,2468, 981, 969,2037, 846,4181, 653,1276,2928, 14,2594, 557, -3007,2474, 156, 902,1338,1740,2574, 537,2518, 973,2282,2216,2433,1928, 138,2903, -1293,2631,1612, 646,3457, 839,2935, 111, 496,2191,2847, 589,3186, 149,3994,2060, -4031,2641,4067,3145,1870, 37,3597,2136,1025,2051,3009,3383,3549,1121,1016,3261, -1301, 251,2446,2599,2153, 872,3246, 637, 334,3705, 831, 884, 921,3065,3140,4092, -2198,1944, 246,2964, 108,2045,1152,1921,2308,1031, 203,3173,4170,1907,3890, 810, -1401,2003,1690, 506, 647,1242,2828,1761,1649,3208,2249,1589,3709,2931,5156,1708, - 498, 666,2613, 834,3817,1231, 184,2851,1124, 883,3197,2261,3710,1765,1553,2658, -1178,2639,2351, 93,1193, 942,2538,2141,4402, 235,1821, 870,1591,2192,1709,1871, -3341,1618,4126,2595,2334, 603, 651, 69, 701, 268,2662,3411,2555,1380,1606, 503, - 448, 254,2371,2646, 574,1187,2309,1770, 322,2235,1292,1801, 305, 566,1133, 229, -2067,2057, 706, 167, 483,2002,2672,3295,1820,3561,3067, 316, 378,2746,3452,1112, - 136,1981, 507,1651,2917,1117, 285,4591, 182,2580,3522,1304, 335,3303,1835,2504, -1795,1792,2248, 674,1018,2106,2449,1857,2292,2845, 976,3047,1781,2600,2727,1389, -1281, 52,3152, 153, 265,3950, 672,3485,3951,4463, 430,1183, 365, 278,2169, 27, -1407,1336,2304, 209,1340,1730,2202,1852,2403,2883, 979,1737,1062, 631,2829,2542, -3876,2592, 825,2086,2226,3048,3625, 352,1417,3724, 542, 991, 431,1351,3938,1861, -2294, 826,1361,2927,3142,3503,1738, 463,2462,2723, 582,1916,1595,2808, 400,3845, -3891,2868,3621,2254, 58,2492,1123, 910,2160,2614,1372,1603,1196,1072,3385,1700, -3267,1980, 696, 480,2430, 920, 799,1570,2920,1951,2041,4047,2540,1321,4223,2469, -3562,2228,1271,2602, 401,2833,3351,2575,5157, 907,2312,1256, 410, 263,3507,1582, - 996, 678,1849,2316,1480, 908,3545,2237, 703,2322, 667,1826,2849,1531,2604,2999, -2407,3146,2151,2630,1786,3711, 469,3542, 497,3899,2409, 858, 837,4446,3393,1274, - 786, 620,1845,2001,3311, 484, 308,3367,1204,1815,3691,2332,1532,2557,1842,2020, -2724,1927,2333,4440, 567, 22,1673,2728,4475,1987,1858,1144,1597, 101,1832,3601, - 12, 974,3783,4391, 951,1412, 1,3720, 453,4608,4041, 528,1041,1027,3230,2628, -1129, 875,1051,3291,1203,2262,1069,2860,2799,2149,2615,3278, 144,1758,3040, 31, - 475,1680, 366,2685,3184, 311,1642,4008,2466,5036,1593,1493,2809, 216,1420,1668, - 233, 304,2128,3284, 232,1429,1768,1040,2008,3407,2740,2967,2543, 242,2133, 778, -1565,2022,2620, 505,2189,2756,1098,2273, 372,1614, 708, 553,2846,2094,2278, 169, -3626,2835,4161, 228,2674,3165, 809,1454,1309, 466,1705,1095, 900,3423, 880,2667, -3751,5258,2317,3109,2571,4317,2766,1503,1342, 866,4447,1118, 63,2076, 314,1881, -1348,1061, 172, 978,3515,1747, 532, 511,3970, 6, 601, 905,2699,3300,1751, 276, -1467,3725,2668, 65,4239,2544,2779,2556,1604, 578,2451,1802, 992,2331,2624,1320, -3446, 713,1513,1013, 103,2786,2447,1661, 886,1702, 916, 654,3574,2031,1556, 751, -2178,2821,2179,1498,1538,2176, 271, 914,2251,2080,1325, 638,1953,2937,3877,2432, -2754, 95,3265,1716, 260,1227,4083, 775, 106,1357,3254, 426,1607, 555,2480, 772, -1985, 244,2546, 474, 495,1046,2611,1851,2061, 71,2089,1675,2590, 742,3758,2843, -3222,1433, 267,2180,2576,2826,2233,2092,3913,2435, 956,1745,3075, 856,2113,1116, - 451, 3,1988,2896,1398, 993,2463,1878,2049,1341,2718,2721,2870,2108, 712,2904, -4363,2753,2324, 277,2872,2349,2649, 384, 987, 435, 691,3000, 922, 164,3939, 652, -1500,1184,4153,2482,3373,2165,4848,2335,3775,3508,3154,2806,2830,1554,2102,1664, -2530,1434,2408, 893,1547,2623,3447,2832,2242,2532,3169,2856,3223,2078, 49,3770, -3469, 462, 318, 656,2259,3250,3069, 679,1629,2758, 344,1138,1104,3120,1836,1283, -3115,2154,1437,4448, 934, 759,1999, 794,2862,1038, 533,2560,1722,2342, 855,2626, -1197,1663,4476,3127, 85,4240,2528, 25,1111,1181,3673, 407,3470,4561,2679,2713, - 768,1925,2841,3986,1544,1165, 932, 373,1240,2146,1930,2673, 721,4766, 354,4333, - 391,2963, 187, 61,3364,1442,1102, 330,1940,1767, 341,3809,4118, 393,2496,2062, -2211, 105, 331, 300, 439, 913,1332, 626, 379,3304,1557, 328, 689,3952, 309,1555, - 931, 317,2517,3027, 325, 569, 686,2107,3084, 60,1042,1333,2794, 264,3177,4014, -1628, 258,3712, 7,4464,1176,1043,1778, 683, 114,1975, 78,1492, 383,1886, 510, - 386, 645,5291,2891,2069,3305,4138,3867,2939,2603,2493,1935,1066,1848,3588,1015, -1282,1289,4609, 697,1453,3044,2666,3611,1856,2412, 54, 719,1330, 568,3778,2459, -1748, 788, 492, 551,1191,1000, 488,3394,3763, 282,1799, 348,2016,1523,3155,2390, -1049, 382,2019,1788,1170, 729,2968,3523, 897,3926,2785,2938,3292, 350,2319,3238, -1718,1717,2655,3453,3143,4465, 161,2889,2980,2009,1421, 56,1908,1640,2387,2232, -1917,1874,2477,4921, 148, 83,3438, 592,4245,2882,1822,1055, 741, 115,1496,1624, - 381,1638,4592,1020, 516,3214, 458, 947,4575,1432, 211,1514,2926,1865,2142, 189, - 852,1221,1400,1486, 882,2299,4036, 351, 28,1122, 700,6479,6480,6481,6482,6483, #last 512 -) - diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/gb2312freq.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/gb2312freq.pyc deleted file mode 100644 index 4fc4f74c4944877e8180b1ea8b0fb22ed0b22514..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38399 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 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/gb2312prober.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/gb2312prober.py deleted file mode 100644 index 8446d2d..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/gb2312prober.py +++ /dev/null @@ -1,46 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import GB2312DistributionAnalysis -from .mbcssm import GB2312_SM_MODEL - -class GB2312Prober(MultiByteCharSetProber): - def __init__(self): - super(GB2312Prober, self).__init__() - self.coding_sm = CodingStateMachine(GB2312_SM_MODEL) - self.distribution_analyzer = GB2312DistributionAnalysis() - self.reset() - - @property - def charset_name(self): - return "GB2312" - - @property - def language(self): - return "Chinese" diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/gb2312prober.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/gb2312prober.pyc deleted file mode 100644 index 5db25ef9e083ff4976f233a9f230f0fca440e942..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1610 zcmd5+OK;RL5FRJ{YE{|_1P8<gP7$J{4^)9vA?OxyVM~>8Ari8(8+YrHWP?4sbSo|h z{xN@m8GF0*#<5K@6VKQg`}<}l;h#IJPk*j|8NuQT>HUVpW~2&w1e5@kfJ}g3JAg8P zDugWbb_it)sy1Y8Z?~ZAK-Gn;OLiNSfKvfQ2Yv(m0{EQupy)yx^(ed+q#{=MfYe}G zqCT9X>YwE%Rd`}1LuLH@U7GJt3SEy=%ux;U(V4E5pL<Ai?+<tPc6N`nMWcsP)RX#c zotJZ~tzWaTTqDzg9DF=__W{?IKEKnFgMcOuNo-6?0YfL`1Rx7Qg-i*9Axc`#46e*J zBx%G1ju;aQ8+{UcKnm#*@Pj@L;5=Y91crbu4n<zs2JEnx$6eOvJ-3MVP92KlXobVH zIpDNWCTX$BOiHP1jZ!AOX~MfAFC96?q^%N$g!f4m*C>)Xb9AYU3u%;9=-J}9R+Xm_ zy}>DKX%sg`&xrkamYeu=QWnbC`0^s2@0nr!{p-&Dw|aZuyx1STv=^_6OS4VaxQRc- zjc&GdZ80y)E!-K5<q5l-$eF5(iHS#)^Fm=f9&#cZm-^?;Jn7KBPe?4o1aVJnh&8d~ zm*F~o`NWi$G-9B~#N$;-cnFS`RdU`uB3E{dme`hcUMW73<zqweUtC>U)#u8$?la#! z$t?lK87lL7Jk7`I8I2d9B2LDlN*S+|$Oo3PniSKLOqXM~fYMH7jq`+CGg&9~FJEqS zV`a$o^_avmn2uQKY_t~L$bXh<xJan4+k{+z{LAtUNQIB8^1m$Cp}5I&T=Cbs(f26F fr*M{fmfP61_$?v9rRczC?e!x%oa@O=;qKrs91nT* diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/hebrewprober.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/hebrewprober.py deleted file mode 100644 index b0e1bf4..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/hebrewprober.py +++ /dev/null @@ -1,292 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Shy Shalom -# Portions created by the Initial Developer are Copyright (C) 2005 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .charsetprober import CharSetProber -from .enums import ProbingState - -# This prober doesn't actually recognize a language or a charset. -# It is a helper prober for the use of the Hebrew model probers - -### General ideas of the Hebrew charset recognition ### -# -# Four main charsets exist in Hebrew: -# "ISO-8859-8" - Visual Hebrew -# "windows-1255" - Logical Hebrew -# "ISO-8859-8-I" - Logical Hebrew -# "x-mac-hebrew" - ?? Logical Hebrew ?? -# -# Both "ISO" charsets use a completely identical set of code points, whereas -# "windows-1255" and "x-mac-hebrew" are two different proper supersets of -# these code points. windows-1255 defines additional characters in the range -# 0x80-0x9F as some misc punctuation marks as well as some Hebrew-specific -# diacritics and additional 'Yiddish' ligature letters in the range 0xc0-0xd6. -# x-mac-hebrew defines similar additional code points but with a different -# mapping. -# -# As far as an average Hebrew text with no diacritics is concerned, all four -# charsets are identical with respect to code points. Meaning that for the -# main Hebrew alphabet, all four map the same values to all 27 Hebrew letters -# (including final letters). -# -# The dominant difference between these charsets is their directionality. -# "Visual" directionality means that the text is ordered as if the renderer is -# not aware of a BIDI rendering algorithm. The renderer sees the text and -# draws it from left to right. The text itself when ordered naturally is read -# backwards. A buffer of Visual Hebrew generally looks like so: -# "[last word of first line spelled backwards] [whole line ordered backwards -# and spelled backwards] [first word of first line spelled backwards] -# [end of line] [last word of second line] ... etc' " -# adding punctuation marks, numbers and English text to visual text is -# naturally also "visual" and from left to right. -# -# "Logical" directionality means the text is ordered "naturally" according to -# the order it is read. It is the responsibility of the renderer to display -# the text from right to left. A BIDI algorithm is used to place general -# punctuation marks, numbers and English text in the text. -# -# Texts in x-mac-hebrew are almost impossible to find on the Internet. From -# what little evidence I could find, it seems that its general directionality -# is Logical. -# -# To sum up all of the above, the Hebrew probing mechanism knows about two -# charsets: -# Visual Hebrew - "ISO-8859-8" - backwards text - Words and sentences are -# backwards while line order is natural. For charset recognition purposes -# the line order is unimportant (In fact, for this implementation, even -# word order is unimportant). -# Logical Hebrew - "windows-1255" - normal, naturally ordered text. -# -# "ISO-8859-8-I" is a subset of windows-1255 and doesn't need to be -# specifically identified. -# "x-mac-hebrew" is also identified as windows-1255. A text in x-mac-hebrew -# that contain special punctuation marks or diacritics is displayed with -# some unconverted characters showing as question marks. This problem might -# be corrected using another model prober for x-mac-hebrew. Due to the fact -# that x-mac-hebrew texts are so rare, writing another model prober isn't -# worth the effort and performance hit. -# -#### The Prober #### -# -# The prober is divided between two SBCharSetProbers and a HebrewProber, -# all of which are managed, created, fed data, inquired and deleted by the -# SBCSGroupProber. The two SBCharSetProbers identify that the text is in -# fact some kind of Hebrew, Logical or Visual. The final decision about which -# one is it is made by the HebrewProber by combining final-letter scores -# with the scores of the two SBCharSetProbers to produce a final answer. -# -# The SBCSGroupProber is responsible for stripping the original text of HTML -# tags, English characters, numbers, low-ASCII punctuation characters, spaces -# and new lines. It reduces any sequence of such characters to a single space. -# The buffer fed to each prober in the SBCS group prober is pure text in -# high-ASCII. -# The two SBCharSetProbers (model probers) share the same language model: -# Win1255Model. -# The first SBCharSetProber uses the model normally as any other -# SBCharSetProber does, to recognize windows-1255, upon which this model was -# built. The second SBCharSetProber is told to make the pair-of-letter -# lookup in the language model backwards. This in practice exactly simulates -# a visual Hebrew model using the windows-1255 logical Hebrew model. -# -# The HebrewProber is not using any language model. All it does is look for -# final-letter evidence suggesting the text is either logical Hebrew or visual -# Hebrew. Disjointed from the model probers, the results of the HebrewProber -# alone are meaningless. HebrewProber always returns 0.00 as confidence -# since it never identifies a charset by itself. Instead, the pointer to the -# HebrewProber is passed to the model probers as a helper "Name Prober". -# When the Group prober receives a positive identification from any prober, -# it asks for the name of the charset identified. If the prober queried is a -# Hebrew model prober, the model prober forwards the call to the -# HebrewProber to make the final decision. In the HebrewProber, the -# decision is made according to the final-letters scores maintained and Both -# model probers scores. The answer is returned in the form of the name of the -# charset identified, either "windows-1255" or "ISO-8859-8". - -class HebrewProber(CharSetProber): - # windows-1255 / ISO-8859-8 code points of interest - FINAL_KAF = 0xea - NORMAL_KAF = 0xeb - FINAL_MEM = 0xed - NORMAL_MEM = 0xee - FINAL_NUN = 0xef - NORMAL_NUN = 0xf0 - FINAL_PE = 0xf3 - NORMAL_PE = 0xf4 - FINAL_TSADI = 0xf5 - NORMAL_TSADI = 0xf6 - - # Minimum Visual vs Logical final letter score difference. - # If the difference is below this, don't rely solely on the final letter score - # distance. - MIN_FINAL_CHAR_DISTANCE = 5 - - # Minimum Visual vs Logical model score difference. - # If the difference is below this, don't rely at all on the model score - # distance. - MIN_MODEL_DISTANCE = 0.01 - - VISUAL_HEBREW_NAME = "ISO-8859-8" - LOGICAL_HEBREW_NAME = "windows-1255" - - def __init__(self): - super(HebrewProber, self).__init__() - self._final_char_logical_score = None - self._final_char_visual_score = None - self._prev = None - self._before_prev = None - self._logical_prober = None - self._visual_prober = None - self.reset() - - def reset(self): - self._final_char_logical_score = 0 - self._final_char_visual_score = 0 - # The two last characters seen in the previous buffer, - # mPrev and mBeforePrev are initialized to space in order to simulate - # a word delimiter at the beginning of the data - self._prev = ' ' - self._before_prev = ' ' - # These probers are owned by the group prober. - - def set_model_probers(self, logicalProber, visualProber): - self._logical_prober = logicalProber - self._visual_prober = visualProber - - def is_final(self, c): - return c in [self.FINAL_KAF, self.FINAL_MEM, self.FINAL_NUN, - self.FINAL_PE, self.FINAL_TSADI] - - def is_non_final(self, c): - # The normal Tsadi is not a good Non-Final letter due to words like - # 'lechotet' (to chat) containing an apostrophe after the tsadi. This - # apostrophe is converted to a space in FilterWithoutEnglishLetters - # causing the Non-Final tsadi to appear at an end of a word even - # though this is not the case in the original text. - # The letters Pe and Kaf rarely display a related behavior of not being - # a good Non-Final letter. Words like 'Pop', 'Winamp' and 'Mubarak' - # for example legally end with a Non-Final Pe or Kaf. However, the - # benefit of these letters as Non-Final letters outweighs the damage - # since these words are quite rare. - return c in [self.NORMAL_KAF, self.NORMAL_MEM, - self.NORMAL_NUN, self.NORMAL_PE] - - def feed(self, byte_str): - # Final letter analysis for logical-visual decision. - # Look for evidence that the received buffer is either logical Hebrew - # or visual Hebrew. - # The following cases are checked: - # 1) A word longer than 1 letter, ending with a final letter. This is - # an indication that the text is laid out "naturally" since the - # final letter really appears at the end. +1 for logical score. - # 2) A word longer than 1 letter, ending with a Non-Final letter. In - # normal Hebrew, words ending with Kaf, Mem, Nun, Pe or Tsadi, - # should not end with the Non-Final form of that letter. Exceptions - # to this rule are mentioned above in isNonFinal(). This is an - # indication that the text is laid out backwards. +1 for visual - # score - # 3) A word longer than 1 letter, starting with a final letter. Final - # letters should not appear at the beginning of a word. This is an - # indication that the text is laid out backwards. +1 for visual - # score. - # - # The visual score and logical score are accumulated throughout the - # text and are finally checked against each other in GetCharSetName(). - # No checking for final letters in the middle of words is done since - # that case is not an indication for either Logical or Visual text. - # - # We automatically filter out all 7-bit characters (replace them with - # spaces) so the word boundary detection works properly. [MAP] - - if self.state == ProbingState.NOT_ME: - # Both model probers say it's not them. No reason to continue. - return ProbingState.NOT_ME - - byte_str = self.filter_high_byte_only(byte_str) - - for cur in byte_str: - if cur == ' ': - # We stand on a space - a word just ended - if self._before_prev != ' ': - # next-to-last char was not a space so self._prev is not a - # 1 letter word - if self.is_final(self._prev): - # case (1) [-2:not space][-1:final letter][cur:space] - self._final_char_logical_score += 1 - elif self.is_non_final(self._prev): - # case (2) [-2:not space][-1:Non-Final letter][ - # cur:space] - self._final_char_visual_score += 1 - else: - # Not standing on a space - if ((self._before_prev == ' ') and - (self.is_final(self._prev)) and (cur != ' ')): - # case (3) [-2:space][-1:final letter][cur:not space] - self._final_char_visual_score += 1 - self._before_prev = self._prev - self._prev = cur - - # Forever detecting, till the end or until both model probers return - # ProbingState.NOT_ME (handled above) - return ProbingState.DETECTING - - @property - def charset_name(self): - # Make the decision: is it Logical or Visual? - # If the final letter score distance is dominant enough, rely on it. - finalsub = self._final_char_logical_score - self._final_char_visual_score - if finalsub >= self.MIN_FINAL_CHAR_DISTANCE: - return self.LOGICAL_HEBREW_NAME - if finalsub <= -self.MIN_FINAL_CHAR_DISTANCE: - return self.VISUAL_HEBREW_NAME - - # It's not dominant enough, try to rely on the model scores instead. - modelsub = (self._logical_prober.get_confidence() - - self._visual_prober.get_confidence()) - if modelsub > self.MIN_MODEL_DISTANCE: - return self.LOGICAL_HEBREW_NAME - if modelsub < -self.MIN_MODEL_DISTANCE: - return self.VISUAL_HEBREW_NAME - - # Still no good, back to final letter distance, maybe it'll save the - # day. - if finalsub < 0.0: - return self.VISUAL_HEBREW_NAME - - # (finalsub > 0 - Logical) or (don't know what to do) default to - # Logical. - return self.LOGICAL_HEBREW_NAME - - @property - def language(self): - return 'Hebrew' - - @property - def state(self): - # Remain active as long as any of the model probers are active. - if (self._logical_prober.state == ProbingState.NOT_ME) and \ - (self._visual_prober.state == ProbingState.NOT_ME): - return ProbingState.NOT_ME - return ProbingState.DETECTING diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/hebrewprober.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/hebrewprober.pyc deleted file mode 100644 index 60d5558aeddad7b2637cdc5007784eede1171afe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4331 zcmd5<&2Jl35T9Lt#rblYk2Y<g6a>W}Qa3<L%6FQ$twpnm)+rU1s+HqiJDWIbXZIy( zN-Kd{@jn0(;=s8F4qQ3FjlZD>t{^_70yhNno40mMD{-xDzwylM+qd&(elu@2@nB@| z#g9j?*C_rZ`2SrV(d$fH{u$IH+A^qOkOA4Grb$}~sw7xWkY`ZcAU8>OiS7`6P)U-T zqH;dXxBCW@Jct@$vanta%br>ZTWemZ)x)fY><5jqswz)GaoJl7y*)jxYnRCvF7SxH zW#SRcVQVTT3}jQ-EIgUbO2L>)8dg*?<ff@IKyHRAS#k%cGDvQgDnsNBQe~LjA*zg! zJ4}^Pa!06=BX<-Vsf>}E6Xp=PW5SG+dq|iGa>s?4BzHoXDe?}JI|=>{8*@a&sg5`; z;^B^Xl<ac;2=BrF3FK#xUqF5Z`3>ZEkOv@tfcy#a7f6ap<HN~&mwvo?_nl~vrBZo$ zW^V56`I)&0p4;;Sx3w3|%)Wf~Yz=<LKtvaKMAw)o{uy+OEj4MwM8ptOmL2w<X4rw6 zVIOLS-KZJ%q-L_XWn-{&e_5hw<%jSDSQ+iKz0gL?)BqF5@dIBuj!Lp%wE|Bag|_Yo z)uvNpSUAmA!>_Rr)movarXRYx>qk4?i&)=jhu*G$#aZ*}e2Z4(aH+FYTX3dEp^F!Y zRahbPB2Q@$!l=k=*7N*NLZXPdLOb+#8Iy(GYFMbZnywc{g_}1D`>%v+!QSTVx$WT0 zx$xC<wYliVdG}^`hChvVVYSfq+cSO;scN%1qh^;H&I(jAoL!G26c(^&*HeXcfx0&9 zbbH^1DWCC(#+Z;XVPt#0-H5`k5>Xh-_(%A<4CjR@8cq$(aCQ)9ByeE)On?BQlX*PM zMxNRk5CqE3G7+!X$k;yc2w?pcj|k=wyphZrHS7hW>xsiG-0FDZmfp8ihz>L{(?-hJ z0I4`bwkVY;hKw#b0xJy|t$6%iP>0xN#;dc{a=j*F9ThaX2PJ|Cx74sf3<R_b4(*Z+ zN!kr@4<|iRHz71hjTCLB85}@_l}BPIK;UA@n!n<_H-E85S}HE}NY+(LQd`elDJr;C z3#;Y%#Zq1z4iE|2YJK2DAjpq&)%lwF*mqM0zQg{-ch4~MKfY@ud%cDbC_u|vwwGeJ z^@#9Wj|j)X#qs2o;(@1ZoC|&6DC8VFDrg1TS>Ld%oi&ux&O+{C+v2RhnE|FG)Qqo9 zlft72JM-ljYzB_T+XmhE0e)S){vF+BAj;{D>0iWf<YKm&pzywkDWPfH87lC}4L*rX zdd+k)wEekU9q5@On&bu_^fD)lIotOsct_^&`NoU$vmRZXHQJKSqk9(#^ybo7gb&HM zwxnshK-aLx!A@zlank6P=inSfQ)45!6!OwqUUim=YKqyq-&9`ctox01XKi13PAh2c zOZl~N`sr#c#ra8ysL%qN#o}slVYOsk>M3CWwyY7UP$4w6ov;sJ1c1~%&;6eNqmxYN z__&!dbLNOKY~~W<=D0DQm`>!36U+@8BS|^nU_WYyK<i6pG_*hsnq~;adC53SQFux& zCm3g)>Nd2=aCs{Zxxg<)8w?`7P$uT5HT<yZ0Bt5IY;_mX1#*CfHn~gqq`MHGCX63e zecDw?9W6`#S`D^TK6xbf!Lh24(@Q1G(Y0~m^1SUVmddO1)<RKD@U<(;mr4s<H7*w~ z*u`s(HO~MUXZ`!7^40&U<@l0*rol%+trgUL*9&T%oM>_np0l*PSiI7G#6u{Njw{+( zlhQ4R2@8Dy6;vGbL^$Ju>X!Ep%h3}|C^=^2jEpg6WD>(nV?H@-WHelmTNnZtAdaIH zheT3Nzf9;YVqTy0H4=bkHE8Tq8{RQCECS}qe6+`#W3^5J#=qjOJt0+WHb&t?N<E>B zKfHxu$CkW{>E7oA%TkW)r@*03*-ta+tCkN&o`6eG*C;V%OfdlR$C!^_CV&urnZTjy zpe5RAvS=e|Y`j<4NGluj?Maa1AgH-E5M`rPlpZfWfu&uspTngWK%NIV1p+wPfToT9 zOV?$o#?P`Sws0rLFFI=9ehCv!gTVTOj1um#y-omAAMuD_S=vk+k9<?<l<3XuAb*qm z9nHRxJDy9%%^(`MI5BnCX|qDV<9Wf(R;0m%=k&>*B`j}hP`r(JOXD(TjMe@Hwy(Tg diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/jisfreq.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/jisfreq.py deleted file mode 100644 index 83fc082..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/jisfreq.py +++ /dev/null @@ -1,325 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# Sampling from about 20M text materials include literature and computer technology -# -# Japanese frequency table, applied to both S-JIS and EUC-JP -# They are sorted in order. - -# 128 --> 0.77094 -# 256 --> 0.85710 -# 512 --> 0.92635 -# 1024 --> 0.97130 -# 2048 --> 0.99431 -# -# Ideal Distribution Ratio = 0.92635 / (1-0.92635) = 12.58 -# Random Distribution Ration = 512 / (2965+62+83+86-512) = 0.191 -# -# Typical Distribution Ratio, 25% of IDR - -JIS_TYPICAL_DISTRIBUTION_RATIO = 3.0 - -# Char to FreqOrder table , -JIS_TABLE_SIZE = 4368 - -JIS_CHAR_TO_FREQ_ORDER = ( - 40, 1, 6, 182, 152, 180, 295,2127, 285, 381,3295,4304,3068,4606,3165,3510, # 16 -3511,1822,2785,4607,1193,2226,5070,4608, 171,2996,1247, 18, 179,5071, 856,1661, # 32 -1262,5072, 619, 127,3431,3512,3230,1899,1700, 232, 228,1294,1298, 284, 283,2041, # 48 -2042,1061,1062, 48, 49, 44, 45, 433, 434,1040,1041, 996, 787,2997,1255,4305, # 64 -2108,4609,1684,1648,5073,5074,5075,5076,5077,5078,3687,5079,4610,5080,3927,3928, # 80 -5081,3296,3432, 290,2285,1471,2187,5082,2580,2825,1303,2140,1739,1445,2691,3375, # 96 -1691,3297,4306,4307,4611, 452,3376,1182,2713,3688,3069,4308,5083,5084,5085,5086, # 112 -5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102, # 128 -5103,5104,5105,5106,5107,5108,5109,5110,5111,5112,4097,5113,5114,5115,5116,5117, # 144 -5118,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133, # 160 -5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149, # 176 -5150,5151,5152,4612,5153,5154,5155,5156,5157,5158,5159,5160,5161,5162,5163,5164, # 192 -5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,1472, 598, 618, 820,1205, # 208 -1309,1412,1858,1307,1692,5176,5177,5178,5179,5180,5181,5182,1142,1452,1234,1172, # 224 -1875,2043,2149,1793,1382,2973, 925,2404,1067,1241, 960,1377,2935,1491, 919,1217, # 240 -1865,2030,1406,1499,2749,4098,5183,5184,5185,5186,5187,5188,2561,4099,3117,1804, # 256 -2049,3689,4309,3513,1663,5189,3166,3118,3298,1587,1561,3433,5190,3119,1625,2998, # 272 -3299,4613,1766,3690,2786,4614,5191,5192,5193,5194,2161, 26,3377, 2,3929, 20, # 288 -3691, 47,4100, 50, 17, 16, 35, 268, 27, 243, 42, 155, 24, 154, 29, 184, # 304 - 4, 91, 14, 92, 53, 396, 33, 289, 9, 37, 64, 620, 21, 39, 321, 5, # 320 - 12, 11, 52, 13, 3, 208, 138, 0, 7, 60, 526, 141, 151,1069, 181, 275, # 336 -1591, 83, 132,1475, 126, 331, 829, 15, 69, 160, 59, 22, 157, 55,1079, 312, # 352 - 109, 38, 23, 25, 10, 19, 79,5195, 61, 382,1124, 8, 30,5196,5197,5198, # 368 -5199,5200,5201,5202,5203,5204,5205,5206, 89, 62, 74, 34,2416, 112, 139, 196, # 384 - 271, 149, 84, 607, 131, 765, 46, 88, 153, 683, 76, 874, 101, 258, 57, 80, # 400 - 32, 364, 121,1508, 169,1547, 68, 235, 145,2999, 41, 360,3027, 70, 63, 31, # 416 - 43, 259, 262,1383, 99, 533, 194, 66, 93, 846, 217, 192, 56, 106, 58, 565, # 432 - 280, 272, 311, 256, 146, 82, 308, 71, 100, 128, 214, 655, 110, 261, 104,1140, # 448 - 54, 51, 36, 87, 67,3070, 185,2618,2936,2020, 28,1066,2390,2059,5207,5208, # 464 -5209,5210,5211,5212,5213,5214,5215,5216,4615,5217,5218,5219,5220,5221,5222,5223, # 480 -5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,3514,5237,5238, # 496 -5239,5240,5241,5242,5243,5244,2297,2031,4616,4310,3692,5245,3071,5246,3598,5247, # 512 -4617,3231,3515,5248,4101,4311,4618,3808,4312,4102,5249,4103,4104,3599,5250,5251, # 528 -5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265,5266,5267, # 544 -5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,5279,5280,5281,5282,5283, # 560 -5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299, # 576 -5300,5301,5302,5303,5304,5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315, # 592 -5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331, # 608 -5332,5333,5334,5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347, # 624 -5348,5349,5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363, # 640 -5364,5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379, # 656 -5380,5381, 363, 642,2787,2878,2788,2789,2316,3232,2317,3434,2011, 165,1942,3930, # 672 -3931,3932,3933,5382,4619,5383,4620,5384,5385,5386,5387,5388,5389,5390,5391,5392, # 688 -5393,5394,5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408, # 704 -5409,5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424, # 720 -5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,5440, # 736 -5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456, # 752 -5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472, # 768 -5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487,5488, # 784 -5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504, # 800 -5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520, # 816 -5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536, # 832 -5537,5538,5539,5540,5541,5542,5543,5544,5545,5546,5547,5548,5549,5550,5551,5552, # 848 -5553,5554,5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568, # 864 -5569,5570,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584, # 880 -5585,5586,5587,5588,5589,5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600, # 896 -5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616, # 912 -5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632, # 928 -5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648, # 944 -5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664, # 960 -5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680, # 976 -5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696, # 992 -5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712, # 1008 -5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728, # 1024 -5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5741,5742,5743,5744, # 1040 -5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5760, # 1056 -5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775,5776, # 1072 -5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5787,5788,5789,5790,5791,5792, # 1088 -5793,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803,5804,5805,5806,5807,5808, # 1104 -5809,5810,5811,5812,5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824, # 1120 -5825,5826,5827,5828,5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840, # 1136 -5841,5842,5843,5844,5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856, # 1152 -5857,5858,5859,5860,5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872, # 1168 -5873,5874,5875,5876,5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888, # 1184 -5889,5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904, # 1200 -5905,5906,5907,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, # 1216 -5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936, # 1232 -5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952, # 1248 -5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968, # 1264 -5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984, # 1280 -5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000, # 1296 -6001,6002,6003,6004,6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016, # 1312 -6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032, # 1328 -6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048, # 1344 -6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064, # 1360 -6065,6066,6067,6068,6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080, # 1376 -6081,6082,6083,6084,6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096, # 1392 -6097,6098,6099,6100,6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112, # 1408 -6113,6114,2044,2060,4621, 997,1235, 473,1186,4622, 920,3378,6115,6116, 379,1108, # 1424 -4313,2657,2735,3934,6117,3809, 636,3233, 573,1026,3693,3435,2974,3300,2298,4105, # 1440 - 854,2937,2463, 393,2581,2417, 539, 752,1280,2750,2480, 140,1161, 440, 708,1569, # 1456 - 665,2497,1746,1291,1523,3000, 164,1603, 847,1331, 537,1997, 486, 508,1693,2418, # 1472 -1970,2227, 878,1220, 299,1030, 969, 652,2751, 624,1137,3301,2619, 65,3302,2045, # 1488 -1761,1859,3120,1930,3694,3516, 663,1767, 852, 835,3695, 269, 767,2826,2339,1305, # 1504 - 896,1150, 770,1616,6118, 506,1502,2075,1012,2519, 775,2520,2975,2340,2938,4314, # 1520 -3028,2086,1224,1943,2286,6119,3072,4315,2240,1273,1987,3935,1557, 175, 597, 985, # 1536 -3517,2419,2521,1416,3029, 585, 938,1931,1007,1052,1932,1685,6120,3379,4316,4623, # 1552 - 804, 599,3121,1333,2128,2539,1159,1554,2032,3810, 687,2033,2904, 952, 675,1467, # 1568 -3436,6121,2241,1096,1786,2440,1543,1924, 980,1813,2228, 781,2692,1879, 728,1918, # 1584 -3696,4624, 548,1950,4625,1809,1088,1356,3303,2522,1944, 502, 972, 373, 513,2827, # 1600 - 586,2377,2391,1003,1976,1631,6122,2464,1084, 648,1776,4626,2141, 324, 962,2012, # 1616 -2177,2076,1384, 742,2178,1448,1173,1810, 222, 102, 301, 445, 125,2420, 662,2498, # 1632 - 277, 200,1476,1165,1068, 224,2562,1378,1446, 450,1880, 659, 791, 582,4627,2939, # 1648 -3936,1516,1274, 555,2099,3697,1020,1389,1526,3380,1762,1723,1787,2229, 412,2114, # 1664 -1900,2392,3518, 512,2597, 427,1925,2341,3122,1653,1686,2465,2499, 697, 330, 273, # 1680 - 380,2162, 951, 832, 780, 991,1301,3073, 965,2270,3519, 668,2523,2636,1286, 535, # 1696 -1407, 518, 671, 957,2658,2378, 267, 611,2197,3030,6123, 248,2299, 967,1799,2356, # 1712 - 850,1418,3437,1876,1256,1480,2828,1718,6124,6125,1755,1664,2405,6126,4628,2879, # 1728 -2829, 499,2179, 676,4629, 557,2329,2214,2090, 325,3234, 464, 811,3001, 992,2342, # 1744 -2481,1232,1469, 303,2242, 466,1070,2163, 603,1777,2091,4630,2752,4631,2714, 322, # 1760 -2659,1964,1768, 481,2188,1463,2330,2857,3600,2092,3031,2421,4632,2318,2070,1849, # 1776 -2598,4633,1302,2254,1668,1701,2422,3811,2905,3032,3123,2046,4106,1763,1694,4634, # 1792 -1604, 943,1724,1454, 917, 868,2215,1169,2940, 552,1145,1800,1228,1823,1955, 316, # 1808 -1080,2510, 361,1807,2830,4107,2660,3381,1346,1423,1134,4108,6127, 541,1263,1229, # 1824 -1148,2540, 545, 465,1833,2880,3438,1901,3074,2482, 816,3937, 713,1788,2500, 122, # 1840 -1575, 195,1451,2501,1111,6128, 859, 374,1225,2243,2483,4317, 390,1033,3439,3075, # 1856 -2524,1687, 266, 793,1440,2599, 946, 779, 802, 507, 897,1081, 528,2189,1292, 711, # 1872 -1866,1725,1167,1640, 753, 398,2661,1053, 246, 348,4318, 137,1024,3440,1600,2077, # 1888 -2129, 825,4319, 698, 238, 521, 187,2300,1157,2423,1641,1605,1464,1610,1097,2541, # 1904 -1260,1436, 759,2255,1814,2150, 705,3235, 409,2563,3304, 561,3033,2005,2564, 726, # 1920 -1956,2343,3698,4109, 949,3812,3813,3520,1669, 653,1379,2525, 881,2198, 632,2256, # 1936 -1027, 778,1074, 733,1957, 514,1481,2466, 554,2180, 702,3938,1606,1017,1398,6129, # 1952 -1380,3521, 921, 993,1313, 594, 449,1489,1617,1166, 768,1426,1360, 495,1794,3601, # 1968 -1177,3602,1170,4320,2344, 476, 425,3167,4635,3168,1424, 401,2662,1171,3382,1998, # 1984 -1089,4110, 477,3169, 474,6130,1909, 596,2831,1842, 494, 693,1051,1028,1207,3076, # 2000 - 606,2115, 727,2790,1473,1115, 743,3522, 630, 805,1532,4321,2021, 366,1057, 838, # 2016 - 684,1114,2142,4322,2050,1492,1892,1808,2271,3814,2424,1971,1447,1373,3305,1090, # 2032 -1536,3939,3523,3306,1455,2199, 336, 369,2331,1035, 584,2393, 902, 718,2600,6131, # 2048 -2753, 463,2151,1149,1611,2467, 715,1308,3124,1268, 343,1413,3236,1517,1347,2663, # 2064 -2093,3940,2022,1131,1553,2100,2941,1427,3441,2942,1323,2484,6132,1980, 872,2368, # 2080 -2441,2943, 320,2369,2116,1082, 679,1933,3941,2791,3815, 625,1143,2023, 422,2200, # 2096 -3816,6133, 730,1695, 356,2257,1626,2301,2858,2637,1627,1778, 937, 883,2906,2693, # 2112 -3002,1769,1086, 400,1063,1325,3307,2792,4111,3077, 456,2345,1046, 747,6134,1524, # 2128 - 884,1094,3383,1474,2164,1059, 974,1688,2181,2258,1047, 345,1665,1187, 358, 875, # 2144 -3170, 305, 660,3524,2190,1334,1135,3171,1540,1649,2542,1527, 927, 968,2793, 885, # 2160 -1972,1850, 482, 500,2638,1218,1109,1085,2543,1654,2034, 876, 78,2287,1482,1277, # 2176 - 861,1675,1083,1779, 724,2754, 454, 397,1132,1612,2332, 893, 672,1237, 257,2259, # 2192 -2370, 135,3384, 337,2244, 547, 352, 340, 709,2485,1400, 788,1138,2511, 540, 772, # 2208 -1682,2260,2272,2544,2013,1843,1902,4636,1999,1562,2288,4637,2201,1403,1533, 407, # 2224 - 576,3308,1254,2071, 978,3385, 170, 136,1201,3125,2664,3172,2394, 213, 912, 873, # 2240 -3603,1713,2202, 699,3604,3699, 813,3442, 493, 531,1054, 468,2907,1483, 304, 281, # 2256 -4112,1726,1252,2094, 339,2319,2130,2639, 756,1563,2944, 748, 571,2976,1588,2425, # 2272 -2715,1851,1460,2426,1528,1392,1973,3237, 288,3309, 685,3386, 296, 892,2716,2216, # 2288 -1570,2245, 722,1747,2217, 905,3238,1103,6135,1893,1441,1965, 251,1805,2371,3700, # 2304 -2601,1919,1078, 75,2182,1509,1592,1270,2640,4638,2152,6136,3310,3817, 524, 706, # 2320 -1075, 292,3818,1756,2602, 317, 98,3173,3605,3525,1844,2218,3819,2502, 814, 567, # 2336 - 385,2908,1534,6137, 534,1642,3239, 797,6138,1670,1529, 953,4323, 188,1071, 538, # 2352 - 178, 729,3240,2109,1226,1374,2000,2357,2977, 731,2468,1116,2014,2051,6139,1261, # 2368 -1593, 803,2859,2736,3443, 556, 682, 823,1541,6140,1369,2289,1706,2794, 845, 462, # 2384 -2603,2665,1361, 387, 162,2358,1740, 739,1770,1720,1304,1401,3241,1049, 627,1571, # 2400 -2427,3526,1877,3942,1852,1500, 431,1910,1503, 677, 297,2795, 286,1433,1038,1198, # 2416 -2290,1133,1596,4113,4639,2469,1510,1484,3943,6141,2442, 108, 712,4640,2372, 866, # 2432 -3701,2755,3242,1348, 834,1945,1408,3527,2395,3243,1811, 824, 994,1179,2110,1548, # 2448 -1453, 790,3003, 690,4324,4325,2832,2909,3820,1860,3821, 225,1748, 310, 346,1780, # 2464 -2470, 821,1993,2717,2796, 828, 877,3528,2860,2471,1702,2165,2910,2486,1789, 453, # 2480 - 359,2291,1676, 73,1164,1461,1127,3311, 421, 604, 314,1037, 589, 116,2487, 737, # 2496 - 837,1180, 111, 244, 735,6142,2261,1861,1362, 986, 523, 418, 581,2666,3822, 103, # 2512 - 855, 503,1414,1867,2488,1091, 657,1597, 979, 605,1316,4641,1021,2443,2078,2001, # 2528 -1209, 96, 587,2166,1032, 260,1072,2153, 173, 94, 226,3244, 819,2006,4642,4114, # 2544 -2203, 231,1744, 782, 97,2667, 786,3387, 887, 391, 442,2219,4326,1425,6143,2694, # 2560 - 633,1544,1202, 483,2015, 592,2052,1958,2472,1655, 419, 129,4327,3444,3312,1714, # 2576 -1257,3078,4328,1518,1098, 865,1310,1019,1885,1512,1734, 469,2444, 148, 773, 436, # 2592 -1815,1868,1128,1055,4329,1245,2756,3445,2154,1934,1039,4643, 579,1238, 932,2320, # 2608 - 353, 205, 801, 115,2428, 944,2321,1881, 399,2565,1211, 678, 766,3944, 335,2101, # 2624 -1459,1781,1402,3945,2737,2131,1010, 844, 981,1326,1013, 550,1816,1545,2620,1335, # 2640 -1008, 371,2881, 936,1419,1613,3529,1456,1395,2273,1834,2604,1317,2738,2503, 416, # 2656 -1643,4330, 806,1126, 229, 591,3946,1314,1981,1576,1837,1666, 347,1790, 977,3313, # 2672 - 764,2861,1853, 688,2429,1920,1462, 77, 595, 415,2002,3034, 798,1192,4115,6144, # 2688 -2978,4331,3035,2695,2582,2072,2566, 430,2430,1727, 842,1396,3947,3702, 613, 377, # 2704 - 278, 236,1417,3388,3314,3174, 757,1869, 107,3530,6145,1194, 623,2262, 207,1253, # 2720 -2167,3446,3948, 492,1117,1935, 536,1838,2757,1246,4332, 696,2095,2406,1393,1572, # 2736 -3175,1782, 583, 190, 253,1390,2230, 830,3126,3389, 934,3245,1703,1749,2979,1870, # 2752 -2545,1656,2204, 869,2346,4116,3176,1817, 496,1764,4644, 942,1504, 404,1903,1122, # 2768 -1580,3606,2945,1022, 515, 372,1735, 955,2431,3036,6146,2797,1110,2302,2798, 617, # 2784 -6147, 441, 762,1771,3447,3607,3608,1904, 840,3037, 86, 939,1385, 572,1370,2445, # 2800 -1336, 114,3703, 898, 294, 203,3315, 703,1583,2274, 429, 961,4333,1854,1951,3390, # 2816 -2373,3704,4334,1318,1381, 966,1911,2322,1006,1155, 309, 989, 458,2718,1795,1372, # 2832 -1203, 252,1689,1363,3177, 517,1936, 168,1490, 562, 193,3823,1042,4117,1835, 551, # 2848 - 470,4645, 395, 489,3448,1871,1465,2583,2641, 417,1493, 279,1295, 511,1236,1119, # 2864 - 72,1231,1982,1812,3004, 871,1564, 984,3449,1667,2696,2096,4646,2347,2833,1673, # 2880 -3609, 695,3246,2668, 807,1183,4647, 890, 388,2333,1801,1457,2911,1765,1477,1031, # 2896 -3316,3317,1278,3391,2799,2292,2526, 163,3450,4335,2669,1404,1802,6148,2323,2407, # 2912 -1584,1728,1494,1824,1269, 298, 909,3318,1034,1632, 375, 776,1683,2061, 291, 210, # 2928 -1123, 809,1249,1002,2642,3038, 206,1011,2132, 144, 975, 882,1565, 342, 667, 754, # 2944 -1442,2143,1299,2303,2062, 447, 626,2205,1221,2739,2912,1144,1214,2206,2584, 760, # 2960 -1715, 614, 950,1281,2670,2621, 810, 577,1287,2546,4648, 242,2168, 250,2643, 691, # 2976 - 123,2644, 647, 313,1029, 689,1357,2946,1650, 216, 771,1339,1306, 808,2063, 549, # 2992 - 913,1371,2913,2914,6149,1466,1092,1174,1196,1311,2605,2396,1783,1796,3079, 406, # 3008 -2671,2117,3949,4649, 487,1825,2220,6150,2915, 448,2348,1073,6151,2397,1707, 130, # 3024 - 900,1598, 329, 176,1959,2527,1620,6152,2275,4336,3319,1983,2191,3705,3610,2155, # 3040 -3706,1912,1513,1614,6153,1988, 646, 392,2304,1589,3320,3039,1826,1239,1352,1340, # 3056 -2916, 505,2567,1709,1437,2408,2547, 906,6154,2672, 384,1458,1594,1100,1329, 710, # 3072 - 423,3531,2064,2231,2622,1989,2673,1087,1882, 333, 841,3005,1296,2882,2379, 580, # 3088 -1937,1827,1293,2585, 601, 574, 249,1772,4118,2079,1120, 645, 901,1176,1690, 795, # 3104 -2207, 478,1434, 516,1190,1530, 761,2080, 930,1264, 355, 435,1552, 644,1791, 987, # 3120 - 220,1364,1163,1121,1538, 306,2169,1327,1222, 546,2645, 218, 241, 610,1704,3321, # 3136 -1984,1839,1966,2528, 451,6155,2586,3707,2568, 907,3178, 254,2947, 186,1845,4650, # 3152 - 745, 432,1757, 428,1633, 888,2246,2221,2489,3611,2118,1258,1265, 956,3127,1784, # 3168 -4337,2490, 319, 510, 119, 457,3612, 274,2035,2007,4651,1409,3128, 970,2758, 590, # 3184 -2800, 661,2247,4652,2008,3950,1420,1549,3080,3322,3951,1651,1375,2111, 485,2491, # 3200 -1429,1156,6156,2548,2183,1495, 831,1840,2529,2446, 501,1657, 307,1894,3247,1341, # 3216 - 666, 899,2156,1539,2549,1559, 886, 349,2208,3081,2305,1736,3824,2170,2759,1014, # 3232 -1913,1386, 542,1397,2948, 490, 368, 716, 362, 159, 282,2569,1129,1658,1288,1750, # 3248 -2674, 276, 649,2016, 751,1496, 658,1818,1284,1862,2209,2087,2512,3451, 622,2834, # 3264 - 376, 117,1060,2053,1208,1721,1101,1443, 247,1250,3179,1792,3952,2760,2398,3953, # 3280 -6157,2144,3708, 446,2432,1151,2570,3452,2447,2761,2835,1210,2448,3082, 424,2222, # 3296 -1251,2449,2119,2836, 504,1581,4338, 602, 817, 857,3825,2349,2306, 357,3826,1470, # 3312 -1883,2883, 255, 958, 929,2917,3248, 302,4653,1050,1271,1751,2307,1952,1430,2697, # 3328 -2719,2359, 354,3180, 777, 158,2036,4339,1659,4340,4654,2308,2949,2248,1146,2232, # 3344 -3532,2720,1696,2623,3827,6158,3129,1550,2698,1485,1297,1428, 637, 931,2721,2145, # 3360 - 914,2550,2587, 81,2450, 612, 827,2646,1242,4655,1118,2884, 472,1855,3181,3533, # 3376 -3534, 569,1353,2699,1244,1758,2588,4119,2009,2762,2171,3709,1312,1531,6159,1152, # 3392 -1938, 134,1830, 471,3710,2276,1112,1535,3323,3453,3535, 982,1337,2950, 488, 826, # 3408 - 674,1058,1628,4120,2017, 522,2399, 211, 568,1367,3454, 350, 293,1872,1139,3249, # 3424 -1399,1946,3006,1300,2360,3324, 588, 736,6160,2606, 744, 669,3536,3828,6161,1358, # 3440 - 199, 723, 848, 933, 851,1939,1505,1514,1338,1618,1831,4656,1634,3613, 443,2740, # 3456 -3829, 717,1947, 491,1914,6162,2551,1542,4121,1025,6163,1099,1223, 198,3040,2722, # 3472 - 370, 410,1905,2589, 998,1248,3182,2380, 519,1449,4122,1710, 947, 928,1153,4341, # 3488 -2277, 344,2624,1511, 615, 105, 161,1212,1076,1960,3130,2054,1926,1175,1906,2473, # 3504 - 414,1873,2801,6164,2309, 315,1319,3325, 318,2018,2146,2157, 963, 631, 223,4342, # 3520 -4343,2675, 479,3711,1197,2625,3712,2676,2361,6165,4344,4123,6166,2451,3183,1886, # 3536 -2184,1674,1330,1711,1635,1506, 799, 219,3250,3083,3954,1677,3713,3326,2081,3614, # 3552 -1652,2073,4657,1147,3041,1752, 643,1961, 147,1974,3955,6167,1716,2037, 918,3007, # 3568 -1994, 120,1537, 118, 609,3184,4345, 740,3455,1219, 332,1615,3830,6168,1621,2980, # 3584 -1582, 783, 212, 553,2350,3714,1349,2433,2082,4124, 889,6169,2310,1275,1410, 973, # 3600 - 166,1320,3456,1797,1215,3185,2885,1846,2590,2763,4658, 629, 822,3008, 763, 940, # 3616 -1990,2862, 439,2409,1566,1240,1622, 926,1282,1907,2764, 654,2210,1607, 327,1130, # 3632 -3956,1678,1623,6170,2434,2192, 686, 608,3831,3715, 903,3957,3042,6171,2741,1522, # 3648 -1915,1105,1555,2552,1359, 323,3251,4346,3457, 738,1354,2553,2311,2334,1828,2003, # 3664 -3832,1753,2351,1227,6172,1887,4125,1478,6173,2410,1874,1712,1847, 520,1204,2607, # 3680 - 264,4659, 836,2677,2102, 600,4660,3833,2278,3084,6174,4347,3615,1342, 640, 532, # 3696 - 543,2608,1888,2400,2591,1009,4348,1497, 341,1737,3616,2723,1394, 529,3252,1321, # 3712 - 983,4661,1515,2120, 971,2592, 924, 287,1662,3186,4349,2700,4350,1519, 908,1948, # 3728 -2452, 156, 796,1629,1486,2223,2055, 694,4126,1259,1036,3392,1213,2249,2742,1889, # 3744 -1230,3958,1015, 910, 408, 559,3617,4662, 746, 725, 935,4663,3959,3009,1289, 563, # 3760 - 867,4664,3960,1567,2981,2038,2626, 988,2263,2381,4351, 143,2374, 704,1895,6175, # 3776 -1188,3716,2088, 673,3085,2362,4352, 484,1608,1921,2765,2918, 215, 904,3618,3537, # 3792 - 894, 509, 976,3043,2701,3961,4353,2837,2982, 498,6176,6177,1102,3538,1332,3393, # 3808 -1487,1636,1637, 233, 245,3962, 383, 650, 995,3044, 460,1520,1206,2352, 749,3327, # 3824 - 530, 700, 389,1438,1560,1773,3963,2264, 719,2951,2724,3834, 870,1832,1644,1000, # 3840 - 839,2474,3717, 197,1630,3394, 365,2886,3964,1285,2133, 734, 922, 818,1106, 732, # 3856 - 480,2083,1774,3458, 923,2279,1350, 221,3086, 85,2233,2234,3835,1585,3010,2147, # 3872 -1387,1705,2382,1619,2475, 133, 239,2802,1991,1016,2084,2383, 411,2838,1113, 651, # 3888 -1985,1160,3328, 990,1863,3087,1048,1276,2647, 265,2627,1599,3253,2056, 150, 638, # 3904 -2019, 656, 853, 326,1479, 680,1439,4354,1001,1759, 413,3459,3395,2492,1431, 459, # 3920 -4355,1125,3329,2265,1953,1450,2065,2863, 849, 351,2678,3131,3254,3255,1104,1577, # 3936 - 227,1351,1645,2453,2193,1421,2887, 812,2121, 634, 95,2435, 201,2312,4665,1646, # 3952 -1671,2743,1601,2554,2702,2648,2280,1315,1366,2089,3132,1573,3718,3965,1729,1189, # 3968 - 328,2679,1077,1940,1136, 558,1283, 964,1195, 621,2074,1199,1743,3460,3619,1896, # 3984 -1916,1890,3836,2952,1154,2112,1064, 862, 378,3011,2066,2113,2803,1568,2839,6178, # 4000 -3088,2919,1941,1660,2004,1992,2194, 142, 707,1590,1708,1624,1922,1023,1836,1233, # 4016 -1004,2313, 789, 741,3620,6179,1609,2411,1200,4127,3719,3720,4666,2057,3721, 593, # 4032 -2840, 367,2920,1878,6180,3461,1521, 628,1168, 692,2211,2649, 300, 720,2067,2571, # 4048 -2953,3396, 959,2504,3966,3539,3462,1977, 701,6181, 954,1043, 800, 681, 183,3722, # 4064 -1803,1730,3540,4128,2103, 815,2314, 174, 467, 230,2454,1093,2134, 755,3541,3397, # 4080 -1141,1162,6182,1738,2039, 270,3256,2513,1005,1647,2185,3837, 858,1679,1897,1719, # 4096 -2954,2324,1806, 402, 670, 167,4129,1498,2158,2104, 750,6183, 915, 189,1680,1551, # 4112 - 455,4356,1501,2455, 405,1095,2955, 338,1586,1266,1819, 570, 641,1324, 237,1556, # 4128 -2650,1388,3723,6184,1368,2384,1343,1978,3089,2436, 879,3724, 792,1191, 758,3012, # 4144 -1411,2135,1322,4357, 240,4667,1848,3725,1574,6185, 420,3045,1546,1391, 714,4358, # 4160 -1967, 941,1864, 863, 664, 426, 560,1731,2680,1785,2864,1949,2363, 403,3330,1415, # 4176 -1279,2136,1697,2335, 204, 721,2097,3838, 90,6186,2085,2505, 191,3967, 124,2148, # 4192 -1376,1798,1178,1107,1898,1405, 860,4359,1243,1272,2375,2983,1558,2456,1638, 113, # 4208 -3621, 578,1923,2609, 880, 386,4130, 784,2186,2266,1422,2956,2172,1722, 497, 263, # 4224 -2514,1267,2412,2610, 177,2703,3542, 774,1927,1344, 616,1432,1595,1018, 172,4360, # 4240 -2325, 911,4361, 438,1468,3622, 794,3968,2024,2173,1681,1829,2957, 945, 895,3090, # 4256 - 575,2212,2476, 475,2401,2681, 785,2744,1745,2293,2555,1975,3133,2865, 394,4668, # 4272 -3839, 635,4131, 639, 202,1507,2195,2766,1345,1435,2572,3726,1908,1184,1181,2457, # 4288 -3727,3134,4362, 843,2611, 437, 916,4669, 234, 769,1884,3046,3047,3623, 833,6187, # 4304 -1639,2250,2402,1355,1185,2010,2047, 999, 525,1732,1290,1488,2612, 948,1578,3728, # 4320 -2413,2477,1216,2725,2159, 334,3840,1328,3624,2921,1525,4132, 564,1056, 891,4363, # 4336 -1444,1698,2385,2251,3729,1365,2281,2235,1717,6188, 864,3841,2515, 444, 527,2767, # 4352 -2922,3625, 544, 461,6189, 566, 209,2437,3398,2098,1065,2068,3331,3626,3257,2137, # 4368 #last 512 -) - - diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/jisfreq.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/jisfreq.pyc deleted file mode 100644 index 921af95d3a24888d1ddcb5d6ee30e9a1851e38d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44543 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 J;Qze?{{woSV}}3$ diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/jpcntx.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/jpcntx.py deleted file mode 100644 index 20044e4..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/jpcntx.py +++ /dev/null @@ -1,233 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - - -# This is hiragana 2-char sequence table, the number in each cell represents its frequency category -jp2CharContext = ( -(0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1), -(2,4,0,4,0,3,0,4,0,3,4,4,4,2,4,3,3,4,3,2,3,3,4,2,3,3,3,2,4,1,4,3,3,1,5,4,3,4,3,4,3,5,3,0,3,5,4,2,0,3,1,0,3,3,0,3,3,0,1,1,0,4,3,0,3,3,0,4,0,2,0,3,5,5,5,5,4,0,4,1,0,3,4), -(0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2), -(0,4,0,5,0,5,0,4,0,4,5,4,4,3,5,3,5,1,5,3,4,3,4,4,3,4,3,3,4,3,5,4,4,3,5,5,3,5,5,5,3,5,5,3,4,5,5,3,1,3,2,0,3,4,0,4,2,0,4,2,1,5,3,2,3,5,0,4,0,2,0,5,4,4,5,4,5,0,4,0,0,4,4), -(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), -(0,3,0,4,0,3,0,3,0,4,5,4,3,3,3,3,4,3,5,4,4,3,5,4,4,3,4,3,4,4,4,4,5,3,4,4,3,4,5,5,4,5,5,1,4,5,4,3,0,3,3,1,3,3,0,4,4,0,3,3,1,5,3,3,3,5,0,4,0,3,0,4,4,3,4,3,3,0,4,1,1,3,4), -(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), -(0,4,0,3,0,3,0,4,0,3,4,4,3,2,2,1,2,1,3,1,3,3,3,3,3,4,3,1,3,3,5,3,3,0,4,3,0,5,4,3,3,5,4,4,3,4,4,5,0,1,2,0,1,2,0,2,2,0,1,0,0,5,2,2,1,4,0,3,0,1,0,4,4,3,5,4,3,0,2,1,0,4,3), -(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), -(0,3,0,5,0,4,0,2,1,4,4,2,4,1,4,2,4,2,4,3,3,3,4,3,3,3,3,1,4,2,3,3,3,1,4,4,1,1,1,4,3,3,2,0,2,4,3,2,0,3,3,0,3,1,1,0,0,0,3,3,0,4,2,2,3,4,0,4,0,3,0,4,4,5,3,4,4,0,3,0,0,1,4), -(1,4,0,4,0,4,0,4,0,3,5,4,4,3,4,3,5,4,3,3,4,3,5,4,4,4,4,3,4,2,4,3,3,1,5,4,3,2,4,5,4,5,5,4,4,5,4,4,0,3,2,2,3,3,0,4,3,1,3,2,1,4,3,3,4,5,0,3,0,2,0,4,5,5,4,5,4,0,4,0,0,5,4), -(0,5,0,5,0,4,0,3,0,4,4,3,4,3,3,3,4,0,4,4,4,3,4,3,4,3,3,1,4,2,4,3,4,0,5,4,1,4,5,4,4,5,3,2,4,3,4,3,2,4,1,3,3,3,2,3,2,0,4,3,3,4,3,3,3,4,0,4,0,3,0,4,5,4,4,4,3,0,4,1,0,1,3), -(0,3,1,4,0,3,0,2,0,3,4,4,3,1,4,2,3,3,4,3,4,3,4,3,4,4,3,2,3,1,5,4,4,1,4,4,3,5,4,4,3,5,5,4,3,4,4,3,1,2,3,1,2,2,0,3,2,0,3,1,0,5,3,3,3,4,3,3,3,3,4,4,4,4,5,4,2,0,3,3,2,4,3), -(0,2,0,3,0,1,0,1,0,0,3,2,0,0,2,0,1,0,2,1,3,3,3,1,2,3,1,0,1,0,4,2,1,1,3,3,0,4,3,3,1,4,3,3,0,3,3,2,0,0,0,0,1,0,0,2,0,0,0,0,0,4,1,0,2,3,2,2,2,1,3,3,3,4,4,3,2,0,3,1,0,3,3), -(0,4,0,4,0,3,0,3,0,4,4,4,3,3,3,3,3,3,4,3,4,2,4,3,4,3,3,2,4,3,4,5,4,1,4,5,3,5,4,5,3,5,4,0,3,5,5,3,1,3,3,2,2,3,0,3,4,1,3,3,2,4,3,3,3,4,0,4,0,3,0,4,5,4,4,5,3,0,4,1,0,3,4), -(0,2,0,3,0,3,0,0,0,2,2,2,1,0,1,0,0,0,3,0,3,0,3,0,1,3,1,0,3,1,3,3,3,1,3,3,3,0,1,3,1,3,4,0,0,3,1,1,0,3,2,0,0,0,0,1,3,0,1,0,0,3,3,2,0,3,0,0,0,0,0,3,4,3,4,3,3,0,3,0,0,2,3), -(2,3,0,3,0,2,0,1,0,3,3,4,3,1,3,1,1,1,3,1,4,3,4,3,3,3,0,0,3,1,5,4,3,1,4,3,2,5,5,4,4,4,4,3,3,4,4,4,0,2,1,1,3,2,0,1,2,0,0,1,0,4,1,3,3,3,0,3,0,1,0,4,4,4,5,5,3,0,2,0,0,4,4), -(0,2,0,1,0,3,1,3,0,2,3,3,3,0,3,1,0,0,3,0,3,2,3,1,3,2,1,1,0,0,4,2,1,0,2,3,1,4,3,2,0,4,4,3,1,3,1,3,0,1,0,0,1,0,0,0,1,0,0,0,0,4,1,1,1,2,0,3,0,0,0,3,4,2,4,3,2,0,1,0,0,3,3), -(0,1,0,4,0,5,0,4,0,2,4,4,2,3,3,2,3,3,5,3,3,3,4,3,4,2,3,0,4,3,3,3,4,1,4,3,2,1,5,5,3,4,5,1,3,5,4,2,0,3,3,0,1,3,0,4,2,0,1,3,1,4,3,3,3,3,0,3,0,1,0,3,4,4,4,5,5,0,3,0,1,4,5), -(0,2,0,3,0,3,0,0,0,2,3,1,3,0,4,0,1,1,3,0,3,4,3,2,3,1,0,3,3,2,3,1,3,0,2,3,0,2,1,4,1,2,2,0,0,3,3,0,0,2,0,0,0,1,0,0,0,0,2,2,0,3,2,1,3,3,0,2,0,2,0,0,3,3,1,2,4,0,3,0,2,2,3), -(2,4,0,5,0,4,0,4,0,2,4,4,4,3,4,3,3,3,1,2,4,3,4,3,4,4,5,0,3,3,3,3,2,0,4,3,1,4,3,4,1,4,4,3,3,4,4,3,1,2,3,0,4,2,0,4,1,0,3,3,0,4,3,3,3,4,0,4,0,2,0,3,5,3,4,5,2,0,3,0,0,4,5), -(0,3,0,4,0,1,0,1,0,1,3,2,2,1,3,0,3,0,2,0,2,0,3,0,2,0,0,0,1,0,1,1,0,0,3,1,0,0,0,4,0,3,1,0,2,1,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,4,2,2,3,1,0,3,0,0,0,1,4,4,4,3,0,0,4,0,0,1,4), -(1,4,1,5,0,3,0,3,0,4,5,4,4,3,5,3,3,4,4,3,4,1,3,3,3,3,2,1,4,1,5,4,3,1,4,4,3,5,4,4,3,5,4,3,3,4,4,4,0,3,3,1,2,3,0,3,1,0,3,3,0,5,4,4,4,4,4,4,3,3,5,4,4,3,3,5,4,0,3,2,0,4,4), -(0,2,0,3,0,1,0,0,0,1,3,3,3,2,4,1,3,0,3,1,3,0,2,2,1,1,0,0,2,0,4,3,1,0,4,3,0,4,4,4,1,4,3,1,1,3,3,1,0,2,0,0,1,3,0,0,0,0,2,0,0,4,3,2,4,3,5,4,3,3,3,4,3,3,4,3,3,0,2,1,0,3,3), -(0,2,0,4,0,3,0,2,0,2,5,5,3,4,4,4,4,1,4,3,3,0,4,3,4,3,1,3,3,2,4,3,0,3,4,3,0,3,4,4,2,4,4,0,4,5,3,3,2,2,1,1,1,2,0,1,5,0,3,3,2,4,3,3,3,4,0,3,0,2,0,4,4,3,5,5,0,0,3,0,2,3,3), -(0,3,0,4,0,3,0,1,0,3,4,3,3,1,3,3,3,0,3,1,3,0,4,3,3,1,1,0,3,0,3,3,0,0,4,4,0,1,5,4,3,3,5,0,3,3,4,3,0,2,0,1,1,1,0,1,3,0,1,2,1,3,3,2,3,3,0,3,0,1,0,1,3,3,4,4,1,0,1,2,2,1,3), -(0,1,0,4,0,4,0,3,0,1,3,3,3,2,3,1,1,0,3,0,3,3,4,3,2,4,2,0,1,0,4,3,2,0,4,3,0,5,3,3,2,4,4,4,3,3,3,4,0,1,3,0,0,1,0,0,1,0,0,0,0,4,2,3,3,3,0,3,0,0,0,4,4,4,5,3,2,0,3,3,0,3,5), -(0,2,0,3,0,0,0,3,0,1,3,0,2,0,0,0,1,0,3,1,1,3,3,0,0,3,0,0,3,0,2,3,1,0,3,1,0,3,3,2,0,4,2,2,0,2,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,2,1,2,0,1,0,1,0,0,0,1,3,1,2,0,0,0,1,0,0,1,4), -(0,3,0,3,0,5,0,1,0,2,4,3,1,3,3,2,1,1,5,2,1,0,5,1,2,0,0,0,3,3,2,2,3,2,4,3,0,0,3,3,1,3,3,0,2,5,3,4,0,3,3,0,1,2,0,2,2,0,3,2,0,2,2,3,3,3,0,2,0,1,0,3,4,4,2,5,4,0,3,0,0,3,5), -(0,3,0,3,0,3,0,1,0,3,3,3,3,0,3,0,2,0,2,1,1,0,2,0,1,0,0,0,2,1,0,0,1,0,3,2,0,0,3,3,1,2,3,1,0,3,3,0,0,1,0,0,0,0,0,2,0,0,0,0,0,2,3,1,2,3,0,3,0,1,0,3,2,1,0,4,3,0,1,1,0,3,3), -(0,4,0,5,0,3,0,3,0,4,5,5,4,3,5,3,4,3,5,3,3,2,5,3,4,4,4,3,4,3,4,5,5,3,4,4,3,4,4,5,4,4,4,3,4,5,5,4,2,3,4,2,3,4,0,3,3,1,4,3,2,4,3,3,5,5,0,3,0,3,0,5,5,5,5,4,4,0,4,0,1,4,4), -(0,4,0,4,0,3,0,3,0,3,5,4,4,2,3,2,5,1,3,2,5,1,4,2,3,2,3,3,4,3,3,3,3,2,5,4,1,3,3,5,3,4,4,0,4,4,3,1,1,3,1,0,2,3,0,2,3,0,3,0,0,4,3,1,3,4,0,3,0,2,0,4,4,4,3,4,5,0,4,0,0,3,4), -(0,3,0,3,0,3,1,2,0,3,4,4,3,3,3,0,2,2,4,3,3,1,3,3,3,1,1,0,3,1,4,3,2,3,4,4,2,4,4,4,3,4,4,3,2,4,4,3,1,3,3,1,3,3,0,4,1,0,2,2,1,4,3,2,3,3,5,4,3,3,5,4,4,3,3,0,4,0,3,2,2,4,4), -(0,2,0,1,0,0,0,0,0,1,2,1,3,0,0,0,0,0,2,0,1,2,1,0,0,1,0,0,0,0,3,0,0,1,0,1,1,3,1,0,0,0,1,1,0,1,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,1,2,2,0,3,4,0,0,0,1,1,0,0,1,0,0,0,0,0,1,1), -(0,1,0,0,0,1,0,0,0,0,4,0,4,1,4,0,3,0,4,0,3,0,4,0,3,0,3,0,4,1,5,1,4,0,0,3,0,5,0,5,2,0,1,0,0,0,2,1,4,0,1,3,0,0,3,0,0,3,1,1,4,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0), -(1,4,0,5,0,3,0,2,0,3,5,4,4,3,4,3,5,3,4,3,3,0,4,3,3,3,3,3,3,2,4,4,3,1,3,4,4,5,4,4,3,4,4,1,3,5,4,3,3,3,1,2,2,3,3,1,3,1,3,3,3,5,3,3,4,5,0,3,0,3,0,3,4,3,4,4,3,0,3,0,2,4,3), -(0,1,0,4,0,0,0,0,0,1,4,0,4,1,4,2,4,0,3,0,1,0,1,0,0,0,0,0,2,0,3,1,1,1,0,3,0,0,0,1,2,1,0,0,1,1,1,1,0,1,0,0,0,1,0,0,3,0,0,0,0,3,2,0,2,2,0,1,0,0,0,2,3,2,3,3,0,0,0,0,2,1,0), -(0,5,1,5,0,3,0,3,0,5,4,4,5,1,5,3,3,0,4,3,4,3,5,3,4,3,3,2,4,3,4,3,3,0,3,3,1,4,4,3,4,4,4,3,4,5,5,3,2,3,1,1,3,3,1,3,1,1,3,3,2,4,5,3,3,5,0,4,0,3,0,4,4,3,5,3,3,0,3,4,0,4,3), -(0,5,0,5,0,3,0,2,0,4,4,3,5,2,4,3,3,3,4,4,4,3,5,3,5,3,3,1,4,0,4,3,3,0,3,3,0,4,4,4,4,5,4,3,3,5,5,3,2,3,1,2,3,2,0,1,0,0,3,2,2,4,4,3,1,5,0,4,0,3,0,4,3,1,3,2,1,0,3,3,0,3,3), -(0,4,0,5,0,5,0,4,0,4,5,5,5,3,4,3,3,2,5,4,4,3,5,3,5,3,4,0,4,3,4,4,3,2,4,4,3,4,5,4,4,5,5,0,3,5,5,4,1,3,3,2,3,3,1,3,1,0,4,3,1,4,4,3,4,5,0,4,0,2,0,4,3,4,4,3,3,0,4,0,0,5,5), -(0,4,0,4,0,5,0,1,1,3,3,4,4,3,4,1,3,0,5,1,3,0,3,1,3,1,1,0,3,0,3,3,4,0,4,3,0,4,4,4,3,4,4,0,3,5,4,1,0,3,0,0,2,3,0,3,1,0,3,1,0,3,2,1,3,5,0,3,0,1,0,3,2,3,3,4,4,0,2,2,0,4,4), -(2,4,0,5,0,4,0,3,0,4,5,5,4,3,5,3,5,3,5,3,5,2,5,3,4,3,3,4,3,4,5,3,2,1,5,4,3,2,3,4,5,3,4,1,2,5,4,3,0,3,3,0,3,2,0,2,3,0,4,1,0,3,4,3,3,5,0,3,0,1,0,4,5,5,5,4,3,0,4,2,0,3,5), -(0,5,0,4,0,4,0,2,0,5,4,3,4,3,4,3,3,3,4,3,4,2,5,3,5,3,4,1,4,3,4,4,4,0,3,5,0,4,4,4,4,5,3,1,3,4,5,3,3,3,3,3,3,3,0,2,2,0,3,3,2,4,3,3,3,5,3,4,1,3,3,5,3,2,0,0,0,0,4,3,1,3,3), -(0,1,0,3,0,3,0,1,0,1,3,3,3,2,3,3,3,0,3,0,0,0,3,1,3,0,0,0,2,2,2,3,0,0,3,2,0,1,2,4,1,3,3,0,0,3,3,3,0,1,0,0,2,1,0,0,3,0,3,1,0,3,0,0,1,3,0,2,0,1,0,3,3,1,3,3,0,0,1,1,0,3,3), -(0,2,0,3,0,2,1,4,0,2,2,3,1,1,3,1,1,0,2,0,3,1,2,3,1,3,0,0,1,0,4,3,2,3,3,3,1,4,2,3,3,3,3,1,0,3,1,4,0,1,1,0,1,2,0,1,1,0,1,1,0,3,1,3,2,2,0,1,0,0,0,2,3,3,3,1,0,0,0,0,0,2,3), -(0,5,0,4,0,5,0,2,0,4,5,5,3,3,4,3,3,1,5,4,4,2,4,4,4,3,4,2,4,3,5,5,4,3,3,4,3,3,5,5,4,5,5,1,3,4,5,3,1,4,3,1,3,3,0,3,3,1,4,3,1,4,5,3,3,5,0,4,0,3,0,5,3,3,1,4,3,0,4,0,1,5,3), -(0,5,0,5,0,4,0,2,0,4,4,3,4,3,3,3,3,3,5,4,4,4,4,4,4,5,3,3,5,2,4,4,4,3,4,4,3,3,4,4,5,5,3,3,4,3,4,3,3,4,3,3,3,3,1,2,2,1,4,3,3,5,4,4,3,4,0,4,0,3,0,4,4,4,4,4,1,0,4,2,0,2,4), -(0,4,0,4,0,3,0,1,0,3,5,2,3,0,3,0,2,1,4,2,3,3,4,1,4,3,3,2,4,1,3,3,3,0,3,3,0,0,3,3,3,5,3,3,3,3,3,2,0,2,0,0,2,0,0,2,0,0,1,0,0,3,1,2,2,3,0,3,0,2,0,4,4,3,3,4,1,0,3,0,0,2,4), -(0,0,0,4,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,1,0,2,0,1,0,0,0,0,0,3,1,3,0,3,2,0,0,0,1,0,3,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,4,0,2,0,0,0,0,0,0,2), -(0,2,1,3,0,2,0,2,0,3,3,3,3,1,3,1,3,3,3,3,3,3,4,2,2,1,2,1,4,0,4,3,1,3,3,3,2,4,3,5,4,3,3,3,3,3,3,3,0,1,3,0,2,0,0,1,0,0,1,0,0,4,2,0,2,3,0,3,3,0,3,3,4,2,3,1,4,0,1,2,0,2,3), -(0,3,0,3,0,1,0,3,0,2,3,3,3,0,3,1,2,0,3,3,2,3,3,2,3,2,3,1,3,0,4,3,2,0,3,3,1,4,3,3,2,3,4,3,1,3,3,1,1,0,1,1,0,1,0,1,0,1,0,0,0,4,1,1,0,3,0,3,1,0,2,3,3,3,3,3,1,0,0,2,0,3,3), -(0,0,0,0,0,0,0,0,0,0,3,0,2,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,3,0,3,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,2,0,2,3,0,0,0,0,0,0,0,0,3), -(0,2,0,3,1,3,0,3,0,2,3,3,3,1,3,1,3,1,3,1,3,3,3,1,3,0,2,3,1,1,4,3,3,2,3,3,1,2,2,4,1,3,3,0,1,4,2,3,0,1,3,0,3,0,0,1,3,0,2,0,0,3,3,2,1,3,0,3,0,2,0,3,4,4,4,3,1,0,3,0,0,3,3), -(0,2,0,1,0,2,0,0,0,1,3,2,2,1,3,0,1,1,3,0,3,2,3,1,2,0,2,0,1,1,3,3,3,0,3,3,1,1,2,3,2,3,3,1,2,3,2,0,0,1,0,0,0,0,0,0,3,0,1,0,0,2,1,2,1,3,0,3,0,0,0,3,4,4,4,3,2,0,2,0,0,2,4), -(0,0,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,3,1,0,0,0,0,0,0,0,3), -(0,3,0,3,0,2,0,3,0,3,3,3,2,3,2,2,2,0,3,1,3,3,3,2,3,3,0,0,3,0,3,2,2,0,2,3,1,4,3,4,3,3,2,3,1,5,4,4,0,3,1,2,1,3,0,3,1,1,2,0,2,3,1,3,1,3,0,3,0,1,0,3,3,4,4,2,1,0,2,1,0,2,4), -(0,1,0,3,0,1,0,2,0,1,4,2,5,1,4,0,2,0,2,1,3,1,4,0,2,1,0,0,2,1,4,1,1,0,3,3,0,5,1,3,2,3,3,1,0,3,2,3,0,1,0,0,0,0,0,0,1,0,0,0,0,4,0,1,0,3,0,2,0,1,0,3,3,3,4,3,3,0,0,0,0,2,3), -(0,0,0,1,0,0,0,0,0,0,2,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,1,0,0,0,0,0,3), -(0,1,0,3,0,4,0,3,0,2,4,3,1,0,3,2,2,1,3,1,2,2,3,1,1,1,2,1,3,0,1,2,0,1,3,2,1,3,0,5,5,1,0,0,1,3,2,1,0,3,0,0,1,0,0,0,0,0,3,4,0,1,1,1,3,2,0,2,0,1,0,2,3,3,1,2,3,0,1,0,1,0,4), -(0,0,0,1,0,3,0,3,0,2,2,1,0,0,4,0,3,0,3,1,3,0,3,0,3,0,1,0,3,0,3,1,3,0,3,3,0,0,1,2,1,1,1,0,1,2,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,2,2,1,2,0,0,2,0,0,0,0,2,3,3,3,3,0,0,0,0,1,4), -(0,0,0,3,0,3,0,0,0,0,3,1,1,0,3,0,1,0,2,0,1,0,0,0,0,0,0,0,1,0,3,0,2,0,2,3,0,0,2,2,3,1,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,2,3), -(2,4,0,5,0,5,0,4,0,3,4,3,3,3,4,3,3,3,4,3,4,4,5,4,5,5,5,2,3,0,5,5,4,1,5,4,3,1,5,4,3,4,4,3,3,4,3,3,0,3,2,0,2,3,0,3,0,0,3,3,0,5,3,2,3,3,0,3,0,3,0,3,4,5,4,5,3,0,4,3,0,3,4), -(0,3,0,3,0,3,0,3,0,3,3,4,3,2,3,2,3,0,4,3,3,3,3,3,3,3,3,0,3,2,4,3,3,1,3,4,3,4,4,4,3,4,4,3,2,4,4,1,0,2,0,0,1,1,0,2,0,0,3,1,0,5,3,2,1,3,0,3,0,1,2,4,3,2,4,3,3,0,3,2,0,4,4), -(0,3,0,3,0,1,0,0,0,1,4,3,3,2,3,1,3,1,4,2,3,2,4,2,3,4,3,0,2,2,3,3,3,0,3,3,3,0,3,4,1,3,3,0,3,4,3,3,0,1,1,0,1,0,0,0,4,0,3,0,0,3,1,2,1,3,0,4,0,1,0,4,3,3,4,3,3,0,2,0,0,3,3), -(0,3,0,4,0,1,0,3,0,3,4,3,3,0,3,3,3,1,3,1,3,3,4,3,3,3,0,0,3,1,5,3,3,1,3,3,2,5,4,3,3,4,5,3,2,5,3,4,0,1,0,0,0,0,0,2,0,0,1,1,0,4,2,2,1,3,0,3,0,2,0,4,4,3,5,3,2,0,1,1,0,3,4), -(0,5,0,4,0,5,0,2,0,4,4,3,3,2,3,3,3,1,4,3,4,1,5,3,4,3,4,0,4,2,4,3,4,1,5,4,0,4,4,4,4,5,4,1,3,5,4,2,1,4,1,1,3,2,0,3,1,0,3,2,1,4,3,3,3,4,0,4,0,3,0,4,4,4,3,3,3,0,4,2,0,3,4), -(1,4,0,4,0,3,0,1,0,3,3,3,1,1,3,3,2,2,3,3,1,0,3,2,2,1,2,0,3,1,2,1,2,0,3,2,0,2,2,3,3,4,3,0,3,3,1,2,0,1,1,3,1,2,0,0,3,0,1,1,0,3,2,2,3,3,0,3,0,0,0,2,3,3,4,3,3,0,1,0,0,1,4), -(0,4,0,4,0,4,0,0,0,3,4,4,3,1,4,2,3,2,3,3,3,1,4,3,4,0,3,0,4,2,3,3,2,2,5,4,2,1,3,4,3,4,3,1,3,3,4,2,0,2,1,0,3,3,0,0,2,0,3,1,0,4,4,3,4,3,0,4,0,1,0,2,4,4,4,4,4,0,3,2,0,3,3), -(0,0,0,1,0,4,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,3,2,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2), -(0,2,0,3,0,4,0,4,0,1,3,3,3,0,4,0,2,1,2,1,1,1,2,0,3,1,1,0,1,0,3,1,0,0,3,3,2,0,1,1,0,0,0,0,0,1,0,2,0,2,2,0,3,1,0,0,1,0,1,1,0,1,2,0,3,0,0,0,0,1,0,0,3,3,4,3,1,0,1,0,3,0,2), -(0,0,0,3,0,5,0,0,0,0,1,0,2,0,3,1,0,1,3,0,0,0,2,0,0,0,1,0,0,0,1,1,0,0,4,0,0,0,2,3,0,1,4,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,3,0,0,0,0,0,3), -(0,2,0,5,0,5,0,1,0,2,4,3,3,2,5,1,3,2,3,3,3,0,4,1,2,0,3,0,4,0,2,2,1,1,5,3,0,0,1,4,2,3,2,0,3,3,3,2,0,2,4,1,1,2,0,1,1,0,3,1,0,1,3,1,2,3,0,2,0,0,0,1,3,5,4,4,4,0,3,0,0,1,3), -(0,4,0,5,0,4,0,4,0,4,5,4,3,3,4,3,3,3,4,3,4,4,5,3,4,5,4,2,4,2,3,4,3,1,4,4,1,3,5,4,4,5,5,4,4,5,5,5,2,3,3,1,4,3,1,3,3,0,3,3,1,4,3,4,4,4,0,3,0,4,0,3,3,4,4,5,0,0,4,3,0,4,5), -(0,4,0,4,0,3,0,3,0,3,4,4,4,3,3,2,4,3,4,3,4,3,5,3,4,3,2,1,4,2,4,4,3,1,3,4,2,4,5,5,3,4,5,4,1,5,4,3,0,3,2,2,3,2,1,3,1,0,3,3,3,5,3,3,3,5,4,4,2,3,3,4,3,3,3,2,1,0,3,2,1,4,3), -(0,4,0,5,0,4,0,3,0,3,5,5,3,2,4,3,4,0,5,4,4,1,4,4,4,3,3,3,4,3,5,5,2,3,3,4,1,2,5,5,3,5,5,2,3,5,5,4,0,3,2,0,3,3,1,1,5,1,4,1,0,4,3,2,3,5,0,4,0,3,0,5,4,3,4,3,0,0,4,1,0,4,4), -(1,3,0,4,0,2,0,2,0,2,5,5,3,3,3,3,3,0,4,2,3,4,4,4,3,4,0,0,3,4,5,4,3,3,3,3,2,5,5,4,5,5,5,4,3,5,5,5,1,3,1,0,1,0,0,3,2,0,4,2,0,5,2,3,2,4,1,3,0,3,0,4,5,4,5,4,3,0,4,2,0,5,4), -(0,3,0,4,0,5,0,3,0,3,4,4,3,2,3,2,3,3,3,3,3,2,4,3,3,2,2,0,3,3,3,3,3,1,3,3,3,0,4,4,3,4,4,1,1,4,4,2,0,3,1,0,1,1,0,4,1,0,2,3,1,3,3,1,3,4,0,3,0,1,0,3,1,3,0,0,1,0,2,0,0,4,4), -(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), -(0,3,0,3,0,2,0,3,0,1,5,4,3,3,3,1,4,2,1,2,3,4,4,2,4,4,5,0,3,1,4,3,4,0,4,3,3,3,2,3,2,5,3,4,3,2,2,3,0,0,3,0,2,1,0,1,2,0,0,0,0,2,1,1,3,1,0,2,0,4,0,3,4,4,4,5,2,0,2,0,0,1,3), -(0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,1,1,0,0,0,4,2,1,1,0,1,0,3,2,0,0,3,1,1,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,1,0,0,0,2,0,0,0,1,4,0,4,2,1,0,0,0,0,0,1), -(0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,3,1,0,0,0,2,0,2,1,0,0,1,2,1,0,1,1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,1,3,1,0,0,0,0,0,1,0,0,2,1,0,0,0,0,0,0,0,0,2), -(0,4,0,4,0,4,0,3,0,4,4,3,4,2,4,3,2,0,4,4,4,3,5,3,5,3,3,2,4,2,4,3,4,3,1,4,0,2,3,4,4,4,3,3,3,4,4,4,3,4,1,3,4,3,2,1,2,1,3,3,3,4,4,3,3,5,0,4,0,3,0,4,3,3,3,2,1,0,3,0,0,3,3), -(0,4,0,3,0,3,0,3,0,3,5,5,3,3,3,3,4,3,4,3,3,3,4,4,4,3,3,3,3,4,3,5,3,3,1,3,2,4,5,5,5,5,4,3,4,5,5,3,2,2,3,3,3,3,2,3,3,1,2,3,2,4,3,3,3,4,0,4,0,2,0,4,3,2,2,1,2,0,3,0,0,4,1), -) - -class JapaneseContextAnalysis(object): - NUM_OF_CATEGORY = 6 - DONT_KNOW = -1 - ENOUGH_REL_THRESHOLD = 100 - MAX_REL_THRESHOLD = 1000 - MINIMUM_DATA_THRESHOLD = 4 - - def __init__(self): - self._total_rel = None - self._rel_sample = None - self._need_to_skip_char_num = None - self._last_char_order = None - self._done = None - self.reset() - - def reset(self): - self._total_rel = 0 # total sequence received - # category counters, each integer counts sequence in its category - self._rel_sample = [0] * self.NUM_OF_CATEGORY - # if last byte in current buffer is not the last byte of a character, - # we need to know how many bytes to skip in next buffer - self._need_to_skip_char_num = 0 - self._last_char_order = -1 # The order of previous char - # If this flag is set to True, detection is done and conclusion has - # been made - self._done = False - - def feed(self, byte_str, num_bytes): - if self._done: - return - - # The buffer we got is byte oriented, and a character may span in more than one - # buffers. In case the last one or two byte in last buffer is not - # complete, we record how many byte needed to complete that character - # and skip these bytes here. We can choose to record those bytes as - # well and analyse the character once it is complete, but since a - # character will not make much difference, by simply skipping - # this character will simply our logic and improve performance. - i = self._need_to_skip_char_num - while i < num_bytes: - order, char_len = self.get_order(byte_str[i:i + 2]) - i += char_len - if i > num_bytes: - self._need_to_skip_char_num = i - num_bytes - self._last_char_order = -1 - else: - if (order != -1) and (self._last_char_order != -1): - self._total_rel += 1 - if self._total_rel > self.MAX_REL_THRESHOLD: - self._done = True - break - self._rel_sample[jp2CharContext[self._last_char_order][order]] += 1 - self._last_char_order = order - - def got_enough_data(self): - return self._total_rel > self.ENOUGH_REL_THRESHOLD - - def get_confidence(self): - # This is just one way to calculate confidence. It works well for me. - if self._total_rel > self.MINIMUM_DATA_THRESHOLD: - return (self._total_rel - self._rel_sample[0]) / self._total_rel - else: - return self.DONT_KNOW - - def get_order(self, byte_str): - return -1, 1 - -class SJISContextAnalysis(JapaneseContextAnalysis): - def __init__(self): - super(SJISContextAnalysis, self).__init__() - self._charset_name = "SHIFT_JIS" - - @property - def charset_name(self): - return self._charset_name - - def get_order(self, byte_str): - if not byte_str: - return -1, 1 - # find out current char's byte length - first_char = byte_str[0] - if (0x81 <= first_char <= 0x9F) or (0xE0 <= first_char <= 0xFC): - char_len = 2 - if (first_char == 0x87) or (0xFA <= first_char <= 0xFC): - self._charset_name = "CP932" - else: - char_len = 1 - - # return its order if it is hiragana - if len(byte_str) > 1: - second_char = byte_str[1] - if (first_char == 202) and (0x9F <= second_char <= 0xF1): - return second_char - 0x9F, char_len - - return -1, char_len - -class EUCJPContextAnalysis(JapaneseContextAnalysis): - def get_order(self, byte_str): - if not byte_str: - return -1, 1 - # find out current char's byte length - first_char = byte_str[0] - if (first_char == 0x8E) or (0xA1 <= first_char <= 0xFE): - char_len = 2 - elif first_char == 0x8F: - char_len = 3 - else: - char_len = 1 - - # return its order if it is hiragana - if len(byte_str) > 1: - second_char = byte_str[1] - if (first_char == 0xA4) and (0xA1 <= second_char <= 0xF3): - return second_char - 0xA1, char_len - - return -1, char_len - - diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/jpcntx.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/jpcntx.pyc deleted file mode 100644 index 3823b28bd582b142ede0a20097e0a6c03b35cbae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25988 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 O{&Bao^w5QeKKFkICV{R1 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langbulgarianmodel.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langbulgarianmodel.py deleted file mode 100644 index 2aa4fb2..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langbulgarianmodel.py +++ /dev/null @@ -1,228 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# 255: Control characters that usually does not exist in any text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 - -# Character Mapping Table: -# this table is modified base on win1251BulgarianCharToOrderMap, so -# only number <64 is sure valid - -Latin5_BulgarianCharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, # 40 -110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, # 50 -253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, # 60 -116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, # 70 -194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209, # 80 -210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225, # 90 - 81,226,227,228,229,230,105,231,232,233,234,235,236, 45,237,238, # a0 - 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, # b0 - 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,239, 67,240, 60, 56, # c0 - 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, # d0 - 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,241, 42, 16, # e0 - 62,242,243,244, 58,245, 98,246,247,248,249,250,251, 91,252,253, # f0 -) - -win1251BulgarianCharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, # 40 -110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, # 50 -253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, # 60 -116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, # 70 -206,207,208,209,210,211,212,213,120,214,215,216,217,218,219,220, # 80 -221, 78, 64, 83,121, 98,117,105,222,223,224,225,226,227,228,229, # 90 - 88,230,231,232,233,122, 89,106,234,235,236,237,238, 45,239,240, # a0 - 73, 80,118,114,241,242,243,244,245, 62, 58,246,247,248,249,250, # b0 - 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, # c0 - 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,251, 67,252, 60, 56, # d0 - 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, # e0 - 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,253, 42, 16, # f0 -) - -# Model Table: -# total sequences: 100% -# first 512 sequences: 96.9392% -# first 1024 sequences:3.0618% -# rest sequences: 0.2992% -# negative sequences: 0.0020% -BulgarianLangModel = ( -0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,3,3,3,3,3, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,2,2,1,2,2, -3,1,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,0,1, -0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,3,3,0,3,1,0, -0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,2,3,2,2,1,3,3,3,3,2,2,2,1,1,2,0,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,2,3,2,2,3,3,1,1,2,3,3,2,3,3,3,3,2,1,2,0,2,0,3,0,0, -0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,1,3,3,3,3,3,2,3,2,3,3,3,3,3,2,3,3,1,3,0,3,0,2,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,3,1,3,3,2,3,3,3,1,3,3,2,3,2,2,2,0,0,2,0,2,0,2,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,3,3,1,2,2,3,2,1,1,2,0,2,0,0,0,0, -1,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,2,3,3,1,2,3,2,2,2,3,3,3,3,3,2,2,3,1,2,0,2,1,2,0,0, -0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,1,3,3,3,3,3,2,3,3,3,2,3,3,2,3,2,2,2,3,1,2,0,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,3,3,3,3,1,1,1,2,2,1,3,1,3,2,2,3,0,0,1,0,1,0,1,0,0, -0,0,0,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,2,2,3,2,2,3,1,2,1,1,1,2,3,1,3,1,2,2,0,1,1,1,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,1,3,2,2,3,3,1,2,3,1,1,3,3,3,3,1,2,2,1,1,1,0,2,0,2,0,1, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,2,2,3,3,3,2,2,1,1,2,0,2,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,0,1,2,1,3,3,2,3,3,3,3,3,2,3,2,1,0,3,1,2,1,2,1,2,3,2,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,1,1,2,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,1,3,3,2,3,3,2,2,2,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,3,0,3,3,3,3,3,2,1,1,2,1,3,3,0,3,1,1,1,1,3,2,0,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,1,1,3,1,3,3,2,3,2,2,2,3,0,2,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,2,3,3,2,2,3,2,1,1,1,1,1,3,1,3,1,1,0,0,0,1,0,0,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,2,3,2,0,3,2,0,3,0,2,0,0,2,1,3,1,0,0,1,0,0,0,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,2,1,1,1,1,2,1,1,2,1,1,1,2,2,1,2,1,1,1,0,1,1,0,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,2,1,3,1,1,2,1,3,2,1,1,0,1,2,3,2,1,1,1,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,3,2,2,1,0,1,0,0,1,0,0,0,2,1,0,3,0,0,1,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,2,3,2,3,3,1,3,2,1,1,1,2,1,1,2,1,3,0,1,0,0,0,1,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,1,2,2,3,3,2,3,2,2,2,3,1,2,2,1,1,2,1,1,2,2,0,1,1,0,1,0,2,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,2,1,3,1,0,2,2,1,3,2,1,0,0,2,0,2,0,1,0,0,0,0,0,0,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,1,2,0,2,3,1,2,3,2,0,1,3,1,2,1,1,1,0,0,1,0,0,2,2,2,3, -2,2,2,2,1,2,1,1,2,2,1,1,2,0,1,1,1,0,0,1,1,0,0,1,1,0,0,0,1,1,0,1, -3,3,3,3,3,2,1,2,2,1,2,0,2,0,1,0,1,2,1,2,1,1,0,0,0,1,0,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, -3,3,2,3,3,1,1,3,1,0,3,2,1,0,0,0,1,2,0,2,0,1,0,0,0,1,0,1,2,1,2,2, -1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,0,1,2,1,1,1,0,0,0,0,0,1,1,0,0, -3,1,0,1,0,2,3,2,2,2,3,2,2,2,2,2,1,0,2,1,2,1,1,1,0,1,2,1,2,2,2,1, -1,1,2,2,2,2,1,2,1,1,0,1,2,1,2,2,2,1,1,1,0,1,1,1,1,2,0,1,0,0,0,0, -2,3,2,3,3,0,0,2,1,0,2,1,0,0,0,0,2,3,0,2,0,0,0,0,0,1,0,0,2,0,1,2, -2,1,2,1,2,2,1,1,1,2,1,1,1,0,1,2,2,1,1,1,1,1,0,1,1,1,0,0,1,2,0,0, -3,3,2,2,3,0,2,3,1,1,2,0,0,0,1,0,0,2,0,2,0,0,0,1,0,1,0,1,2,0,2,2, -1,1,1,1,2,1,0,1,2,2,2,1,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,1,0,0, -2,3,2,3,3,0,0,3,0,1,1,0,1,0,0,0,2,2,1,2,0,0,0,0,0,0,0,0,2,0,1,2, -2,2,1,1,1,1,1,2,2,2,1,0,2,0,1,0,1,0,0,1,0,1,0,0,1,0,0,0,0,1,0,0, -3,3,3,3,2,2,2,2,2,0,2,1,1,1,1,2,1,2,1,1,0,2,0,1,0,1,0,0,2,0,1,2, -1,1,1,1,1,1,1,2,2,1,1,0,2,0,1,0,2,0,0,1,1,1,0,0,2,0,0,0,1,1,0,0, -2,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0,0,0,0,1,2,0,1,2, -2,2,2,1,1,2,1,1,2,2,2,1,2,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,0,0, -2,3,3,3,3,0,2,2,0,2,1,0,0,0,1,1,1,2,0,2,0,0,0,3,0,0,0,0,2,0,2,2, -1,1,1,2,1,2,1,1,2,2,2,1,2,0,1,1,1,0,1,1,1,1,0,2,1,0,0,0,1,1,0,0, -2,3,3,3,3,0,2,1,0,0,2,0,0,0,0,0,1,2,0,2,0,0,0,0,0,0,0,0,2,0,1,2, -1,1,1,2,1,1,1,1,2,2,2,0,1,0,1,1,1,0,0,1,1,1,0,0,1,0,0,0,0,1,0,0, -3,3,2,2,3,0,1,0,1,0,0,0,0,0,0,0,1,1,0,3,0,0,0,0,0,0,0,0,1,0,2,2, -1,1,1,1,1,2,1,1,2,2,1,2,2,1,0,1,1,1,1,1,0,1,0,0,1,0,0,0,1,1,0,0, -3,1,0,1,0,2,2,2,2,3,2,1,1,1,2,3,0,0,1,0,2,1,1,0,1,1,1,1,2,1,1,1, -1,2,2,1,2,1,2,2,1,1,0,1,2,1,2,2,1,1,1,0,0,1,1,1,2,1,0,1,0,0,0,0, -2,1,0,1,0,3,1,2,2,2,2,1,2,2,1,1,1,0,2,1,2,2,1,1,2,1,1,0,2,1,1,1, -1,2,2,2,2,2,2,2,1,2,0,1,1,0,2,1,1,1,1,1,0,0,1,1,1,1,0,1,0,0,0,0, -2,1,1,1,1,2,2,2,2,1,2,2,2,1,2,2,1,1,2,1,2,3,2,2,1,1,1,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,3,2,0,1,2,0,1,2,1,1,0,1,0,1,2,1,2,0,0,0,1,1,0,0,0,1,0,0,2, -1,1,0,0,1,1,0,1,1,1,1,0,2,0,1,1,1,0,0,1,1,0,0,0,0,1,0,0,0,1,0,0, -2,0,0,0,0,1,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,2,1,1,1, -1,2,2,2,2,1,1,2,1,2,1,1,1,0,2,1,2,1,1,1,0,2,1,1,1,1,0,1,0,0,0,0, -3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, -1,1,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,3,2,0,0,0,0,1,0,0,0,0,0,0,1,1,0,2,0,0,0,0,0,0,0,0,1,0,1,2, -1,1,1,1,1,1,0,0,2,2,2,2,2,0,1,1,0,1,1,1,1,1,0,0,1,0,0,0,1,1,0,1, -2,3,1,2,1,0,1,1,0,2,2,2,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,0,1,2, -1,1,1,1,2,1,1,1,1,1,1,1,1,0,1,1,0,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0, -2,2,2,2,2,0,0,2,0,0,2,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,0,2,2, -1,1,1,1,1,0,0,1,2,1,1,0,1,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,2,2,0,0,2,0,1,1,0,0,0,1,0,0,2,0,2,0,0,0,0,0,0,0,0,0,0,1,1, -0,0,0,1,1,1,1,1,1,1,1,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,3,2,0,0,1,0,0,1,0,0,0,0,0,0,1,0,2,0,0,0,1,0,0,0,0,0,0,0,2, -1,1,0,0,1,0,0,0,1,1,0,0,1,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, -2,1,2,2,2,1,2,1,2,2,1,1,2,1,1,1,0,1,1,1,1,2,0,1,0,1,1,1,1,0,1,1, -1,1,2,1,1,1,1,1,1,0,0,1,2,1,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0, -1,0,0,1,3,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,2,1,0,0,1,0,2,0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,2,0,0,1, -0,2,0,1,0,0,1,1,2,0,1,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,2,2,0,1,1,0,2,1,0,1,1,1,0,0,1,0,2,0,1,0,0,0,0,0,0,0,0,0,1, -0,1,0,0,1,0,0,0,1,1,0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,2,2,0,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, -0,1,0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, -2,0,1,0,0,1,2,1,1,1,1,1,1,2,2,1,0,0,1,0,1,0,0,0,0,1,1,1,1,0,0,0, -1,1,2,1,1,1,1,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,1,2,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, -0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, -0,1,1,0,1,1,1,0,0,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, -1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,2,0,0,2,0,1,0,0,1,0,0,1, -1,1,0,0,1,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, -1,1,1,1,1,1,1,2,0,0,0,0,0,0,2,1,0,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -) - -Latin5BulgarianModel = { - 'char_to_order_map': Latin5_BulgarianCharToOrderMap, - 'precedence_matrix': BulgarianLangModel, - 'typical_positive_ratio': 0.969392, - 'keep_english_letter': False, - 'charset_name': "ISO-8859-5", - 'language': 'Bulgairan', -} - -Win1251BulgarianModel = { - 'char_to_order_map': win1251BulgarianCharToOrderMap, - 'precedence_matrix': BulgarianLangModel, - 'typical_positive_ratio': 0.969392, - 'keep_english_letter': False, - 'charset_name': "windows-1251", - 'language': 'Bulgarian', -} diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langbulgarianmodel.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langbulgarianmodel.pyc deleted file mode 100644 index cef9908008626d48e3390033d8054cc5d020f078..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25011 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 F_is$E7KH!+ diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langcyrillicmodel.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langcyrillicmodel.py deleted file mode 100644 index e5f9a1f..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langcyrillicmodel.py +++ /dev/null @@ -1,333 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# KOI8-R language model -# Character Mapping Table: -KOI8R_char_to_order_map = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 -191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, # 80 -207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, # 90 -223,224,225, 68,226,227,228,229,230,231,232,233,234,235,236,237, # a0 -238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253, # b0 - 27, 3, 21, 28, 13, 2, 39, 19, 26, 4, 23, 11, 8, 12, 5, 1, # c0 - 15, 16, 9, 7, 6, 14, 24, 10, 17, 18, 20, 25, 30, 29, 22, 54, # d0 - 59, 37, 44, 58, 41, 48, 53, 46, 55, 42, 60, 36, 49, 38, 31, 34, # e0 - 35, 43, 45, 32, 40, 52, 56, 33, 61, 62, 51, 57, 47, 63, 50, 70, # f0 -) - -win1251_char_to_order_map = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 -191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, -207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, -223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, -239,240,241,242,243,244,245,246, 68,247,248,249,250,251,252,253, - 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, - 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, - 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, - 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, -) - -latin5_char_to_order_map = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 -191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, -207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, -223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, - 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, - 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, - 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, - 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, -239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, -) - -macCyrillic_char_to_order_map = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 - 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, - 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, -191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, -207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, -223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, -239,240,241,242,243,244,245,246,247,248,249,250,251,252, 68, 16, - 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, - 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27,255, -) - -IBM855_char_to_order_map = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 -191,192,193,194, 68,195,196,197,198,199,200,201,202,203,204,205, -206,207,208,209,210,211,212,213,214,215,216,217, 27, 59, 54, 70, - 3, 37, 21, 44, 28, 58, 13, 41, 2, 48, 39, 53, 19, 46,218,219, -220,221,222,223,224, 26, 55, 4, 42,225,226,227,228, 23, 60,229, -230,231,232,233,234,235, 11, 36,236,237,238,239,240,241,242,243, - 8, 49, 12, 38, 5, 31, 1, 34, 15,244,245,246,247, 35, 16,248, - 43, 9, 45, 7, 32, 6, 40, 14, 52, 24, 56, 10, 33, 17, 61,249, -250, 18, 62, 20, 51, 25, 57, 30, 47, 29, 63, 22, 50,251,252,255, -) - -IBM866_char_to_order_map = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 - 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, - 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, - 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, -191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, -207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, -223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, - 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, -239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, -) - -# Model Table: -# total sequences: 100% -# first 512 sequences: 97.6601% -# first 1024 sequences: 2.3389% -# rest sequences: 0.1237% -# negative sequences: 0.0009% -RussianLangModel = ( -0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,1,3,3,3,2,3,2,3,3, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,2,2,2,2,2,0,0,2, -3,3,3,2,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,2,3,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,2,2,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,2,3,3,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, -0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, -0,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,2,2,2,3,1,3,3,1,3,3,3,3,2,2,3,0,2,2,2,3,3,2,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,3,3,3,3,3,2,2,3,2,3,3,3,2,1,2,2,0,1,2,2,2,2,2,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,3,0,2,2,3,3,2,1,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,3,3,1,2,3,2,2,3,2,3,3,3,3,2,2,3,0,3,2,2,3,1,1,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,3,3,3,3,2,2,2,0,3,3,3,2,2,2,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,2,3,2,2,0,1,3,2,1,2,2,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,2,1,1,3,0,1,1,1,1,2,1,1,0,2,2,2,1,2,0,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,3,3,2,2,2,2,1,3,2,3,2,3,2,1,2,2,0,1,1,2,1,2,1,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,2,3,3,3,2,2,2,2,0,2,2,2,2,3,1,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -3,2,3,2,2,3,3,3,3,3,3,3,3,3,1,3,2,0,0,3,3,3,3,2,3,3,3,3,2,3,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,3,3,2,2,3,3,0,2,1,0,3,2,3,2,3,0,0,1,2,0,0,1,0,1,2,1,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,3,0,2,3,3,3,3,2,3,3,3,3,1,2,2,0,0,2,3,2,2,2,3,2,3,2,2,3,0,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,3,0,2,3,2,3,0,1,2,3,3,2,0,2,3,0,0,2,3,2,2,0,1,3,1,3,2,2,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,3,0,2,3,3,3,3,3,3,3,3,2,1,3,2,0,0,2,2,3,3,3,2,3,3,0,2,2,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,2,3,3,2,2,2,3,3,0,0,1,1,1,1,1,2,0,0,1,1,1,1,0,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,2,3,3,3,3,3,3,3,0,3,2,3,3,2,3,2,0,2,1,0,1,1,0,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,3,3,3,2,2,2,2,3,1,3,2,3,1,1,2,1,0,2,2,2,2,1,3,1,0, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -2,2,3,3,3,3,3,1,2,2,1,3,1,0,3,0,0,3,0,0,0,1,1,0,1,2,1,0,0,0,0,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,2,1,1,3,3,3,2,2,1,2,2,3,1,1,2,0,0,2,2,1,3,0,0,2,1,1,2,1,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,3,3,3,3,1,2,2,2,1,2,1,3,3,1,1,2,1,2,1,2,2,0,2,0,0,1,1,0,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,3,3,2,1,3,2,2,3,2,0,3,2,0,3,0,1,0,1,1,0,0,1,1,1,1,0,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,2,3,3,3,2,2,2,3,3,1,2,1,2,1,0,1,0,1,1,0,1,0,0,2,1,1,1,0,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, -3,1,1,2,1,2,3,3,2,2,1,2,2,3,0,2,1,0,0,2,2,3,2,1,2,2,2,2,2,3,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,1,1,0,1,1,2,2,1,1,3,0,0,1,3,1,1,1,0,0,0,1,0,1,1,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,1,3,3,3,2,0,0,0,2,1,0,1,0,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,1,0,0,2,3,2,2,2,1,2,2,2,1,2,1,0,0,1,1,1,0,2,0,1,1,1,0,0,1,1, -1,0,0,0,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,3,0,0,0,0,1,0,0,0,0,3,0,1,2,1,0,0,0,0,0,0,0,1,1,0,0,1,1, -1,0,1,0,1,2,0,0,1,1,2,1,0,1,1,1,1,0,1,1,1,1,0,1,0,0,1,0,0,1,1,0, -2,2,3,2,2,2,3,1,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,0,1,0,1,1,1,0,2,1, -1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,0,1,1,0, -3,3,3,2,2,2,2,3,2,2,1,1,2,2,2,2,1,1,3,1,2,1,2,0,0,1,1,0,1,0,2,1, -1,1,1,1,1,2,1,0,1,1,1,1,0,1,0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,1,1,0, -2,0,0,1,0,3,2,2,2,2,1,2,1,2,1,2,0,0,0,2,1,2,2,1,1,2,2,0,1,1,0,2, -1,1,1,1,1,0,1,1,1,2,1,1,1,2,1,0,1,2,1,1,1,1,0,1,1,1,0,0,1,0,0,1, -1,3,2,2,2,1,1,1,2,3,0,0,0,0,2,0,2,2,1,0,0,0,0,0,0,1,0,0,0,0,1,1, -1,0,1,1,0,1,0,1,1,0,1,1,0,2,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, -2,3,2,3,2,1,2,2,2,2,1,0,0,0,2,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,2,1, -1,1,2,1,0,2,0,0,1,0,1,0,0,1,0,0,1,1,0,1,1,0,0,0,0,0,1,0,0,0,0,0, -3,0,0,1,0,2,2,2,3,2,2,2,2,2,2,2,0,0,0,2,1,2,1,1,1,2,2,0,0,0,1,2, -1,1,1,1,1,0,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,1, -2,3,2,3,3,2,0,1,1,1,0,0,1,0,2,0,1,1,3,1,0,0,0,0,0,0,0,1,0,0,2,1, -1,1,1,1,1,1,1,0,1,0,1,1,1,1,0,1,1,1,0,0,1,1,0,1,0,0,0,0,0,0,1,0, -2,3,3,3,3,1,2,2,2,2,0,1,1,0,2,1,1,1,2,1,0,1,1,0,0,1,0,1,0,0,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,2,0,0,1,1,2,2,1,0,0,2,0,1,1,3,0,0,1,0,0,0,0,0,1,0,1,2,1, -1,1,2,0,1,1,1,0,1,0,1,1,0,1,0,1,1,1,1,0,1,0,0,0,0,0,0,1,0,1,1,0, -1,3,2,3,2,1,0,0,2,2,2,0,1,0,2,0,1,1,1,0,1,0,0,0,3,0,1,1,0,0,2,1, -1,1,1,0,1,1,0,0,0,0,1,1,0,1,0,0,2,1,1,0,1,0,0,0,1,0,1,0,0,1,1,0, -3,1,2,1,1,2,2,2,2,2,2,1,2,2,1,1,0,0,0,2,2,2,0,0,0,1,2,1,0,1,0,1, -2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2,1,1,1,0,1,0,1,1,0,1,1,1,0,0,1, -3,0,0,0,0,2,0,1,1,1,1,1,1,1,0,1,0,0,0,1,1,1,0,1,0,1,1,0,0,1,0,1, -1,1,0,0,1,0,0,0,1,0,1,1,0,0,1,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1, -1,3,3,2,2,0,0,0,2,2,0,0,0,1,2,0,1,1,2,0,0,0,0,0,0,0,0,1,0,0,2,1, -0,1,1,0,0,1,1,0,0,0,1,1,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0, -2,3,2,3,2,0,0,0,0,1,1,0,0,0,2,0,2,0,2,0,0,0,0,0,1,0,0,1,0,0,1,1, -1,1,2,0,1,2,1,0,1,1,2,1,1,1,1,1,2,1,1,0,1,0,0,1,1,1,1,1,0,1,1,0, -1,3,2,2,2,1,0,0,2,2,1,0,1,2,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1, -0,0,1,1,0,1,1,0,0,1,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,1,0,2,3,1,2,2,2,2,2,2,1,1,0,0,0,1,0,1,0,2,1,1,1,0,0,0,0,1, -1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, -2,0,2,0,0,1,0,3,2,1,2,1,2,2,0,1,0,0,0,2,1,0,0,2,1,1,1,1,0,2,0,2, -2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,0,0,0,1,1,1,1,0,1,0,0,1, -1,2,2,2,2,1,0,0,1,0,0,0,0,0,2,0,1,1,1,1,0,0,0,0,1,0,1,2,0,0,2,0, -1,0,1,1,1,2,1,0,1,0,1,1,0,0,1,0,1,1,1,0,1,0,0,0,1,0,0,1,0,1,1,0, -2,1,2,2,2,0,3,0,1,1,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -0,0,0,1,1,1,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0, -1,2,2,3,2,2,0,0,1,1,2,0,1,2,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1, -0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, -2,2,1,1,2,1,2,2,2,2,2,1,2,2,0,1,0,0,0,1,2,2,2,1,2,1,1,1,1,1,2,1, -1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,0,1, -1,2,2,2,2,0,1,0,2,2,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0, -0,0,1,0,0,1,0,0,0,0,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,2,2,0,0,0,2,2,2,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1, -0,1,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,2,2,0,0,0,0,1,0,0,1,1,2,0,0,0,0,1,0,1,0,0,1,0,0,2,0,0,0,1, -0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,2,1,1,2,0,2,1,1,1,1,0,2,2,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1, -0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -1,0,2,1,2,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0, -0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, -1,0,0,0,0,2,0,1,2,1,0,1,1,1,0,1,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,1, -0,0,0,0,0,1,0,0,1,1,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1, -2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -1,1,1,0,1,0,1,0,0,1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -1,1,0,1,1,0,1,0,1,0,0,0,0,1,1,0,1,1,0,0,0,0,0,1,0,1,1,0,1,0,0,0, -0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, -) - -Koi8rModel = { - 'char_to_order_map': KOI8R_char_to_order_map, - 'precedence_matrix': RussianLangModel, - 'typical_positive_ratio': 0.976601, - 'keep_english_letter': False, - 'charset_name': "KOI8-R", - 'language': 'Russian', -} - -Win1251CyrillicModel = { - 'char_to_order_map': win1251_char_to_order_map, - 'precedence_matrix': RussianLangModel, - 'typical_positive_ratio': 0.976601, - 'keep_english_letter': False, - 'charset_name': "windows-1251", - 'language': 'Russian', -} - -Latin5CyrillicModel = { - 'char_to_order_map': latin5_char_to_order_map, - 'precedence_matrix': RussianLangModel, - 'typical_positive_ratio': 0.976601, - 'keep_english_letter': False, - 'charset_name': "ISO-8859-5", - 'language': 'Russian', -} - -MacCyrillicModel = { - 'char_to_order_map': macCyrillic_char_to_order_map, - 'precedence_matrix': RussianLangModel, - 'typical_positive_ratio': 0.976601, - 'keep_english_letter': False, - 'charset_name': "MacCyrillic", - 'language': 'Russian', -} - -Ibm866Model = { - 'char_to_order_map': IBM866_char_to_order_map, - 'precedence_matrix': RussianLangModel, - 'typical_positive_ratio': 0.976601, - 'keep_english_letter': False, - 'charset_name': "IBM866", - 'language': 'Russian', -} - -Ibm855Model = { - 'char_to_order_map': IBM855_char_to_order_map, - 'precedence_matrix': RussianLangModel, - 'typical_positive_ratio': 0.976601, - 'keep_english_letter': False, - 'charset_name': "IBM855", - 'language': 'Russian', -} diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langcyrillicmodel.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langcyrillicmodel.pyc deleted file mode 100644 index 45a701fc3856dd51fc4b6e1728358bf46f391d99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30731 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 M<6rylgkkai4RSK)5C8xG diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langgreekmodel.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langgreekmodel.py deleted file mode 100644 index 5332221..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langgreekmodel.py +++ /dev/null @@ -1,225 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# 255: Control characters that usually does not exist in any text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 - -# Character Mapping Table: -Latin7_char_to_order_map = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 - 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 -253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 - 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 -253,233, 90,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 -253,253,253,253,247,248, 61, 36, 46, 71, 73,253, 54,253,108,123, # b0 -110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 - 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 -124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 - 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 -) - -win1253_char_to_order_map = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 - 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 -253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 - 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 -253,233, 61,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 -253,253,253,253,247,253,253, 36, 46, 71, 73,253, 54,253,108,123, # b0 -110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 - 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 -124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 - 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 -) - -# Model Table: -# total sequences: 100% -# first 512 sequences: 98.2851% -# first 1024 sequences:1.7001% -# rest sequences: 0.0359% -# negative sequences: 0.0148% -GreekLangModel = ( -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,2,2,3,3,3,3,3,3,3,3,1,3,3,3,0,2,2,3,3,0,3,0,3,2,0,3,3,3,0, -3,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,0,3,3,0,3,2,3,3,0,3,2,3,3,3,0,0,3,0,3,0,3,3,2,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, -0,2,3,2,2,3,3,3,3,3,3,3,3,0,3,3,3,3,0,2,3,3,0,3,3,3,3,2,3,3,3,0, -2,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,2,1,3,3,3,3,2,3,3,2,3,3,2,0, -0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,2,3,3,0, -2,0,1,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,2,3,0,0,0,0,3,3,0,3,1,3,3,3,0,3,3,0,3,3,3,3,0,0,0,0, -2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,0,3,0,3,3,3,3,3,0,3,2,2,2,3,0,2,3,3,3,3,3,2,3,3,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,3,2,2,2,3,3,3,3,0,3,1,3,3,3,3,2,3,3,3,3,3,3,3,2,2,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,2,0,3,0,0,0,3,3,2,3,3,3,3,3,0,0,3,2,3,0,2,3,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,0,3,3,3,3,0,0,3,3,0,2,3,0,3,0,3,3,3,0,0,3,0,3,0,2,2,3,3,0,0, -0,0,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,2,0,3,2,3,3,3,3,0,3,3,3,3,3,0,3,3,2,3,2,3,3,2,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,2,3,2,3,3,3,3,3,3,0,2,3,2,3,2,2,2,3,2,3,3,2,3,0,2,2,2,3,0, -2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,0,0,0,3,3,3,2,3,3,0,0,3,0,3,0,0,0,3,2,0,3,0,3,0,0,2,0,2,0, -0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,0,0,0,3,3,0,3,3,3,0,0,1,2,3,0, -3,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,2,0,0,3,2,2,3,3,0,3,3,3,3,3,2,1,3,0,3,2,3,3,2,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,3,0,2,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,3,0,3,2,3,0,0,3,3,3,0, -3,0,0,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,0,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,2,0,3,2,3,0,0,3,2,3,0, -2,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,1,2,2,3,3,3,3,3,3,0,2,3,0,3,0,0,0,3,3,0,3,0,2,0,0,2,3,1,0, -2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,0,3,3,3,3,0,3,0,3,3,2,3,0,3,3,3,3,3,3,0,3,3,3,0,2,3,0,0,3,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,0,3,3,3,0,0,3,0,0,0,3,3,0,3,0,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,0,0,0,3,3,3,3,3,3,0,0,3,0,2,0,0,0,3,3,0,3,0,3,0,0,2,0,2,0, -0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,3,0,3,0,2,0,3,2,0,3,2,3,2,3,0,0,3,2,3,2,3,3,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,0,0,2,3,3,3,3,3,0,0,0,3,0,2,1,0,0,3,2,2,2,0,3,0,0,2,2,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,0,3,3,3,2,0,3,0,3,0,3,3,0,2,1,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,3,3,3,0,3,3,3,3,3,3,0,2,3,0,3,0,0,0,2,1,0,2,2,3,0,0,2,2,2,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,0,0,2,3,3,3,2,3,0,0,1,3,0,2,0,0,0,0,3,0,1,0,2,0,0,1,1,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,1,0,3,0,0,0,3,2,0,3,2,3,3,3,0,0,3,0,3,2,2,2,1,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,0,3,3,3,0,0,3,0,0,0,0,2,0,2,3,3,2,2,2,2,3,0,2,0,2,2,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,2,0,0,0,0,0,0,2,3,0,2,0,2,3,2,0,0,3,0,3,0,3,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,3,2,3,3,2,2,3,0,2,0,3,0,0,0,2,0,0,0,0,1,2,0,2,0,2,0, -0,2,0,2,0,2,2,0,0,1,0,2,2,2,0,2,2,2,0,2,2,2,0,0,2,0,0,1,0,0,0,0, -0,2,0,3,3,2,0,0,0,0,0,0,1,3,0,2,0,2,2,2,0,0,2,0,3,0,0,2,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,0,2,3,2,0,2,2,0,2,0,2,2,0,2,0,2,2,2,0,0,0,0,0,0,2,3,0,0,0,2, -0,1,2,0,0,0,0,2,2,0,0,0,2,1,0,2,2,0,0,0,0,0,0,1,0,2,0,0,0,0,0,0, -0,0,2,1,0,2,3,2,2,3,2,3,2,0,0,3,3,3,0,0,3,2,0,0,0,1,1,0,2,0,2,2, -0,2,0,2,0,2,2,0,0,2,0,2,2,2,0,2,2,2,2,0,0,2,0,0,0,2,0,1,0,0,0,0, -0,3,0,3,3,2,2,0,3,0,0,0,2,2,0,2,2,2,1,2,0,0,1,2,2,0,0,3,0,0,0,2, -0,1,2,0,0,0,1,2,0,0,0,0,0,0,0,2,2,0,1,0,0,2,0,0,0,2,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,3,3,2,2,0,0,0,2,0,2,3,3,0,2,0,0,0,0,0,0,2,2,2,0,2,2,0,2,0,2, -0,2,2,0,0,2,2,2,2,1,0,0,2,2,0,2,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0, -0,2,0,3,2,3,0,0,0,3,0,0,2,2,0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,0,2, -0,0,2,2,0,0,2,2,2,0,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,2,0,0,3,2,0,2,2,2,2,2,0,0,0,2,0,0,0,0,2,0,1,0,0,2,0,1,0,0,0, -0,2,2,2,0,2,2,0,1,2,0,2,2,2,0,2,2,2,2,1,2,2,0,0,2,0,0,0,0,0,0,0, -0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -0,2,0,2,0,2,2,0,0,0,0,1,2,1,0,0,2,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,3,2,3,0,0,2,0,0,0,2,2,0,2,0,0,0,1,0,0,2,0,2,0,2,2,0,0,0,0, -0,0,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0, -0,2,2,3,2,2,0,0,0,0,0,0,1,3,0,2,0,2,2,0,0,0,1,0,2,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,0,2,0,3,2,0,2,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -0,0,2,0,0,0,0,1,1,0,0,2,1,2,0,2,2,0,1,0,0,1,0,0,0,2,0,0,0,0,0,0, -0,3,0,2,2,2,0,0,2,0,0,0,2,0,0,0,2,3,0,2,0,0,0,0,0,0,2,2,0,0,0,2, -0,1,2,0,0,0,1,2,2,1,0,0,0,2,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,1,2,0,2,2,0,2,0,0,2,0,0,0,0,1,2,1,0,2,1,0,0,0,0,0,0,0,0,0,0, -0,0,2,0,0,0,3,1,2,2,0,2,0,0,0,0,2,0,0,0,2,0,0,3,0,0,0,0,2,2,2,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,1,0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,2, -0,2,2,0,0,2,2,2,2,2,0,1,2,0,0,0,2,2,0,1,0,2,0,0,2,2,0,0,0,0,0,0, -0,0,0,0,1,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,0,0,0,0,2,0,2,0,0,0,0,2, -0,1,2,0,0,0,0,2,2,1,0,1,0,1,0,2,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0, -0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,2,0,0,2,2,0,0,0,0,1,0,0,0,0,0,0,2, -0,2,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0, -0,2,2,2,2,0,0,0,3,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,1, -0,0,2,0,0,0,0,1,2,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0, -0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,2,2,2,0,0,0,2,0,0,0,0,0,0,0,0,2, -0,0,1,0,0,0,0,2,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, -0,3,0,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,2, -0,0,2,0,0,0,0,2,2,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,0,2,2,1,0,0,0,0,0,0,2,0,0,2,0,2,2,2,0,0,0,0,0,0,2,0,0,0,0,2, -0,0,2,0,0,2,0,2,2,0,0,0,0,2,0,2,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0, -0,0,3,0,0,0,2,2,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0,0,0, -0,2,2,2,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1, -0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -0,2,0,0,0,2,0,0,0,0,0,1,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,2,0,0,0, -0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,2,0,2,0,0,0, -0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -) - -Latin7GreekModel = { - 'char_to_order_map': Latin7_char_to_order_map, - 'precedence_matrix': GreekLangModel, - 'typical_positive_ratio': 0.982851, - 'keep_english_letter': False, - 'charset_name': "ISO-8859-7", - 'language': 'Greek', -} - -Win1253GreekModel = { - 'char_to_order_map': win1253_char_to_order_map, - 'precedence_matrix': GreekLangModel, - 'typical_positive_ratio': 0.982851, - 'keep_english_letter': False, - 'charset_name': "windows-1253", - 'language': 'Greek', -} diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langgreekmodel.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langgreekmodel.pyc deleted file mode 100644 index cf33a34305d3a516ba3b972ce846d1b66fd28a6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24686 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 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langhebrewmodel.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langhebrewmodel.py deleted file mode 100644 index 58f4c87..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langhebrewmodel.py +++ /dev/null @@ -1,200 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Simon Montagu -# Portions created by the Initial Developer are Copyright (C) 2005 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# Shoshannah Forbes - original C code (?) -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# 255: Control characters that usually does not exist in any text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 - -# Windows-1255 language model -# Character Mapping Table: -WIN1255_CHAR_TO_ORDER_MAP = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 69, 91, 79, 80, 92, 89, 97, 90, 68,111,112, 82, 73, 95, 85, # 40 - 78,121, 86, 71, 67,102,107, 84,114,103,115,253,253,253,253,253, # 50 -253, 50, 74, 60, 61, 42, 76, 70, 64, 53,105, 93, 56, 65, 54, 49, # 60 - 66,110, 51, 43, 44, 63, 81, 77, 98, 75,108,253,253,253,253,253, # 70 -124,202,203,204,205, 40, 58,206,207,208,209,210,211,212,213,214, -215, 83, 52, 47, 46, 72, 32, 94,216,113,217,109,218,219,220,221, - 34,116,222,118,100,223,224,117,119,104,125,225,226, 87, 99,227, -106,122,123,228, 55,229,230,101,231,232,120,233, 48, 39, 57,234, - 30, 59, 41, 88, 33, 37, 36, 31, 29, 35,235, 62, 28,236,126,237, -238, 38, 45,239,240,241,242,243,127,244,245,246,247,248,249,250, - 9, 8, 20, 16, 3, 2, 24, 14, 22, 1, 25, 15, 4, 11, 6, 23, - 12, 19, 13, 26, 18, 27, 21, 17, 7, 10, 5,251,252,128, 96,253, -) - -# Model Table: -# total sequences: 100% -# first 512 sequences: 98.4004% -# first 1024 sequences: 1.5981% -# rest sequences: 0.087% -# negative sequences: 0.0015% -HEBREW_LANG_MODEL = ( -0,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,3,2,1,2,0,1,0,0, -3,0,3,1,0,0,1,3,2,0,1,1,2,0,2,2,2,1,1,1,1,2,1,1,1,2,0,0,2,2,0,1, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2, -1,2,1,2,1,2,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2, -1,2,1,3,1,1,0,0,2,0,0,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,1,2,2,1,3, -1,2,1,1,2,2,0,0,2,2,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,1,0,1,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,2,2,2,3,2, -1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,3,2,2,3,2,2,2,1,2,2,2,2, -1,2,1,1,2,2,0,1,2,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,0,2,2,2,2,2, -0,2,0,2,2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,0,2,2,2, -0,2,1,2,2,2,0,0,2,1,0,0,0,0,1,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,2,1,2,3,2,2,2, -1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0, -3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,2,0,2, -0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,2,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,2,2,3,2,1,2,1,1,1, -0,1,1,1,1,1,3,0,1,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,0,0,1,0,0,1,0,0,0,0, -0,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2, -0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,2,3,3,3,2,1,2,3,3,2,3,3,3,3,2,3,2,1,2,0,2,1,2, -0,2,0,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0, -3,3,3,3,3,3,3,3,3,2,3,3,3,1,2,2,3,3,2,3,2,3,2,2,3,1,2,2,0,2,2,2, -0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,2,2,3,3,3,3,1,3,2,2,2, -0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,2,3,2,2,2,1,2,2,0,2,2,2,2, -0,2,0,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,1,3,2,3,3,2,3,3,2,2,1,2,2,2,2,2,2, -0,2,1,2,1,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,2,3,2,3,3,2,3,3,3,3,2,3,2,3,3,3,3,3,2,2,2,2,2,2,2,1, -0,2,0,1,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,2,1,2,3,3,3,3,3,3,3,2,3,2,3,2,1,2,3,0,2,1,2,2, -0,2,1,1,2,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,2,0, -3,3,3,3,3,3,3,3,3,2,3,3,3,3,2,1,3,1,2,2,2,1,2,3,3,1,2,1,2,2,2,2, -0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,0,2,3,3,3,1,3,3,3,1,2,2,2,2,1,1,2,2,2,2,2,2, -0,2,0,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,2,3,3,3,2,2,3,3,3,2,1,2,3,2,3,2,2,2,2,1,2,1,1,1,2,2, -0,2,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,1,0,0,0,0,0, -1,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,2,3,3,2,3,1,2,2,2,2,3,2,3,1,1,2,2,1,2,2,1,1,0,2,2,2,2, -0,1,0,1,2,2,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,0,0,1,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,0, -0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,1,0,1,0,1,1,0,1,1,0,0,0,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -3,2,2,1,2,2,2,2,2,2,2,1,2,2,1,2,2,1,1,1,1,1,1,1,1,2,1,1,0,3,3,3, -0,3,0,2,2,2,2,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,1,2,2,2,1,1,1,2,0,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,0,2,2,0,0,0,0,0,0, -0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,1,0,2,1,0, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, -0,3,1,1,2,2,2,2,2,1,2,2,2,1,1,2,2,2,2,2,2,2,1,2,2,1,0,1,1,1,1,0, -0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,1,1,1,1,2,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, -0,0,2,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,0,0, -2,1,1,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,1,2,1,2,1,1,1,1,0,0,0,0, -0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,2,1,2,2,2,2,2,2,2,2,2,2,1,2,1,2,1,1,2,1,1,1,2,1,2,1,2,0,1,0,1, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,1,2,2,2,1,2,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,2,1,2,1,1,0,1,0,1, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,1,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2, -0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,1,1,1,1,1,1,1,0,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,2,0,1,1,1,0,1,0,0,0,1,1,0,1,1,0,0,0,0,0,1,1,0,0, -0,1,1,1,2,1,2,2,2,0,2,0,2,0,1,1,2,1,1,1,1,2,1,0,1,1,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,1,0,0,0,0,0,1,0,1,2,2,0,1,0,0,1,1,2,2,1,2,0,2,0,0,0,1,2,0,1, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,2,0,2,1,2,0,2,0,0,1,1,1,1,1,1,0,1,0,0,0,1,0,0,1, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,1,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,1,2,2,0,0,1,0,0,0,1,0,0,1, -1,1,2,1,0,1,1,1,0,1,0,1,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,2,1, -0,2,0,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,1,0,0,1,0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,1,0,0,0,1,1,0,1, -2,0,1,0,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,1,1,1,0,1,0,0,1,1,2,1,1,2,0,1,0,0,0,1,1,0,1, -1,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,0,0,2,1,1,2,0,2,0,0,0,1,1,0,1, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,2,2,1,2,1,1,0,1,0,0,0,1,1,0,1, -2,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,1,0,1, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,2,1,1,1,0,2,1,1,0,0,0,2,1,0,1, -1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,0,2,1,1,0,1,0,0,0,1,1,0,1, -2,2,1,1,1,0,1,1,0,1,1,0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,0,1,2,1,0,2,0,0,0,1,1,0,1, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0, -0,1,0,0,2,0,2,1,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,1,0,1,0,0,1,0,0,0,1,0,0,1, -1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,0,0,0,0,0,1,0,1,1,0,0,1,0,0,2,1,1,1,1,1,0,1,0,0,0,0,1,0,1, -0,1,1,1,2,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,2,1,0,0,0,0,0,1,1,1,1,1,0,1,0,0,0,1,1,0,0, -) - -Win1255HebrewModel = { - 'char_to_order_map': WIN1255_CHAR_TO_ORDER_MAP, - 'precedence_matrix': HEBREW_LANG_MODEL, - 'typical_positive_ratio': 0.984004, - 'keep_english_letter': False, - 'charset_name': "windows-1255", - 'language': 'Hebrew', -} diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langhebrewmodel.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langhebrewmodel.pyc deleted file mode 100644 index 1732b977e920d91db7efb1df7adb546d91ce5568..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23497 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 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langhungarianmodel.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langhungarianmodel.py deleted file mode 100644 index bb7c095..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langhungarianmodel.py +++ /dev/null @@ -1,225 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# 255: Control characters that usually does not exist in any text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 - -# Character Mapping Table: -Latin2_HungarianCharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, - 46, 71, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, -253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, - 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, -159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174, -175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190, -191,192,193,194,195,196,197, 75,198,199,200,201,202,203,204,205, - 79,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, -221, 51, 81,222, 78,223,224,225,226, 44,227,228,229, 61,230,231, -232,233,234, 58,235, 66, 59,236,237,238, 60, 69, 63,239,240,241, - 82, 14, 74,242, 70, 80,243, 72,244, 15, 83, 77, 84, 30, 76, 85, -245,246,247, 25, 73, 42, 24,248,249,250, 31, 56, 29,251,252,253, -) - -win1250HungarianCharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, - 46, 72, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, -253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, - 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, -161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176, -177,178,179,180, 78,181, 69,182,183,184,185,186,187,188,189,190, -191,192,193,194,195,196,197, 76,198,199,200,201,202,203,204,205, - 81,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, -221, 51, 83,222, 80,223,224,225,226, 44,227,228,229, 61,230,231, -232,233,234, 58,235, 66, 59,236,237,238, 60, 70, 63,239,240,241, - 84, 14, 75,242, 71, 82,243, 73,244, 15, 85, 79, 86, 30, 77, 87, -245,246,247, 25, 74, 42, 24,248,249,250, 31, 56, 29,251,252,253, -) - -# Model Table: -# total sequences: 100% -# first 512 sequences: 94.7368% -# first 1024 sequences:5.2623% -# rest sequences: 0.8894% -# negative sequences: 0.0009% -HungarianLangModel = ( -0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, -3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,2,3,3,1,1,2,2,2,2,2,1,2, -3,2,2,3,3,3,3,3,2,3,3,3,3,3,3,1,2,3,3,3,3,2,3,3,1,1,3,3,0,1,1,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0, -3,2,1,3,3,3,3,3,2,3,3,3,3,3,1,1,2,3,3,3,3,3,3,3,1,1,3,2,0,1,1,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,1,1,2,3,3,3,1,3,3,3,3,3,1,3,3,2,2,0,3,2,3, -0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,3,3,2,3,3,2,2,3,2,3,2,0,3,2,2, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, -3,3,3,3,3,3,2,3,3,3,3,3,2,3,3,3,1,2,3,2,2,3,1,2,3,3,2,2,0,3,3,3, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,3,2,3,3,3,3,2,3,3,3,3,0,2,3,2, -0,0,0,1,1,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,1,1,1,3,3,2,1,3,2,2,3,2,1,3,2,2,1,0,3,3,1, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,2,2,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,3,2,2,3,1,1,3,2,0,1,1,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,1,3,3,3,3,3,2,2,1,3,3,3,0,1,1,2, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,2,0,3,2,3, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,0, -3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,1,3,2,2,2,3,1,1,3,3,1,1,0,3,3,2, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,2,3,3,3,3,3,1,2,3,2,2,0,2,2,2, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,2,2,2,3,1,3,3,2,2,1,3,3,3,1,1,3,1,2,3,2,3,2,2,2,1,0,2,2,2, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, -3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,2,2,3,2,1,0,3,2,0,1,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,1,0,3,3,3,3,0,2,3,0,0,2,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,2,3,3,2,2,2,2,3,3,0,1,2,3,2,3,2,2,3,2,1,2,0,2,2,2, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, -3,3,3,3,3,3,1,2,3,3,3,2,1,2,3,3,2,2,2,3,2,3,3,1,3,3,1,1,0,2,3,2, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,1,2,2,2,2,3,3,3,1,1,1,3,3,1,1,3,1,1,3,2,1,2,3,1,1,0,2,2,2, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,2,1,2,1,1,3,3,1,1,1,1,3,3,1,1,2,2,1,2,1,1,2,2,1,1,0,2,2,1, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,1,1,2,1,1,3,3,1,0,1,1,3,3,2,0,1,1,2,3,1,0,2,2,1,0,0,1,3,2, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,2,1,3,3,3,3,3,1,2,3,2,3,3,2,1,1,3,2,3,2,1,2,2,0,1,2,1,0,0,1,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,2,2,2,2,3,1,2,2,1,1,3,3,0,3,2,1,2,3,2,1,3,3,1,1,0,2,1,3, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,2,2,2,3,2,3,3,3,2,1,1,3,3,1,1,1,2,2,3,2,3,2,2,2,1,0,2,2,1, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -1,0,0,3,3,3,3,3,0,0,3,3,2,3,0,0,0,2,3,3,1,0,1,2,0,0,1,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,2,3,3,3,3,3,1,2,3,3,2,2,1,1,0,3,3,2,2,1,2,2,1,0,2,2,0,1,1,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,2,2,1,3,1,2,3,3,2,2,1,1,2,2,1,1,1,1,3,2,1,1,1,1,2,1,0,1,2,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0, -2,3,3,1,1,1,1,1,3,3,3,0,1,1,3,3,1,1,1,1,1,2,2,0,3,1,1,2,0,2,1,1, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,1,0,1,2,1,2,2,0,1,2,3,1,2,0,0,0,2,1,1,1,1,1,2,0,0,1,1,0,0,0,0, -1,2,1,2,2,2,1,2,1,2,0,2,0,2,2,1,1,2,1,1,2,1,1,1,0,1,0,0,0,1,1,0, -1,1,1,2,3,2,3,3,0,1,2,2,3,1,0,1,0,2,1,2,2,0,1,1,0,0,1,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,3,3,2,2,1,0,0,3,2,3,2,0,0,0,1,1,3,0,0,1,1,0,0,2,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,1,2,2,3,3,1,0,1,3,2,3,1,1,1,0,1,1,1,1,1,3,1,0,0,2,2,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,1,1,2,2,2,1,0,1,2,3,3,2,0,0,0,2,1,1,1,2,1,1,1,0,1,1,1,0,0,0, -1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,2,1,1,1,1,1,1,0,1,1,1,0,0,1,1, -3,2,2,1,0,0,1,1,2,2,0,3,0,1,2,1,1,0,0,1,1,1,0,1,1,1,1,0,2,1,1,1, -2,2,1,1,1,2,1,2,1,1,1,1,1,1,1,2,1,1,1,2,3,1,1,1,1,1,1,1,1,1,0,1, -2,3,3,0,1,0,0,0,3,3,1,0,0,1,2,2,1,0,0,0,0,2,0,0,1,1,1,0,2,1,1,1, -2,1,1,1,1,1,1,2,1,1,0,1,1,0,1,1,1,0,1,2,1,1,0,1,1,1,1,1,1,1,0,1, -2,3,3,0,1,0,0,0,2,2,0,0,0,0,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,1,0, -2,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, -3,2,2,0,1,0,1,0,2,3,2,0,0,1,2,2,1,0,0,1,1,1,0,0,2,1,0,1,2,2,1,1, -2,1,1,1,1,1,1,2,1,1,1,1,1,1,0,2,1,0,1,1,0,1,1,1,0,1,1,2,1,1,0,1, -2,2,2,0,0,1,0,0,2,2,1,1,0,0,2,1,1,0,0,0,1,2,0,0,2,1,0,0,2,1,1,1, -2,1,1,1,1,2,1,2,1,1,1,2,2,1,1,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1, -1,2,3,0,0,0,1,0,3,2,1,0,0,1,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,2,1, -1,1,0,0,0,1,0,1,1,1,1,1,2,0,0,1,0,0,0,2,0,0,1,1,1,1,1,1,1,1,0,1, -3,0,0,2,1,2,2,1,0,0,2,1,2,2,0,0,0,2,1,1,1,0,1,1,0,0,1,1,2,0,0,0, -1,2,1,2,2,1,1,2,1,2,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,0,0,1, -1,3,2,0,0,0,1,0,2,2,2,0,0,0,2,2,1,0,0,0,0,3,1,1,1,1,0,0,2,1,1,1, -2,1,0,1,1,1,0,1,1,1,1,1,1,1,0,2,1,0,0,1,0,1,1,0,1,1,1,1,1,1,0,1, -2,3,2,0,0,0,1,0,2,2,0,0,0,0,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,1,0, -2,1,1,1,1,2,1,2,1,2,0,1,1,1,0,2,1,1,1,2,1,1,1,1,0,1,1,1,1,1,0,1, -3,1,1,2,2,2,3,2,1,1,2,2,1,1,0,1,0,2,2,1,1,1,1,1,0,0,1,1,0,1,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,0,0,0,0,0,2,2,0,0,0,0,2,2,1,0,0,0,1,1,0,0,1,2,0,0,2,1,1,1, -2,2,1,1,1,2,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,1,1,0,1,2,1,1,1,0,1, -1,0,0,1,2,3,2,1,0,0,2,0,1,1,0,0,0,1,1,1,1,0,1,1,0,0,1,0,0,0,0,0, -1,2,1,2,1,2,1,1,1,2,0,2,1,1,1,0,1,2,0,0,1,1,1,0,0,0,0,0,0,0,0,0, -2,3,2,0,0,0,0,0,1,1,2,1,0,0,1,1,1,0,0,0,0,2,0,0,1,1,0,0,2,1,1,1, -2,1,1,1,1,1,1,2,1,0,1,1,1,1,0,2,1,1,1,1,1,1,0,1,0,1,1,1,1,1,0,1, -1,2,2,0,1,1,1,0,2,2,2,0,0,0,3,2,1,0,0,0,1,1,0,0,1,1,0,1,1,1,0,0, -1,1,0,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,0,0,1,1,1,0,1,0,1, -2,1,0,2,1,1,2,2,1,1,2,1,1,1,0,0,0,1,1,0,1,1,1,1,0,0,1,1,1,0,0,0, -1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,1,0, -1,2,3,0,0,0,1,0,2,2,0,0,0,0,2,2,0,0,0,0,0,1,0,0,1,0,0,0,2,0,1,0, -2,1,1,1,1,1,0,2,0,0,0,1,2,1,1,1,1,0,1,2,0,1,0,1,0,1,1,1,0,1,0,1, -2,2,2,0,0,0,1,0,2,1,2,0,0,0,1,1,2,0,0,0,0,1,0,0,1,1,0,0,2,1,0,1, -2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, -1,2,2,0,0,0,1,0,2,2,2,0,0,0,1,1,0,0,0,0,0,1,1,0,2,0,0,1,1,1,0,1, -1,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,0,0,1,1,0,1,0,1,1,1,1,1,0,0,0,1, -1,0,0,1,0,1,2,1,0,0,1,1,1,2,0,0,0,1,1,0,1,0,1,1,0,0,1,0,0,0,0,0, -0,2,1,2,1,1,1,1,1,2,0,2,0,1,1,0,1,2,1,0,1,1,1,0,0,0,0,0,0,1,0,0, -2,1,1,0,1,2,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,2,1,0,1, -2,2,1,1,1,1,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,0,1,0,1,1,1,1,1,0,1, -1,2,2,0,0,0,0,0,1,1,0,0,0,0,2,1,0,0,0,0,0,2,0,0,2,2,0,0,2,0,0,1, -2,1,1,1,1,1,1,1,0,1,1,0,1,1,0,1,0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1, -1,1,2,0,0,3,1,0,2,1,1,1,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,1,0,1,0, -1,2,1,0,1,1,1,2,1,1,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,1,0,0,0,1,0,0, -2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,2,0,0,0, -2,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,1,0,1, -2,1,1,1,2,1,1,1,0,1,1,2,1,0,0,0,0,1,1,1,1,0,1,0,0,0,0,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,1,0,1,1,1,1,1,0,0,1,1,2,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0,1,0,0,0, -1,2,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0, -2,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,2,0,0,1,0,0,1,0,1,0,0,0, -0,1,1,1,1,1,1,1,1,2,0,1,1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, -1,0,0,1,1,1,1,1,0,0,2,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0, -0,1,1,1,1,1,1,0,1,1,0,1,0,1,1,0,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0, -1,0,0,1,1,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -0,1,1,1,1,1,0,0,1,1,0,1,0,1,0,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, -0,0,0,1,0,0,0,0,0,0,1,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,1,1,1,0,1,0,0,1,1,0,1,0,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, -2,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,1,0,1,0,1,1,1,0,0,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, -0,1,1,1,1,1,1,0,1,1,0,1,0,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0, -) - -Latin2HungarianModel = { - 'char_to_order_map': Latin2_HungarianCharToOrderMap, - 'precedence_matrix': HungarianLangModel, - 'typical_positive_ratio': 0.947368, - 'keep_english_letter': True, - 'charset_name': "ISO-8859-2", - 'language': 'Hungarian', -} - -Win1250HungarianModel = { - 'char_to_order_map': win1250HungarianCharToOrderMap, - 'precedence_matrix': HungarianLangModel, - 'typical_positive_ratio': 0.947368, - 'keep_english_letter': True, - 'charset_name': "windows-1250", - 'language': 'Hungarian', -} diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langhungarianmodel.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langhungarianmodel.pyc deleted file mode 100644 index 1bc3bfca41cf28b6eb1aa2dbf1dbfc2a5ccaa510..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24981 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 T|6gYp%$ql7$IZVMz99QI@Ubjl diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langthaimodel.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langthaimodel.py deleted file mode 100644 index 15f94c2..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langthaimodel.py +++ /dev/null @@ -1,199 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# 255: Control characters that usually does not exist in any text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 - -# The following result for thai was collected from a limited sample (1M). - -# Character Mapping Table: -TIS620CharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,182,106,107,100,183,184,185,101, 94,186,187,108,109,110,111, # 40 -188,189,190, 89, 95,112,113,191,192,193,194,253,253,253,253,253, # 50 -253, 64, 72, 73,114, 74,115,116,102, 81,201,117, 90,103, 78, 82, # 60 - 96,202, 91, 79, 84,104,105, 97, 98, 92,203,253,253,253,253,253, # 70 -209,210,211,212,213, 88,214,215,216,217,218,219,220,118,221,222, -223,224, 99, 85, 83,225,226,227,228,229,230,231,232,233,234,235, -236, 5, 30,237, 24,238, 75, 8, 26, 52, 34, 51,119, 47, 58, 57, - 49, 53, 55, 43, 20, 19, 44, 14, 48, 3, 17, 25, 39, 62, 31, 54, - 45, 9, 16, 2, 61, 15,239, 12, 42, 46, 18, 21, 76, 4, 66, 63, - 22, 10, 1, 36, 23, 13, 40, 27, 32, 35, 86,240,241,242,243,244, - 11, 28, 41, 29, 33,245, 50, 37, 6, 7, 67, 77, 38, 93,246,247, - 68, 56, 59, 65, 69, 60, 70, 80, 71, 87,248,249,250,251,252,253, -) - -# Model Table: -# total sequences: 100% -# first 512 sequences: 92.6386% -# first 1024 sequences:7.3177% -# rest sequences: 1.0230% -# negative sequences: 0.0436% -ThaiLangModel = ( -0,1,3,3,3,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,0,0,3,3,3,0,3,3,3,3, -0,3,3,0,0,0,1,3,0,3,3,2,3,3,0,1,2,3,3,3,3,0,2,0,2,0,0,3,2,1,2,2, -3,0,3,3,2,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,0,3,2,3,0,2,2,2,3, -0,2,3,0,0,0,0,1,0,1,2,3,1,1,3,2,2,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1, -3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,3,3,2,3,2,3,3,2,2,2, -3,1,2,3,0,3,3,2,2,1,2,3,3,1,2,0,1,3,0,1,0,0,1,0,0,0,0,0,0,0,1,1, -3,3,2,2,3,3,3,3,1,2,3,3,3,3,3,2,2,2,2,3,3,2,2,3,3,2,2,3,2,3,2,2, -3,3,1,2,3,1,2,2,3,3,1,0,2,1,0,0,3,1,2,1,0,0,1,0,0,0,0,0,0,1,0,1, -3,3,3,3,3,3,2,2,3,3,3,3,2,3,2,2,3,3,2,2,3,2,2,2,2,1,1,3,1,2,1,1, -3,2,1,0,2,1,0,1,0,1,1,0,1,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0, -3,3,3,2,3,2,3,3,2,2,3,2,3,3,2,3,1,1,2,3,2,2,2,3,2,2,2,2,2,1,2,1, -2,2,1,1,3,3,2,1,0,1,2,2,0,1,3,0,0,0,1,1,0,0,0,0,0,2,3,0,0,2,1,1, -3,3,2,3,3,2,0,0,3,3,0,3,3,0,2,2,3,1,2,2,1,1,1,0,2,2,2,0,2,2,1,1, -0,2,1,0,2,0,0,2,0,1,0,0,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,2,3,3,2,0,0,3,3,0,2,3,0,2,1,2,2,2,2,1,2,0,0,2,2,2,0,2,2,1,1, -0,2,1,0,2,0,0,2,0,1,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0, -3,3,2,3,2,3,2,0,2,2,1,3,2,1,3,2,1,2,3,2,2,3,0,2,3,2,2,1,2,2,2,2, -1,2,2,0,0,0,0,2,0,1,2,0,1,1,1,0,1,0,3,1,1,0,0,0,0,0,0,0,0,0,1,0, -3,3,2,3,3,2,3,2,2,2,3,2,2,3,2,2,1,2,3,2,2,3,1,3,2,2,2,3,2,2,2,3, -3,2,1,3,0,1,1,1,0,2,1,1,1,1,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0,2,0,0, -1,0,0,3,0,3,3,3,3,3,0,0,3,0,2,2,3,3,3,3,3,0,0,0,1,1,3,0,0,0,0,2, -0,0,1,0,0,0,0,0,0,0,2,3,0,0,0,3,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0, -2,0,3,3,3,3,0,0,2,3,0,0,3,0,3,3,2,3,3,3,3,3,0,0,3,3,3,0,0,0,3,3, -0,0,3,0,0,0,0,2,0,0,2,1,1,3,0,0,1,0,0,2,3,0,1,0,0,0,0,0,0,0,1,0, -3,3,3,3,2,3,3,3,3,3,3,3,1,2,1,3,3,2,2,1,2,2,2,3,1,1,2,0,2,1,2,1, -2,2,1,0,0,0,1,1,0,1,0,1,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0, -3,0,2,1,2,3,3,3,0,2,0,2,2,0,2,1,3,2,2,1,2,1,0,0,2,2,1,0,2,1,2,2, -0,1,1,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,2,1,3,3,1,1,3,0,2,3,1,1,3,2,1,1,2,0,2,2,3,2,1,1,1,1,1,2, -3,0,0,1,3,1,2,1,2,0,3,0,0,0,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, -3,3,1,1,3,2,3,3,3,1,3,2,1,3,2,1,3,2,2,2,2,1,3,3,1,2,1,3,1,2,3,0, -2,1,1,3,2,2,2,1,2,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, -3,3,2,3,2,3,3,2,3,2,3,2,3,3,2,1,0,3,2,2,2,1,2,2,2,1,2,2,1,2,1,1, -2,2,2,3,0,1,3,1,1,1,1,0,1,1,0,2,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,2,3,2,2,1,1,3,2,3,2,3,2,0,3,2,2,1,2,0,2,2,2,1,2,2,2,2,1, -3,2,1,2,2,1,0,2,0,1,0,0,1,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,2,3,1,2,3,3,2,2,3,0,1,1,2,0,3,3,2,2,3,0,1,1,3,0,0,0,0, -3,1,0,3,3,0,2,0,2,1,0,0,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,2,3,2,3,3,0,1,3,1,1,2,1,2,1,1,3,1,1,0,2,3,1,1,1,1,1,1,1,1, -3,1,1,2,2,2,2,1,1,1,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,2,2,1,1,2,1,3,3,2,3,2,2,3,2,2,3,1,2,2,1,2,0,3,2,1,2,2,2,2,2,1, -3,2,1,2,2,2,1,1,1,1,0,0,1,1,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,1,3,3,0,2,1,0,3,2,0,0,3,1,0,1,1,0,1,0,0,0,0,0,1, -1,0,0,1,0,3,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,2,2,2,3,0,0,1,3,0,3,2,0,3,2,2,3,3,3,3,3,1,0,2,2,2,0,2,2,1,2, -0,2,3,0,0,0,0,1,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,0,2,3,1,3,3,2,3,3,0,3,3,0,3,2,2,3,2,3,3,3,0,0,2,2,3,0,1,1,1,3, -0,0,3,0,0,0,2,2,0,1,3,0,1,2,2,2,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1, -3,2,3,3,2,0,3,3,2,2,3,1,3,2,1,3,2,0,1,2,2,0,2,3,2,1,0,3,0,0,0,0, -3,0,0,2,3,1,3,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,3,2,2,2,1,2,0,1,3,1,1,3,1,3,0,0,2,1,1,1,1,2,1,1,1,0,2,1,0,1, -1,2,0,0,0,3,1,1,0,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,0,3,1,0,0,0,1,0, -3,3,3,3,2,2,2,2,2,1,3,1,1,1,2,0,1,1,2,1,2,1,3,2,0,0,3,1,1,1,1,1, -3,1,0,2,3,0,0,0,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,2,3,0,3,3,0,2,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,2,3,1,3,0,0,1,2,0,0,2,0,3,3,2,3,3,3,2,3,0,0,2,2,2,0,0,0,2,2, -0,0,1,0,0,0,0,3,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -0,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,1,2,3,1,3,3,0,0,1,0,3,0,0,0,0,0, -0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,1,2,3,1,2,3,1,0,3,0,2,2,1,0,2,1,1,2,0,1,0,0,1,1,1,1,0,1,0,0, -1,0,0,0,0,1,1,0,3,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,2,1,0,1,1,1,3,1,2,2,2,2,2,2,1,1,1,1,0,3,1,0,1,3,1,1,1,1, -1,1,0,2,0,1,3,1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,1, -3,0,2,2,1,3,3,2,3,3,0,1,1,0,2,2,1,2,1,3,3,1,0,0,3,2,0,0,0,0,2,1, -0,1,0,0,0,0,1,2,0,1,1,3,1,1,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -0,0,3,0,0,1,0,0,0,3,0,0,3,0,3,1,0,1,1,1,3,2,0,0,0,3,0,0,0,0,2,0, -0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, -3,3,1,3,2,1,3,3,1,2,2,0,1,2,1,0,1,2,0,0,0,0,0,3,0,0,0,3,0,0,0,0, -3,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,1,2,0,3,3,3,2,2,0,1,1,0,1,3,0,0,0,2,2,0,0,0,0,3,1,0,1,0,0,0, -0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,2,3,1,2,0,0,2,1,0,3,1,0,1,2,0,1,1,1,1,3,0,0,3,1,1,0,2,2,1,1, -0,2,0,0,0,0,0,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,0,3,1,2,0,0,2,2,0,1,2,0,1,0,1,3,1,2,1,0,0,0,2,0,3,0,0,0,1,0, -0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,1,1,2,2,0,0,0,2,0,2,1,0,1,1,0,1,1,1,2,1,0,0,1,1,1,0,2,1,1,1, -0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1, -0,0,0,2,0,1,3,1,1,1,1,0,0,0,0,3,2,0,1,0,0,0,1,2,0,0,0,1,0,0,0,0, -0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,2,3,2,2,0,0,0,1,0,0,0,0,2,3,2,1,2,2,3,0,0,0,2,3,1,0,0,0,1,1, -0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0, -3,3,2,2,0,1,0,0,0,0,2,0,2,0,1,0,0,0,1,1,0,0,0,2,1,0,1,0,1,1,0,0, -0,1,0,2,0,0,1,0,3,0,1,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,1,0,0,1,0,0,0,0,0,1,1,2,0,0,0,0,1,0,0,1,3,1,0,0,0,0,1,1,0,0, -0,1,0,0,0,0,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0, -3,3,1,1,1,1,2,3,0,0,2,1,1,1,1,1,0,2,1,1,0,0,0,2,1,0,1,2,1,1,0,1, -2,1,0,3,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,3,1,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1, -0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,2,0,0,0,0,0,0,1,2,1,0,1,1,0,2,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,2,0,0,0,1,3,0,1,0,0,0,2,0,0,0,0,0,0,0,1,2,0,0,0,0,0, -3,3,0,0,1,1,2,0,0,1,2,1,0,1,1,1,0,1,1,0,0,2,1,1,0,1,0,0,1,1,1,0, -0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,1,0,0,0,0,1,0,0,0,0,3,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, -2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,0,0,1,1,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,1,0,1,2,0,1,2,0,0,1,1,0,2,0,1,0,0,1,0,0,0,0,1,0,0,0,2,0,0,0,0, -1,0,0,1,0,1,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,1,0,0,0,0,0,0,0,1,1,0,1,1,0,2,1,3,0,0,0,0,1,1,0,0,0,0,0,0,0,3, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,1,0,1,0,0,2,0,0,2,0,0,1,1,2,0,0,1,1,0,0,0,1,0,0,0,1,1,0,0,0, -1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,3,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0, -1,0,0,0,0,0,0,0,0,1,0,0,0,0,2,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,1,1,0,0,2,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -) - -TIS620ThaiModel = { - 'char_to_order_map': TIS620CharToOrderMap, - 'precedence_matrix': ThaiLangModel, - 'typical_positive_ratio': 0.926386, - 'keep_english_letter': False, - 'charset_name': "TIS-620", - 'language': 'Thai', -} diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langthaimodel.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langthaimodel.pyc deleted file mode 100644 index ceb14463fe3ad912f6b57fb9a13c5f434676223a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23476 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 M<;$1t@&4cc0pB*x^Z)<= diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langturkishmodel.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langturkishmodel.py deleted file mode 100644 index a427a45..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langturkishmodel.py +++ /dev/null @@ -1,193 +0,0 @@ -# -*- coding: utf-8 -*- -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Özgür Baskın - Turkish Language Model -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# 255: Control characters that usually does not exist in any text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 - -# Character Mapping Table: -Latin5_TurkishCharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -255, 23, 37, 47, 39, 29, 52, 36, 45, 53, 60, 16, 49, 20, 46, 42, - 48, 69, 44, 35, 31, 51, 38, 62, 65, 43, 56,255,255,255,255,255, -255, 1, 21, 28, 12, 2, 18, 27, 25, 3, 24, 10, 5, 13, 4, 15, - 26, 64, 7, 8, 9, 14, 32, 57, 58, 11, 22,255,255,255,255,255, -180,179,178,177,176,175,174,173,172,171,170,169,168,167,166,165, -164,163,162,161,160,159,101,158,157,156,155,154,153,152,151,106, -150,149,148,147,146,145,144,100,143,142,141,140,139,138,137,136, - 94, 80, 93,135,105,134,133, 63,132,131,130,129,128,127,126,125, -124,104, 73, 99, 79, 85,123, 54,122, 98, 92,121,120, 91,103,119, - 68,118,117, 97,116,115, 50, 90,114,113,112,111, 55, 41, 40, 86, - 89, 70, 59, 78, 71, 82, 88, 33, 77, 66, 84, 83,110, 75, 61, 96, - 30, 67,109, 74, 87,102, 34, 95, 81,108, 76, 72, 17, 6, 19,107, -) - -TurkishLangModel = ( -3,2,3,3,3,1,3,3,3,3,3,3,3,3,2,1,1,3,3,1,3,3,0,3,3,3,3,3,0,3,1,3, -3,2,1,0,0,1,1,0,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,2,2,0,0,1,0,0,1, -3,2,2,3,3,0,3,3,3,3,3,3,3,2,3,1,0,3,3,1,3,3,0,3,3,3,3,3,0,3,0,3, -3,1,1,0,1,0,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,2,2,0,0,0,1,0,1, -3,3,2,3,3,0,3,3,3,3,3,3,3,2,3,1,1,3,3,0,3,3,1,2,3,3,3,3,0,3,0,3, -3,1,1,0,0,0,1,0,0,0,0,1,1,0,1,2,1,0,0,0,1,0,0,0,0,2,0,0,0,0,0,1, -3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,1,3,3,2,0,3,2,1,2,2,1,3,3,0,0,0,2, -2,2,0,1,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,1,0,0,1, -3,3,3,2,3,3,1,2,3,3,3,3,3,3,3,1,3,2,1,0,3,2,0,1,2,3,3,2,1,0,0,2, -2,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,2,0,0,0, -1,0,1,3,3,1,3,3,3,3,3,3,3,1,2,0,0,2,3,0,2,3,0,0,2,2,2,3,0,3,0,1, -2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,0,3,2,0,2,3,2,3,3,1,0,0,2, -3,2,0,0,1,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,1,1,1,0,2,0,0,1, -3,3,3,2,3,3,2,3,3,3,3,2,3,3,3,0,3,3,0,0,2,1,0,0,2,3,2,2,0,0,0,2, -2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,0,1,0,2,0,0,1, -3,3,3,2,3,3,3,3,3,3,3,2,3,3,3,0,3,2,0,1,3,2,1,1,3,2,3,2,1,0,0,2, -2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, -3,3,3,2,3,3,3,3,3,3,3,2,3,3,3,0,3,2,2,0,2,3,0,0,2,2,2,2,0,0,0,2, -3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,1,0,0,0, -3,3,3,3,3,3,3,2,2,2,2,3,2,3,3,0,3,3,1,1,2,2,0,0,2,2,3,2,0,0,1,3, -0,3,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1, -3,3,3,2,3,3,3,2,1,2,2,3,2,3,3,0,3,2,0,0,1,1,0,1,1,2,1,2,0,0,0,1, -0,3,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0, -3,3,3,2,3,3,2,3,2,2,2,3,3,3,3,1,3,1,1,0,3,2,1,1,3,3,2,3,1,0,0,1, -1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,0,1, -3,2,2,3,3,0,3,3,3,3,3,3,3,2,2,1,0,3,3,1,3,3,0,1,3,3,2,3,0,3,0,3, -2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, -2,2,2,3,3,0,3,3,3,3,3,3,3,3,3,0,0,3,2,0,3,3,0,3,2,3,3,3,0,3,1,3, -2,0,0,0,0,0,0,0,0,0,0,1,0,1,2,0,1,0,0,0,0,0,0,0,2,2,0,0,1,0,0,1, -3,3,3,1,2,3,3,1,0,0,1,0,0,3,3,2,3,0,0,2,0,0,2,0,2,0,0,0,2,0,2,0, -0,3,1,0,1,0,0,0,2,2,1,0,1,1,2,1,2,2,2,0,2,1,1,0,0,0,2,0,0,0,0,0, -1,2,1,3,3,0,3,3,3,3,3,2,3,0,0,0,0,2,3,0,2,3,1,0,2,3,1,3,0,3,0,2, -3,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,1,3,3,2,2,3,2,2,0,1,2,3,0,1,2,1,0,1,0,0,0,1,0,2,2,0,0,0,1, -1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0, -3,3,3,1,3,3,1,1,3,3,1,1,3,3,1,0,2,1,2,0,2,1,0,0,1,1,2,1,0,0,0,2, -2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,1,0,2,1,3,0,0,2,0,0,3,3,0,3,0,0,1,0,1,2,0,0,1,1,2,2,0,1,0, -0,1,2,1,1,0,1,0,1,1,1,1,1,0,1,1,1,2,2,1,2,0,1,0,0,0,0,0,0,1,0,0, -3,3,3,2,3,2,3,3,0,2,2,2,3,3,3,0,3,0,0,0,2,2,0,1,2,1,1,1,0,0,0,1, -0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, -3,3,3,3,3,3,2,1,2,2,3,3,3,3,2,0,2,0,0,0,2,2,0,0,2,1,3,3,0,0,1,1, -1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0, -1,1,2,3,3,0,3,3,3,3,3,3,2,2,0,2,0,2,3,2,3,2,2,2,2,2,2,2,1,3,2,3, -2,0,2,1,2,2,2,2,1,1,2,2,1,2,2,1,2,0,0,2,1,1,0,2,1,0,0,1,0,0,0,1, -2,3,3,1,1,1,0,1,1,1,2,3,2,1,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0, -0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,2,2,2,3,2,3,2,2,1,3,3,3,0,2,1,2,0,2,1,0,0,1,1,1,1,1,0,0,1, -2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,2,0,1,0,0,0, -3,3,3,2,3,3,3,3,3,2,3,1,2,3,3,1,2,0,0,0,0,0,0,0,3,2,1,1,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, -3,3,3,2,2,3,3,2,1,1,1,1,1,3,3,0,3,1,0,0,1,1,0,0,3,1,2,1,0,0,0,0, -0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0, -3,3,3,2,2,3,2,2,2,3,2,1,1,3,3,0,3,0,0,0,0,1,0,0,3,1,1,2,0,0,0,1, -1,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -1,1,1,3,3,0,3,3,3,3,3,2,2,2,1,2,0,2,1,2,2,1,1,0,1,2,2,2,2,2,2,2, -0,0,2,1,2,1,2,1,0,1,1,3,1,2,1,1,2,0,0,2,0,1,0,1,0,1,0,0,0,1,0,1, -3,3,3,1,3,3,3,0,1,1,0,2,2,3,1,0,3,0,0,0,1,0,0,0,1,0,0,1,0,1,0,0, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,2,0,0,2,2,1,0,0,1,0,0,3,3,1,3,0,0,1,1,0,2,0,3,0,0,0,2,0,1,1, -0,1,2,0,1,2,2,0,2,2,2,2,1,0,2,1,1,0,2,0,2,1,2,0,0,0,0,0,0,0,0,0, -3,3,3,1,3,2,3,2,0,2,2,2,1,3,2,0,2,1,2,0,1,2,0,0,1,0,2,2,0,0,0,2, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0, -3,3,3,0,3,3,1,1,2,3,1,0,3,2,3,0,3,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0, -1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,3,3,0,3,3,2,3,3,2,2,0,0,0,0,1,2,0,1,3,0,0,0,3,1,1,0,3,0,2, -2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,1,2,2,1,0,3,1,1,1,1,3,3,2,3,0,0,1,0,1,2,0,2,2,0,2,2,0,2,1, -0,2,2,1,1,1,1,0,2,1,1,0,1,1,1,1,2,1,2,1,2,0,1,0,1,0,0,0,0,0,0,0, -3,3,3,0,1,1,3,0,0,1,1,0,0,2,2,0,3,0,0,1,1,0,1,0,0,0,0,0,2,0,0,0, -0,3,1,0,1,0,1,0,2,0,0,1,0,1,0,1,1,1,2,1,1,0,2,0,0,0,0,0,0,0,0,0, -3,3,3,0,2,0,2,0,1,1,1,0,0,3,3,0,2,0,0,1,0,0,2,1,1,0,1,0,1,0,1,0, -0,2,0,1,2,0,2,0,2,1,1,0,1,0,2,1,1,0,2,1,1,0,1,0,0,0,1,1,0,0,0,0, -3,2,3,0,1,0,0,0,0,0,0,0,0,1,2,0,1,0,0,1,0,0,1,0,0,0,0,0,2,0,0,0, -0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,2,1,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,0,0,2,3,0,0,1,0,1,0,2,3,2,3,0,0,1,3,0,2,1,0,0,0,0,2,0,1,0, -0,2,1,0,0,1,1,0,2,1,0,0,1,0,0,1,1,0,1,1,2,0,1,0,0,0,0,1,0,0,0,0, -3,2,2,0,0,1,1,0,0,0,0,0,0,3,1,1,1,0,0,0,0,0,1,0,0,0,0,0,2,0,1,0, -0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0, -0,0,0,3,3,0,2,3,2,2,1,2,2,1,1,2,0,1,3,2,2,2,0,0,2,2,0,0,0,1,2,1, -3,0,2,1,1,0,1,1,1,0,1,2,2,2,1,1,2,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0, -0,1,1,2,3,0,3,3,3,2,2,2,2,1,0,1,0,1,0,1,2,2,0,0,2,2,1,3,1,1,2,1, -0,0,1,1,2,0,1,1,0,0,1,2,0,2,1,1,2,0,0,1,0,0,0,1,0,1,0,1,0,0,0,0, -3,3,2,0,0,3,1,0,0,0,0,0,0,3,2,1,2,0,0,1,0,0,2,0,0,0,0,0,2,0,1,0, -0,2,1,1,0,0,1,0,1,2,0,0,1,1,0,0,2,1,1,1,1,0,2,0,0,0,0,0,0,0,0,0, -3,3,2,0,0,1,0,0,0,0,1,0,0,3,3,2,2,0,0,1,0,0,2,0,1,0,0,0,2,0,1,0, -0,0,1,1,0,0,2,0,2,1,0,0,1,1,2,1,2,0,2,1,2,1,1,1,0,0,1,1,0,0,0,0, -3,3,2,0,0,2,2,0,0,0,1,1,0,2,2,1,3,1,0,1,0,1,2,0,0,0,0,0,1,0,1,0, -0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,2,0,0,0,1,0,0,1,0,0,2,3,1,2,0,0,1,0,0,2,0,0,0,1,0,2,0,2,0, -0,1,1,2,2,1,2,0,2,1,1,0,0,1,1,0,1,1,1,1,2,1,1,0,0,0,0,0,0,0,0,0, -3,3,3,0,2,1,2,1,0,0,1,1,0,3,3,1,2,0,0,1,0,0,2,0,2,0,1,1,2,0,0,0, -0,0,1,1,1,1,2,0,1,1,0,1,1,1,1,0,0,0,1,1,1,0,1,0,0,0,1,0,0,0,0,0, -3,3,3,0,2,2,3,2,0,0,1,0,0,2,3,1,0,0,0,0,0,0,2,0,2,0,0,0,2,0,0,0, -0,1,1,0,0,0,1,0,0,1,0,1,1,0,1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0, -3,2,3,0,0,0,0,0,0,0,1,0,0,2,2,2,2,0,0,1,0,0,2,0,0,0,0,0,2,0,1,0, -0,0,2,1,1,0,1,0,2,1,1,0,0,1,1,2,1,0,2,0,2,0,1,0,0,0,2,0,0,0,0,0, -0,0,0,2,2,0,2,1,1,1,1,2,2,0,0,1,0,1,0,0,1,3,0,0,0,0,1,0,0,2,1,0, -0,0,1,0,1,0,0,0,0,0,2,1,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, -2,0,0,2,3,0,2,3,1,2,2,0,2,0,0,2,0,2,1,1,1,2,1,0,0,1,2,1,1,2,1,0, -1,0,2,0,1,0,1,1,0,0,2,2,1,2,1,1,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,0,2,1,2,0,0,0,1,0,0,3,2,0,1,0,0,1,0,0,2,0,0,0,1,2,1,0,1,0, -0,0,0,0,1,0,1,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0, -0,0,0,2,2,0,2,2,1,1,0,1,1,1,1,1,0,0,1,2,1,1,1,0,1,0,0,0,1,1,1,1, -0,0,2,1,0,1,1,1,0,1,1,2,1,2,1,1,2,0,1,1,2,1,0,2,0,0,0,0,0,0,0,0, -3,2,2,0,0,2,0,0,0,0,0,0,0,2,2,0,2,0,0,1,0,0,2,0,0,0,0,0,2,0,0,0, -0,2,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0, -0,0,0,3,2,0,2,2,0,1,1,0,1,0,0,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0, -2,0,1,0,1,0,1,1,0,0,1,2,0,1,0,1,1,0,0,1,0,1,0,2,0,0,0,0,0,0,0,0, -2,2,2,0,1,1,0,0,0,1,0,0,0,1,2,0,1,0,0,1,0,0,1,0,0,0,0,1,2,0,1,0, -0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,2,1,0,1,1,1,0,0,0,0,1,2,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, -1,1,2,0,1,0,0,0,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,1, -0,0,1,2,2,0,2,1,2,1,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,0,0,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, -2,2,2,0,0,0,1,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, -0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,0,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,1,0,0,0,0,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -) - -Latin5TurkishModel = { - 'char_to_order_map': Latin5_TurkishCharToOrderMap, - 'precedence_matrix': TurkishLangModel, - 'typical_positive_ratio': 0.970290, - 'keep_english_letter': True, - 'charset_name': "ISO-8859-9", - 'language': 'Turkish', -} diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langturkishmodel.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langturkishmodel.pyc deleted file mode 100644 index afd83e1f8a56e8531d3e20e9db03809b2aff4a81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23493 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 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/latin1prober.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/latin1prober.py deleted file mode 100644 index 7d1e8c2..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/latin1prober.py +++ /dev/null @@ -1,145 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .charsetprober import CharSetProber -from .enums import ProbingState - -FREQ_CAT_NUM = 4 - -UDF = 0 # undefined -OTH = 1 # other -ASC = 2 # ascii capital letter -ASS = 3 # ascii small letter -ACV = 4 # accent capital vowel -ACO = 5 # accent capital other -ASV = 6 # accent small vowel -ASO = 7 # accent small other -CLASS_NUM = 8 # total classes - -Latin1_CharToClass = ( - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 00 - 07 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 08 - 0F - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 10 - 17 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 18 - 1F - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 20 - 27 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 28 - 2F - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 30 - 37 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 38 - 3F - OTH, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 40 - 47 - ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 48 - 4F - ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 50 - 57 - ASC, ASC, ASC, OTH, OTH, OTH, OTH, OTH, # 58 - 5F - OTH, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 60 - 67 - ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 68 - 6F - ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 70 - 77 - ASS, ASS, ASS, OTH, OTH, OTH, OTH, OTH, # 78 - 7F - OTH, UDF, OTH, ASO, OTH, OTH, OTH, OTH, # 80 - 87 - OTH, OTH, ACO, OTH, ACO, UDF, ACO, UDF, # 88 - 8F - UDF, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 90 - 97 - OTH, OTH, ASO, OTH, ASO, UDF, ASO, ACO, # 98 - 9F - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A0 - A7 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A8 - AF - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B0 - B7 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B8 - BF - ACV, ACV, ACV, ACV, ACV, ACV, ACO, ACO, # C0 - C7 - ACV, ACV, ACV, ACV, ACV, ACV, ACV, ACV, # C8 - CF - ACO, ACO, ACV, ACV, ACV, ACV, ACV, OTH, # D0 - D7 - ACV, ACV, ACV, ACV, ACV, ACO, ACO, ACO, # D8 - DF - ASV, ASV, ASV, ASV, ASV, ASV, ASO, ASO, # E0 - E7 - ASV, ASV, ASV, ASV, ASV, ASV, ASV, ASV, # E8 - EF - ASO, ASO, ASV, ASV, ASV, ASV, ASV, OTH, # F0 - F7 - ASV, ASV, ASV, ASV, ASV, ASO, ASO, ASO, # F8 - FF -) - -# 0 : illegal -# 1 : very unlikely -# 2 : normal -# 3 : very likely -Latin1ClassModel = ( -# UDF OTH ASC ASS ACV ACO ASV ASO - 0, 0, 0, 0, 0, 0, 0, 0, # UDF - 0, 3, 3, 3, 3, 3, 3, 3, # OTH - 0, 3, 3, 3, 3, 3, 3, 3, # ASC - 0, 3, 3, 3, 1, 1, 3, 3, # ASS - 0, 3, 3, 3, 1, 2, 1, 2, # ACV - 0, 3, 3, 3, 3, 3, 3, 3, # ACO - 0, 3, 1, 3, 1, 1, 1, 3, # ASV - 0, 3, 1, 3, 1, 1, 3, 3, # ASO -) - - -class Latin1Prober(CharSetProber): - def __init__(self): - super(Latin1Prober, self).__init__() - self._last_char_class = None - self._freq_counter = None - self.reset() - - def reset(self): - self._last_char_class = OTH - self._freq_counter = [0] * FREQ_CAT_NUM - CharSetProber.reset(self) - - @property - def charset_name(self): - return "ISO-8859-1" - - @property - def language(self): - return "" - - def feed(self, byte_str): - byte_str = self.filter_with_english_letters(byte_str) - for c in byte_str: - char_class = Latin1_CharToClass[c] - freq = Latin1ClassModel[(self._last_char_class * CLASS_NUM) - + char_class] - if freq == 0: - self._state = ProbingState.NOT_ME - break - self._freq_counter[freq] += 1 - self._last_char_class = char_class - - return self.state - - def get_confidence(self): - if self.state == ProbingState.NOT_ME: - return 0.01 - - total = sum(self._freq_counter) - if total < 0.01: - confidence = 0.0 - else: - confidence = ((self._freq_counter[3] - self._freq_counter[1] * 20.0) - / total) - if confidence < 0.0: - confidence = 0.0 - # lower the confidence of latin1 so that other more accurate - # detector can take priority. - confidence = confidence * 0.73 - return confidence diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/latin1prober.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/latin1prober.pyc deleted file mode 100644 index d82e64949e8d29fb74ce657434577be79a6d5320..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4117 zcmdT`TTdHD6h5=QV4G_bLPM)YeY7G`2PLJXiW;bs^rB$snl$PvXluM<vt(JD-GKmw zN=@?Kf6^b(f6}M^fU58P&KYA6m$p)opx&9|nX_ju=k}e={4rd*{nN-wlMa81Xb$7_ zb%rQFQxp+xDDo63o;wsdw2>h%gE{`P6lBTEv8<P;AV=N+1$puc#BYlf43Jl%pg`Ur z1x50PC@7IPOgjJnZv&(+u$?wYf%FBo)BESd1w&^!q9jaE$XIHHPj6y5b`wyDf!gKg z310}mNcu#>p=c+V{pp!+ag)A)9au5Y!BY)-p`GSi&Y5qq{|R|3HbgB_-UtOF<c(4Q z8AUBc!4SPAdPDS`H%7rQ)yt#E#Sl43WhQ1Aq`KBf>e?(NomHJ!_7K=S594;-G>i_j zV1(!tI!utu6y})ZnG7%~fEZr*v|++{+HTj!0bcewdiphpMsDMB#Fz6N#snT@NF(_j zxiRnoj>j}}I0Y7DMGSC|lR<&pdYR8}vMSv9T2=J)E{H)>v=8+iT6fq8j5nD3*wzkm zJYCNpzN?G!wKA(?Si5wqs}q;6Zdg0t5984IzR6-z>%`iOF*j<Y#&5!ieiOq~Z0ffX zz3DeQTd~oJ?3L(L8*5!&p6aMo#y<&3Q;aIzB;1CvE8C5v(&|KkPSVQWPG$FQvKqg7 zIX$x(-<e77%`|7zo%_LFatFV5x3XO6hTW+!PE8|<rp)w0+h1aqbbnjNK_{v3^#W}w zk@%)7uKuXI>+)3^=qc+*>bff8>D!Yv7kl2u0QO|#!EcJ%ii|_!JkJo!u`ZT;V<Ej> z=5;j*7x9l_zbr0)>9VsVM4q^hzwxW{%YN<Ig3IQ1(aGgYh>6@HkC=D4=HUyq(Nn%T z!8Bt>#^Hby<FE~3lb+gX3Dd9Yi&L|+AK#yvwo0(<712rT&*6Y@^y9{cMmeUGJw{I7 z@#pA<5IA(pRnmyP6gA@ZR->)E7$0iGN^u%<7f=0&0cSj@B1G$fq8-iSM=L9I;0Rtg zG<krSc0^Eudwf4b?@k_MX&=C$=%qu+bH)b%2PeP)EyZ@*0!uWp0YL1N%mXa539>ms z&-vIQVuVw{riMjfju!JiNGps075=Nxtob@_M`60=N7{gwnrnD(QPpR#UhY%{Xc&Dg zTjmR$Ku0#mIDM*5=j(MzF!q(<2(B$I`wNd{=mRc{mfW*Y$I~)fO5#-TZgtma$R&VL zfUM!G9)md!dqz1M;h4~6p_t%tOY4B+Go9e8s8KbnO6UbOgeMDR8@A!i4&W{Uae#ph z2<V6+!M>f4WCmvOi)=4U5F_k*qU2L9QHYiJ!=3<2)T9+ffto~Z8ovqY8xYw?X~Uja z)Hz&)<G{?*xP4uhT2pKPF#gLIzwNz!$XFvkTVdJmJ=VRs_KTl?{j>by_lMR?H}KAt zEWD19Ky13TAr6%wvu<REnhq+1^<F1#g@KNn`U*I0gp~sZHT#!(4NlK}*HqRSh2x6O zq#EG=Oi7hFs(Xc)feVG0L(=y*I>A<isZ=v5A|iz<hw^Q9UH&L>`8fAICbvM2^q0|P zMXr2Xe2@F2e8;>h=8L(}>}a+)QY+7aBQ^A26Ao(|IOmQa@lPVM_AEILHUX_;XPhg? z*lUGlbe7y%mpqb_(?sOx+#}xK%k_6IzXL(}AnR2;`{g5F8v=Ve-r7iQ8V#~2uYC6C zi7T+ollgj8n7~r|U;VcCzu4pV=JiFFVcKO-cKKNG?G=eL$%h9vPd@tqmrK_`#?+XT Wck=4Qleww>%X6!UZ}DSKKKmEov<?XX diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcharsetprober.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcharsetprober.py deleted file mode 100644 index 6256ecf..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcharsetprober.py +++ /dev/null @@ -1,91 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# Proofpoint, Inc. -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .charsetprober import CharSetProber -from .enums import ProbingState, MachineState - - -class MultiByteCharSetProber(CharSetProber): - """ - MultiByteCharSetProber - """ - - def __init__(self, lang_filter=None): - super(MultiByteCharSetProber, self).__init__(lang_filter=lang_filter) - self.distribution_analyzer = None - self.coding_sm = None - self._last_char = [0, 0] - - def reset(self): - super(MultiByteCharSetProber, self).reset() - if self.coding_sm: - self.coding_sm.reset() - if self.distribution_analyzer: - self.distribution_analyzer.reset() - self._last_char = [0, 0] - - @property - def charset_name(self): - raise NotImplementedError - - @property - def language(self): - raise NotImplementedError - - def feed(self, byte_str): - for i in range(len(byte_str)): - coding_state = self.coding_sm.next_state(byte_str[i]) - if coding_state == MachineState.ERROR: - self.logger.debug('%s %s prober hit error at byte %s', - self.charset_name, self.language, i) - self._state = ProbingState.NOT_ME - break - elif coding_state == MachineState.ITS_ME: - self._state = ProbingState.FOUND_IT - break - elif coding_state == MachineState.START: - char_len = self.coding_sm.get_current_charlen() - if i == 0: - self._last_char[1] = byte_str[0] - self.distribution_analyzer.feed(self._last_char, char_len) - else: - self.distribution_analyzer.feed(byte_str[i - 1:i + 1], - char_len) - - self._last_char[0] = byte_str[-1] - - if self.state == ProbingState.DETECTING: - if (self.distribution_analyzer.got_enough_data() and - (self.get_confidence() > self.SHORTCUT_THRESHOLD)): - self._state = ProbingState.FOUND_IT - - return self.state - - def get_confidence(self): - return self.distribution_analyzer.get_confidence() diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcharsetprober.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcharsetprober.pyc deleted file mode 100644 index 3c173016a224fbd2debcd15ddc35294fa61144db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3171 zcmd5;TW=dh6rNpgoJ(_0n>OMi7YSh@QnvysDwPVF7#fK<(b^RdsT!@l6K9?Et}{Ch zN!30;`pA#uH^2{o?>n1>7W%>yaduA5T=wjD&YAPgRQ{No`S|DgXFYZPtKk1vXaz-# z$5W|NLr?8_%46SGsjr3=wO3KYK<xz>ttjKEeNV-KdZpBvQa|oZsCYuP>s1&@Jcv4l zn}gUmh-}-qU7L4}t@|9Fg<wC)`fV3EBLmw}?;y!cIk1Wq+vC(Fk58R>!@?zST6&CD zv>}WlUclY+RXj;2UcrNa=z$REOjQ9k(PDg3x+QpYr-+@)rd3=OWk!YV`V@`VAZBX# zy&a8A^$3NHvD`o_9zi%fo_c{V`f31F&^^S;V^A@w0j^XKI!ybj@5?xVDnydDTJ9QT z8fAUGpQO&%1YK31gm4oO#du_F$d!&@wNA3cY3%}ZT6t#N4JdI^IGc3GF3B?;Wl?(i z+*mh_nO+_v1G*Tx8NQuHh0{G`t4tD&6eisdsnpR*Q5-{SjBIj@#5Im1+t|<3*w~`+ z{G@UEsqJPz9p1Ztl-<2=KfB-iqBwaFKeu=B>yH|p#wZ!BCt2a5G+lT1w)=XQL(=rI z$>Q8Lh#)quG3-(+j2p?$xidNqxw}3>E9kBA*1T!_^|;g6E~EbgI{%3N8I~aEgNm}B zFv?Jn6OLw*gh8NeQznAfCXh2c=XpVzm>1@`Rpx<kLgt}N0X1s?IAm}`VhkBrDTR=k zyc$tt^{t~7RFt=Z7%ob?j3lGE!4-s$Nd6+F)fPuuWo55mrj@&`;V3mjlQ|PNt<CKf z^HqrDd>iR38k*1P6;r7E|KM#%9=mF;aet8-#!=rqfPUc?z2jEo?vx~wk58)Jc}0MO z<k@`oyLu^%gF-+#fSg|VY7LVw(Wxkq$Y4Sp`pOQaE~;uEyvpL4l96e?aE9{$^f9=` zAw8>hk5(?;o|CtKRh*vx_w<5HV>Ju{!6K{iWk8$YLVou*VuHTL6-%V=ht!tUpnPdb zy$DFI-qD2Ab~zz#VC^j$s;HZ{FBYvRK>MC1gG-ZsY4W;YydhuhUf5bCAX|2CQs>8S zsY5VDS6sgE>8N`_BG<tW41KG(4f$bF!&9<X?I3YA!wRWIuGYn&hB;voIW3bv@vE=l zCE<08v>I1IH#M2Ci7<3#PMijJIukO<va}h7JE3E))4bmYvGe<}>5lv1JhX6ug7qwG zT00%R-4wMnB<fbD%~5WsZ+4!xHuY9V%(OdShaJaC2O8ZQTZ=-M6N0eF4MK8q-0T|@ z%S(b!j+f15r@7JDYJKYnqMti$vV7b>&~XGGh)&Gr*?tn6tY_RZhT2bd!p_Fij_y1O zo9KMEDG?R=6oiZ&uv?t1xN4LIetwS0Rf1ly;x#Z{4ZeLBh`vNC?m+O=TJ;vZS@7<x z7l=m5ktJ`<f5)5mm;7b)Z+OdZ;V3c@HzFS1Ca~cchn5^m<&jfE|B7){NKAWZB}aL! zI#0v%I}2$UcNT6Zt%rF$PTA!hN9#E6X&q9Rvp?jCC9k2XaP@JguWfRMSw8f4)<ye2 zFDxwK56}wk_G+c-&sL|W7J`Lf`n{IimF0%~#yuy*%CfXgHXasIyHf6Q$+$YcNg5uO Q`Fiv|edIlH(Oa$j1;7K&%K!iX diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcsgroupprober.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcsgroupprober.py deleted file mode 100644 index 530abe7..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcsgroupprober.py +++ /dev/null @@ -1,54 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# Proofpoint, Inc. -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .charsetgroupprober import CharSetGroupProber -from .utf8prober import UTF8Prober -from .sjisprober import SJISProber -from .eucjpprober import EUCJPProber -from .gb2312prober import GB2312Prober -from .euckrprober import EUCKRProber -from .cp949prober import CP949Prober -from .big5prober import Big5Prober -from .euctwprober import EUCTWProber - - -class MBCSGroupProber(CharSetGroupProber): - def __init__(self, lang_filter=None): - super(MBCSGroupProber, self).__init__(lang_filter=lang_filter) - self.probers = [ - UTF8Prober(), - SJISProber(), - EUCJPProber(), - GB2312Prober(), - EUCKRProber(), - CP949Prober(), - Big5Prober(), - EUCTWProber() - ] - self.reset() diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcsgroupprober.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcsgroupprober.pyc deleted file mode 100644 index c90e1607383e158ed77de2b672d5359a7fce21ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1477 zcmd5++iuf95S@*4zcg*(g%_SfrQ+U*S_vW42r7yiMNTV(C1etNW1OxX<K3he^##$d z;rI9fW_Ar&{Q<Bu$DZTa-PxJ5v3_=%Ti@0``H){0K3}8B9|!^d7zluvfy;oAUjk8r z*aFuwz6GKTaRuCp@yj5p5ZA!18NULe4siqAhViQ)nh>|ZZ5h7?q788e+>Y_<Al4x6 zg4;EI1H?MS8{lrB-vrKJ#vo|HJ-~N>kM1S}Z5a1Dm~O-ndIV|{Ven;=jk!9>7Rz*$ zEv7s(-<tUC;{5I5LvDQfZd~MA829F4a5^fIZ6r^Q_x5-9ifkVG-g!t4Mn?xnMUoaj zj=~p3E+2jV!H}wpF=xkvaUt_R{VCCSH2D~T1GNQPgpIk!7Fpnodlcalkk!!!X!0|H z!XJY>EL;iZB^r0fu!xK)i)yLL8Y>#B8fzNs8XFp$gkha#@mhrQHZdd(v-D8WcEltJ zy;&p_7M)t7DhP6!^2}+FOL=)-ltjw&9O{@u**X?MnSkP*DnX5a;uXE6x{*@PmvPCJ z-Y=$(({nL%sJ=Zk19F9LcA7=2iQ@KZlG(F`2zVy#+iUw~Kbt03m%IJ1$xc5z==+EA z`Y5=~cJK;Q``k{WbUR9<nh3G2cF#g@M3gpf#gkx>**<D4;L47tz6?odCco$DjYCS= zLerfB_M}v0#k*S?_9*MT6v-s!o~I~%&x;qqQjkjl!$rdNWPi7%-~Q#^sE5zcBz3LI zhP_Al)Q64=f?X-p!og3VH?~x>LsK8!a?QzkBy*1D(&FJuf1VdoD?(8z!zmrQJX9Bs zbcUgqSx%B<^msqTLzj~zA-&KP4_(fYj(#tsu5ywTrnUM1lvzvTr4hrcr<k9lzqNJt H;I@7Nw1Y#O diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcssm.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcssm.py deleted file mode 100644 index 8360d0f..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcssm.py +++ /dev/null @@ -1,572 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .enums import MachineState - -# BIG5 - -BIG5_CLS = ( - 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as legal value - 1,1,1,1,1,1,0,0, # 08 - 0f - 1,1,1,1,1,1,1,1, # 10 - 17 - 1,1,1,0,1,1,1,1, # 18 - 1f - 1,1,1,1,1,1,1,1, # 20 - 27 - 1,1,1,1,1,1,1,1, # 28 - 2f - 1,1,1,1,1,1,1,1, # 30 - 37 - 1,1,1,1,1,1,1,1, # 38 - 3f - 2,2,2,2,2,2,2,2, # 40 - 47 - 2,2,2,2,2,2,2,2, # 48 - 4f - 2,2,2,2,2,2,2,2, # 50 - 57 - 2,2,2,2,2,2,2,2, # 58 - 5f - 2,2,2,2,2,2,2,2, # 60 - 67 - 2,2,2,2,2,2,2,2, # 68 - 6f - 2,2,2,2,2,2,2,2, # 70 - 77 - 2,2,2,2,2,2,2,1, # 78 - 7f - 4,4,4,4,4,4,4,4, # 80 - 87 - 4,4,4,4,4,4,4,4, # 88 - 8f - 4,4,4,4,4,4,4,4, # 90 - 97 - 4,4,4,4,4,4,4,4, # 98 - 9f - 4,3,3,3,3,3,3,3, # a0 - a7 - 3,3,3,3,3,3,3,3, # a8 - af - 3,3,3,3,3,3,3,3, # b0 - b7 - 3,3,3,3,3,3,3,3, # b8 - bf - 3,3,3,3,3,3,3,3, # c0 - c7 - 3,3,3,3,3,3,3,3, # c8 - cf - 3,3,3,3,3,3,3,3, # d0 - d7 - 3,3,3,3,3,3,3,3, # d8 - df - 3,3,3,3,3,3,3,3, # e0 - e7 - 3,3,3,3,3,3,3,3, # e8 - ef - 3,3,3,3,3,3,3,3, # f0 - f7 - 3,3,3,3,3,3,3,0 # f8 - ff -) - -BIG5_ST = ( - MachineState.ERROR,MachineState.START,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 - MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,#08-0f - MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START#10-17 -) - -BIG5_CHAR_LEN_TABLE = (0, 1, 1, 2, 0) - -BIG5_SM_MODEL = {'class_table': BIG5_CLS, - 'class_factor': 5, - 'state_table': BIG5_ST, - 'char_len_table': BIG5_CHAR_LEN_TABLE, - 'name': 'Big5'} - -# CP949 - -CP949_CLS = ( - 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,0, # 00 - 0f - 1,1,1,1,1,1,1,1, 1,1,1,0,1,1,1,1, # 10 - 1f - 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, # 20 - 2f - 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, # 30 - 3f - 1,4,4,4,4,4,4,4, 4,4,4,4,4,4,4,4, # 40 - 4f - 4,4,5,5,5,5,5,5, 5,5,5,1,1,1,1,1, # 50 - 5f - 1,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5, # 60 - 6f - 5,5,5,5,5,5,5,5, 5,5,5,1,1,1,1,1, # 70 - 7f - 0,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6, # 80 - 8f - 6,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6, # 90 - 9f - 6,7,7,7,7,7,7,7, 7,7,7,7,7,8,8,8, # a0 - af - 7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7, # b0 - bf - 7,7,7,7,7,7,9,2, 2,3,2,2,2,2,2,2, # c0 - cf - 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2, # d0 - df - 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2, # e0 - ef - 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,0, # f0 - ff -) - -CP949_ST = ( -#cls= 0 1 2 3 4 5 6 7 8 9 # previous state = - MachineState.ERROR,MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START, 4, 5,MachineState.ERROR, 6, # MachineState.START - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, # MachineState.ERROR - MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME, # MachineState.ITS_ME - MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START, # 3 - MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, # 4 - MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, # 5 - MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START, # 6 -) - -CP949_CHAR_LEN_TABLE = (0, 1, 2, 0, 1, 1, 2, 2, 0, 2) - -CP949_SM_MODEL = {'class_table': CP949_CLS, - 'class_factor': 10, - 'state_table': CP949_ST, - 'char_len_table': CP949_CHAR_LEN_TABLE, - 'name': 'CP949'} - -# EUC-JP - -EUCJP_CLS = ( - 4,4,4,4,4,4,4,4, # 00 - 07 - 4,4,4,4,4,4,5,5, # 08 - 0f - 4,4,4,4,4,4,4,4, # 10 - 17 - 4,4,4,5,4,4,4,4, # 18 - 1f - 4,4,4,4,4,4,4,4, # 20 - 27 - 4,4,4,4,4,4,4,4, # 28 - 2f - 4,4,4,4,4,4,4,4, # 30 - 37 - 4,4,4,4,4,4,4,4, # 38 - 3f - 4,4,4,4,4,4,4,4, # 40 - 47 - 4,4,4,4,4,4,4,4, # 48 - 4f - 4,4,4,4,4,4,4,4, # 50 - 57 - 4,4,4,4,4,4,4,4, # 58 - 5f - 4,4,4,4,4,4,4,4, # 60 - 67 - 4,4,4,4,4,4,4,4, # 68 - 6f - 4,4,4,4,4,4,4,4, # 70 - 77 - 4,4,4,4,4,4,4,4, # 78 - 7f - 5,5,5,5,5,5,5,5, # 80 - 87 - 5,5,5,5,5,5,1,3, # 88 - 8f - 5,5,5,5,5,5,5,5, # 90 - 97 - 5,5,5,5,5,5,5,5, # 98 - 9f - 5,2,2,2,2,2,2,2, # a0 - a7 - 2,2,2,2,2,2,2,2, # a8 - af - 2,2,2,2,2,2,2,2, # b0 - b7 - 2,2,2,2,2,2,2,2, # b8 - bf - 2,2,2,2,2,2,2,2, # c0 - c7 - 2,2,2,2,2,2,2,2, # c8 - cf - 2,2,2,2,2,2,2,2, # d0 - d7 - 2,2,2,2,2,2,2,2, # d8 - df - 0,0,0,0,0,0,0,0, # e0 - e7 - 0,0,0,0,0,0,0,0, # e8 - ef - 0,0,0,0,0,0,0,0, # f0 - f7 - 0,0,0,0,0,0,0,5 # f8 - ff -) - -EUCJP_ST = ( - 3, 4, 3, 5,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f - MachineState.ITS_ME,MachineState.ITS_ME,MachineState.START,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#10-17 - MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 3,MachineState.ERROR,#18-1f - 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START#20-27 -) - -EUCJP_CHAR_LEN_TABLE = (2, 2, 2, 3, 1, 0) - -EUCJP_SM_MODEL = {'class_table': EUCJP_CLS, - 'class_factor': 6, - 'state_table': EUCJP_ST, - 'char_len_table': EUCJP_CHAR_LEN_TABLE, - 'name': 'EUC-JP'} - -# EUC-KR - -EUCKR_CLS = ( - 1,1,1,1,1,1,1,1, # 00 - 07 - 1,1,1,1,1,1,0,0, # 08 - 0f - 1,1,1,1,1,1,1,1, # 10 - 17 - 1,1,1,0,1,1,1,1, # 18 - 1f - 1,1,1,1,1,1,1,1, # 20 - 27 - 1,1,1,1,1,1,1,1, # 28 - 2f - 1,1,1,1,1,1,1,1, # 30 - 37 - 1,1,1,1,1,1,1,1, # 38 - 3f - 1,1,1,1,1,1,1,1, # 40 - 47 - 1,1,1,1,1,1,1,1, # 48 - 4f - 1,1,1,1,1,1,1,1, # 50 - 57 - 1,1,1,1,1,1,1,1, # 58 - 5f - 1,1,1,1,1,1,1,1, # 60 - 67 - 1,1,1,1,1,1,1,1, # 68 - 6f - 1,1,1,1,1,1,1,1, # 70 - 77 - 1,1,1,1,1,1,1,1, # 78 - 7f - 0,0,0,0,0,0,0,0, # 80 - 87 - 0,0,0,0,0,0,0,0, # 88 - 8f - 0,0,0,0,0,0,0,0, # 90 - 97 - 0,0,0,0,0,0,0,0, # 98 - 9f - 0,2,2,2,2,2,2,2, # a0 - a7 - 2,2,2,2,2,3,3,3, # a8 - af - 2,2,2,2,2,2,2,2, # b0 - b7 - 2,2,2,2,2,2,2,2, # b8 - bf - 2,2,2,2,2,2,2,2, # c0 - c7 - 2,3,2,2,2,2,2,2, # c8 - cf - 2,2,2,2,2,2,2,2, # d0 - d7 - 2,2,2,2,2,2,2,2, # d8 - df - 2,2,2,2,2,2,2,2, # e0 - e7 - 2,2,2,2,2,2,2,2, # e8 - ef - 2,2,2,2,2,2,2,2, # f0 - f7 - 2,2,2,2,2,2,2,0 # f8 - ff -) - -EUCKR_ST = ( - MachineState.ERROR,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 - MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START #08-0f -) - -EUCKR_CHAR_LEN_TABLE = (0, 1, 2, 0) - -EUCKR_SM_MODEL = {'class_table': EUCKR_CLS, - 'class_factor': 4, - 'state_table': EUCKR_ST, - 'char_len_table': EUCKR_CHAR_LEN_TABLE, - 'name': 'EUC-KR'} - -# EUC-TW - -EUCTW_CLS = ( - 2,2,2,2,2,2,2,2, # 00 - 07 - 2,2,2,2,2,2,0,0, # 08 - 0f - 2,2,2,2,2,2,2,2, # 10 - 17 - 2,2,2,0,2,2,2,2, # 18 - 1f - 2,2,2,2,2,2,2,2, # 20 - 27 - 2,2,2,2,2,2,2,2, # 28 - 2f - 2,2,2,2,2,2,2,2, # 30 - 37 - 2,2,2,2,2,2,2,2, # 38 - 3f - 2,2,2,2,2,2,2,2, # 40 - 47 - 2,2,2,2,2,2,2,2, # 48 - 4f - 2,2,2,2,2,2,2,2, # 50 - 57 - 2,2,2,2,2,2,2,2, # 58 - 5f - 2,2,2,2,2,2,2,2, # 60 - 67 - 2,2,2,2,2,2,2,2, # 68 - 6f - 2,2,2,2,2,2,2,2, # 70 - 77 - 2,2,2,2,2,2,2,2, # 78 - 7f - 0,0,0,0,0,0,0,0, # 80 - 87 - 0,0,0,0,0,0,6,0, # 88 - 8f - 0,0,0,0,0,0,0,0, # 90 - 97 - 0,0,0,0,0,0,0,0, # 98 - 9f - 0,3,4,4,4,4,4,4, # a0 - a7 - 5,5,1,1,1,1,1,1, # a8 - af - 1,1,1,1,1,1,1,1, # b0 - b7 - 1,1,1,1,1,1,1,1, # b8 - bf - 1,1,3,1,3,3,3,3, # c0 - c7 - 3,3,3,3,3,3,3,3, # c8 - cf - 3,3,3,3,3,3,3,3, # d0 - d7 - 3,3,3,3,3,3,3,3, # d8 - df - 3,3,3,3,3,3,3,3, # e0 - e7 - 3,3,3,3,3,3,3,3, # e8 - ef - 3,3,3,3,3,3,3,3, # f0 - f7 - 3,3,3,3,3,3,3,0 # f8 - ff -) - -EUCTW_ST = ( - MachineState.ERROR,MachineState.ERROR,MachineState.START, 3, 3, 3, 4,MachineState.ERROR,#00-07 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f - MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,MachineState.ERROR,#10-17 - MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f - 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.START,MachineState.START,#20-27 - MachineState.START,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START #28-2f -) - -EUCTW_CHAR_LEN_TABLE = (0, 0, 1, 2, 2, 2, 3) - -EUCTW_SM_MODEL = {'class_table': EUCTW_CLS, - 'class_factor': 7, - 'state_table': EUCTW_ST, - 'char_len_table': EUCTW_CHAR_LEN_TABLE, - 'name': 'x-euc-tw'} - -# GB2312 - -GB2312_CLS = ( - 1,1,1,1,1,1,1,1, # 00 - 07 - 1,1,1,1,1,1,0,0, # 08 - 0f - 1,1,1,1,1,1,1,1, # 10 - 17 - 1,1,1,0,1,1,1,1, # 18 - 1f - 1,1,1,1,1,1,1,1, # 20 - 27 - 1,1,1,1,1,1,1,1, # 28 - 2f - 3,3,3,3,3,3,3,3, # 30 - 37 - 3,3,1,1,1,1,1,1, # 38 - 3f - 2,2,2,2,2,2,2,2, # 40 - 47 - 2,2,2,2,2,2,2,2, # 48 - 4f - 2,2,2,2,2,2,2,2, # 50 - 57 - 2,2,2,2,2,2,2,2, # 58 - 5f - 2,2,2,2,2,2,2,2, # 60 - 67 - 2,2,2,2,2,2,2,2, # 68 - 6f - 2,2,2,2,2,2,2,2, # 70 - 77 - 2,2,2,2,2,2,2,4, # 78 - 7f - 5,6,6,6,6,6,6,6, # 80 - 87 - 6,6,6,6,6,6,6,6, # 88 - 8f - 6,6,6,6,6,6,6,6, # 90 - 97 - 6,6,6,6,6,6,6,6, # 98 - 9f - 6,6,6,6,6,6,6,6, # a0 - a7 - 6,6,6,6,6,6,6,6, # a8 - af - 6,6,6,6,6,6,6,6, # b0 - b7 - 6,6,6,6,6,6,6,6, # b8 - bf - 6,6,6,6,6,6,6,6, # c0 - c7 - 6,6,6,6,6,6,6,6, # c8 - cf - 6,6,6,6,6,6,6,6, # d0 - d7 - 6,6,6,6,6,6,6,6, # d8 - df - 6,6,6,6,6,6,6,6, # e0 - e7 - 6,6,6,6,6,6,6,6, # e8 - ef - 6,6,6,6,6,6,6,6, # f0 - f7 - 6,6,6,6,6,6,6,0 # f8 - ff -) - -GB2312_ST = ( - MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, 3,MachineState.ERROR,#00-07 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f - MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,#10-17 - 4,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f - MachineState.ERROR,MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,#20-27 - MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START #28-2f -) - -# To be accurate, the length of class 6 can be either 2 or 4. -# But it is not necessary to discriminate between the two since -# it is used for frequency analysis only, and we are validating -# each code range there as well. So it is safe to set it to be -# 2 here. -GB2312_CHAR_LEN_TABLE = (0, 1, 1, 1, 1, 1, 2) - -GB2312_SM_MODEL = {'class_table': GB2312_CLS, - 'class_factor': 7, - 'state_table': GB2312_ST, - 'char_len_table': GB2312_CHAR_LEN_TABLE, - 'name': 'GB2312'} - -# Shift_JIS - -SJIS_CLS = ( - 1,1,1,1,1,1,1,1, # 00 - 07 - 1,1,1,1,1,1,0,0, # 08 - 0f - 1,1,1,1,1,1,1,1, # 10 - 17 - 1,1,1,0,1,1,1,1, # 18 - 1f - 1,1,1,1,1,1,1,1, # 20 - 27 - 1,1,1,1,1,1,1,1, # 28 - 2f - 1,1,1,1,1,1,1,1, # 30 - 37 - 1,1,1,1,1,1,1,1, # 38 - 3f - 2,2,2,2,2,2,2,2, # 40 - 47 - 2,2,2,2,2,2,2,2, # 48 - 4f - 2,2,2,2,2,2,2,2, # 50 - 57 - 2,2,2,2,2,2,2,2, # 58 - 5f - 2,2,2,2,2,2,2,2, # 60 - 67 - 2,2,2,2,2,2,2,2, # 68 - 6f - 2,2,2,2,2,2,2,2, # 70 - 77 - 2,2,2,2,2,2,2,1, # 78 - 7f - 3,3,3,3,3,2,2,3, # 80 - 87 - 3,3,3,3,3,3,3,3, # 88 - 8f - 3,3,3,3,3,3,3,3, # 90 - 97 - 3,3,3,3,3,3,3,3, # 98 - 9f - #0xa0 is illegal in sjis encoding, but some pages does - #contain such byte. We need to be more error forgiven. - 2,2,2,2,2,2,2,2, # a0 - a7 - 2,2,2,2,2,2,2,2, # a8 - af - 2,2,2,2,2,2,2,2, # b0 - b7 - 2,2,2,2,2,2,2,2, # b8 - bf - 2,2,2,2,2,2,2,2, # c0 - c7 - 2,2,2,2,2,2,2,2, # c8 - cf - 2,2,2,2,2,2,2,2, # d0 - d7 - 2,2,2,2,2,2,2,2, # d8 - df - 3,3,3,3,3,3,3,3, # e0 - e7 - 3,3,3,3,3,4,4,4, # e8 - ef - 3,3,3,3,3,3,3,3, # f0 - f7 - 3,3,3,3,3,0,0,0) # f8 - ff - - -SJIS_ST = ( - MachineState.ERROR,MachineState.START,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f - MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START #10-17 -) - -SJIS_CHAR_LEN_TABLE = (0, 1, 1, 2, 0, 0) - -SJIS_SM_MODEL = {'class_table': SJIS_CLS, - 'class_factor': 6, - 'state_table': SJIS_ST, - 'char_len_table': SJIS_CHAR_LEN_TABLE, - 'name': 'Shift_JIS'} - -# UCS2-BE - -UCS2BE_CLS = ( - 0,0,0,0,0,0,0,0, # 00 - 07 - 0,0,1,0,0,2,0,0, # 08 - 0f - 0,0,0,0,0,0,0,0, # 10 - 17 - 0,0,0,3,0,0,0,0, # 18 - 1f - 0,0,0,0,0,0,0,0, # 20 - 27 - 0,3,3,3,3,3,0,0, # 28 - 2f - 0,0,0,0,0,0,0,0, # 30 - 37 - 0,0,0,0,0,0,0,0, # 38 - 3f - 0,0,0,0,0,0,0,0, # 40 - 47 - 0,0,0,0,0,0,0,0, # 48 - 4f - 0,0,0,0,0,0,0,0, # 50 - 57 - 0,0,0,0,0,0,0,0, # 58 - 5f - 0,0,0,0,0,0,0,0, # 60 - 67 - 0,0,0,0,0,0,0,0, # 68 - 6f - 0,0,0,0,0,0,0,0, # 70 - 77 - 0,0,0,0,0,0,0,0, # 78 - 7f - 0,0,0,0,0,0,0,0, # 80 - 87 - 0,0,0,0,0,0,0,0, # 88 - 8f - 0,0,0,0,0,0,0,0, # 90 - 97 - 0,0,0,0,0,0,0,0, # 98 - 9f - 0,0,0,0,0,0,0,0, # a0 - a7 - 0,0,0,0,0,0,0,0, # a8 - af - 0,0,0,0,0,0,0,0, # b0 - b7 - 0,0,0,0,0,0,0,0, # b8 - bf - 0,0,0,0,0,0,0,0, # c0 - c7 - 0,0,0,0,0,0,0,0, # c8 - cf - 0,0,0,0,0,0,0,0, # d0 - d7 - 0,0,0,0,0,0,0,0, # d8 - df - 0,0,0,0,0,0,0,0, # e0 - e7 - 0,0,0,0,0,0,0,0, # e8 - ef - 0,0,0,0,0,0,0,0, # f0 - f7 - 0,0,0,0,0,0,4,5 # f8 - ff -) - -UCS2BE_ST = ( - 5, 7, 7,MachineState.ERROR, 4, 3,MachineState.ERROR,MachineState.ERROR,#00-07 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f - MachineState.ITS_ME,MachineState.ITS_ME, 6, 6, 6, 6,MachineState.ERROR,MachineState.ERROR,#10-17 - 6, 6, 6, 6, 6,MachineState.ITS_ME, 6, 6,#18-1f - 6, 6, 6, 6, 5, 7, 7,MachineState.ERROR,#20-27 - 5, 8, 6, 6,MachineState.ERROR, 6, 6, 6,#28-2f - 6, 6, 6, 6,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START #30-37 -) - -UCS2BE_CHAR_LEN_TABLE = (2, 2, 2, 0, 2, 2) - -UCS2BE_SM_MODEL = {'class_table': UCS2BE_CLS, - 'class_factor': 6, - 'state_table': UCS2BE_ST, - 'char_len_table': UCS2BE_CHAR_LEN_TABLE, - 'name': 'UTF-16BE'} - -# UCS2-LE - -UCS2LE_CLS = ( - 0,0,0,0,0,0,0,0, # 00 - 07 - 0,0,1,0,0,2,0,0, # 08 - 0f - 0,0,0,0,0,0,0,0, # 10 - 17 - 0,0,0,3,0,0,0,0, # 18 - 1f - 0,0,0,0,0,0,0,0, # 20 - 27 - 0,3,3,3,3,3,0,0, # 28 - 2f - 0,0,0,0,0,0,0,0, # 30 - 37 - 0,0,0,0,0,0,0,0, # 38 - 3f - 0,0,0,0,0,0,0,0, # 40 - 47 - 0,0,0,0,0,0,0,0, # 48 - 4f - 0,0,0,0,0,0,0,0, # 50 - 57 - 0,0,0,0,0,0,0,0, # 58 - 5f - 0,0,0,0,0,0,0,0, # 60 - 67 - 0,0,0,0,0,0,0,0, # 68 - 6f - 0,0,0,0,0,0,0,0, # 70 - 77 - 0,0,0,0,0,0,0,0, # 78 - 7f - 0,0,0,0,0,0,0,0, # 80 - 87 - 0,0,0,0,0,0,0,0, # 88 - 8f - 0,0,0,0,0,0,0,0, # 90 - 97 - 0,0,0,0,0,0,0,0, # 98 - 9f - 0,0,0,0,0,0,0,0, # a0 - a7 - 0,0,0,0,0,0,0,0, # a8 - af - 0,0,0,0,0,0,0,0, # b0 - b7 - 0,0,0,0,0,0,0,0, # b8 - bf - 0,0,0,0,0,0,0,0, # c0 - c7 - 0,0,0,0,0,0,0,0, # c8 - cf - 0,0,0,0,0,0,0,0, # d0 - d7 - 0,0,0,0,0,0,0,0, # d8 - df - 0,0,0,0,0,0,0,0, # e0 - e7 - 0,0,0,0,0,0,0,0, # e8 - ef - 0,0,0,0,0,0,0,0, # f0 - f7 - 0,0,0,0,0,0,4,5 # f8 - ff -) - -UCS2LE_ST = ( - 6, 6, 7, 6, 4, 3,MachineState.ERROR,MachineState.ERROR,#00-07 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f - MachineState.ITS_ME,MachineState.ITS_ME, 5, 5, 5,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,#10-17 - 5, 5, 5,MachineState.ERROR, 5,MachineState.ERROR, 6, 6,#18-1f - 7, 6, 8, 8, 5, 5, 5,MachineState.ERROR,#20-27 - 5, 5, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5, 5,#28-2f - 5, 5, 5,MachineState.ERROR, 5,MachineState.ERROR,MachineState.START,MachineState.START #30-37 -) - -UCS2LE_CHAR_LEN_TABLE = (2, 2, 2, 2, 2, 2) - -UCS2LE_SM_MODEL = {'class_table': UCS2LE_CLS, - 'class_factor': 6, - 'state_table': UCS2LE_ST, - 'char_len_table': UCS2LE_CHAR_LEN_TABLE, - 'name': 'UTF-16LE'} - -# UTF-8 - -UTF8_CLS = ( - 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as a legal value - 1,1,1,1,1,1,0,0, # 08 - 0f - 1,1,1,1,1,1,1,1, # 10 - 17 - 1,1,1,0,1,1,1,1, # 18 - 1f - 1,1,1,1,1,1,1,1, # 20 - 27 - 1,1,1,1,1,1,1,1, # 28 - 2f - 1,1,1,1,1,1,1,1, # 30 - 37 - 1,1,1,1,1,1,1,1, # 38 - 3f - 1,1,1,1,1,1,1,1, # 40 - 47 - 1,1,1,1,1,1,1,1, # 48 - 4f - 1,1,1,1,1,1,1,1, # 50 - 57 - 1,1,1,1,1,1,1,1, # 58 - 5f - 1,1,1,1,1,1,1,1, # 60 - 67 - 1,1,1,1,1,1,1,1, # 68 - 6f - 1,1,1,1,1,1,1,1, # 70 - 77 - 1,1,1,1,1,1,1,1, # 78 - 7f - 2,2,2,2,3,3,3,3, # 80 - 87 - 4,4,4,4,4,4,4,4, # 88 - 8f - 4,4,4,4,4,4,4,4, # 90 - 97 - 4,4,4,4,4,4,4,4, # 98 - 9f - 5,5,5,5,5,5,5,5, # a0 - a7 - 5,5,5,5,5,5,5,5, # a8 - af - 5,5,5,5,5,5,5,5, # b0 - b7 - 5,5,5,5,5,5,5,5, # b8 - bf - 0,0,6,6,6,6,6,6, # c0 - c7 - 6,6,6,6,6,6,6,6, # c8 - cf - 6,6,6,6,6,6,6,6, # d0 - d7 - 6,6,6,6,6,6,6,6, # d8 - df - 7,8,8,8,8,8,8,8, # e0 - e7 - 8,8,8,8,8,9,8,8, # e8 - ef - 10,11,11,11,11,11,11,11, # f0 - f7 - 12,13,13,13,14,15,0,0 # f8 - ff -) - -UTF8_ST = ( - MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 12, 10,#00-07 - 9, 11, 8, 7, 6, 5, 4, 3,#08-0f - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#10-17 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f - MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#20-27 - MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#28-2f - MachineState.ERROR,MachineState.ERROR, 5, 5, 5, 5,MachineState.ERROR,MachineState.ERROR,#30-37 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#38-3f - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5, 5, 5,MachineState.ERROR,MachineState.ERROR,#40-47 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#48-4f - MachineState.ERROR,MachineState.ERROR, 7, 7, 7, 7,MachineState.ERROR,MachineState.ERROR,#50-57 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#58-5f - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 7, 7,MachineState.ERROR,MachineState.ERROR,#60-67 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#68-6f - MachineState.ERROR,MachineState.ERROR, 9, 9, 9, 9,MachineState.ERROR,MachineState.ERROR,#70-77 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#78-7f - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 9,MachineState.ERROR,MachineState.ERROR,#80-87 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#88-8f - MachineState.ERROR,MachineState.ERROR, 12, 12, 12, 12,MachineState.ERROR,MachineState.ERROR,#90-97 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#98-9f - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 12,MachineState.ERROR,MachineState.ERROR,#a0-a7 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#a8-af - MachineState.ERROR,MachineState.ERROR, 12, 12, 12,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#b0-b7 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#b8-bf - MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,#c0-c7 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR #c8-cf -) - -UTF8_CHAR_LEN_TABLE = (0, 1, 0, 0, 0, 0, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6) - -UTF8_SM_MODEL = {'class_table': UTF8_CLS, - 'class_factor': 16, - 'state_table': UTF8_ST, - 'char_len_table': UTF8_CHAR_LEN_TABLE, - 'name': 'UTF-8'} diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcssm.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcssm.pyc deleted file mode 100644 index 74f02ddb27617bbf484e91fd46f49859ac8774a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19168 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 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcharsetprober.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcharsetprober.py deleted file mode 100644 index 0adb51d..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcharsetprober.py +++ /dev/null @@ -1,132 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .charsetprober import CharSetProber -from .enums import CharacterCategory, ProbingState, SequenceLikelihood - - -class SingleByteCharSetProber(CharSetProber): - SAMPLE_SIZE = 64 - SB_ENOUGH_REL_THRESHOLD = 1024 # 0.25 * SAMPLE_SIZE^2 - POSITIVE_SHORTCUT_THRESHOLD = 0.95 - NEGATIVE_SHORTCUT_THRESHOLD = 0.05 - - def __init__(self, model, reversed=False, name_prober=None): - super(SingleByteCharSetProber, self).__init__() - self._model = model - # TRUE if we need to reverse every pair in the model lookup - self._reversed = reversed - # Optional auxiliary prober for name decision - self._name_prober = name_prober - self._last_order = None - self._seq_counters = None - self._total_seqs = None - self._total_char = None - self._freq_char = None - self.reset() - - def reset(self): - super(SingleByteCharSetProber, self).reset() - # char order of last character - self._last_order = 255 - self._seq_counters = [0] * SequenceLikelihood.get_num_categories() - self._total_seqs = 0 - self._total_char = 0 - # characters that fall in our sampling range - self._freq_char = 0 - - @property - def charset_name(self): - if self._name_prober: - return self._name_prober.charset_name - else: - return self._model['charset_name'] - - @property - def language(self): - if self._name_prober: - return self._name_prober.language - else: - return self._model.get('language') - - def feed(self, byte_str): - if not self._model['keep_english_letter']: - byte_str = self.filter_international_words(byte_str) - if not byte_str: - return self.state - char_to_order_map = self._model['char_to_order_map'] - for i, c in enumerate(byte_str): - # XXX: Order is in range 1-64, so one would think we want 0-63 here, - # but that leads to 27 more test failures than before. - order = char_to_order_map[c] - # XXX: This was SYMBOL_CAT_ORDER before, with a value of 250, but - # CharacterCategory.SYMBOL is actually 253, so we use CONTROL - # to make it closer to the original intent. The only difference - # is whether or not we count digits and control characters for - # _total_char purposes. - if order < CharacterCategory.CONTROL: - self._total_char += 1 - if order < self.SAMPLE_SIZE: - self._freq_char += 1 - if self._last_order < self.SAMPLE_SIZE: - self._total_seqs += 1 - if not self._reversed: - i = (self._last_order * self.SAMPLE_SIZE) + order - model = self._model['precedence_matrix'][i] - else: # reverse the order of the letters in the lookup - i = (order * self.SAMPLE_SIZE) + self._last_order - model = self._model['precedence_matrix'][i] - self._seq_counters[model] += 1 - self._last_order = order - - charset_name = self._model['charset_name'] - if self.state == ProbingState.DETECTING: - if self._total_seqs > self.SB_ENOUGH_REL_THRESHOLD: - confidence = self.get_confidence() - if confidence > self.POSITIVE_SHORTCUT_THRESHOLD: - self.logger.debug('%s confidence = %s, we have a winner', - charset_name, confidence) - self._state = ProbingState.FOUND_IT - elif confidence < self.NEGATIVE_SHORTCUT_THRESHOLD: - self.logger.debug('%s confidence = %s, below negative ' - 'shortcut threshhold %s', charset_name, - confidence, - self.NEGATIVE_SHORTCUT_THRESHOLD) - self._state = ProbingState.NOT_ME - - return self.state - - def get_confidence(self): - r = 0.01 - if self._total_seqs > 0: - r = ((1.0 * self._seq_counters[SequenceLikelihood.POSITIVE]) / - self._total_seqs / self._model['typical_positive_ratio']) - r = r * self._freq_char / self._total_char - if r >= 1.0: - r = 0.99 - return r diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcharsetprober.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcharsetprober.pyc deleted file mode 100644 index 82e06ba7ffc60fcba561f7a8f19d5383c0748766..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4050 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 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcsgroupprober.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcsgroupprober.py deleted file mode 100644 index 98e95dc..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcsgroupprober.py +++ /dev/null @@ -1,73 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .charsetgroupprober import CharSetGroupProber -from .sbcharsetprober import SingleByteCharSetProber -from .langcyrillicmodel import (Win1251CyrillicModel, Koi8rModel, - Latin5CyrillicModel, MacCyrillicModel, - Ibm866Model, Ibm855Model) -from .langgreekmodel import Latin7GreekModel, Win1253GreekModel -from .langbulgarianmodel import Latin5BulgarianModel, Win1251BulgarianModel -# from .langhungarianmodel import Latin2HungarianModel, Win1250HungarianModel -from .langthaimodel import TIS620ThaiModel -from .langhebrewmodel import Win1255HebrewModel -from .hebrewprober import HebrewProber -from .langturkishmodel import Latin5TurkishModel - - -class SBCSGroupProber(CharSetGroupProber): - def __init__(self): - super(SBCSGroupProber, self).__init__() - self.probers = [ - SingleByteCharSetProber(Win1251CyrillicModel), - SingleByteCharSetProber(Koi8rModel), - SingleByteCharSetProber(Latin5CyrillicModel), - SingleByteCharSetProber(MacCyrillicModel), - SingleByteCharSetProber(Ibm866Model), - SingleByteCharSetProber(Ibm855Model), - SingleByteCharSetProber(Latin7GreekModel), - SingleByteCharSetProber(Win1253GreekModel), - SingleByteCharSetProber(Latin5BulgarianModel), - SingleByteCharSetProber(Win1251BulgarianModel), - # TODO: Restore Hungarian encodings (iso-8859-2 and windows-1250) - # after we retrain model. - # SingleByteCharSetProber(Latin2HungarianModel), - # SingleByteCharSetProber(Win1250HungarianModel), - SingleByteCharSetProber(TIS620ThaiModel), - SingleByteCharSetProber(Latin5TurkishModel), - ] - hebrew_prober = HebrewProber() - logical_hebrew_prober = SingleByteCharSetProber(Win1255HebrewModel, - False, hebrew_prober) - visual_hebrew_prober = SingleByteCharSetProber(Win1255HebrewModel, True, - hebrew_prober) - hebrew_prober.set_model_probers(logical_hebrew_prober, visual_hebrew_prober) - self.probers.extend([hebrew_prober, logical_hebrew_prober, - visual_hebrew_prober]) - - self.reset() diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcsgroupprober.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcsgroupprober.pyc deleted file mode 100644 index 6685d9461e69704fa6e2929244eaf13bd327c1b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2070 zcmd5+TW{k;6h31&*CtJxwrN4)Jpy*!?2=F<gitH7te~rvQwi-z$a0*i>vqNo<4Lw% zbstdqiTn)S_ye3X6L(vXc!k(=a;`Jy@_GC}+s#jZ-TFC!_0PxuZ*djBBbnjLKmsTR zoB<=*1L=YCf%{JOL2iJm0Iz_m0<VIq0k46o1FwT>0B?Y50&hC+4Un6lTEJVN+Q8dR zTLHNRssp?Ostdg9v{jJXpnAZ2POgF60ksQ!*U5E|d!YKj`%Z3v+y`|4`~c-92nOd2 zW}EOEz#YIF{t?VtFd4M5u#6!Y5HUR@Cl|4v2=hYEmy6eWJ{8*8_R%)U@>GiB8za_U zYlkWY?;`mr%ZJZK!;>4GNtq?5^O=yQiH0BM*^zeQ4vIg<Cd)^U-MXkhjg!a9O;o;| zs-yAP1()(@WaWW}c0-YN$1h)KA+DU~HY!~@&p&9LKV|ANI9|#$)>)jpn7#X$;bV(y zK?lueFDK(?hi4aY<`TH?n>%aty_jn8_JOU1K~DLwo78ES!r4+^WyOU{fKHekpG+Qf z{~nEW(lM@rDic5;L=56Uxd-9IW|)xA1}>WG39jM~BnDpww>WtZE<Kt*Gd`FNxMM&} zrDUolQ!ANz$uvr)Su&d?(<+&E$!wKOhnTcQXGdKy+jRDOcW4jH4%{-h^WnW`(?HE` zsqu-q+=E*WZhgv|;TD%&xa^a`X;U=dcSwePTNHM~wc*v^fXc2=1C|S+Ljs7YBZ;Cc z&rB4B)Tofa6Z%A`XCe8A1m&<sg#5z>5dv^X$O~zhAq~lp%ffyhMYu&;YPmh~yI2+i zyNg)SOMyjW7Q#e|zJ+KVV(1ugZA3n^F<PL@fMRT5A>_HC4KFO3)=`GwDd%aH#4>tp zAw;jTV)=K&0QF!=u|h6b=xh}m5v*bzoX_P<=puM`9o#(E)BNq#aQsVtIM!c`lcVDL ztJyn!h`)3ZoCS+)@g&O&6HEET3{TVOHL2{1R#?Pb2MOLAGhu>aniMHr9<J1<i<^+Z z{yDCK2(TTm!T#}78mx!<Dr;F=mvvav8_;mpgUe$jqR3t*5jAruQM6lsDDpqAlz{db zu7aRdWv>PwQvp;zwFhVXpfe$A!4R0RWzOnaX2EH3BjY?x)_1AJ&%Z;~5D+OQrEAay z)KO(oY_lNaw7m12!#%hy;K;$?<>qVzcbg%p9paq9f}N~Rxz3x8x0kWq#ocSppQ^N9 i;s0k=7FJ(ldI+R%KEeD78dH~b*;BvI`W|uk_<sRy=hs~T diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/sjisprober.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/sjisprober.py deleted file mode 100644 index 9e29623..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/sjisprober.py +++ /dev/null @@ -1,92 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import SJISDistributionAnalysis -from .jpcntx import SJISContextAnalysis -from .mbcssm import SJIS_SM_MODEL -from .enums import ProbingState, MachineState - - -class SJISProber(MultiByteCharSetProber): - def __init__(self): - super(SJISProber, self).__init__() - self.coding_sm = CodingStateMachine(SJIS_SM_MODEL) - self.distribution_analyzer = SJISDistributionAnalysis() - self.context_analyzer = SJISContextAnalysis() - self.reset() - - def reset(self): - super(SJISProber, self).reset() - self.context_analyzer.reset() - - @property - def charset_name(self): - return self.context_analyzer.charset_name - - @property - def language(self): - return "Japanese" - - def feed(self, byte_str): - for i in range(len(byte_str)): - coding_state = self.coding_sm.next_state(byte_str[i]) - if coding_state == MachineState.ERROR: - self.logger.debug('%s %s prober hit error at byte %s', - self.charset_name, self.language, i) - self._state = ProbingState.NOT_ME - break - elif coding_state == MachineState.ITS_ME: - self._state = ProbingState.FOUND_IT - break - elif coding_state == MachineState.START: - char_len = self.coding_sm.get_current_charlen() - if i == 0: - self._last_char[1] = byte_str[0] - self.context_analyzer.feed(self._last_char[2 - char_len:], - char_len) - self.distribution_analyzer.feed(self._last_char, char_len) - else: - self.context_analyzer.feed(byte_str[i + 1 - char_len:i + 3 - - char_len], char_len) - self.distribution_analyzer.feed(byte_str[i - 1:i + 1], - char_len) - - self._last_char[0] = byte_str[-1] - - if self.state == ProbingState.DETECTING: - if (self.context_analyzer.got_enough_data() and - (self.get_confidence() > self.SHORTCUT_THRESHOLD)): - self._state = ProbingState.FOUND_IT - - return self.state - - def get_confidence(self): - context_conf = self.context_analyzer.get_confidence() - distrib_conf = self.distribution_analyzer.get_confidence() - return max(context_conf, distrib_conf) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/sjisprober.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/sjisprober.pyc deleted file mode 100644 index 1920ced99e9ff67a9755bf652ecd34d27117fffd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3443 zcmd5;-ESL35T84L#rbR!k~DzSRJ4)>6t|*^3aSvT6KJa1sm`uYEmf<FZ{wVMcXn>q zC8=5o1dseBedBNA9r(?xod$*X)V`hDot@pA@0r413$vg9y7;0;lV1Vv?=j3T01+OK z5~9?ju16lPeM)>v3)C&Rb%By1r6uZ?+`33fnbHb%D{ft)WQNizb*pY&rev1VIqJ?) zI#1nsU@N3OI`k--q2GyqBYNIlpr}gi+ANreJ%AbmyAIGCCpLa~YIWl%%-h;N&4&j% zcl#^YZw#Y2>$h!abu;W8#hG?{SFzWAyw~1|jm_hOv5kk>gDgx=O>7*+>V%>(%&b1K z|J_`eY^rusHTQRRpVWL{>^uN-F#V(;Cf^kvEQ`S3b$p)bnNL5&FpmK=v3j9hh~M>D z=R7HpF0#H^C(wUMmWAoEOi@wDDioDuGDAVTR>pNbRu&I7W&^`K0<d^IdV|Y+8u+Yc z&lboQ`Ep=YiENp%Jg<<Qna-<>8O+K7u-F!5wQ6&GWr;5zk8~bXcsT>0RGh_Dsel;> zij1xT^u#R6q=D#d4XEgxB~-|!c#VsgXM06Xh#Agy<YT!u+B$Rb)kY_WHM~iHImWC$ z%Hvlse*IOL*AItDq;pe$eNsRDIzPyMetBp6IJ>=_-`(!rGbi6fuk+jZ^+)wieH4#w z#hI~TlH9U)ntk<@Q8LskokhdE-h<0U+Sbh=HY4%7uSTZ<i+2;lu&K#g^_IMO{4ZMJ z2Dbml3asA3)FkIL%mN0iQc-Te9vHB{iTJ@H&oC}kbmr+x48y##=x0K+^~LpADJ&r# z@637F2SgT$7gj6Gs<JS3!TMncw*)3{V;JU^{EMQo(1_Kxq=J@s|Ko5JX7EvG83}<8 z!BE0m5@!8z*w=T@$;6^@5OdlPbNvaPPg>r@O+8Kycy?ZV>%H~Gjz}H_dV`eV(<XM_ zVj)>%P@<PU<*5*rX@ImOd1Wvo7-SLToFa10EDh!urRM4B@#^&Sf}H+?czf~U_L6La z8g2v*u5dPbTjV>DAo;t0Gf$XrGQ~1Q1-j3(6&kohK!LnSSFZse1A4ss(fi#A_P8k< z?wAOPn>P3yf2!oB*DqW#r4%Y0m{LGKJU=mO<ulfN$J(06x-Q(mn|^hJ1<T#?D$kkC zO?p{m<aym3zw<J;y9Nj3?AtQe0dJZuJT5tH9mRG_=lL+-3hmYbY9{t#5V@Kfv+?5s zgMaX=eT<n)vTziQ+CY@(EZ_i^Dwd%rD&$A219lf7-3@~M0CfYT!+u}qf{gURxF2x% z1j`KA!Gxx@-%-t7nYxQ)y4PtlmNVTC`_EcCYOf>Lv^x)ij^(NhZd7la=Q_h1$pUN% zM=A-8!?<L^0ePr(6ud7^%&rumo!!oEqqEog(K2KGp;bB?j{8R{3PHm`Dqk69hjFB{ zp0?afv>)vUoyN0{>O2Z|v3RmmV__se3B#;Zh?1kSLX9q)O)8yynT2AG6<EIXY<&&P z+`};20OW0Y>r$##QLKtGW5~s8+1v0c-lo5SjQ)wY=r8*#z^{2LE(x+{@MvI|F96s{ z@gP+oDqYkgNZryWc#_K(2)k+bAhnH)S@0PHu@_&Nh9@<CI}I~I&vj!8??ch=q-_wy zrK^;=e~w`|1W43Z<9<M#LrFzb%K55FhtW9E=!}>^%DGS>R?$G&({lmCh7!fRmrrJw z)ZlP-xq)HW9%ZjusTP;;uU>D}IBq1M(t}AAcc~`;o+N}^<0ok&b^W+>hOWiqe(GEo z=z2p|<zUpy?1^gzd5!B0dPjB}$qhOir$!Qs<Ra;iJ_u!rN$)#TfA=Za6{TJArvLTA Ezxf&gUH||9 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/universaldetector.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/universaldetector.py deleted file mode 100644 index 7b4e92d..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/universaldetector.py +++ /dev/null @@ -1,286 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### -""" -Module containing the UniversalDetector detector class, which is the primary -class a user of ``chardet`` should use. - -:author: Mark Pilgrim (initial port to Python) -:author: Shy Shalom (original C code) -:author: Dan Blanchard (major refactoring for 3.0) -:author: Ian Cordasco -""" - - -import codecs -import logging -import re - -from .charsetgroupprober import CharSetGroupProber -from .enums import InputState, LanguageFilter, ProbingState -from .escprober import EscCharSetProber -from .latin1prober import Latin1Prober -from .mbcsgroupprober import MBCSGroupProber -from .sbcsgroupprober import SBCSGroupProber - - -class UniversalDetector(object): - """ - The ``UniversalDetector`` class underlies the ``chardet.detect`` function - and coordinates all of the different charset probers. - - To get a ``dict`` containing an encoding and its confidence, you can simply - run: - - .. code:: - - u = UniversalDetector() - u.feed(some_bytes) - u.close() - detected = u.result - - """ - - MINIMUM_THRESHOLD = 0.20 - HIGH_BYTE_DETECTOR = re.compile(b'[\x80-\xFF]') - ESC_DETECTOR = re.compile(b'(\033|~{)') - WIN_BYTE_DETECTOR = re.compile(b'[\x80-\x9F]') - ISO_WIN_MAP = {'iso-8859-1': 'Windows-1252', - 'iso-8859-2': 'Windows-1250', - 'iso-8859-5': 'Windows-1251', - 'iso-8859-6': 'Windows-1256', - 'iso-8859-7': 'Windows-1253', - 'iso-8859-8': 'Windows-1255', - 'iso-8859-9': 'Windows-1254', - 'iso-8859-13': 'Windows-1257'} - - def __init__(self, lang_filter=LanguageFilter.ALL): - self._esc_charset_prober = None - self._charset_probers = [] - self.result = None - self.done = None - self._got_data = None - self._input_state = None - self._last_char = None - self.lang_filter = lang_filter - self.logger = logging.getLogger(__name__) - self._has_win_bytes = None - self.reset() - - def reset(self): - """ - Reset the UniversalDetector and all of its probers back to their - initial states. This is called by ``__init__``, so you only need to - call this directly in between analyses of different documents. - """ - self.result = {'encoding': None, 'confidence': 0.0, 'language': None} - self.done = False - self._got_data = False - self._has_win_bytes = False - self._input_state = InputState.PURE_ASCII - self._last_char = b'' - if self._esc_charset_prober: - self._esc_charset_prober.reset() - for prober in self._charset_probers: - prober.reset() - - def feed(self, byte_str): - """ - Takes a chunk of a document and feeds it through all of the relevant - charset probers. - - After calling ``feed``, you can check the value of the ``done`` - attribute to see if you need to continue feeding the - ``UniversalDetector`` more data, or if it has made a prediction - (in the ``result`` attribute). - - .. note:: - You should always call ``close`` when you're done feeding in your - document if ``done`` is not already ``True``. - """ - if self.done: - return - - if not len(byte_str): - return - - if not isinstance(byte_str, bytearray): - byte_str = bytearray(byte_str) - - # First check for known BOMs, since these are guaranteed to be correct - if not self._got_data: - # If the data starts with BOM, we know it is UTF - if byte_str.startswith(codecs.BOM_UTF8): - # EF BB BF UTF-8 with BOM - self.result = {'encoding': "UTF-8-SIG", - 'confidence': 1.0, - 'language': ''} - elif byte_str.startswith((codecs.BOM_UTF32_LE, - codecs.BOM_UTF32_BE)): - # FF FE 00 00 UTF-32, little-endian BOM - # 00 00 FE FF UTF-32, big-endian BOM - self.result = {'encoding': "UTF-32", - 'confidence': 1.0, - 'language': ''} - elif byte_str.startswith(b'\xFE\xFF\x00\x00'): - # FE FF 00 00 UCS-4, unusual octet order BOM (3412) - self.result = {'encoding': "X-ISO-10646-UCS-4-3412", - 'confidence': 1.0, - 'language': ''} - elif byte_str.startswith(b'\x00\x00\xFF\xFE'): - # 00 00 FF FE UCS-4, unusual octet order BOM (2143) - self.result = {'encoding': "X-ISO-10646-UCS-4-2143", - 'confidence': 1.0, - 'language': ''} - elif byte_str.startswith((codecs.BOM_LE, codecs.BOM_BE)): - # FF FE UTF-16, little endian BOM - # FE FF UTF-16, big endian BOM - self.result = {'encoding': "UTF-16", - 'confidence': 1.0, - 'language': ''} - - self._got_data = True - if self.result['encoding'] is not None: - self.done = True - return - - # If none of those matched and we've only see ASCII so far, check - # for high bytes and escape sequences - if self._input_state == InputState.PURE_ASCII: - if self.HIGH_BYTE_DETECTOR.search(byte_str): - self._input_state = InputState.HIGH_BYTE - elif self._input_state == InputState.PURE_ASCII and \ - self.ESC_DETECTOR.search(self._last_char + byte_str): - self._input_state = InputState.ESC_ASCII - - self._last_char = byte_str[-1:] - - # If we've seen escape sequences, use the EscCharSetProber, which - # uses a simple state machine to check for known escape sequences in - # HZ and ISO-2022 encodings, since those are the only encodings that - # use such sequences. - if self._input_state == InputState.ESC_ASCII: - if not self._esc_charset_prober: - self._esc_charset_prober = EscCharSetProber(self.lang_filter) - if self._esc_charset_prober.feed(byte_str) == ProbingState.FOUND_IT: - self.result = {'encoding': - self._esc_charset_prober.charset_name, - 'confidence': - self._esc_charset_prober.get_confidence(), - 'language': - self._esc_charset_prober.language} - self.done = True - # If we've seen high bytes (i.e., those with values greater than 127), - # we need to do more complicated checks using all our multi-byte and - # single-byte probers that are left. The single-byte probers - # use character bigram distributions to determine the encoding, whereas - # the multi-byte probers use a combination of character unigram and - # bigram distributions. - elif self._input_state == InputState.HIGH_BYTE: - if not self._charset_probers: - self._charset_probers = [MBCSGroupProber(self.lang_filter)] - # If we're checking non-CJK encodings, use single-byte prober - if self.lang_filter & LanguageFilter.NON_CJK: - self._charset_probers.append(SBCSGroupProber()) - self._charset_probers.append(Latin1Prober()) - for prober in self._charset_probers: - if prober.feed(byte_str) == ProbingState.FOUND_IT: - self.result = {'encoding': prober.charset_name, - 'confidence': prober.get_confidence(), - 'language': prober.language} - self.done = True - break - if self.WIN_BYTE_DETECTOR.search(byte_str): - self._has_win_bytes = True - - def close(self): - """ - Stop analyzing the current document and come up with a final - prediction. - - :returns: The ``result`` attribute, a ``dict`` with the keys - `encoding`, `confidence`, and `language`. - """ - # Don't bother with checks if we're already done - if self.done: - return self.result - self.done = True - - if not self._got_data: - self.logger.debug('no data received!') - - # Default to ASCII if it is all we've seen so far - elif self._input_state == InputState.PURE_ASCII: - self.result = {'encoding': 'ascii', - 'confidence': 1.0, - 'language': ''} - - # If we have seen non-ASCII, return the best that met MINIMUM_THRESHOLD - elif self._input_state == InputState.HIGH_BYTE: - prober_confidence = None - max_prober_confidence = 0.0 - max_prober = None - for prober in self._charset_probers: - if not prober: - continue - prober_confidence = prober.get_confidence() - if prober_confidence > max_prober_confidence: - max_prober_confidence = prober_confidence - max_prober = prober - if max_prober and (max_prober_confidence > self.MINIMUM_THRESHOLD): - charset_name = max_prober.charset_name - lower_charset_name = max_prober.charset_name.lower() - confidence = max_prober.get_confidence() - # Use Windows encoding name instead of ISO-8859 if we saw any - # extra Windows-specific bytes - if lower_charset_name.startswith('iso-8859'): - if self._has_win_bytes: - charset_name = self.ISO_WIN_MAP.get(lower_charset_name, - charset_name) - self.result = {'encoding': charset_name, - 'confidence': confidence, - 'language': max_prober.language} - - # Log all prober confidences if none met MINIMUM_THRESHOLD - if self.logger.getEffectiveLevel() == logging.DEBUG: - if self.result['encoding'] is None: - self.logger.debug('no probers hit minimum threshold') - for group_prober in self._charset_probers: - if not group_prober: - continue - if isinstance(group_prober, CharSetGroupProber): - for prober in group_prober.probers: - self.logger.debug('%s %s confidence = %s', - prober.charset_name, - prober.language, - prober.get_confidence()) - else: - self.logger.debug('%s %s confidence = %s', - prober.charset_name, - prober.language, - prober.get_confidence()) - return self.result diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/universaldetector.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/universaldetector.pyc deleted file mode 100644 index cbc46325c79e54f3af0bd1b466cf49b62381b64a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7403 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 SYBo)dJP0Q9B0DUcHvM0=TCwy1 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/utf8prober.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/utf8prober.py deleted file mode 100644 index 6c3196c..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/utf8prober.py +++ /dev/null @@ -1,82 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .charsetprober import CharSetProber -from .enums import ProbingState, MachineState -from .codingstatemachine import CodingStateMachine -from .mbcssm import UTF8_SM_MODEL - - - -class UTF8Prober(CharSetProber): - ONE_CHAR_PROB = 0.5 - - def __init__(self): - super(UTF8Prober, self).__init__() - self.coding_sm = CodingStateMachine(UTF8_SM_MODEL) - self._num_mb_chars = None - self.reset() - - def reset(self): - super(UTF8Prober, self).reset() - self.coding_sm.reset() - self._num_mb_chars = 0 - - @property - def charset_name(self): - return "utf-8" - - @property - def language(self): - return "" - - def feed(self, byte_str): - for c in byte_str: - coding_state = self.coding_sm.next_state(c) - if coding_state == MachineState.ERROR: - self._state = ProbingState.NOT_ME - break - elif coding_state == MachineState.ITS_ME: - self._state = ProbingState.FOUND_IT - break - elif coding_state == MachineState.START: - if self.coding_sm.get_current_charlen() >= 2: - self._num_mb_chars += 1 - - if self.state == ProbingState.DETECTING: - if self.get_confidence() > self.SHORTCUT_THRESHOLD: - self._state = ProbingState.FOUND_IT - - return self.state - - def get_confidence(self): - unlike = 0.99 - if self._num_mb_chars < 6: - unlike *= self.ONE_CHAR_PROB ** self._num_mb_chars - return 1.0 - unlike - else: - return unlike diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/utf8prober.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/utf8prober.pyc deleted file mode 100644 index 1d61bceba54ecdb0d4fc0975307280f31f4d2c64..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2892 zcmd5;UvJ|?5TA9NfBl!Ly+eQyAR(a$QF0YfS_xgbOLNysZBngWAtF^v8gFuLY$vrh zrLEcrbiDI+e2e=sed7r}0Z4oSW@eLC=#J;s@{V_B$GbcKezUoM=4U?pdEu}NlP8DY z@33V*A_?#n5COyj+5!ZP9f%x=bI{H~>_XeM+#E!Chzrmz*s%*y5#kcGOE}Jh7SIzA z6yO(tmjFMs%McX7tCnz+P#~!iG4n|3FFL8G&3-yO(rMKp_8bx#he_Wv9iy4C*Xh0p z6U_|!_Y(a*45m^Of!mc2{AcUR+f#e3t;VjIL22UHjc)X(4WDAm_K|2HwNdM~Lx#Y^ zqt<8v>bRiu5ad`Rv`&GC?sQlL)SARf6RlBW=~aukXdfFse{6P1XKG~gI<{;BiNROE zCECe>V~4CIOb(0-FPW=wQ=n;8Bzjz831oS!XtP?THS)CDc%)NFJws+zDojG7l%(CH zOKcMDvcXgq;|>7LVWQa!DjCNrK2lxuM#jsfI@87)lO!`8^{V&<CfN!0YNIqfMfcQB zJ87*qi~^lzwTrXb`IqTY^3z~-?Id}$mVUL?UC+)of{XMKKK)V6uZ_adN|<D(6Gba# zb+51XiN#Hw>LeJZH9AM2O>Jy?>mv@0FGlB*%=sy{j1&a1EGnWb-Zbk9PQJygWWL<g z#^_!$s!P`OIP97sEm|c5$^sGY%~FrHlN3N~4@vQP=eD4OeU2@ovyv_5Z!JMV#sNm2 zLro_NW~32XbY<P1p2Y5jGMwNXdfKR@6YEtxSw^V|&W(HjM=5ml)EoCl9}1YLlk~@( zzWy5fQ(Z_U@(DF|(C^qe`wcDyY#sgzR}SYm#wkW8Vu66G99$wAAT;D);6VDAkl{Gb zv0H%s69ff2UF7LQo-VyPUFK;EA-Mbup$G=XAP?y)l6H@03Fy9Y)GVC50$dm0?<r&E zc*%MG|C*1tKtIz|1qLpp*Z<k`<Qft?JBMMHL-m>=X>Cz|5qq3X49AH+GYVnAXh|Xr zI}IsYQj#YP1$MLLtGxzytt5AMe2=(f<!7yf=9b#=`Df36B7L)r>^=rkcbuj=!7pM- zq!UhHi<Dec2o1LyexvU1G@qM==}*I?7X~`%YD4wK+ipp}e&8#ATQ+d8yHzFMan|tu zN9RW4$x_5{1Xml#6Nsf<?iwZ-<$GEORBEyhkpKe45(4L(aBt{C@t(6J9*QNKZR8B{ zTpb(ND2$XV#>->A5DWm)Rf<^(f+>G_14RN1R{`&ONW6f6m5kNwzkdGb#e>&>ZHDC1 zNj>~~lTp`tg)RcEW<%AtpGdVYTTksA0WCXxoJ8T^&W$PG$MfuB%cvHBD4+o!h>}yK z;iTvidMU->tyDY=#t{zX$0)$nOA>6eC{{JB*XCT3?y^GUBO<iNZPak@j;bwHi%+m+ zlp6(6aLR>pzT#Hg@^aIvOh=!<wk^^U88(kKUMMooW1HKQO!n@<2_M_r9A8e@!|_o! h%VNH#aN)fdCSXT>YrXjR1Jr;o9*g1~u_zYZe*w5PgUbK_ diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/version.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/version.py deleted file mode 100644 index bb2a34a..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/version.py +++ /dev/null @@ -1,9 +0,0 @@ -""" -This module exists only to simplify retrieving the version number of chardet -from within setup.py and from chardet subpackages. - -:author: Dan Blanchard (dan.blanchard@gmail.com) -""" - -__version__ = "3.0.4" -VERSION = __version__.split('.') diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/version.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/version.pyc deleted file mode 100644 index aa690db8ee3dcfd6c0bab02afea6dfc2909aaaf8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 478 zcmYLG(MrQG6iqvwQqf=VK2BlHL>W3nhUkM2PEqkekdifN8`mZ^N$cvH_(^`6Kj2-h z7`P|r+?<emZ+hR`!T!h2b4<GB<37c(y9k_+Cq$1tc|>^R#V6b+pD25T_sIQVZDssI z2p%$Nq0qd_1&F1z&Vp8X15SgLMVZT_0VAA|qLwNJmkFqau~I8gRWTO^bOLe43>Pj) zj4t3!x=bpt!c}EhHoz2z_Mmftt>z_*7c3Pv41x)(T&B$gE|`MzoT=6Z1I|=9|C7_S zU@{M5UF-#R9qT>}N8yq4kcG3h8@GWxinxxW$ZfT}s}uF=hQ(f7>w3JryT7`b4KPXm z!77xrG_qz+(3%;V=$vD#^nFR2Lo-)zi-Ym28ja1-I6k(^6aH>SxYCk7&{CE|sjOpp qK6D4yX>_|vwGq`qacyYVKJCiF(YQ@~^7ME3XMN;$^)G$D@BIMtH-`xT diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/colorama/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/colorama/__init__.py deleted file mode 100644 index 2a3bf47..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/colorama/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. -from .initialise import init, deinit, reinit, colorama_text -from .ansi import Fore, Back, Style, Cursor -from .ansitowin32 import AnsiToWin32 - -__version__ = '0.4.1' diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/colorama/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/colorama/__init__.pyc deleted file mode 100644 index d29a6a3384eb173ff733dce93d6e9e35de330ed2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 530 zcmYLF+e!m55S`uay()e~pBBNUwWTPCcmdxOiGmQ&uy)rHnrzl2*0yhcvp?WWwHh{O zGbd-x%q02R?HqjWJx$?v#rQwR?Vk~H{36f*CIS(Gi9y6*5)cWP8i*Q1q=-S+!8AZL zz%)TL!L&fMz_dZMe-sJm4wx>8F2<O+19=_p(*~AM5kgu+2n4EBArPMze@FLo+(mY3 zwRM@vWGI&5KkM4MVv~NEP3NJG!uzn&#m4CB-FfR$DigX07o}GZ_ED9iBTvdff7~D5 zrsN(v2vk;OTKR%w1e_8%y$VkdHdQjT;M6TA15WMoCS8(0T?YF>{=Bs%rCb!wD_csL zA_xEAD-2oX)FKN7TV#&CTAibqt(R;yaxdk_d^mY42NO4*OppEYBwxD$u35z%Sf#2% yRr-)=eHex}GkHhUW@E)Nw~lR}j7dqON!hPfff_qCHh<T}8O`QthF;W*_Tz67)NslG diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/colorama/ansi.py b/venv/lib/python2.7/site-packages/pip/_vendor/colorama/ansi.py deleted file mode 100644 index 7877658..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/colorama/ansi.py +++ /dev/null @@ -1,102 +0,0 @@ -# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. -''' -This module generates ANSI character codes to printing colors to terminals. -See: http://en.wikipedia.org/wiki/ANSI_escape_code -''' - -CSI = '\033[' -OSC = '\033]' -BEL = '\007' - - -def code_to_chars(code): - return CSI + str(code) + 'm' - -def set_title(title): - return OSC + '2;' + title + BEL - -def clear_screen(mode=2): - return CSI + str(mode) + 'J' - -def clear_line(mode=2): - return CSI + str(mode) + 'K' - - -class AnsiCodes(object): - def __init__(self): - # the subclasses declare class attributes which are numbers. - # Upon instantiation we define instance attributes, which are the same - # as the class attributes but wrapped with the ANSI escape sequence - for name in dir(self): - if not name.startswith('_'): - value = getattr(self, name) - setattr(self, name, code_to_chars(value)) - - -class AnsiCursor(object): - def UP(self, n=1): - return CSI + str(n) + 'A' - def DOWN(self, n=1): - return CSI + str(n) + 'B' - def FORWARD(self, n=1): - return CSI + str(n) + 'C' - def BACK(self, n=1): - return CSI + str(n) + 'D' - def POS(self, x=1, y=1): - return CSI + str(y) + ';' + str(x) + 'H' - - -class AnsiFore(AnsiCodes): - BLACK = 30 - RED = 31 - GREEN = 32 - YELLOW = 33 - BLUE = 34 - MAGENTA = 35 - CYAN = 36 - WHITE = 37 - RESET = 39 - - # These are fairly well supported, but not part of the standard. - LIGHTBLACK_EX = 90 - LIGHTRED_EX = 91 - LIGHTGREEN_EX = 92 - LIGHTYELLOW_EX = 93 - LIGHTBLUE_EX = 94 - LIGHTMAGENTA_EX = 95 - LIGHTCYAN_EX = 96 - LIGHTWHITE_EX = 97 - - -class AnsiBack(AnsiCodes): - BLACK = 40 - RED = 41 - GREEN = 42 - YELLOW = 43 - BLUE = 44 - MAGENTA = 45 - CYAN = 46 - WHITE = 47 - RESET = 49 - - # These are fairly well supported, but not part of the standard. - LIGHTBLACK_EX = 100 - LIGHTRED_EX = 101 - LIGHTGREEN_EX = 102 - LIGHTYELLOW_EX = 103 - LIGHTBLUE_EX = 104 - LIGHTMAGENTA_EX = 105 - LIGHTCYAN_EX = 106 - LIGHTWHITE_EX = 107 - - -class AnsiStyle(AnsiCodes): - BRIGHT = 1 - DIM = 2 - NORMAL = 22 - RESET_ALL = 0 - -Fore = AnsiFore() -Back = AnsiBack() -Style = AnsiStyle() -Cursor = AnsiCursor() diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/colorama/ansi.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/colorama/ansi.pyc deleted file mode 100644 index ece47dc96babdd34a11790d47e7f11a7f1b430dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5184 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 M@>6`$nFN1-17XHWssI20 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/colorama/ansitowin32.py b/venv/lib/python2.7/site-packages/pip/_vendor/colorama/ansitowin32.py deleted file mode 100644 index 359c92b..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/colorama/ansitowin32.py +++ /dev/null @@ -1,257 +0,0 @@ -# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. -import re -import sys -import os - -from .ansi import AnsiFore, AnsiBack, AnsiStyle, Style -from .winterm import WinTerm, WinColor, WinStyle -from .win32 import windll, winapi_test - - -winterm = None -if windll is not None: - winterm = WinTerm() - - -class StreamWrapper(object): - ''' - Wraps a stream (such as stdout), acting as a transparent proxy for all - attribute access apart from method 'write()', which is delegated to our - Converter instance. - ''' - def __init__(self, wrapped, converter): - # double-underscore everything to prevent clashes with names of - # attributes on the wrapped stream object. - self.__wrapped = wrapped - self.__convertor = converter - - def __getattr__(self, name): - return getattr(self.__wrapped, name) - - def __enter__(self, *args, **kwargs): - # special method lookup bypasses __getattr__/__getattribute__, see - # https://stackoverflow.com/questions/12632894/why-doesnt-getattr-work-with-exit - # thus, contextlib magic methods are not proxied via __getattr__ - return self.__wrapped.__enter__(*args, **kwargs) - - def __exit__(self, *args, **kwargs): - return self.__wrapped.__exit__(*args, **kwargs) - - def write(self, text): - self.__convertor.write(text) - - def isatty(self): - stream = self.__wrapped - if 'PYCHARM_HOSTED' in os.environ: - if stream is not None and (stream is sys.__stdout__ or stream is sys.__stderr__): - return True - try: - stream_isatty = stream.isatty - except AttributeError: - return False - else: - return stream_isatty() - - @property - def closed(self): - stream = self.__wrapped - try: - return stream.closed - except AttributeError: - return True - - -class AnsiToWin32(object): - ''' - Implements a 'write()' method which, on Windows, will strip ANSI character - sequences from the text, and if outputting to a tty, will convert them into - win32 function calls. - ''' - ANSI_CSI_RE = re.compile('\001?\033\\[((?:\\d|;)*)([a-zA-Z])\002?') # Control Sequence Introducer - ANSI_OSC_RE = re.compile('\001?\033\\]((?:.|;)*?)(\x07)\002?') # Operating System Command - - def __init__(self, wrapped, convert=None, strip=None, autoreset=False): - # The wrapped stream (normally sys.stdout or sys.stderr) - self.wrapped = wrapped - - # should we reset colors to defaults after every .write() - self.autoreset = autoreset - - # create the proxy wrapping our output stream - self.stream = StreamWrapper(wrapped, self) - - on_windows = os.name == 'nt' - # We test if the WinAPI works, because even if we are on Windows - # we may be using a terminal that doesn't support the WinAPI - # (e.g. Cygwin Terminal). In this case it's up to the terminal - # to support the ANSI codes. - conversion_supported = on_windows and winapi_test() - - # should we strip ANSI sequences from our output? - if strip is None: - strip = conversion_supported or (not self.stream.closed and not self.stream.isatty()) - self.strip = strip - - # should we should convert ANSI sequences into win32 calls? - if convert is None: - convert = conversion_supported and not self.stream.closed and self.stream.isatty() - self.convert = convert - - # dict of ansi codes to win32 functions and parameters - self.win32_calls = self.get_win32_calls() - - # are we wrapping stderr? - self.on_stderr = self.wrapped is sys.stderr - - def should_wrap(self): - ''' - True if this class is actually needed. If false, then the output - stream will not be affected, nor will win32 calls be issued, so - wrapping stdout is not actually required. This will generally be - False on non-Windows platforms, unless optional functionality like - autoreset has been requested using kwargs to init() - ''' - return self.convert or self.strip or self.autoreset - - def get_win32_calls(self): - if self.convert and winterm: - return { - AnsiStyle.RESET_ALL: (winterm.reset_all, ), - AnsiStyle.BRIGHT: (winterm.style, WinStyle.BRIGHT), - AnsiStyle.DIM: (winterm.style, WinStyle.NORMAL), - AnsiStyle.NORMAL: (winterm.style, WinStyle.NORMAL), - AnsiFore.BLACK: (winterm.fore, WinColor.BLACK), - AnsiFore.RED: (winterm.fore, WinColor.RED), - AnsiFore.GREEN: (winterm.fore, WinColor.GREEN), - AnsiFore.YELLOW: (winterm.fore, WinColor.YELLOW), - AnsiFore.BLUE: (winterm.fore, WinColor.BLUE), - AnsiFore.MAGENTA: (winterm.fore, WinColor.MAGENTA), - AnsiFore.CYAN: (winterm.fore, WinColor.CYAN), - AnsiFore.WHITE: (winterm.fore, WinColor.GREY), - AnsiFore.RESET: (winterm.fore, ), - AnsiFore.LIGHTBLACK_EX: (winterm.fore, WinColor.BLACK, True), - AnsiFore.LIGHTRED_EX: (winterm.fore, WinColor.RED, True), - AnsiFore.LIGHTGREEN_EX: (winterm.fore, WinColor.GREEN, True), - AnsiFore.LIGHTYELLOW_EX: (winterm.fore, WinColor.YELLOW, True), - AnsiFore.LIGHTBLUE_EX: (winterm.fore, WinColor.BLUE, True), - AnsiFore.LIGHTMAGENTA_EX: (winterm.fore, WinColor.MAGENTA, True), - AnsiFore.LIGHTCYAN_EX: (winterm.fore, WinColor.CYAN, True), - AnsiFore.LIGHTWHITE_EX: (winterm.fore, WinColor.GREY, True), - AnsiBack.BLACK: (winterm.back, WinColor.BLACK), - AnsiBack.RED: (winterm.back, WinColor.RED), - AnsiBack.GREEN: (winterm.back, WinColor.GREEN), - AnsiBack.YELLOW: (winterm.back, WinColor.YELLOW), - AnsiBack.BLUE: (winterm.back, WinColor.BLUE), - AnsiBack.MAGENTA: (winterm.back, WinColor.MAGENTA), - AnsiBack.CYAN: (winterm.back, WinColor.CYAN), - AnsiBack.WHITE: (winterm.back, WinColor.GREY), - AnsiBack.RESET: (winterm.back, ), - AnsiBack.LIGHTBLACK_EX: (winterm.back, WinColor.BLACK, True), - AnsiBack.LIGHTRED_EX: (winterm.back, WinColor.RED, True), - AnsiBack.LIGHTGREEN_EX: (winterm.back, WinColor.GREEN, True), - AnsiBack.LIGHTYELLOW_EX: (winterm.back, WinColor.YELLOW, True), - AnsiBack.LIGHTBLUE_EX: (winterm.back, WinColor.BLUE, True), - AnsiBack.LIGHTMAGENTA_EX: (winterm.back, WinColor.MAGENTA, True), - AnsiBack.LIGHTCYAN_EX: (winterm.back, WinColor.CYAN, True), - AnsiBack.LIGHTWHITE_EX: (winterm.back, WinColor.GREY, True), - } - return dict() - - def write(self, text): - if self.strip or self.convert: - self.write_and_convert(text) - else: - self.wrapped.write(text) - self.wrapped.flush() - if self.autoreset: - self.reset_all() - - - def reset_all(self): - if self.convert: - self.call_win32('m', (0,)) - elif not self.strip and not self.stream.closed: - self.wrapped.write(Style.RESET_ALL) - - - def write_and_convert(self, text): - ''' - Write the given text to our wrapped stream, stripping any ANSI - sequences from the text, and optionally converting them into win32 - calls. - ''' - cursor = 0 - text = self.convert_osc(text) - for match in self.ANSI_CSI_RE.finditer(text): - start, end = match.span() - self.write_plain_text(text, cursor, start) - self.convert_ansi(*match.groups()) - cursor = end - self.write_plain_text(text, cursor, len(text)) - - - def write_plain_text(self, text, start, end): - if start < end: - self.wrapped.write(text[start:end]) - self.wrapped.flush() - - - def convert_ansi(self, paramstring, command): - if self.convert: - params = self.extract_params(command, paramstring) - self.call_win32(command, params) - - - def extract_params(self, command, paramstring): - if command in 'Hf': - params = tuple(int(p) if len(p) != 0 else 1 for p in paramstring.split(';')) - while len(params) < 2: - # defaults: - params = params + (1,) - else: - params = tuple(int(p) for p in paramstring.split(';') if len(p) != 0) - if len(params) == 0: - # defaults: - if command in 'JKm': - params = (0,) - elif command in 'ABCD': - params = (1,) - - return params - - - def call_win32(self, command, params): - if command == 'm': - for param in params: - if param in self.win32_calls: - func_args = self.win32_calls[param] - func = func_args[0] - args = func_args[1:] - kwargs = dict(on_stderr=self.on_stderr) - func(*args, **kwargs) - elif command in 'J': - winterm.erase_screen(params[0], on_stderr=self.on_stderr) - elif command in 'K': - winterm.erase_line(params[0], on_stderr=self.on_stderr) - elif command in 'Hf': # cursor position - absolute - winterm.set_cursor_position(params, on_stderr=self.on_stderr) - elif command in 'ABCD': # cursor position - relative - n = params[0] - # A - up, B - down, C - forward, D - back - x, y = {'A': (0, -n), 'B': (0, n), 'C': (n, 0), 'D': (-n, 0)}[command] - winterm.cursor_adjust(x, y, on_stderr=self.on_stderr) - - - def convert_osc(self, text): - for match in self.ANSI_OSC_RE.finditer(text): - start, end = match.span() - text = text[:start] + text[end:] - paramstring, command = match.groups() - if command in '\x07': # \x07 = BEL - params = paramstring.split(";") - # 0 - change title and icon (we will only change title) - # 1 - change icon (we don't support this) - # 2 - change title - if params[0] in '02': - winterm.set_title(params[1]) - return text diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/colorama/ansitowin32.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/colorama/ansitowin32.pyc deleted file mode 100644 index 3803952d4eeb084a8e20f8338d280cb53b6fa9f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11113 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 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/colorama/initialise.py b/venv/lib/python2.7/site-packages/pip/_vendor/colorama/initialise.py deleted file mode 100644 index 430d066..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/colorama/initialise.py +++ /dev/null @@ -1,80 +0,0 @@ -# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. -import atexit -import contextlib -import sys - -from .ansitowin32 import AnsiToWin32 - - -orig_stdout = None -orig_stderr = None - -wrapped_stdout = None -wrapped_stderr = None - -atexit_done = False - - -def reset_all(): - if AnsiToWin32 is not None: # Issue #74: objects might become None at exit - AnsiToWin32(orig_stdout).reset_all() - - -def init(autoreset=False, convert=None, strip=None, wrap=True): - - if not wrap and any([autoreset, convert, strip]): - raise ValueError('wrap=False conflicts with any other arg=True') - - global wrapped_stdout, wrapped_stderr - global orig_stdout, orig_stderr - - orig_stdout = sys.stdout - orig_stderr = sys.stderr - - if sys.stdout is None: - wrapped_stdout = None - else: - sys.stdout = wrapped_stdout = \ - wrap_stream(orig_stdout, convert, strip, autoreset, wrap) - if sys.stderr is None: - wrapped_stderr = None - else: - sys.stderr = wrapped_stderr = \ - wrap_stream(orig_stderr, convert, strip, autoreset, wrap) - - global atexit_done - if not atexit_done: - atexit.register(reset_all) - atexit_done = True - - -def deinit(): - if orig_stdout is not None: - sys.stdout = orig_stdout - if orig_stderr is not None: - sys.stderr = orig_stderr - - -@contextlib.contextmanager -def colorama_text(*args, **kwargs): - init(*args, **kwargs) - try: - yield - finally: - deinit() - - -def reinit(): - if wrapped_stdout is not None: - sys.stdout = wrapped_stdout - if wrapped_stderr is not None: - sys.stderr = wrapped_stderr - - -def wrap_stream(stream, convert, strip, autoreset, wrap): - if wrap: - wrapper = AnsiToWin32(stream, - convert=convert, strip=strip, autoreset=autoreset) - if wrapper.should_wrap(): - stream = wrapper.stream - return stream diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/colorama/initialise.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/colorama/initialise.pyc deleted file mode 100644 index 6856385f7691b6e616d445920dab261779755843..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2683 zcmc&$ZEqVz5T3pB+qrg}ri3>|Y9xeY0mUh)B0!XaD)@keg)V7}A|Y$*+d7w=@7&#W zoJ8&iNIxR}1HXn3{2YD&%rkyd5MPlmx0BhI*`0glnOTQ_HR~Vzyzx_?=1-abf5pxH z&LZJgQATvU)D<18#dtu+0VVu~l!Y`b(Q%0s8|VtmbX8<cWJIP;`W7W6dd=H4(B(D! znkFS>dd<cglvHH4MMlx-CM8vLuldN^l+<Kui;_r`JFq=$*V)VTZ+^O|Vzmw7Z?X6~ zcj-~_EY0^nS$<o<<Bz$y_pnMn=`1397rGB{&}m55L@JlLL)op{F7fJ^8+mBmA~$kE zVbej+`J@<oAMu1W&iJ0rvNqPPgtOf3jBI+Yz3H55+j&uBiLtJ8b<w%px6kv*+5Ll; z`QCwjaM1tMU3`{Y**$&+qs~!hl#cGDx%0g5J%9iELGK3)N$Z`PJSl9aUu1>VL)}U9 z)TcU2o%wil8HarA7B>g4Ni|d-3R;Dm;P59a(~uhWLqIU)SJ5<}0i&P@gAyUue^JDk zFh&fJE{Re`m}esi(OHe`6YxUUC}%(;fHm6<+wz8GD)H(b+t=pybF*K?tiCX-{HGb8 zR!3mnALJW!+9baLAC+%`Rf~8bz+Lwd%Zb&ahu`YVncaSozsS<Qce|6+pX}=Va<}j& z#_no6cz9&TroG7q9&quT2cw?qY;3-<wy-knE}aKvvtY+KWzjd*-XH__W8vTiFM<;z zlPpLAT4IR%*61OB!Hp%0t(YYjsqZD=8BU$`eT`LX2C4JLN^FIV;y+?46x3s12n~Ie zhxo(KjrATW%}1sqv496_C#QG<y1oV9-ep0-j%t-76$LF7g?E+6u%eo(k6Ap+^nJjc zRr<a?PhX}MI9dXokk)(9LAmmhABar14NxVB5~*0az$-=;$G~}ok7#SkV2OTW0MkA@ z<=`3e7=Ho^072{vZti^+%Ow7d7hXj`;;DMZk`wuwhkj&rQPp4^Z$rGvqAjGxW}Fo> zwx3O)uAo>K3QcxuQQ~@>8~$@1n1K;ARmhC_e;9&7@Nb4RForm+U=eLy*nqoM81k64 zn+!qPV;=6xEX1@#_R*Xte1UR>=KGsVK40M|(kgsarfHc@g)h7kdO)v;UOqw=aV<ZT z`>-41YKiYa+-A`Zp>dntzV4(LXGssWW?m^#@n)H~gOxX}<2PW49GsO*yMlL3$i^tv z-*IyYIjM?@)Hdf`OSR!^jM^<%1s7RxGE1LJA(6{K^KTDdOz_)7Aepg95>85tFbn%i zX_i|m2Fs<a$GDAFi7B_l{E(r}^?<AYJ6M6DDPFFyS}PSnvoD54GS1AG_*92DOR)+z TxsF!?X<<~}-ifMPQB?g0wvSAm diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/colorama/win32.py b/venv/lib/python2.7/site-packages/pip/_vendor/colorama/win32.py deleted file mode 100644 index c2d8360..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/colorama/win32.py +++ /dev/null @@ -1,152 +0,0 @@ -# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. - -# from winbase.h -STDOUT = -11 -STDERR = -12 - -try: - import ctypes - from ctypes import LibraryLoader - windll = LibraryLoader(ctypes.WinDLL) - from ctypes import wintypes -except (AttributeError, ImportError): - windll = None - SetConsoleTextAttribute = lambda *_: None - winapi_test = lambda *_: None -else: - from ctypes import byref, Structure, c_char, POINTER - - COORD = wintypes._COORD - - class CONSOLE_SCREEN_BUFFER_INFO(Structure): - """struct in wincon.h.""" - _fields_ = [ - ("dwSize", COORD), - ("dwCursorPosition", COORD), - ("wAttributes", wintypes.WORD), - ("srWindow", wintypes.SMALL_RECT), - ("dwMaximumWindowSize", COORD), - ] - def __str__(self): - return '(%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d)' % ( - self.dwSize.Y, self.dwSize.X - , self.dwCursorPosition.Y, self.dwCursorPosition.X - , self.wAttributes - , self.srWindow.Top, self.srWindow.Left, self.srWindow.Bottom, self.srWindow.Right - , self.dwMaximumWindowSize.Y, self.dwMaximumWindowSize.X - ) - - _GetStdHandle = windll.kernel32.GetStdHandle - _GetStdHandle.argtypes = [ - wintypes.DWORD, - ] - _GetStdHandle.restype = wintypes.HANDLE - - _GetConsoleScreenBufferInfo = windll.kernel32.GetConsoleScreenBufferInfo - _GetConsoleScreenBufferInfo.argtypes = [ - wintypes.HANDLE, - POINTER(CONSOLE_SCREEN_BUFFER_INFO), - ] - _GetConsoleScreenBufferInfo.restype = wintypes.BOOL - - _SetConsoleTextAttribute = windll.kernel32.SetConsoleTextAttribute - _SetConsoleTextAttribute.argtypes = [ - wintypes.HANDLE, - wintypes.WORD, - ] - _SetConsoleTextAttribute.restype = wintypes.BOOL - - _SetConsoleCursorPosition = windll.kernel32.SetConsoleCursorPosition - _SetConsoleCursorPosition.argtypes = [ - wintypes.HANDLE, - COORD, - ] - _SetConsoleCursorPosition.restype = wintypes.BOOL - - _FillConsoleOutputCharacterA = windll.kernel32.FillConsoleOutputCharacterA - _FillConsoleOutputCharacterA.argtypes = [ - wintypes.HANDLE, - c_char, - wintypes.DWORD, - COORD, - POINTER(wintypes.DWORD), - ] - _FillConsoleOutputCharacterA.restype = wintypes.BOOL - - _FillConsoleOutputAttribute = windll.kernel32.FillConsoleOutputAttribute - _FillConsoleOutputAttribute.argtypes = [ - wintypes.HANDLE, - wintypes.WORD, - wintypes.DWORD, - COORD, - POINTER(wintypes.DWORD), - ] - _FillConsoleOutputAttribute.restype = wintypes.BOOL - - _SetConsoleTitleW = windll.kernel32.SetConsoleTitleW - _SetConsoleTitleW.argtypes = [ - wintypes.LPCWSTR - ] - _SetConsoleTitleW.restype = wintypes.BOOL - - def _winapi_test(handle): - csbi = CONSOLE_SCREEN_BUFFER_INFO() - success = _GetConsoleScreenBufferInfo( - handle, byref(csbi)) - return bool(success) - - def winapi_test(): - return any(_winapi_test(h) for h in - (_GetStdHandle(STDOUT), _GetStdHandle(STDERR))) - - def GetConsoleScreenBufferInfo(stream_id=STDOUT): - handle = _GetStdHandle(stream_id) - csbi = CONSOLE_SCREEN_BUFFER_INFO() - success = _GetConsoleScreenBufferInfo( - handle, byref(csbi)) - return csbi - - def SetConsoleTextAttribute(stream_id, attrs): - handle = _GetStdHandle(stream_id) - return _SetConsoleTextAttribute(handle, attrs) - - def SetConsoleCursorPosition(stream_id, position, adjust=True): - position = COORD(*position) - # If the position is out of range, do nothing. - if position.Y <= 0 or position.X <= 0: - return - # Adjust for Windows' SetConsoleCursorPosition: - # 1. being 0-based, while ANSI is 1-based. - # 2. expecting (x,y), while ANSI uses (y,x). - adjusted_position = COORD(position.Y - 1, position.X - 1) - if adjust: - # Adjust for viewport's scroll position - sr = GetConsoleScreenBufferInfo(STDOUT).srWindow - adjusted_position.Y += sr.Top - adjusted_position.X += sr.Left - # Resume normal processing - handle = _GetStdHandle(stream_id) - return _SetConsoleCursorPosition(handle, adjusted_position) - - def FillConsoleOutputCharacter(stream_id, char, length, start): - handle = _GetStdHandle(stream_id) - char = c_char(char.encode()) - length = wintypes.DWORD(length) - num_written = wintypes.DWORD(0) - # Note that this is hard-coded for ANSI (vs wide) bytes. - success = _FillConsoleOutputCharacterA( - handle, char, length, start, byref(num_written)) - return num_written.value - - def FillConsoleOutputAttribute(stream_id, attr, length, start): - ''' FillConsoleOutputAttribute( hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten )''' - handle = _GetStdHandle(stream_id) - attribute = wintypes.WORD(attr) - length = wintypes.DWORD(length) - num_written = wintypes.DWORD(0) - # Note that this is hard-coded for ANSI (vs wide) bytes. - return _FillConsoleOutputAttribute( - handle, attribute, length, start, byref(num_written)) - - def SetConsoleTitle(title): - return _SetConsoleTitleW(title) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/colorama/win32.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/colorama/win32.pyc deleted file mode 100644 index 46cc3a007bb13eb4c7c974f1d257908e710404b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5862 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 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/colorama/winterm.py b/venv/lib/python2.7/site-packages/pip/_vendor/colorama/winterm.py deleted file mode 100644 index 0fdb4ec..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/colorama/winterm.py +++ /dev/null @@ -1,169 +0,0 @@ -# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. -from . import win32 - - -# from wincon.h -class WinColor(object): - BLACK = 0 - BLUE = 1 - GREEN = 2 - CYAN = 3 - RED = 4 - MAGENTA = 5 - YELLOW = 6 - GREY = 7 - -# from wincon.h -class WinStyle(object): - NORMAL = 0x00 # dim text, dim background - BRIGHT = 0x08 # bright text, dim background - BRIGHT_BACKGROUND = 0x80 # dim text, bright background - -class WinTerm(object): - - def __init__(self): - self._default = win32.GetConsoleScreenBufferInfo(win32.STDOUT).wAttributes - self.set_attrs(self._default) - self._default_fore = self._fore - self._default_back = self._back - self._default_style = self._style - # In order to emulate LIGHT_EX in windows, we borrow the BRIGHT style. - # So that LIGHT_EX colors and BRIGHT style do not clobber each other, - # we track them separately, since LIGHT_EX is overwritten by Fore/Back - # and BRIGHT is overwritten by Style codes. - self._light = 0 - - def get_attrs(self): - return self._fore + self._back * 16 + (self._style | self._light) - - def set_attrs(self, value): - self._fore = value & 7 - self._back = (value >> 4) & 7 - self._style = value & (WinStyle.BRIGHT | WinStyle.BRIGHT_BACKGROUND) - - def reset_all(self, on_stderr=None): - self.set_attrs(self._default) - self.set_console(attrs=self._default) - self._light = 0 - - def fore(self, fore=None, light=False, on_stderr=False): - if fore is None: - fore = self._default_fore - self._fore = fore - # Emulate LIGHT_EX with BRIGHT Style - if light: - self._light |= WinStyle.BRIGHT - else: - self._light &= ~WinStyle.BRIGHT - self.set_console(on_stderr=on_stderr) - - def back(self, back=None, light=False, on_stderr=False): - if back is None: - back = self._default_back - self._back = back - # Emulate LIGHT_EX with BRIGHT_BACKGROUND Style - if light: - self._light |= WinStyle.BRIGHT_BACKGROUND - else: - self._light &= ~WinStyle.BRIGHT_BACKGROUND - self.set_console(on_stderr=on_stderr) - - def style(self, style=None, on_stderr=False): - if style is None: - style = self._default_style - self._style = style - self.set_console(on_stderr=on_stderr) - - def set_console(self, attrs=None, on_stderr=False): - if attrs is None: - attrs = self.get_attrs() - handle = win32.STDOUT - if on_stderr: - handle = win32.STDERR - win32.SetConsoleTextAttribute(handle, attrs) - - def get_position(self, handle): - position = win32.GetConsoleScreenBufferInfo(handle).dwCursorPosition - # Because Windows coordinates are 0-based, - # and win32.SetConsoleCursorPosition expects 1-based. - position.X += 1 - position.Y += 1 - return position - - def set_cursor_position(self, position=None, on_stderr=False): - if position is None: - # I'm not currently tracking the position, so there is no default. - # position = self.get_position() - return - handle = win32.STDOUT - if on_stderr: - handle = win32.STDERR - win32.SetConsoleCursorPosition(handle, position) - - def cursor_adjust(self, x, y, on_stderr=False): - handle = win32.STDOUT - if on_stderr: - handle = win32.STDERR - position = self.get_position(handle) - adjusted_position = (position.Y + y, position.X + x) - win32.SetConsoleCursorPosition(handle, adjusted_position, adjust=False) - - def erase_screen(self, mode=0, on_stderr=False): - # 0 should clear from the cursor to the end of the screen. - # 1 should clear from the cursor to the beginning of the screen. - # 2 should clear the entire screen, and move cursor to (1,1) - handle = win32.STDOUT - if on_stderr: - handle = win32.STDERR - csbi = win32.GetConsoleScreenBufferInfo(handle) - # get the number of character cells in the current buffer - cells_in_screen = csbi.dwSize.X * csbi.dwSize.Y - # get number of character cells before current cursor position - cells_before_cursor = csbi.dwSize.X * csbi.dwCursorPosition.Y + csbi.dwCursorPosition.X - if mode == 0: - from_coord = csbi.dwCursorPosition - cells_to_erase = cells_in_screen - cells_before_cursor - elif mode == 1: - from_coord = win32.COORD(0, 0) - cells_to_erase = cells_before_cursor - elif mode == 2: - from_coord = win32.COORD(0, 0) - cells_to_erase = cells_in_screen - else: - # invalid mode - return - # fill the entire screen with blanks - win32.FillConsoleOutputCharacter(handle, ' ', cells_to_erase, from_coord) - # now set the buffer's attributes accordingly - win32.FillConsoleOutputAttribute(handle, self.get_attrs(), cells_to_erase, from_coord) - if mode == 2: - # put the cursor where needed - win32.SetConsoleCursorPosition(handle, (1, 1)) - - def erase_line(self, mode=0, on_stderr=False): - # 0 should clear from the cursor to the end of the line. - # 1 should clear from the cursor to the beginning of the line. - # 2 should clear the entire line. - handle = win32.STDOUT - if on_stderr: - handle = win32.STDERR - csbi = win32.GetConsoleScreenBufferInfo(handle) - if mode == 0: - from_coord = csbi.dwCursorPosition - cells_to_erase = csbi.dwSize.X - csbi.dwCursorPosition.X - elif mode == 1: - from_coord = win32.COORD(0, csbi.dwCursorPosition.Y) - cells_to_erase = csbi.dwCursorPosition.X - elif mode == 2: - from_coord = win32.COORD(0, csbi.dwCursorPosition.Y) - cells_to_erase = csbi.dwSize.X - else: - # invalid mode - return - # fill the entire screen with blanks - win32.FillConsoleOutputCharacter(handle, ' ', cells_to_erase, from_coord) - # now set the buffer's attributes accordingly - win32.FillConsoleOutputAttribute(handle, self.get_attrs(), cells_to_erase, from_coord) - - def set_title(self, title): - win32.SetConsoleTitle(title) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/colorama/winterm.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/colorama/winterm.pyc deleted file mode 100644 index 41ab840d7860d17c0d30ba68f32a072f9733f1aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6935 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 X()N4yzjQw5`pI?8RQbxpmCC;Xn{=c2 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/__init__.py deleted file mode 100644 index a786b4d..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/__init__.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2012-2017 Vinay Sajip. -# Licensed to the Python Software Foundation under a contributor agreement. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -import logging - -__version__ = '0.2.8' - -class DistlibException(Exception): - pass - -try: - from logging import NullHandler -except ImportError: # pragma: no cover - class NullHandler(logging.Handler): - def handle(self, record): pass - def emit(self, record): pass - def createLock(self): self.lock = None - -logger = logging.getLogger(__name__) -logger.addHandler(NullHandler()) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/__init__.pyc deleted file mode 100644 index cb543f8af1a8a3e2c0cc9ff4ea78ad33c855b182..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1623 zcmd5+-*3|}5I!eqyB5mNiZ`Bki6*V-2C9aH5CSHFG%A!K0g+IY#cr0>b%O1ccH#w% zNB&#>0Jw9j7Ks<$O4@VIXP@(ZcfRv~c00S@ZhXpN^)&GP48{Dwf#aWn1V~WvAYs6L z5FU(C3E(@x6~M>DhegkAZP3<f07(Gsz1oF9G+@#JeFls%-UI<~-gM5bwQ~T9!3SDt zf!Kj721y%48_qi*0y-Zp3_+ZPI|!)!h0n+k$U*<0e`s%^_OdiqmZwMaT-3I#)S3&! z#pfu7T=5f#KRyXjhtR{pk~vLPHWg`VJ8m+q_=Uvjau=GwX{JIgs&zTbtcYfrj>eVb zLYwGv9xWc~Q}t!CKm4o)L;Yx&ADa1NeyIoe6m|42s>^z>RK{jf?%Dk}Mf#RZPSTlB zywVY0a){EjRHaSRe!Yn4>(@{Wfo-yo=vXq0E~I>wDK3SMeVqSI_yJm%gfWGfr^KT~ zlHyY$NeL(x&YO-Wq4Qs$m;eV37;>_V{s<T?7$L{DiHa6^rTHdM+lY|^a^^yDhp?eQ z{?B}3;uF(l+A<5mA*Q9hi|-`|iaZH%aXIOtf;st$Hx`R;lN{P$$$wNS;S^cr6PGzh zZ_CW6s&Xx`YK{?B4`+^FNI{Q@U`zyJx=(S726EV7cG@;BmaD7Vh{X`JCTrs_q}sED zQdUJ#s=^gxiY2TKwjJytZCqQoAy>cd9JlZFw63&0(i%rPV^zS;rx5lSkHm7Okhn`t ppAg!0rHu2{=Kmltu4z75w#lc&!%z#p?lrx8zR!BB%kDRBvfp-ne5U{a diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/__init__.py deleted file mode 100644 index f7dbf4c..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -"""Modules copied from Python 3 standard libraries, for internal use only. - -Individual classes and functions are found in d2._backport.misc. Intended -usage is to always import things missing from 3.1 from that module: the -built-in/stdlib objects will be used if found. -""" diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/__init__.pyc deleted file mode 100644 index f2c73a8af797c48dac59515ab3162c817e1034c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 498 zcmYLF!A>JF3>{c$L4%fW@UcQLp<7h#B80edV1)!HBot+m%+%X78DdY{;kMt*53GkG zh~$@N$9A6m?d?Z-^6&WB79VF%?i(>G1zb@)3GNjSll?JvB(HbL^}!R^)S-9K<g|kO zffp&l42Vs1COZgNXOq#>DKseqM)o<H06lp~F$`5%-bROObiG7vFhtT*ilOPFWlT}L z?4`Ju7)EeED_tAA>{8}xg=8y$Tj?5|cV$ne^?(GNz=Vw%2yiuK0xvMO1X4gkc4}wU zbVqn$7*_A|TuP=d>mCE2VN}FUCV*7`^_B@X7y{IOR4-zhovNz*Ga0wV2Lf8VWVN0M zExv#TaaEUbZP=@|$*M`g`Aq6{tA<&w<7PRXzr^!-zL?uzwEgW~^SPY1Q;({{PPE8M uLpbB<U90cM(7Wli44$%bNGw9t=W3MJ7?HKEx`7Yn_p9A}*WZPcSn(g(f0_FL diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/misc.py b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/misc.py deleted file mode 100644 index cfb318d..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/misc.py +++ /dev/null @@ -1,41 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2012 The Python Software Foundation. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -"""Backports for individual classes and functions.""" - -import os -import sys - -__all__ = ['cache_from_source', 'callable', 'fsencode'] - - -try: - from imp import cache_from_source -except ImportError: - def cache_from_source(py_file, debug=__debug__): - ext = debug and 'c' or 'o' - return py_file + ext - - -try: - callable = callable -except NameError: - from collections import Callable - - def callable(obj): - return isinstance(obj, Callable) - - -try: - fsencode = os.fsencode -except AttributeError: - def fsencode(filename): - if isinstance(filename, bytes): - return filename - elif isinstance(filename, str): - return filename.encode(sys.getfilesystemencoding()) - else: - raise TypeError("expect bytes or str, not %s" % - type(filename).__name__) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/misc.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/misc.pyc deleted file mode 100644 index c57e538b4a5baec7d0cfd598308542e9154bcccb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1616 zcmd5+?`ji45TCtE(lkw4wN;@a9D)#v?X{>yK}0Qn@Pk3pLghftyWLH^^!~ZKiMdig zX!{O6k6(NtA3$gJitQWNgPEP3o!Q;_&2P{B-Ro?8TmHb|{A=R)0!9BqB>)1{41@zI zg8+@%b|7#-xF8xJnlN@DaG_eWt1U<ykToG_0z1s_LPNITr~~RFFvjEphy^&qt(uTC zcwcouwjpT4VZMQpi#GBHMbbfSNIQ@%L9hf&EW#Pyrd_A?Kr)zgA?RY}I%f84=1-g1 zv5{RHi5K7RFHt={s#g&|Dhp+_H!75u<RY0RVj86$Pb00R_M%*PqiN1fQsjCo`GeoU zT*piv@lP@wsUiz?F;!few)LiI6sPrMq-D+vA^QwhhA6-tR4xjQdnkGx)d>UDC8)|3 z!u6{IC+KwG_I{sY2Zr*w)kPmoux_(}R#}Ck1dpR82^mkvhBD;b)NyEoo}%(gmCPa| z{aK{^QIQI%w0}JJtA{GizZ~uCe$Kad)uUbhM9-g!W3`RnxbzSFGATEcT$?COH_gu5 zarlm0R>GOgMWK9=Xp<(fAI9fk`dOm+R$1AS2`k;8i?AEaB4L5r!wm^2PPLKHy)7a= zGz`{{n!zb`i<Sp{g3NSKCE8vn=W<Ap*LzZW5l^l}*>vAKD4MPe>|cq5f-RANxm==J zrE>SrT@F>P9+PY0f@#2{38w(33?o`Z6YM;$;e67DTR42jmx1XPp@F88<-C;KcyVQr z!bogw)B`UsjCWu67jb<^%96&0Skhn&ZjZT^v$d<z<|ewv(h$ouPGx4-lYDGwkAtd| zua&|VM8z4L+3tp69%V8NFZxaS<hv3LqQ2Zi(Op!)R#*dN)oHQ*GS2P83PVxwFf<fe z=;0+l5*Pi%w<Ieq#SQ&V-emM2sj(nra07aeVK^i@Sg;0Ie;q&xyhxG$_P=6zJfx!x z9rV%|mBdq12VWp&t^fC&ZD*flg_x%DIWa|hs9H{!b)6O0WoxX*t~FiOq0#9zTpWAs EFC|%fq5uE@ diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/shutil.py b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/shutil.py deleted file mode 100644 index 159e49e..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/shutil.py +++ /dev/null @@ -1,761 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2012 The Python Software Foundation. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -"""Utility functions for copying and archiving files and directory trees. - -XXX The functions here don't copy the resource fork or other metadata on Mac. - -""" - -import os -import sys -import stat -from os.path import abspath -import fnmatch -import collections -import errno -from . import tarfile - -try: - import bz2 - _BZ2_SUPPORTED = True -except ImportError: - _BZ2_SUPPORTED = False - -try: - from pwd import getpwnam -except ImportError: - getpwnam = None - -try: - from grp import getgrnam -except ImportError: - getgrnam = None - -__all__ = ["copyfileobj", "copyfile", "copymode", "copystat", "copy", "copy2", - "copytree", "move", "rmtree", "Error", "SpecialFileError", - "ExecError", "make_archive", "get_archive_formats", - "register_archive_format", "unregister_archive_format", - "get_unpack_formats", "register_unpack_format", - "unregister_unpack_format", "unpack_archive", "ignore_patterns"] - -class Error(EnvironmentError): - pass - -class SpecialFileError(EnvironmentError): - """Raised when trying to do a kind of operation (e.g. copying) which is - not supported on a special file (e.g. a named pipe)""" - -class ExecError(EnvironmentError): - """Raised when a command could not be executed""" - -class ReadError(EnvironmentError): - """Raised when an archive cannot be read""" - -class RegistryError(Exception): - """Raised when a registry operation with the archiving - and unpacking registries fails""" - - -try: - WindowsError -except NameError: - WindowsError = None - -def copyfileobj(fsrc, fdst, length=16*1024): - """copy data from file-like object fsrc to file-like object fdst""" - while 1: - buf = fsrc.read(length) - if not buf: - break - fdst.write(buf) - -def _samefile(src, dst): - # Macintosh, Unix. - if hasattr(os.path, 'samefile'): - try: - return os.path.samefile(src, dst) - except OSError: - return False - - # All other platforms: check for same pathname. - return (os.path.normcase(os.path.abspath(src)) == - os.path.normcase(os.path.abspath(dst))) - -def copyfile(src, dst): - """Copy data from src to dst""" - if _samefile(src, dst): - raise Error("`%s` and `%s` are the same file" % (src, dst)) - - for fn in [src, dst]: - try: - st = os.stat(fn) - except OSError: - # File most likely does not exist - pass - else: - # XXX What about other special files? (sockets, devices...) - if stat.S_ISFIFO(st.st_mode): - raise SpecialFileError("`%s` is a named pipe" % fn) - - with open(src, 'rb') as fsrc: - with open(dst, 'wb') as fdst: - copyfileobj(fsrc, fdst) - -def copymode(src, dst): - """Copy mode bits from src to dst""" - if hasattr(os, 'chmod'): - st = os.stat(src) - mode = stat.S_IMODE(st.st_mode) - os.chmod(dst, mode) - -def copystat(src, dst): - """Copy all stat info (mode bits, atime, mtime, flags) from src to dst""" - st = os.stat(src) - mode = stat.S_IMODE(st.st_mode) - if hasattr(os, 'utime'): - os.utime(dst, (st.st_atime, st.st_mtime)) - if hasattr(os, 'chmod'): - os.chmod(dst, mode) - if hasattr(os, 'chflags') and hasattr(st, 'st_flags'): - try: - os.chflags(dst, st.st_flags) - except OSError as why: - if (not hasattr(errno, 'EOPNOTSUPP') or - why.errno != errno.EOPNOTSUPP): - raise - -def copy(src, dst): - """Copy data and mode bits ("cp src dst"). - - The destination may be a directory. - - """ - if os.path.isdir(dst): - dst = os.path.join(dst, os.path.basename(src)) - copyfile(src, dst) - copymode(src, dst) - -def copy2(src, dst): - """Copy data and all stat info ("cp -p src dst"). - - The destination may be a directory. - - """ - if os.path.isdir(dst): - dst = os.path.join(dst, os.path.basename(src)) - copyfile(src, dst) - copystat(src, dst) - -def ignore_patterns(*patterns): - """Function that can be used as copytree() ignore parameter. - - Patterns is a sequence of glob-style patterns - that are used to exclude files""" - def _ignore_patterns(path, names): - ignored_names = [] - for pattern in patterns: - ignored_names.extend(fnmatch.filter(names, pattern)) - return set(ignored_names) - return _ignore_patterns - -def copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2, - ignore_dangling_symlinks=False): - """Recursively copy a directory tree. - - The destination directory must not already exist. - If exception(s) occur, an Error is raised with a list of reasons. - - If the optional symlinks flag is true, symbolic links in the - source tree result in symbolic links in the destination tree; if - it is false, the contents of the files pointed to by symbolic - links are copied. If the file pointed by the symlink doesn't - exist, an exception will be added in the list of errors raised in - an Error exception at the end of the copy process. - - You can set the optional ignore_dangling_symlinks flag to true if you - want to silence this exception. Notice that this has no effect on - platforms that don't support os.symlink. - - The optional ignore argument is a callable. If given, it - is called with the `src` parameter, which is the directory - being visited by copytree(), and `names` which is the list of - `src` contents, as returned by os.listdir(): - - callable(src, names) -> ignored_names - - Since copytree() is called recursively, the callable will be - called once for each directory that is copied. It returns a - list of names relative to the `src` directory that should - not be copied. - - The optional copy_function argument is a callable that will be used - to copy each file. It will be called with the source path and the - destination path as arguments. By default, copy2() is used, but any - function that supports the same signature (like copy()) can be used. - - """ - names = os.listdir(src) - if ignore is not None: - ignored_names = ignore(src, names) - else: - ignored_names = set() - - os.makedirs(dst) - errors = [] - for name in names: - if name in ignored_names: - continue - srcname = os.path.join(src, name) - dstname = os.path.join(dst, name) - try: - if os.path.islink(srcname): - linkto = os.readlink(srcname) - if symlinks: - os.symlink(linkto, dstname) - else: - # ignore dangling symlink if the flag is on - if not os.path.exists(linkto) and ignore_dangling_symlinks: - continue - # otherwise let the copy occurs. copy2 will raise an error - copy_function(srcname, dstname) - elif os.path.isdir(srcname): - copytree(srcname, dstname, symlinks, ignore, copy_function) - else: - # Will raise a SpecialFileError for unsupported file types - copy_function(srcname, dstname) - # catch the Error from the recursive copytree so that we can - # continue with other files - except Error as err: - errors.extend(err.args[0]) - except EnvironmentError as why: - errors.append((srcname, dstname, str(why))) - try: - copystat(src, dst) - except OSError as why: - if WindowsError is not None and isinstance(why, WindowsError): - # Copying file access times may fail on Windows - pass - else: - errors.extend((src, dst, str(why))) - if errors: - raise Error(errors) - -def rmtree(path, ignore_errors=False, onerror=None): - """Recursively delete a directory tree. - - If ignore_errors is set, errors are ignored; otherwise, if onerror - is set, it is called to handle the error with arguments (func, - path, exc_info) where func is os.listdir, os.remove, or os.rmdir; - path is the argument to that function that caused it to fail; and - exc_info is a tuple returned by sys.exc_info(). If ignore_errors - is false and onerror is None, an exception is raised. - - """ - if ignore_errors: - def onerror(*args): - pass - elif onerror is None: - def onerror(*args): - raise - try: - if os.path.islink(path): - # symlinks to directories are forbidden, see bug #1669 - raise OSError("Cannot call rmtree on a symbolic link") - except OSError: - onerror(os.path.islink, path, sys.exc_info()) - # can't continue even if onerror hook returns - return - names = [] - try: - names = os.listdir(path) - except os.error: - onerror(os.listdir, path, sys.exc_info()) - for name in names: - fullname = os.path.join(path, name) - try: - mode = os.lstat(fullname).st_mode - except os.error: - mode = 0 - if stat.S_ISDIR(mode): - rmtree(fullname, ignore_errors, onerror) - else: - try: - os.remove(fullname) - except os.error: - onerror(os.remove, fullname, sys.exc_info()) - try: - os.rmdir(path) - except os.error: - onerror(os.rmdir, path, sys.exc_info()) - - -def _basename(path): - # A basename() variant which first strips the trailing slash, if present. - # Thus we always get the last component of the path, even for directories. - return os.path.basename(path.rstrip(os.path.sep)) - -def move(src, dst): - """Recursively move a file or directory to another location. This is - similar to the Unix "mv" command. - - If the destination is a directory or a symlink to a directory, the source - is moved inside the directory. The destination path must not already - exist. - - If the destination already exists but is not a directory, it may be - overwritten depending on os.rename() semantics. - - If the destination is on our current filesystem, then rename() is used. - Otherwise, src is copied to the destination and then removed. - A lot more could be done here... A look at a mv.c shows a lot of - the issues this implementation glosses over. - - """ - real_dst = dst - if os.path.isdir(dst): - if _samefile(src, dst): - # We might be on a case insensitive filesystem, - # perform the rename anyway. - os.rename(src, dst) - return - - real_dst = os.path.join(dst, _basename(src)) - if os.path.exists(real_dst): - raise Error("Destination path '%s' already exists" % real_dst) - try: - os.rename(src, real_dst) - except OSError: - if os.path.isdir(src): - if _destinsrc(src, dst): - raise Error("Cannot move a directory '%s' into itself '%s'." % (src, dst)) - copytree(src, real_dst, symlinks=True) - rmtree(src) - else: - copy2(src, real_dst) - os.unlink(src) - -def _destinsrc(src, dst): - src = abspath(src) - dst = abspath(dst) - if not src.endswith(os.path.sep): - src += os.path.sep - if not dst.endswith(os.path.sep): - dst += os.path.sep - return dst.startswith(src) - -def _get_gid(name): - """Returns a gid, given a group name.""" - if getgrnam is None or name is None: - return None - try: - result = getgrnam(name) - except KeyError: - result = None - if result is not None: - return result[2] - return None - -def _get_uid(name): - """Returns an uid, given a user name.""" - if getpwnam is None or name is None: - return None - try: - result = getpwnam(name) - except KeyError: - result = None - if result is not None: - return result[2] - return None - -def _make_tarball(base_name, base_dir, compress="gzip", verbose=0, dry_run=0, - owner=None, group=None, logger=None): - """Create a (possibly compressed) tar file from all the files under - 'base_dir'. - - 'compress' must be "gzip" (the default), "bzip2", or None. - - 'owner' and 'group' can be used to define an owner and a group for the - archive that is being built. If not provided, the current owner and group - will be used. - - The output tar file will be named 'base_name' + ".tar", possibly plus - the appropriate compression extension (".gz", or ".bz2"). - - Returns the output filename. - """ - tar_compression = {'gzip': 'gz', None: ''} - compress_ext = {'gzip': '.gz'} - - if _BZ2_SUPPORTED: - tar_compression['bzip2'] = 'bz2' - compress_ext['bzip2'] = '.bz2' - - # flags for compression program, each element of list will be an argument - if compress is not None and compress not in compress_ext: - raise ValueError("bad value for 'compress', or compression format not " - "supported : {0}".format(compress)) - - archive_name = base_name + '.tar' + compress_ext.get(compress, '') - archive_dir = os.path.dirname(archive_name) - - if not os.path.exists(archive_dir): - if logger is not None: - logger.info("creating %s", archive_dir) - if not dry_run: - os.makedirs(archive_dir) - - # creating the tarball - if logger is not None: - logger.info('Creating tar archive') - - uid = _get_uid(owner) - gid = _get_gid(group) - - def _set_uid_gid(tarinfo): - if gid is not None: - tarinfo.gid = gid - tarinfo.gname = group - if uid is not None: - tarinfo.uid = uid - tarinfo.uname = owner - return tarinfo - - if not dry_run: - tar = tarfile.open(archive_name, 'w|%s' % tar_compression[compress]) - try: - tar.add(base_dir, filter=_set_uid_gid) - finally: - tar.close() - - return archive_name - -def _call_external_zip(base_dir, zip_filename, verbose=False, dry_run=False): - # XXX see if we want to keep an external call here - if verbose: - zipoptions = "-r" - else: - zipoptions = "-rq" - from distutils.errors import DistutilsExecError - from distutils.spawn import spawn - try: - spawn(["zip", zipoptions, zip_filename, base_dir], dry_run=dry_run) - except DistutilsExecError: - # XXX really should distinguish between "couldn't find - # external 'zip' command" and "zip failed". - raise ExecError("unable to create zip file '%s': " - "could neither import the 'zipfile' module nor " - "find a standalone zip utility") % zip_filename - -def _make_zipfile(base_name, base_dir, verbose=0, dry_run=0, logger=None): - """Create a zip file from all the files under 'base_dir'. - - The output zip file will be named 'base_name' + ".zip". Uses either the - "zipfile" Python module (if available) or the InfoZIP "zip" utility - (if installed and found on the default search path). If neither tool is - available, raises ExecError. Returns the name of the output zip - file. - """ - zip_filename = base_name + ".zip" - archive_dir = os.path.dirname(base_name) - - if not os.path.exists(archive_dir): - if logger is not None: - logger.info("creating %s", archive_dir) - if not dry_run: - os.makedirs(archive_dir) - - # If zipfile module is not available, try spawning an external 'zip' - # command. - try: - import zipfile - except ImportError: - zipfile = None - - if zipfile is None: - _call_external_zip(base_dir, zip_filename, verbose, dry_run) - else: - if logger is not None: - logger.info("creating '%s' and adding '%s' to it", - zip_filename, base_dir) - - if not dry_run: - zip = zipfile.ZipFile(zip_filename, "w", - compression=zipfile.ZIP_DEFLATED) - - for dirpath, dirnames, filenames in os.walk(base_dir): - for name in filenames: - path = os.path.normpath(os.path.join(dirpath, name)) - if os.path.isfile(path): - zip.write(path, path) - if logger is not None: - logger.info("adding '%s'", path) - zip.close() - - return zip_filename - -_ARCHIVE_FORMATS = { - 'gztar': (_make_tarball, [('compress', 'gzip')], "gzip'ed tar-file"), - 'bztar': (_make_tarball, [('compress', 'bzip2')], "bzip2'ed tar-file"), - 'tar': (_make_tarball, [('compress', None)], "uncompressed tar file"), - 'zip': (_make_zipfile, [], "ZIP file"), - } - -if _BZ2_SUPPORTED: - _ARCHIVE_FORMATS['bztar'] = (_make_tarball, [('compress', 'bzip2')], - "bzip2'ed tar-file") - -def get_archive_formats(): - """Returns a list of supported formats for archiving and unarchiving. - - Each element of the returned sequence is a tuple (name, description) - """ - formats = [(name, registry[2]) for name, registry in - _ARCHIVE_FORMATS.items()] - formats.sort() - return formats - -def register_archive_format(name, function, extra_args=None, description=''): - """Registers an archive format. - - name is the name of the format. function is the callable that will be - used to create archives. If provided, extra_args is a sequence of - (name, value) tuples that will be passed as arguments to the callable. - description can be provided to describe the format, and will be returned - by the get_archive_formats() function. - """ - if extra_args is None: - extra_args = [] - if not isinstance(function, collections.Callable): - raise TypeError('The %s object is not callable' % function) - if not isinstance(extra_args, (tuple, list)): - raise TypeError('extra_args needs to be a sequence') - for element in extra_args: - if not isinstance(element, (tuple, list)) or len(element) !=2: - raise TypeError('extra_args elements are : (arg_name, value)') - - _ARCHIVE_FORMATS[name] = (function, extra_args, description) - -def unregister_archive_format(name): - del _ARCHIVE_FORMATS[name] - -def make_archive(base_name, format, root_dir=None, base_dir=None, verbose=0, - dry_run=0, owner=None, group=None, logger=None): - """Create an archive file (eg. zip or tar). - - 'base_name' is the name of the file to create, minus any format-specific - extension; 'format' is the archive format: one of "zip", "tar", "bztar" - or "gztar". - - 'root_dir' is a directory that will be the root directory of the - archive; ie. we typically chdir into 'root_dir' before creating the - archive. 'base_dir' is the directory where we start archiving from; - ie. 'base_dir' will be the common prefix of all files and - directories in the archive. 'root_dir' and 'base_dir' both default - to the current directory. Returns the name of the archive file. - - 'owner' and 'group' are used when creating a tar archive. By default, - uses the current owner and group. - """ - save_cwd = os.getcwd() - if root_dir is not None: - if logger is not None: - logger.debug("changing into '%s'", root_dir) - base_name = os.path.abspath(base_name) - if not dry_run: - os.chdir(root_dir) - - if base_dir is None: - base_dir = os.curdir - - kwargs = {'dry_run': dry_run, 'logger': logger} - - try: - format_info = _ARCHIVE_FORMATS[format] - except KeyError: - raise ValueError("unknown archive format '%s'" % format) - - func = format_info[0] - for arg, val in format_info[1]: - kwargs[arg] = val - - if format != 'zip': - kwargs['owner'] = owner - kwargs['group'] = group - - try: - filename = func(base_name, base_dir, **kwargs) - finally: - if root_dir is not None: - if logger is not None: - logger.debug("changing back to '%s'", save_cwd) - os.chdir(save_cwd) - - return filename - - -def get_unpack_formats(): - """Returns a list of supported formats for unpacking. - - Each element of the returned sequence is a tuple - (name, extensions, description) - """ - formats = [(name, info[0], info[3]) for name, info in - _UNPACK_FORMATS.items()] - formats.sort() - return formats - -def _check_unpack_options(extensions, function, extra_args): - """Checks what gets registered as an unpacker.""" - # first make sure no other unpacker is registered for this extension - existing_extensions = {} - for name, info in _UNPACK_FORMATS.items(): - for ext in info[0]: - existing_extensions[ext] = name - - for extension in extensions: - if extension in existing_extensions: - msg = '%s is already registered for "%s"' - raise RegistryError(msg % (extension, - existing_extensions[extension])) - - if not isinstance(function, collections.Callable): - raise TypeError('The registered function must be a callable') - - -def register_unpack_format(name, extensions, function, extra_args=None, - description=''): - """Registers an unpack format. - - `name` is the name of the format. `extensions` is a list of extensions - corresponding to the format. - - `function` is the callable that will be - used to unpack archives. The callable will receive archives to unpack. - If it's unable to handle an archive, it needs to raise a ReadError - exception. - - If provided, `extra_args` is a sequence of - (name, value) tuples that will be passed as arguments to the callable. - description can be provided to describe the format, and will be returned - by the get_unpack_formats() function. - """ - if extra_args is None: - extra_args = [] - _check_unpack_options(extensions, function, extra_args) - _UNPACK_FORMATS[name] = extensions, function, extra_args, description - -def unregister_unpack_format(name): - """Removes the pack format from the registry.""" - del _UNPACK_FORMATS[name] - -def _ensure_directory(path): - """Ensure that the parent directory of `path` exists""" - dirname = os.path.dirname(path) - if not os.path.isdir(dirname): - os.makedirs(dirname) - -def _unpack_zipfile(filename, extract_dir): - """Unpack zip `filename` to `extract_dir` - """ - try: - import zipfile - except ImportError: - raise ReadError('zlib not supported, cannot unpack this archive.') - - if not zipfile.is_zipfile(filename): - raise ReadError("%s is not a zip file" % filename) - - zip = zipfile.ZipFile(filename) - try: - for info in zip.infolist(): - name = info.filename - - # don't extract absolute paths or ones with .. in them - if name.startswith('/') or '..' in name: - continue - - target = os.path.join(extract_dir, *name.split('/')) - if not target: - continue - - _ensure_directory(target) - if not name.endswith('/'): - # file - data = zip.read(info.filename) - f = open(target, 'wb') - try: - f.write(data) - finally: - f.close() - del data - finally: - zip.close() - -def _unpack_tarfile(filename, extract_dir): - """Unpack tar/tar.gz/tar.bz2 `filename` to `extract_dir` - """ - try: - tarobj = tarfile.open(filename) - except tarfile.TarError: - raise ReadError( - "%s is not a compressed or uncompressed tar file" % filename) - try: - tarobj.extractall(extract_dir) - finally: - tarobj.close() - -_UNPACK_FORMATS = { - 'gztar': (['.tar.gz', '.tgz'], _unpack_tarfile, [], "gzip'ed tar-file"), - 'tar': (['.tar'], _unpack_tarfile, [], "uncompressed tar file"), - 'zip': (['.zip'], _unpack_zipfile, [], "ZIP file") - } - -if _BZ2_SUPPORTED: - _UNPACK_FORMATS['bztar'] = (['.bz2'], _unpack_tarfile, [], - "bzip2'ed tar-file") - -def _find_unpack_format(filename): - for name, info in _UNPACK_FORMATS.items(): - for extension in info[0]: - if filename.endswith(extension): - return name - return None - -def unpack_archive(filename, extract_dir=None, format=None): - """Unpack an archive. - - `filename` is the name of the archive. - - `extract_dir` is the name of the target directory, where the archive - is unpacked. If not provided, the current working directory is used. - - `format` is the archive format: one of "zip", "tar", or "gztar". Or any - other registered format. If not provided, unpack_archive will use the - filename extension and see if an unpacker was registered for that - extension. - - In case none is found, a ValueError is raised. - """ - if extract_dir is None: - extract_dir = os.getcwd() - - if format is not None: - try: - format_info = _UNPACK_FORMATS[format] - except KeyError: - raise ValueError("Unknown unpack format '{0}'".format(format)) - - func = format_info[1] - func(filename, extract_dir, **dict(format_info[2])) - else: - # we need to look at the registered unpackers supported extensions - format = _find_unpack_format(filename) - if format is None: - raise ReadError("Unknown archive format '{0}'".format(filename)) - - func = _UNPACK_FORMATS[format][1] - kwargs = dict(_UNPACK_FORMATS[format][2]) - func(filename, extract_dir, **kwargs) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/shutil.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/shutil.pyc deleted file mode 100644 index 6475a9db984418654ceeb9f82540cfa3c76b9a56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28427 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 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg deleted file mode 100644 index 1746bd0..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg +++ /dev/null @@ -1,84 +0,0 @@ -[posix_prefix] -# Configuration directories. Some of these come straight out of the -# configure script. They are for implementing the other variables, not to -# be used directly in [resource_locations]. -confdir = /etc -datadir = /usr/share -libdir = /usr/lib -statedir = /var -# User resource directory -local = ~/.local/{distribution.name} - -stdlib = {base}/lib/python{py_version_short} -platstdlib = {platbase}/lib/python{py_version_short} -purelib = {base}/lib/python{py_version_short}/site-packages -platlib = {platbase}/lib/python{py_version_short}/site-packages -include = {base}/include/python{py_version_short}{abiflags} -platinclude = {platbase}/include/python{py_version_short}{abiflags} -data = {base} - -[posix_home] -stdlib = {base}/lib/python -platstdlib = {base}/lib/python -purelib = {base}/lib/python -platlib = {base}/lib/python -include = {base}/include/python -platinclude = {base}/include/python -scripts = {base}/bin -data = {base} - -[nt] -stdlib = {base}/Lib -platstdlib = {base}/Lib -purelib = {base}/Lib/site-packages -platlib = {base}/Lib/site-packages -include = {base}/Include -platinclude = {base}/Include -scripts = {base}/Scripts -data = {base} - -[os2] -stdlib = {base}/Lib -platstdlib = {base}/Lib -purelib = {base}/Lib/site-packages -platlib = {base}/Lib/site-packages -include = {base}/Include -platinclude = {base}/Include -scripts = {base}/Scripts -data = {base} - -[os2_home] -stdlib = {userbase}/lib/python{py_version_short} -platstdlib = {userbase}/lib/python{py_version_short} -purelib = {userbase}/lib/python{py_version_short}/site-packages -platlib = {userbase}/lib/python{py_version_short}/site-packages -include = {userbase}/include/python{py_version_short} -scripts = {userbase}/bin -data = {userbase} - -[nt_user] -stdlib = {userbase}/Python{py_version_nodot} -platstdlib = {userbase}/Python{py_version_nodot} -purelib = {userbase}/Python{py_version_nodot}/site-packages -platlib = {userbase}/Python{py_version_nodot}/site-packages -include = {userbase}/Python{py_version_nodot}/Include -scripts = {userbase}/Scripts -data = {userbase} - -[posix_user] -stdlib = {userbase}/lib/python{py_version_short} -platstdlib = {userbase}/lib/python{py_version_short} -purelib = {userbase}/lib/python{py_version_short}/site-packages -platlib = {userbase}/lib/python{py_version_short}/site-packages -include = {userbase}/include/python{py_version_short} -scripts = {userbase}/bin -data = {userbase} - -[osx_framework_user] -stdlib = {userbase}/lib/python -platstdlib = {userbase}/lib/python -purelib = {userbase}/lib/python/site-packages -platlib = {userbase}/lib/python/site-packages -include = {userbase}/include -scripts = {userbase}/bin -data = {userbase} diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.py b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.py deleted file mode 100644 index 1df3aba..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.py +++ /dev/null @@ -1,788 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2012 The Python Software Foundation. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -"""Access to Python's configuration information.""" - -import codecs -import os -import re -import sys -from os.path import pardir, realpath -try: - import configparser -except ImportError: - import ConfigParser as configparser - - -__all__ = [ - 'get_config_h_filename', - 'get_config_var', - 'get_config_vars', - 'get_makefile_filename', - 'get_path', - 'get_path_names', - 'get_paths', - 'get_platform', - 'get_python_version', - 'get_scheme_names', - 'parse_config_h', -] - - -def _safe_realpath(path): - try: - return realpath(path) - except OSError: - return path - - -if sys.executable: - _PROJECT_BASE = os.path.dirname(_safe_realpath(sys.executable)) -else: - # sys.executable can be empty if argv[0] has been changed and Python is - # unable to retrieve the real program name - _PROJECT_BASE = _safe_realpath(os.getcwd()) - -if os.name == "nt" and "pcbuild" in _PROJECT_BASE[-8:].lower(): - _PROJECT_BASE = _safe_realpath(os.path.join(_PROJECT_BASE, pardir)) -# PC/VS7.1 -if os.name == "nt" and "\\pc\\v" in _PROJECT_BASE[-10:].lower(): - _PROJECT_BASE = _safe_realpath(os.path.join(_PROJECT_BASE, pardir, pardir)) -# PC/AMD64 -if os.name == "nt" and "\\pcbuild\\amd64" in _PROJECT_BASE[-14:].lower(): - _PROJECT_BASE = _safe_realpath(os.path.join(_PROJECT_BASE, pardir, pardir)) - - -def is_python_build(): - for fn in ("Setup.dist", "Setup.local"): - if os.path.isfile(os.path.join(_PROJECT_BASE, "Modules", fn)): - return True - return False - -_PYTHON_BUILD = is_python_build() - -_cfg_read = False - -def _ensure_cfg_read(): - global _cfg_read - if not _cfg_read: - from ..resources import finder - backport_package = __name__.rsplit('.', 1)[0] - _finder = finder(backport_package) - _cfgfile = _finder.find('sysconfig.cfg') - assert _cfgfile, 'sysconfig.cfg exists' - with _cfgfile.as_stream() as s: - _SCHEMES.readfp(s) - if _PYTHON_BUILD: - for scheme in ('posix_prefix', 'posix_home'): - _SCHEMES.set(scheme, 'include', '{srcdir}/Include') - _SCHEMES.set(scheme, 'platinclude', '{projectbase}/.') - - _cfg_read = True - - -_SCHEMES = configparser.RawConfigParser() -_VAR_REPL = re.compile(r'\{([^{]*?)\}') - -def _expand_globals(config): - _ensure_cfg_read() - if config.has_section('globals'): - globals = config.items('globals') - else: - globals = tuple() - - sections = config.sections() - for section in sections: - if section == 'globals': - continue - for option, value in globals: - if config.has_option(section, option): - continue - config.set(section, option, value) - config.remove_section('globals') - - # now expanding local variables defined in the cfg file - # - for section in config.sections(): - variables = dict(config.items(section)) - - def _replacer(matchobj): - name = matchobj.group(1) - if name in variables: - return variables[name] - return matchobj.group(0) - - for option, value in config.items(section): - config.set(section, option, _VAR_REPL.sub(_replacer, value)) - -#_expand_globals(_SCHEMES) - - # FIXME don't rely on sys.version here, its format is an implementation detail - # of CPython, use sys.version_info or sys.hexversion -_PY_VERSION = sys.version.split()[0] -_PY_VERSION_SHORT = sys.version[:3] -_PY_VERSION_SHORT_NO_DOT = _PY_VERSION[0] + _PY_VERSION[2] -_PREFIX = os.path.normpath(sys.prefix) -_EXEC_PREFIX = os.path.normpath(sys.exec_prefix) -_CONFIG_VARS = None -_USER_BASE = None - - -def _subst_vars(path, local_vars): - """In the string `path`, replace tokens like {some.thing} with the - corresponding value from the map `local_vars`. - - If there is no corresponding value, leave the token unchanged. - """ - def _replacer(matchobj): - name = matchobj.group(1) - if name in local_vars: - return local_vars[name] - elif name in os.environ: - return os.environ[name] - return matchobj.group(0) - return _VAR_REPL.sub(_replacer, path) - - -def _extend_dict(target_dict, other_dict): - target_keys = target_dict.keys() - for key, value in other_dict.items(): - if key in target_keys: - continue - target_dict[key] = value - - -def _expand_vars(scheme, vars): - res = {} - if vars is None: - vars = {} - _extend_dict(vars, get_config_vars()) - - for key, value in _SCHEMES.items(scheme): - if os.name in ('posix', 'nt'): - value = os.path.expanduser(value) - res[key] = os.path.normpath(_subst_vars(value, vars)) - return res - - -def format_value(value, vars): - def _replacer(matchobj): - name = matchobj.group(1) - if name in vars: - return vars[name] - return matchobj.group(0) - return _VAR_REPL.sub(_replacer, value) - - -def _get_default_scheme(): - if os.name == 'posix': - # the default scheme for posix is posix_prefix - return 'posix_prefix' - return os.name - - -def _getuserbase(): - env_base = os.environ.get("PYTHONUSERBASE", None) - - def joinuser(*args): - return os.path.expanduser(os.path.join(*args)) - - # what about 'os2emx', 'riscos' ? - if os.name == "nt": - base = os.environ.get("APPDATA") or "~" - if env_base: - return env_base - else: - return joinuser(base, "Python") - - if sys.platform == "darwin": - framework = get_config_var("PYTHONFRAMEWORK") - if framework: - if env_base: - return env_base - else: - return joinuser("~", "Library", framework, "%d.%d" % - sys.version_info[:2]) - - if env_base: - return env_base - else: - return joinuser("~", ".local") - - -def _parse_makefile(filename, vars=None): - """Parse a Makefile-style file. - - A dictionary containing name/value pairs is returned. If an - optional dictionary is passed in as the second argument, it is - used instead of a new dictionary. - """ - # Regexes needed for parsing Makefile (and similar syntaxes, - # like old-style Setup files). - _variable_rx = re.compile(r"([a-zA-Z][a-zA-Z0-9_]+)\s*=\s*(.*)") - _findvar1_rx = re.compile(r"\$\(([A-Za-z][A-Za-z0-9_]*)\)") - _findvar2_rx = re.compile(r"\${([A-Za-z][A-Za-z0-9_]*)}") - - if vars is None: - vars = {} - done = {} - notdone = {} - - with codecs.open(filename, encoding='utf-8', errors="surrogateescape") as f: - lines = f.readlines() - - for line in lines: - if line.startswith('#') or line.strip() == '': - continue - m = _variable_rx.match(line) - if m: - n, v = m.group(1, 2) - v = v.strip() - # `$$' is a literal `$' in make - tmpv = v.replace('$$', '') - - if "$" in tmpv: - notdone[n] = v - else: - try: - v = int(v) - except ValueError: - # insert literal `$' - done[n] = v.replace('$$', '$') - else: - done[n] = v - - # do variable interpolation here - variables = list(notdone.keys()) - - # Variables with a 'PY_' prefix in the makefile. These need to - # be made available without that prefix through sysconfig. - # Special care is needed to ensure that variable expansion works, even - # if the expansion uses the name without a prefix. - renamed_variables = ('CFLAGS', 'LDFLAGS', 'CPPFLAGS') - - while len(variables) > 0: - for name in tuple(variables): - value = notdone[name] - m = _findvar1_rx.search(value) or _findvar2_rx.search(value) - if m is not None: - n = m.group(1) - found = True - if n in done: - item = str(done[n]) - elif n in notdone: - # get it on a subsequent round - found = False - elif n in os.environ: - # do it like make: fall back to environment - item = os.environ[n] - - elif n in renamed_variables: - if (name.startswith('PY_') and - name[3:] in renamed_variables): - item = "" - - elif 'PY_' + n in notdone: - found = False - - else: - item = str(done['PY_' + n]) - - else: - done[n] = item = "" - - if found: - after = value[m.end():] - value = value[:m.start()] + item + after - if "$" in after: - notdone[name] = value - else: - try: - value = int(value) - except ValueError: - done[name] = value.strip() - else: - done[name] = value - variables.remove(name) - - if (name.startswith('PY_') and - name[3:] in renamed_variables): - - name = name[3:] - if name not in done: - done[name] = value - - else: - # bogus variable reference (e.g. "prefix=$/opt/python"); - # just drop it since we can't deal - done[name] = value - variables.remove(name) - - # strip spurious spaces - for k, v in done.items(): - if isinstance(v, str): - done[k] = v.strip() - - # save the results in the global dictionary - vars.update(done) - return vars - - -def get_makefile_filename(): - """Return the path of the Makefile.""" - if _PYTHON_BUILD: - return os.path.join(_PROJECT_BASE, "Makefile") - if hasattr(sys, 'abiflags'): - config_dir_name = 'config-%s%s' % (_PY_VERSION_SHORT, sys.abiflags) - else: - config_dir_name = 'config' - return os.path.join(get_path('stdlib'), config_dir_name, 'Makefile') - - -def _init_posix(vars): - """Initialize the module as appropriate for POSIX systems.""" - # load the installed Makefile: - makefile = get_makefile_filename() - try: - _parse_makefile(makefile, vars) - except IOError as e: - msg = "invalid Python installation: unable to open %s" % makefile - if hasattr(e, "strerror"): - msg = msg + " (%s)" % e.strerror - raise IOError(msg) - # load the installed pyconfig.h: - config_h = get_config_h_filename() - try: - with open(config_h) as f: - parse_config_h(f, vars) - except IOError as e: - msg = "invalid Python installation: unable to open %s" % config_h - if hasattr(e, "strerror"): - msg = msg + " (%s)" % e.strerror - raise IOError(msg) - # On AIX, there are wrong paths to the linker scripts in the Makefile - # -- these paths are relative to the Python source, but when installed - # the scripts are in another directory. - if _PYTHON_BUILD: - vars['LDSHARED'] = vars['BLDSHARED'] - - -def _init_non_posix(vars): - """Initialize the module as appropriate for NT""" - # set basic install directories - vars['LIBDEST'] = get_path('stdlib') - vars['BINLIBDEST'] = get_path('platstdlib') - vars['INCLUDEPY'] = get_path('include') - vars['SO'] = '.pyd' - vars['EXE'] = '.exe' - vars['VERSION'] = _PY_VERSION_SHORT_NO_DOT - vars['BINDIR'] = os.path.dirname(_safe_realpath(sys.executable)) - -# -# public APIs -# - - -def parse_config_h(fp, vars=None): - """Parse a config.h-style file. - - A dictionary containing name/value pairs is returned. If an - optional dictionary is passed in as the second argument, it is - used instead of a new dictionary. - """ - if vars is None: - vars = {} - define_rx = re.compile("#define ([A-Z][A-Za-z0-9_]+) (.*)\n") - undef_rx = re.compile("/[*] #undef ([A-Z][A-Za-z0-9_]+) [*]/\n") - - while True: - line = fp.readline() - if not line: - break - m = define_rx.match(line) - if m: - n, v = m.group(1, 2) - try: - v = int(v) - except ValueError: - pass - vars[n] = v - else: - m = undef_rx.match(line) - if m: - vars[m.group(1)] = 0 - return vars - - -def get_config_h_filename(): - """Return the path of pyconfig.h.""" - if _PYTHON_BUILD: - if os.name == "nt": - inc_dir = os.path.join(_PROJECT_BASE, "PC") - else: - inc_dir = _PROJECT_BASE - else: - inc_dir = get_path('platinclude') - return os.path.join(inc_dir, 'pyconfig.h') - - -def get_scheme_names(): - """Return a tuple containing the schemes names.""" - return tuple(sorted(_SCHEMES.sections())) - - -def get_path_names(): - """Return a tuple containing the paths names.""" - # xxx see if we want a static list - return _SCHEMES.options('posix_prefix') - - -def get_paths(scheme=_get_default_scheme(), vars=None, expand=True): - """Return a mapping containing an install scheme. - - ``scheme`` is the install scheme name. If not provided, it will - return the default scheme for the current platform. - """ - _ensure_cfg_read() - if expand: - return _expand_vars(scheme, vars) - else: - return dict(_SCHEMES.items(scheme)) - - -def get_path(name, scheme=_get_default_scheme(), vars=None, expand=True): - """Return a path corresponding to the scheme. - - ``scheme`` is the install scheme name. - """ - return get_paths(scheme, vars, expand)[name] - - -def get_config_vars(*args): - """With no arguments, return a dictionary of all configuration - variables relevant for the current platform. - - On Unix, this means every variable defined in Python's installed Makefile; - On Windows and Mac OS it's a much smaller set. - - With arguments, return a list of values that result from looking up - each argument in the configuration variable dictionary. - """ - global _CONFIG_VARS - if _CONFIG_VARS is None: - _CONFIG_VARS = {} - # Normalized versions of prefix and exec_prefix are handy to have; - # in fact, these are the standard versions used most places in the - # distutils2 module. - _CONFIG_VARS['prefix'] = _PREFIX - _CONFIG_VARS['exec_prefix'] = _EXEC_PREFIX - _CONFIG_VARS['py_version'] = _PY_VERSION - _CONFIG_VARS['py_version_short'] = _PY_VERSION_SHORT - _CONFIG_VARS['py_version_nodot'] = _PY_VERSION[0] + _PY_VERSION[2] - _CONFIG_VARS['base'] = _PREFIX - _CONFIG_VARS['platbase'] = _EXEC_PREFIX - _CONFIG_VARS['projectbase'] = _PROJECT_BASE - try: - _CONFIG_VARS['abiflags'] = sys.abiflags - except AttributeError: - # sys.abiflags may not be defined on all platforms. - _CONFIG_VARS['abiflags'] = '' - - if os.name in ('nt', 'os2'): - _init_non_posix(_CONFIG_VARS) - if os.name == 'posix': - _init_posix(_CONFIG_VARS) - # Setting 'userbase' is done below the call to the - # init function to enable using 'get_config_var' in - # the init-function. - if sys.version >= '2.6': - _CONFIG_VARS['userbase'] = _getuserbase() - - if 'srcdir' not in _CONFIG_VARS: - _CONFIG_VARS['srcdir'] = _PROJECT_BASE - else: - _CONFIG_VARS['srcdir'] = _safe_realpath(_CONFIG_VARS['srcdir']) - - # Convert srcdir into an absolute path if it appears necessary. - # Normally it is relative to the build directory. However, during - # testing, for example, we might be running a non-installed python - # from a different directory. - if _PYTHON_BUILD and os.name == "posix": - base = _PROJECT_BASE - try: - cwd = os.getcwd() - except OSError: - cwd = None - if (not os.path.isabs(_CONFIG_VARS['srcdir']) and - base != cwd): - # srcdir is relative and we are not in the same directory - # as the executable. Assume executable is in the build - # directory and make srcdir absolute. - srcdir = os.path.join(base, _CONFIG_VARS['srcdir']) - _CONFIG_VARS['srcdir'] = os.path.normpath(srcdir) - - if sys.platform == 'darwin': - kernel_version = os.uname()[2] # Kernel version (8.4.3) - major_version = int(kernel_version.split('.')[0]) - - if major_version < 8: - # On Mac OS X before 10.4, check if -arch and -isysroot - # are in CFLAGS or LDFLAGS and remove them if they are. - # This is needed when building extensions on a 10.3 system - # using a universal build of python. - for key in ('LDFLAGS', 'BASECFLAGS', - # a number of derived variables. These need to be - # patched up as well. - 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'): - flags = _CONFIG_VARS[key] - flags = re.sub(r'-arch\s+\w+\s', ' ', flags) - flags = re.sub('-isysroot [^ \t]*', ' ', flags) - _CONFIG_VARS[key] = flags - else: - # Allow the user to override the architecture flags using - # an environment variable. - # NOTE: This name was introduced by Apple in OSX 10.5 and - # is used by several scripting languages distributed with - # that OS release. - if 'ARCHFLAGS' in os.environ: - arch = os.environ['ARCHFLAGS'] - for key in ('LDFLAGS', 'BASECFLAGS', - # a number of derived variables. These need to be - # patched up as well. - 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'): - - flags = _CONFIG_VARS[key] - flags = re.sub(r'-arch\s+\w+\s', ' ', flags) - flags = flags + ' ' + arch - _CONFIG_VARS[key] = flags - - # If we're on OSX 10.5 or later and the user tries to - # compiles an extension using an SDK that is not present - # on the current machine it is better to not use an SDK - # than to fail. - # - # The major usecase for this is users using a Python.org - # binary installer on OSX 10.6: that installer uses - # the 10.4u SDK, but that SDK is not installed by default - # when you install Xcode. - # - CFLAGS = _CONFIG_VARS.get('CFLAGS', '') - m = re.search(r'-isysroot\s+(\S+)', CFLAGS) - if m is not None: - sdk = m.group(1) - if not os.path.exists(sdk): - for key in ('LDFLAGS', 'BASECFLAGS', - # a number of derived variables. These need to be - # patched up as well. - 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'): - - flags = _CONFIG_VARS[key] - flags = re.sub(r'-isysroot\s+\S+(\s|$)', ' ', flags) - _CONFIG_VARS[key] = flags - - if args: - vals = [] - for name in args: - vals.append(_CONFIG_VARS.get(name)) - return vals - else: - return _CONFIG_VARS - - -def get_config_var(name): - """Return the value of a single variable using the dictionary returned by - 'get_config_vars()'. - - Equivalent to get_config_vars().get(name) - """ - return get_config_vars().get(name) - - -def get_platform(): - """Return a string that identifies the current platform. - - This is used mainly to distinguish platform-specific build directories and - platform-specific built distributions. Typically includes the OS name - and version and the architecture (as supplied by 'os.uname()'), - although the exact information included depends on the OS; eg. for IRIX - the architecture isn't particularly important (IRIX only runs on SGI - hardware), but for Linux the kernel version isn't particularly - important. - - Examples of returned values: - linux-i586 - linux-alpha (?) - solaris-2.6-sun4u - irix-5.3 - irix64-6.2 - - Windows will return one of: - win-amd64 (64bit Windows on AMD64 (aka x86_64, Intel64, EM64T, etc) - win-ia64 (64bit Windows on Itanium) - win32 (all others - specifically, sys.platform is returned) - - For other non-POSIX platforms, currently just returns 'sys.platform'. - """ - if os.name == 'nt': - # sniff sys.version for architecture. - prefix = " bit (" - i = sys.version.find(prefix) - if i == -1: - return sys.platform - j = sys.version.find(")", i) - look = sys.version[i+len(prefix):j].lower() - if look == 'amd64': - return 'win-amd64' - if look == 'itanium': - return 'win-ia64' - return sys.platform - - if os.name != "posix" or not hasattr(os, 'uname'): - # XXX what about the architecture? NT is Intel or Alpha, - # Mac OS is M68k or PPC, etc. - return sys.platform - - # Try to distinguish various flavours of Unix - osname, host, release, version, machine = os.uname() - - # Convert the OS name to lowercase, remove '/' characters - # (to accommodate BSD/OS), and translate spaces (for "Power Macintosh") - osname = osname.lower().replace('/', '') - machine = machine.replace(' ', '_') - machine = machine.replace('/', '-') - - if osname[:5] == "linux": - # At least on Linux/Intel, 'machine' is the processor -- - # i386, etc. - # XXX what about Alpha, SPARC, etc? - return "%s-%s" % (osname, machine) - elif osname[:5] == "sunos": - if release[0] >= "5": # SunOS 5 == Solaris 2 - osname = "solaris" - release = "%d.%s" % (int(release[0]) - 3, release[2:]) - # fall through to standard osname-release-machine representation - elif osname[:4] == "irix": # could be "irix64"! - return "%s-%s" % (osname, release) - elif osname[:3] == "aix": - return "%s-%s.%s" % (osname, version, release) - elif osname[:6] == "cygwin": - osname = "cygwin" - rel_re = re.compile(r'[\d.]+') - m = rel_re.match(release) - if m: - release = m.group() - elif osname[:6] == "darwin": - # - # For our purposes, we'll assume that the system version from - # distutils' perspective is what MACOSX_DEPLOYMENT_TARGET is set - # to. This makes the compatibility story a bit more sane because the - # machine is going to compile and link as if it were - # MACOSX_DEPLOYMENT_TARGET. - cfgvars = get_config_vars() - macver = cfgvars.get('MACOSX_DEPLOYMENT_TARGET') - - if True: - # Always calculate the release of the running machine, - # needed to determine if we can build fat binaries or not. - - macrelease = macver - # Get the system version. Reading this plist is a documented - # way to get the system version (see the documentation for - # the Gestalt Manager) - try: - f = open('/System/Library/CoreServices/SystemVersion.plist') - except IOError: - # We're on a plain darwin box, fall back to the default - # behaviour. - pass - else: - try: - m = re.search(r'<key>ProductUserVisibleVersion</key>\s*' - r'<string>(.*?)</string>', f.read()) - finally: - f.close() - if m is not None: - macrelease = '.'.join(m.group(1).split('.')[:2]) - # else: fall back to the default behaviour - - if not macver: - macver = macrelease - - if macver: - release = macver - osname = "macosx" - - if ((macrelease + '.') >= '10.4.' and - '-arch' in get_config_vars().get('CFLAGS', '').strip()): - # The universal build will build fat binaries, but not on - # systems before 10.4 - # - # Try to detect 4-way universal builds, those have machine-type - # 'universal' instead of 'fat'. - - machine = 'fat' - cflags = get_config_vars().get('CFLAGS') - - archs = re.findall(r'-arch\s+(\S+)', cflags) - archs = tuple(sorted(set(archs))) - - if len(archs) == 1: - machine = archs[0] - elif archs == ('i386', 'ppc'): - machine = 'fat' - elif archs == ('i386', 'x86_64'): - machine = 'intel' - elif archs == ('i386', 'ppc', 'x86_64'): - machine = 'fat3' - elif archs == ('ppc64', 'x86_64'): - machine = 'fat64' - elif archs == ('i386', 'ppc', 'ppc64', 'x86_64'): - machine = 'universal' - else: - raise ValueError( - "Don't know machine value for archs=%r" % (archs,)) - - elif machine == 'i386': - # On OSX the machine type returned by uname is always the - # 32-bit variant, even if the executable architecture is - # the 64-bit variant - if sys.maxsize >= 2**32: - machine = 'x86_64' - - elif machine in ('PowerPC', 'Power_Macintosh'): - # Pick a sane name for the PPC architecture. - # See 'i386' case - if sys.maxsize >= 2**32: - machine = 'ppc64' - else: - machine = 'ppc' - - return "%s-%s-%s" % (osname, release, machine) - - -def get_python_version(): - return _PY_VERSION_SHORT - - -def _print_dict(title, data): - for index, (key, value) in enumerate(sorted(data.items())): - if index == 0: - print('%s: ' % (title)) - print('\t%s = "%s"' % (key, value)) - - -def _main(): - """Display all information sysconfig detains.""" - print('Platform: "%s"' % get_platform()) - print('Python version: "%s"' % get_python_version()) - print('Current installation scheme: "%s"' % _get_default_scheme()) - print() - _print_dict('Paths', get_paths()) - print() - _print_dict('Variables', get_config_vars()) - - -if __name__ == '__main__': - _main() diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.pyc deleted file mode 100644 index 18e457bfa19b2eeb47d92aa1af312811f22af1ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22518 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 ZQ~9p^o_yP(?n52<C&>F%wF{;B{{bjzEo}e* diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/tarfile.py b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/tarfile.py deleted file mode 100644 index d66d856..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/tarfile.py +++ /dev/null @@ -1,2607 +0,0 @@ -#------------------------------------------------------------------- -# tarfile.py -#------------------------------------------------------------------- -# Copyright (C) 2002 Lars Gustaebel <lars@gustaebel.de> -# All rights reserved. -# -# Permission is hereby granted, free of charge, to any person -# obtaining a copy of this software and associated documentation -# files (the "Software"), to deal in the Software without -# restriction, including without limitation the rights to use, -# copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the -# Software is furnished to do so, subject to the following -# conditions: -# -# The above copyright notice and this permission notice shall be -# included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -# OTHER DEALINGS IN THE SOFTWARE. -# -from __future__ import print_function - -"""Read from and write to tar format archives. -""" - -__version__ = "$Revision$" - -version = "0.9.0" -__author__ = "Lars Gust\u00e4bel (lars@gustaebel.de)" -__date__ = "$Date: 2011-02-25 17:42:01 +0200 (Fri, 25 Feb 2011) $" -__cvsid__ = "$Id: tarfile.py 88586 2011-02-25 15:42:01Z marc-andre.lemburg $" -__credits__ = "Gustavo Niemeyer, Niels Gust\u00e4bel, Richard Townsend." - -#--------- -# Imports -#--------- -import sys -import os -import stat -import errno -import time -import struct -import copy -import re - -try: - import grp, pwd -except ImportError: - grp = pwd = None - -# os.symlink on Windows prior to 6.0 raises NotImplementedError -symlink_exception = (AttributeError, NotImplementedError) -try: - # WindowsError (1314) will be raised if the caller does not hold the - # SeCreateSymbolicLinkPrivilege privilege - symlink_exception += (WindowsError,) -except NameError: - pass - -# from tarfile import * -__all__ = ["TarFile", "TarInfo", "is_tarfile", "TarError"] - -if sys.version_info[0] < 3: - import __builtin__ as builtins -else: - import builtins - -_open = builtins.open # Since 'open' is TarFile.open - -#--------------------------------------------------------- -# tar constants -#--------------------------------------------------------- -NUL = b"\0" # the null character -BLOCKSIZE = 512 # length of processing blocks -RECORDSIZE = BLOCKSIZE * 20 # length of records -GNU_MAGIC = b"ustar \0" # magic gnu tar string -POSIX_MAGIC = b"ustar\x0000" # magic posix tar string - -LENGTH_NAME = 100 # maximum length of a filename -LENGTH_LINK = 100 # maximum length of a linkname -LENGTH_PREFIX = 155 # maximum length of the prefix field - -REGTYPE = b"0" # regular file -AREGTYPE = b"\0" # regular file -LNKTYPE = b"1" # link (inside tarfile) -SYMTYPE = b"2" # symbolic link -CHRTYPE = b"3" # character special device -BLKTYPE = b"4" # block special device -DIRTYPE = b"5" # directory -FIFOTYPE = b"6" # fifo special device -CONTTYPE = b"7" # contiguous file - -GNUTYPE_LONGNAME = b"L" # GNU tar longname -GNUTYPE_LONGLINK = b"K" # GNU tar longlink -GNUTYPE_SPARSE = b"S" # GNU tar sparse file - -XHDTYPE = b"x" # POSIX.1-2001 extended header -XGLTYPE = b"g" # POSIX.1-2001 global header -SOLARIS_XHDTYPE = b"X" # Solaris extended header - -USTAR_FORMAT = 0 # POSIX.1-1988 (ustar) format -GNU_FORMAT = 1 # GNU tar format -PAX_FORMAT = 2 # POSIX.1-2001 (pax) format -DEFAULT_FORMAT = GNU_FORMAT - -#--------------------------------------------------------- -# tarfile constants -#--------------------------------------------------------- -# File types that tarfile supports: -SUPPORTED_TYPES = (REGTYPE, AREGTYPE, LNKTYPE, - SYMTYPE, DIRTYPE, FIFOTYPE, - CONTTYPE, CHRTYPE, BLKTYPE, - GNUTYPE_LONGNAME, GNUTYPE_LONGLINK, - GNUTYPE_SPARSE) - -# File types that will be treated as a regular file. -REGULAR_TYPES = (REGTYPE, AREGTYPE, - CONTTYPE, GNUTYPE_SPARSE) - -# File types that are part of the GNU tar format. -GNU_TYPES = (GNUTYPE_LONGNAME, GNUTYPE_LONGLINK, - GNUTYPE_SPARSE) - -# Fields from a pax header that override a TarInfo attribute. -PAX_FIELDS = ("path", "linkpath", "size", "mtime", - "uid", "gid", "uname", "gname") - -# Fields from a pax header that are affected by hdrcharset. -PAX_NAME_FIELDS = set(("path", "linkpath", "uname", "gname")) - -# Fields in a pax header that are numbers, all other fields -# are treated as strings. -PAX_NUMBER_FIELDS = { - "atime": float, - "ctime": float, - "mtime": float, - "uid": int, - "gid": int, - "size": int -} - -#--------------------------------------------------------- -# Bits used in the mode field, values in octal. -#--------------------------------------------------------- -S_IFLNK = 0o120000 # symbolic link -S_IFREG = 0o100000 # regular file -S_IFBLK = 0o060000 # block device -S_IFDIR = 0o040000 # directory -S_IFCHR = 0o020000 # character device -S_IFIFO = 0o010000 # fifo - -TSUID = 0o4000 # set UID on execution -TSGID = 0o2000 # set GID on execution -TSVTX = 0o1000 # reserved - -TUREAD = 0o400 # read by owner -TUWRITE = 0o200 # write by owner -TUEXEC = 0o100 # execute/search by owner -TGREAD = 0o040 # read by group -TGWRITE = 0o020 # write by group -TGEXEC = 0o010 # execute/search by group -TOREAD = 0o004 # read by other -TOWRITE = 0o002 # write by other -TOEXEC = 0o001 # execute/search by other - -#--------------------------------------------------------- -# initialization -#--------------------------------------------------------- -if os.name in ("nt", "ce"): - ENCODING = "utf-8" -else: - ENCODING = sys.getfilesystemencoding() - -#--------------------------------------------------------- -# Some useful functions -#--------------------------------------------------------- - -def stn(s, length, encoding, errors): - """Convert a string to a null-terminated bytes object. - """ - s = s.encode(encoding, errors) - return s[:length] + (length - len(s)) * NUL - -def nts(s, encoding, errors): - """Convert a null-terminated bytes object to a string. - """ - p = s.find(b"\0") - if p != -1: - s = s[:p] - return s.decode(encoding, errors) - -def nti(s): - """Convert a number field to a python number. - """ - # There are two possible encodings for a number field, see - # itn() below. - if s[0] != chr(0o200): - try: - n = int(nts(s, "ascii", "strict") or "0", 8) - except ValueError: - raise InvalidHeaderError("invalid header") - else: - n = 0 - for i in range(len(s) - 1): - n <<= 8 - n += ord(s[i + 1]) - return n - -def itn(n, digits=8, format=DEFAULT_FORMAT): - """Convert a python number to a number field. - """ - # POSIX 1003.1-1988 requires numbers to be encoded as a string of - # octal digits followed by a null-byte, this allows values up to - # (8**(digits-1))-1. GNU tar allows storing numbers greater than - # that if necessary. A leading 0o200 byte indicates this particular - # encoding, the following digits-1 bytes are a big-endian - # representation. This allows values up to (256**(digits-1))-1. - if 0 <= n < 8 ** (digits - 1): - s = ("%0*o" % (digits - 1, n)).encode("ascii") + NUL - else: - if format != GNU_FORMAT or n >= 256 ** (digits - 1): - raise ValueError("overflow in number field") - - if n < 0: - # XXX We mimic GNU tar's behaviour with negative numbers, - # this could raise OverflowError. - n = struct.unpack("L", struct.pack("l", n))[0] - - s = bytearray() - for i in range(digits - 1): - s.insert(0, n & 0o377) - n >>= 8 - s.insert(0, 0o200) - return s - -def calc_chksums(buf): - """Calculate the checksum for a member's header by summing up all - characters except for the chksum field which is treated as if - it was filled with spaces. According to the GNU tar sources, - some tars (Sun and NeXT) calculate chksum with signed char, - which will be different if there are chars in the buffer with - the high bit set. So we calculate two checksums, unsigned and - signed. - """ - unsigned_chksum = 256 + sum(struct.unpack("148B", buf[:148]) + struct.unpack("356B", buf[156:512])) - signed_chksum = 256 + sum(struct.unpack("148b", buf[:148]) + struct.unpack("356b", buf[156:512])) - return unsigned_chksum, signed_chksum - -def copyfileobj(src, dst, length=None): - """Copy length bytes from fileobj src to fileobj dst. - If length is None, copy the entire content. - """ - if length == 0: - return - if length is None: - while True: - buf = src.read(16*1024) - if not buf: - break - dst.write(buf) - return - - BUFSIZE = 16 * 1024 - blocks, remainder = divmod(length, BUFSIZE) - for b in range(blocks): - buf = src.read(BUFSIZE) - if len(buf) < BUFSIZE: - raise IOError("end of file reached") - dst.write(buf) - - if remainder != 0: - buf = src.read(remainder) - if len(buf) < remainder: - raise IOError("end of file reached") - dst.write(buf) - return - -filemode_table = ( - ((S_IFLNK, "l"), - (S_IFREG, "-"), - (S_IFBLK, "b"), - (S_IFDIR, "d"), - (S_IFCHR, "c"), - (S_IFIFO, "p")), - - ((TUREAD, "r"),), - ((TUWRITE, "w"),), - ((TUEXEC|TSUID, "s"), - (TSUID, "S"), - (TUEXEC, "x")), - - ((TGREAD, "r"),), - ((TGWRITE, "w"),), - ((TGEXEC|TSGID, "s"), - (TSGID, "S"), - (TGEXEC, "x")), - - ((TOREAD, "r"),), - ((TOWRITE, "w"),), - ((TOEXEC|TSVTX, "t"), - (TSVTX, "T"), - (TOEXEC, "x")) -) - -def filemode(mode): - """Convert a file's mode to a string of the form - -rwxrwxrwx. - Used by TarFile.list() - """ - perm = [] - for table in filemode_table: - for bit, char in table: - if mode & bit == bit: - perm.append(char) - break - else: - perm.append("-") - return "".join(perm) - -class TarError(Exception): - """Base exception.""" - pass -class ExtractError(TarError): - """General exception for extract errors.""" - pass -class ReadError(TarError): - """Exception for unreadable tar archives.""" - pass -class CompressionError(TarError): - """Exception for unavailable compression methods.""" - pass -class StreamError(TarError): - """Exception for unsupported operations on stream-like TarFiles.""" - pass -class HeaderError(TarError): - """Base exception for header errors.""" - pass -class EmptyHeaderError(HeaderError): - """Exception for empty headers.""" - pass -class TruncatedHeaderError(HeaderError): - """Exception for truncated headers.""" - pass -class EOFHeaderError(HeaderError): - """Exception for end of file headers.""" - pass -class InvalidHeaderError(HeaderError): - """Exception for invalid headers.""" - pass -class SubsequentHeaderError(HeaderError): - """Exception for missing and invalid extended headers.""" - pass - -#--------------------------- -# internal stream interface -#--------------------------- -class _LowLevelFile(object): - """Low-level file object. Supports reading and writing. - It is used instead of a regular file object for streaming - access. - """ - - def __init__(self, name, mode): - mode = { - "r": os.O_RDONLY, - "w": os.O_WRONLY | os.O_CREAT | os.O_TRUNC, - }[mode] - if hasattr(os, "O_BINARY"): - mode |= os.O_BINARY - self.fd = os.open(name, mode, 0o666) - - def close(self): - os.close(self.fd) - - def read(self, size): - return os.read(self.fd, size) - - def write(self, s): - os.write(self.fd, s) - -class _Stream(object): - """Class that serves as an adapter between TarFile and - a stream-like object. The stream-like object only - needs to have a read() or write() method and is accessed - blockwise. Use of gzip or bzip2 compression is possible. - A stream-like object could be for example: sys.stdin, - sys.stdout, a socket, a tape device etc. - - _Stream is intended to be used only internally. - """ - - def __init__(self, name, mode, comptype, fileobj, bufsize): - """Construct a _Stream object. - """ - self._extfileobj = True - if fileobj is None: - fileobj = _LowLevelFile(name, mode) - self._extfileobj = False - - if comptype == '*': - # Enable transparent compression detection for the - # stream interface - fileobj = _StreamProxy(fileobj) - comptype = fileobj.getcomptype() - - self.name = name or "" - self.mode = mode - self.comptype = comptype - self.fileobj = fileobj - self.bufsize = bufsize - self.buf = b"" - self.pos = 0 - self.closed = False - - try: - if comptype == "gz": - try: - import zlib - except ImportError: - raise CompressionError("zlib module is not available") - self.zlib = zlib - self.crc = zlib.crc32(b"") - if mode == "r": - self._init_read_gz() - else: - self._init_write_gz() - - if comptype == "bz2": - try: - import bz2 - except ImportError: - raise CompressionError("bz2 module is not available") - if mode == "r": - self.dbuf = b"" - self.cmp = bz2.BZ2Decompressor() - else: - self.cmp = bz2.BZ2Compressor() - except: - if not self._extfileobj: - self.fileobj.close() - self.closed = True - raise - - def __del__(self): - if hasattr(self, "closed") and not self.closed: - self.close() - - def _init_write_gz(self): - """Initialize for writing with gzip compression. - """ - self.cmp = self.zlib.compressobj(9, self.zlib.DEFLATED, - -self.zlib.MAX_WBITS, - self.zlib.DEF_MEM_LEVEL, - 0) - timestamp = struct.pack("<L", int(time.time())) - self.__write(b"\037\213\010\010" + timestamp + b"\002\377") - if self.name.endswith(".gz"): - self.name = self.name[:-3] - # RFC1952 says we must use ISO-8859-1 for the FNAME field. - self.__write(self.name.encode("iso-8859-1", "replace") + NUL) - - def write(self, s): - """Write string s to the stream. - """ - if self.comptype == "gz": - self.crc = self.zlib.crc32(s, self.crc) - self.pos += len(s) - if self.comptype != "tar": - s = self.cmp.compress(s) - self.__write(s) - - def __write(self, s): - """Write string s to the stream if a whole new block - is ready to be written. - """ - self.buf += s - while len(self.buf) > self.bufsize: - self.fileobj.write(self.buf[:self.bufsize]) - self.buf = self.buf[self.bufsize:] - - def close(self): - """Close the _Stream object. No operation should be - done on it afterwards. - """ - if self.closed: - return - - if self.mode == "w" and self.comptype != "tar": - self.buf += self.cmp.flush() - - if self.mode == "w" and self.buf: - self.fileobj.write(self.buf) - self.buf = b"" - if self.comptype == "gz": - # The native zlib crc is an unsigned 32-bit integer, but - # the Python wrapper implicitly casts that to a signed C - # long. So, on a 32-bit box self.crc may "look negative", - # while the same crc on a 64-bit box may "look positive". - # To avoid irksome warnings from the `struct` module, force - # it to look positive on all boxes. - self.fileobj.write(struct.pack("<L", self.crc & 0xffffffff)) - self.fileobj.write(struct.pack("<L", self.pos & 0xffffFFFF)) - - if not self._extfileobj: - self.fileobj.close() - - self.closed = True - - def _init_read_gz(self): - """Initialize for reading a gzip compressed fileobj. - """ - self.cmp = self.zlib.decompressobj(-self.zlib.MAX_WBITS) - self.dbuf = b"" - - # taken from gzip.GzipFile with some alterations - if self.__read(2) != b"\037\213": - raise ReadError("not a gzip file") - if self.__read(1) != b"\010": - raise CompressionError("unsupported compression method") - - flag = ord(self.__read(1)) - self.__read(6) - - if flag & 4: - xlen = ord(self.__read(1)) + 256 * ord(self.__read(1)) - self.read(xlen) - if flag & 8: - while True: - s = self.__read(1) - if not s or s == NUL: - break - if flag & 16: - while True: - s = self.__read(1) - if not s or s == NUL: - break - if flag & 2: - self.__read(2) - - def tell(self): - """Return the stream's file pointer position. - """ - return self.pos - - def seek(self, pos=0): - """Set the stream's file pointer to pos. Negative seeking - is forbidden. - """ - if pos - self.pos >= 0: - blocks, remainder = divmod(pos - self.pos, self.bufsize) - for i in range(blocks): - self.read(self.bufsize) - self.read(remainder) - else: - raise StreamError("seeking backwards is not allowed") - return self.pos - - def read(self, size=None): - """Return the next size number of bytes from the stream. - If size is not defined, return all bytes of the stream - up to EOF. - """ - if size is None: - t = [] - while True: - buf = self._read(self.bufsize) - if not buf: - break - t.append(buf) - buf = "".join(t) - else: - buf = self._read(size) - self.pos += len(buf) - return buf - - def _read(self, size): - """Return size bytes from the stream. - """ - if self.comptype == "tar": - return self.__read(size) - - c = len(self.dbuf) - while c < size: - buf = self.__read(self.bufsize) - if not buf: - break - try: - buf = self.cmp.decompress(buf) - except IOError: - raise ReadError("invalid compressed data") - self.dbuf += buf - c += len(buf) - buf = self.dbuf[:size] - self.dbuf = self.dbuf[size:] - return buf - - def __read(self, size): - """Return size bytes from stream. If internal buffer is empty, - read another block from the stream. - """ - c = len(self.buf) - while c < size: - buf = self.fileobj.read(self.bufsize) - if not buf: - break - self.buf += buf - c += len(buf) - buf = self.buf[:size] - self.buf = self.buf[size:] - return buf -# class _Stream - -class _StreamProxy(object): - """Small proxy class that enables transparent compression - detection for the Stream interface (mode 'r|*'). - """ - - def __init__(self, fileobj): - self.fileobj = fileobj - self.buf = self.fileobj.read(BLOCKSIZE) - - def read(self, size): - self.read = self.fileobj.read - return self.buf - - def getcomptype(self): - if self.buf.startswith(b"\037\213\010"): - return "gz" - if self.buf.startswith(b"BZh91"): - return "bz2" - return "tar" - - def close(self): - self.fileobj.close() -# class StreamProxy - -class _BZ2Proxy(object): - """Small proxy class that enables external file object - support for "r:bz2" and "w:bz2" modes. This is actually - a workaround for a limitation in bz2 module's BZ2File - class which (unlike gzip.GzipFile) has no support for - a file object argument. - """ - - blocksize = 16 * 1024 - - def __init__(self, fileobj, mode): - self.fileobj = fileobj - self.mode = mode - self.name = getattr(self.fileobj, "name", None) - self.init() - - def init(self): - import bz2 - self.pos = 0 - if self.mode == "r": - self.bz2obj = bz2.BZ2Decompressor() - self.fileobj.seek(0) - self.buf = b"" - else: - self.bz2obj = bz2.BZ2Compressor() - - def read(self, size): - x = len(self.buf) - while x < size: - raw = self.fileobj.read(self.blocksize) - if not raw: - break - data = self.bz2obj.decompress(raw) - self.buf += data - x += len(data) - - buf = self.buf[:size] - self.buf = self.buf[size:] - self.pos += len(buf) - return buf - - def seek(self, pos): - if pos < self.pos: - self.init() - self.read(pos - self.pos) - - def tell(self): - return self.pos - - def write(self, data): - self.pos += len(data) - raw = self.bz2obj.compress(data) - self.fileobj.write(raw) - - def close(self): - if self.mode == "w": - raw = self.bz2obj.flush() - self.fileobj.write(raw) -# class _BZ2Proxy - -#------------------------ -# Extraction file object -#------------------------ -class _FileInFile(object): - """A thin wrapper around an existing file object that - provides a part of its data as an individual file - object. - """ - - def __init__(self, fileobj, offset, size, blockinfo=None): - self.fileobj = fileobj - self.offset = offset - self.size = size - self.position = 0 - - if blockinfo is None: - blockinfo = [(0, size)] - - # Construct a map with data and zero blocks. - self.map_index = 0 - self.map = [] - lastpos = 0 - realpos = self.offset - for offset, size in blockinfo: - if offset > lastpos: - self.map.append((False, lastpos, offset, None)) - self.map.append((True, offset, offset + size, realpos)) - realpos += size - lastpos = offset + size - if lastpos < self.size: - self.map.append((False, lastpos, self.size, None)) - - def seekable(self): - if not hasattr(self.fileobj, "seekable"): - # XXX gzip.GzipFile and bz2.BZ2File - return True - return self.fileobj.seekable() - - def tell(self): - """Return the current file position. - """ - return self.position - - def seek(self, position): - """Seek to a position in the file. - """ - self.position = position - - def read(self, size=None): - """Read data from the file. - """ - if size is None: - size = self.size - self.position - else: - size = min(size, self.size - self.position) - - buf = b"" - while size > 0: - while True: - data, start, stop, offset = self.map[self.map_index] - if start <= self.position < stop: - break - else: - self.map_index += 1 - if self.map_index == len(self.map): - self.map_index = 0 - length = min(size, stop - self.position) - if data: - self.fileobj.seek(offset + (self.position - start)) - buf += self.fileobj.read(length) - else: - buf += NUL * length - size -= length - self.position += length - return buf -#class _FileInFile - - -class ExFileObject(object): - """File-like object for reading an archive member. - Is returned by TarFile.extractfile(). - """ - blocksize = 1024 - - def __init__(self, tarfile, tarinfo): - self.fileobj = _FileInFile(tarfile.fileobj, - tarinfo.offset_data, - tarinfo.size, - tarinfo.sparse) - self.name = tarinfo.name - self.mode = "r" - self.closed = False - self.size = tarinfo.size - - self.position = 0 - self.buffer = b"" - - def readable(self): - return True - - def writable(self): - return False - - def seekable(self): - return self.fileobj.seekable() - - def read(self, size=None): - """Read at most size bytes from the file. If size is not - present or None, read all data until EOF is reached. - """ - if self.closed: - raise ValueError("I/O operation on closed file") - - buf = b"" - if self.buffer: - if size is None: - buf = self.buffer - self.buffer = b"" - else: - buf = self.buffer[:size] - self.buffer = self.buffer[size:] - - if size is None: - buf += self.fileobj.read() - else: - buf += self.fileobj.read(size - len(buf)) - - self.position += len(buf) - return buf - - # XXX TextIOWrapper uses the read1() method. - read1 = read - - def readline(self, size=-1): - """Read one entire line from the file. If size is present - and non-negative, return a string with at most that - size, which may be an incomplete line. - """ - if self.closed: - raise ValueError("I/O operation on closed file") - - pos = self.buffer.find(b"\n") + 1 - if pos == 0: - # no newline found. - while True: - buf = self.fileobj.read(self.blocksize) - self.buffer += buf - if not buf or b"\n" in buf: - pos = self.buffer.find(b"\n") + 1 - if pos == 0: - # no newline found. - pos = len(self.buffer) - break - - if size != -1: - pos = min(size, pos) - - buf = self.buffer[:pos] - self.buffer = self.buffer[pos:] - self.position += len(buf) - return buf - - def readlines(self): - """Return a list with all remaining lines. - """ - result = [] - while True: - line = self.readline() - if not line: break - result.append(line) - return result - - def tell(self): - """Return the current file position. - """ - if self.closed: - raise ValueError("I/O operation on closed file") - - return self.position - - def seek(self, pos, whence=os.SEEK_SET): - """Seek to a position in the file. - """ - if self.closed: - raise ValueError("I/O operation on closed file") - - if whence == os.SEEK_SET: - self.position = min(max(pos, 0), self.size) - elif whence == os.SEEK_CUR: - if pos < 0: - self.position = max(self.position + pos, 0) - else: - self.position = min(self.position + pos, self.size) - elif whence == os.SEEK_END: - self.position = max(min(self.size + pos, self.size), 0) - else: - raise ValueError("Invalid argument") - - self.buffer = b"" - self.fileobj.seek(self.position) - - def close(self): - """Close the file object. - """ - self.closed = True - - def __iter__(self): - """Get an iterator over the file's lines. - """ - while True: - line = self.readline() - if not line: - break - yield line -#class ExFileObject - -#------------------ -# Exported Classes -#------------------ -class TarInfo(object): - """Informational class which holds the details about an - archive member given by a tar header block. - TarInfo objects are returned by TarFile.getmember(), - TarFile.getmembers() and TarFile.gettarinfo() and are - usually created internally. - """ - - __slots__ = ("name", "mode", "uid", "gid", "size", "mtime", - "chksum", "type", "linkname", "uname", "gname", - "devmajor", "devminor", - "offset", "offset_data", "pax_headers", "sparse", - "tarfile", "_sparse_structs", "_link_target") - - def __init__(self, name=""): - """Construct a TarInfo object. name is the optional name - of the member. - """ - self.name = name # member name - self.mode = 0o644 # file permissions - self.uid = 0 # user id - self.gid = 0 # group id - self.size = 0 # file size - self.mtime = 0 # modification time - self.chksum = 0 # header checksum - self.type = REGTYPE # member type - self.linkname = "" # link name - self.uname = "" # user name - self.gname = "" # group name - self.devmajor = 0 # device major number - self.devminor = 0 # device minor number - - self.offset = 0 # the tar header starts here - self.offset_data = 0 # the file's data starts here - - self.sparse = None # sparse member information - self.pax_headers = {} # pax header information - - # In pax headers the "name" and "linkname" field are called - # "path" and "linkpath". - def _getpath(self): - return self.name - def _setpath(self, name): - self.name = name - path = property(_getpath, _setpath) - - def _getlinkpath(self): - return self.linkname - def _setlinkpath(self, linkname): - self.linkname = linkname - linkpath = property(_getlinkpath, _setlinkpath) - - def __repr__(self): - return "<%s %r at %#x>" % (self.__class__.__name__,self.name,id(self)) - - def get_info(self): - """Return the TarInfo's attributes as a dictionary. - """ - info = { - "name": self.name, - "mode": self.mode & 0o7777, - "uid": self.uid, - "gid": self.gid, - "size": self.size, - "mtime": self.mtime, - "chksum": self.chksum, - "type": self.type, - "linkname": self.linkname, - "uname": self.uname, - "gname": self.gname, - "devmajor": self.devmajor, - "devminor": self.devminor - } - - if info["type"] == DIRTYPE and not info["name"].endswith("/"): - info["name"] += "/" - - return info - - def tobuf(self, format=DEFAULT_FORMAT, encoding=ENCODING, errors="surrogateescape"): - """Return a tar header as a string of 512 byte blocks. - """ - info = self.get_info() - - if format == USTAR_FORMAT: - return self.create_ustar_header(info, encoding, errors) - elif format == GNU_FORMAT: - return self.create_gnu_header(info, encoding, errors) - elif format == PAX_FORMAT: - return self.create_pax_header(info, encoding) - else: - raise ValueError("invalid format") - - def create_ustar_header(self, info, encoding, errors): - """Return the object as a ustar header block. - """ - info["magic"] = POSIX_MAGIC - - if len(info["linkname"]) > LENGTH_LINK: - raise ValueError("linkname is too long") - - if len(info["name"]) > LENGTH_NAME: - info["prefix"], info["name"] = self._posix_split_name(info["name"]) - - return self._create_header(info, USTAR_FORMAT, encoding, errors) - - def create_gnu_header(self, info, encoding, errors): - """Return the object as a GNU header block sequence. - """ - info["magic"] = GNU_MAGIC - - buf = b"" - if len(info["linkname"]) > LENGTH_LINK: - buf += self._create_gnu_long_header(info["linkname"], GNUTYPE_LONGLINK, encoding, errors) - - if len(info["name"]) > LENGTH_NAME: - buf += self._create_gnu_long_header(info["name"], GNUTYPE_LONGNAME, encoding, errors) - - return buf + self._create_header(info, GNU_FORMAT, encoding, errors) - - def create_pax_header(self, info, encoding): - """Return the object as a ustar header block. If it cannot be - represented this way, prepend a pax extended header sequence - with supplement information. - """ - info["magic"] = POSIX_MAGIC - pax_headers = self.pax_headers.copy() - - # Test string fields for values that exceed the field length or cannot - # be represented in ASCII encoding. - for name, hname, length in ( - ("name", "path", LENGTH_NAME), ("linkname", "linkpath", LENGTH_LINK), - ("uname", "uname", 32), ("gname", "gname", 32)): - - if hname in pax_headers: - # The pax header has priority. - continue - - # Try to encode the string as ASCII. - try: - info[name].encode("ascii", "strict") - except UnicodeEncodeError: - pax_headers[hname] = info[name] - continue - - if len(info[name]) > length: - pax_headers[hname] = info[name] - - # Test number fields for values that exceed the field limit or values - # that like to be stored as float. - for name, digits in (("uid", 8), ("gid", 8), ("size", 12), ("mtime", 12)): - if name in pax_headers: - # The pax header has priority. Avoid overflow. - info[name] = 0 - continue - - val = info[name] - if not 0 <= val < 8 ** (digits - 1) or isinstance(val, float): - pax_headers[name] = str(val) - info[name] = 0 - - # Create a pax extended header if necessary. - if pax_headers: - buf = self._create_pax_generic_header(pax_headers, XHDTYPE, encoding) - else: - buf = b"" - - return buf + self._create_header(info, USTAR_FORMAT, "ascii", "replace") - - @classmethod - def create_pax_global_header(cls, pax_headers): - """Return the object as a pax global header block sequence. - """ - return cls._create_pax_generic_header(pax_headers, XGLTYPE, "utf8") - - def _posix_split_name(self, name): - """Split a name longer than 100 chars into a prefix - and a name part. - """ - prefix = name[:LENGTH_PREFIX + 1] - while prefix and prefix[-1] != "/": - prefix = prefix[:-1] - - name = name[len(prefix):] - prefix = prefix[:-1] - - if not prefix or len(name) > LENGTH_NAME: - raise ValueError("name is too long") - return prefix, name - - @staticmethod - def _create_header(info, format, encoding, errors): - """Return a header block. info is a dictionary with file - information, format must be one of the *_FORMAT constants. - """ - parts = [ - stn(info.get("name", ""), 100, encoding, errors), - itn(info.get("mode", 0) & 0o7777, 8, format), - itn(info.get("uid", 0), 8, format), - itn(info.get("gid", 0), 8, format), - itn(info.get("size", 0), 12, format), - itn(info.get("mtime", 0), 12, format), - b" ", # checksum field - info.get("type", REGTYPE), - stn(info.get("linkname", ""), 100, encoding, errors), - info.get("magic", POSIX_MAGIC), - stn(info.get("uname", ""), 32, encoding, errors), - stn(info.get("gname", ""), 32, encoding, errors), - itn(info.get("devmajor", 0), 8, format), - itn(info.get("devminor", 0), 8, format), - stn(info.get("prefix", ""), 155, encoding, errors) - ] - - buf = struct.pack("%ds" % BLOCKSIZE, b"".join(parts)) - chksum = calc_chksums(buf[-BLOCKSIZE:])[0] - buf = buf[:-364] + ("%06o\0" % chksum).encode("ascii") + buf[-357:] - return buf - - @staticmethod - def _create_payload(payload): - """Return the string payload filled with zero bytes - up to the next 512 byte border. - """ - blocks, remainder = divmod(len(payload), BLOCKSIZE) - if remainder > 0: - payload += (BLOCKSIZE - remainder) * NUL - return payload - - @classmethod - def _create_gnu_long_header(cls, name, type, encoding, errors): - """Return a GNUTYPE_LONGNAME or GNUTYPE_LONGLINK sequence - for name. - """ - name = name.encode(encoding, errors) + NUL - - info = {} - info["name"] = "././@LongLink" - info["type"] = type - info["size"] = len(name) - info["magic"] = GNU_MAGIC - - # create extended header + name blocks. - return cls._create_header(info, USTAR_FORMAT, encoding, errors) + \ - cls._create_payload(name) - - @classmethod - def _create_pax_generic_header(cls, pax_headers, type, encoding): - """Return a POSIX.1-2008 extended or global header sequence - that contains a list of keyword, value pairs. The values - must be strings. - """ - # Check if one of the fields contains surrogate characters and thereby - # forces hdrcharset=BINARY, see _proc_pax() for more information. - binary = False - for keyword, value in pax_headers.items(): - try: - value.encode("utf8", "strict") - except UnicodeEncodeError: - binary = True - break - - records = b"" - if binary: - # Put the hdrcharset field at the beginning of the header. - records += b"21 hdrcharset=BINARY\n" - - for keyword, value in pax_headers.items(): - keyword = keyword.encode("utf8") - if binary: - # Try to restore the original byte representation of `value'. - # Needless to say, that the encoding must match the string. - value = value.encode(encoding, "surrogateescape") - else: - value = value.encode("utf8") - - l = len(keyword) + len(value) + 3 # ' ' + '=' + '\n' - n = p = 0 - while True: - n = l + len(str(p)) - if n == p: - break - p = n - records += bytes(str(p), "ascii") + b" " + keyword + b"=" + value + b"\n" - - # We use a hardcoded "././@PaxHeader" name like star does - # instead of the one that POSIX recommends. - info = {} - info["name"] = "././@PaxHeader" - info["type"] = type - info["size"] = len(records) - info["magic"] = POSIX_MAGIC - - # Create pax header + record blocks. - return cls._create_header(info, USTAR_FORMAT, "ascii", "replace") + \ - cls._create_payload(records) - - @classmethod - def frombuf(cls, buf, encoding, errors): - """Construct a TarInfo object from a 512 byte bytes object. - """ - if len(buf) == 0: - raise EmptyHeaderError("empty header") - if len(buf) != BLOCKSIZE: - raise TruncatedHeaderError("truncated header") - if buf.count(NUL) == BLOCKSIZE: - raise EOFHeaderError("end of file header") - - chksum = nti(buf[148:156]) - if chksum not in calc_chksums(buf): - raise InvalidHeaderError("bad checksum") - - obj = cls() - obj.name = nts(buf[0:100], encoding, errors) - obj.mode = nti(buf[100:108]) - obj.uid = nti(buf[108:116]) - obj.gid = nti(buf[116:124]) - obj.size = nti(buf[124:136]) - obj.mtime = nti(buf[136:148]) - obj.chksum = chksum - obj.type = buf[156:157] - obj.linkname = nts(buf[157:257], encoding, errors) - obj.uname = nts(buf[265:297], encoding, errors) - obj.gname = nts(buf[297:329], encoding, errors) - obj.devmajor = nti(buf[329:337]) - obj.devminor = nti(buf[337:345]) - prefix = nts(buf[345:500], encoding, errors) - - # Old V7 tar format represents a directory as a regular - # file with a trailing slash. - if obj.type == AREGTYPE and obj.name.endswith("/"): - obj.type = DIRTYPE - - # The old GNU sparse format occupies some of the unused - # space in the buffer for up to 4 sparse structures. - # Save the them for later processing in _proc_sparse(). - if obj.type == GNUTYPE_SPARSE: - pos = 386 - structs = [] - for i in range(4): - try: - offset = nti(buf[pos:pos + 12]) - numbytes = nti(buf[pos + 12:pos + 24]) - except ValueError: - break - structs.append((offset, numbytes)) - pos += 24 - isextended = bool(buf[482]) - origsize = nti(buf[483:495]) - obj._sparse_structs = (structs, isextended, origsize) - - # Remove redundant slashes from directories. - if obj.isdir(): - obj.name = obj.name.rstrip("/") - - # Reconstruct a ustar longname. - if prefix and obj.type not in GNU_TYPES: - obj.name = prefix + "/" + obj.name - return obj - - @classmethod - def fromtarfile(cls, tarfile): - """Return the next TarInfo object from TarFile object - tarfile. - """ - buf = tarfile.fileobj.read(BLOCKSIZE) - obj = cls.frombuf(buf, tarfile.encoding, tarfile.errors) - obj.offset = tarfile.fileobj.tell() - BLOCKSIZE - return obj._proc_member(tarfile) - - #-------------------------------------------------------------------------- - # The following are methods that are called depending on the type of a - # member. The entry point is _proc_member() which can be overridden in a - # subclass to add custom _proc_*() methods. A _proc_*() method MUST - # implement the following - # operations: - # 1. Set self.offset_data to the position where the data blocks begin, - # if there is data that follows. - # 2. Set tarfile.offset to the position where the next member's header will - # begin. - # 3. Return self or another valid TarInfo object. - def _proc_member(self, tarfile): - """Choose the right processing method depending on - the type and call it. - """ - if self.type in (GNUTYPE_LONGNAME, GNUTYPE_LONGLINK): - return self._proc_gnulong(tarfile) - elif self.type == GNUTYPE_SPARSE: - return self._proc_sparse(tarfile) - elif self.type in (XHDTYPE, XGLTYPE, SOLARIS_XHDTYPE): - return self._proc_pax(tarfile) - else: - return self._proc_builtin(tarfile) - - def _proc_builtin(self, tarfile): - """Process a builtin type or an unknown type which - will be treated as a regular file. - """ - self.offset_data = tarfile.fileobj.tell() - offset = self.offset_data - if self.isreg() or self.type not in SUPPORTED_TYPES: - # Skip the following data blocks. - offset += self._block(self.size) - tarfile.offset = offset - - # Patch the TarInfo object with saved global - # header information. - self._apply_pax_info(tarfile.pax_headers, tarfile.encoding, tarfile.errors) - - return self - - def _proc_gnulong(self, tarfile): - """Process the blocks that hold a GNU longname - or longlink member. - """ - buf = tarfile.fileobj.read(self._block(self.size)) - - # Fetch the next header and process it. - try: - next = self.fromtarfile(tarfile) - except HeaderError: - raise SubsequentHeaderError("missing or bad subsequent header") - - # Patch the TarInfo object from the next header with - # the longname information. - next.offset = self.offset - if self.type == GNUTYPE_LONGNAME: - next.name = nts(buf, tarfile.encoding, tarfile.errors) - elif self.type == GNUTYPE_LONGLINK: - next.linkname = nts(buf, tarfile.encoding, tarfile.errors) - - return next - - def _proc_sparse(self, tarfile): - """Process a GNU sparse header plus extra headers. - """ - # We already collected some sparse structures in frombuf(). - structs, isextended, origsize = self._sparse_structs - del self._sparse_structs - - # Collect sparse structures from extended header blocks. - while isextended: - buf = tarfile.fileobj.read(BLOCKSIZE) - pos = 0 - for i in range(21): - try: - offset = nti(buf[pos:pos + 12]) - numbytes = nti(buf[pos + 12:pos + 24]) - except ValueError: - break - if offset and numbytes: - structs.append((offset, numbytes)) - pos += 24 - isextended = bool(buf[504]) - self.sparse = structs - - self.offset_data = tarfile.fileobj.tell() - tarfile.offset = self.offset_data + self._block(self.size) - self.size = origsize - return self - - def _proc_pax(self, tarfile): - """Process an extended or global header as described in - POSIX.1-2008. - """ - # Read the header information. - buf = tarfile.fileobj.read(self._block(self.size)) - - # A pax header stores supplemental information for either - # the following file (extended) or all following files - # (global). - if self.type == XGLTYPE: - pax_headers = tarfile.pax_headers - else: - pax_headers = tarfile.pax_headers.copy() - - # Check if the pax header contains a hdrcharset field. This tells us - # the encoding of the path, linkpath, uname and gname fields. Normally, - # these fields are UTF-8 encoded but since POSIX.1-2008 tar - # implementations are allowed to store them as raw binary strings if - # the translation to UTF-8 fails. - match = re.search(br"\d+ hdrcharset=([^\n]+)\n", buf) - if match is not None: - pax_headers["hdrcharset"] = match.group(1).decode("utf8") - - # For the time being, we don't care about anything other than "BINARY". - # The only other value that is currently allowed by the standard is - # "ISO-IR 10646 2000 UTF-8" in other words UTF-8. - hdrcharset = pax_headers.get("hdrcharset") - if hdrcharset == "BINARY": - encoding = tarfile.encoding - else: - encoding = "utf8" - - # Parse pax header information. A record looks like that: - # "%d %s=%s\n" % (length, keyword, value). length is the size - # of the complete record including the length field itself and - # the newline. keyword and value are both UTF-8 encoded strings. - regex = re.compile(br"(\d+) ([^=]+)=") - pos = 0 - while True: - match = regex.match(buf, pos) - if not match: - break - - length, keyword = match.groups() - length = int(length) - value = buf[match.end(2) + 1:match.start(1) + length - 1] - - # Normally, we could just use "utf8" as the encoding and "strict" - # as the error handler, but we better not take the risk. For - # example, GNU tar <= 1.23 is known to store filenames it cannot - # translate to UTF-8 as raw strings (unfortunately without a - # hdrcharset=BINARY header). - # We first try the strict standard encoding, and if that fails we - # fall back on the user's encoding and error handler. - keyword = self._decode_pax_field(keyword, "utf8", "utf8", - tarfile.errors) - if keyword in PAX_NAME_FIELDS: - value = self._decode_pax_field(value, encoding, tarfile.encoding, - tarfile.errors) - else: - value = self._decode_pax_field(value, "utf8", "utf8", - tarfile.errors) - - pax_headers[keyword] = value - pos += length - - # Fetch the next header. - try: - next = self.fromtarfile(tarfile) - except HeaderError: - raise SubsequentHeaderError("missing or bad subsequent header") - - # Process GNU sparse information. - if "GNU.sparse.map" in pax_headers: - # GNU extended sparse format version 0.1. - self._proc_gnusparse_01(next, pax_headers) - - elif "GNU.sparse.size" in pax_headers: - # GNU extended sparse format version 0.0. - self._proc_gnusparse_00(next, pax_headers, buf) - - elif pax_headers.get("GNU.sparse.major") == "1" and pax_headers.get("GNU.sparse.minor") == "0": - # GNU extended sparse format version 1.0. - self._proc_gnusparse_10(next, pax_headers, tarfile) - - if self.type in (XHDTYPE, SOLARIS_XHDTYPE): - # Patch the TarInfo object with the extended header info. - next._apply_pax_info(pax_headers, tarfile.encoding, tarfile.errors) - next.offset = self.offset - - if "size" in pax_headers: - # If the extended header replaces the size field, - # we need to recalculate the offset where the next - # header starts. - offset = next.offset_data - if next.isreg() or next.type not in SUPPORTED_TYPES: - offset += next._block(next.size) - tarfile.offset = offset - - return next - - def _proc_gnusparse_00(self, next, pax_headers, buf): - """Process a GNU tar extended sparse header, version 0.0. - """ - offsets = [] - for match in re.finditer(br"\d+ GNU.sparse.offset=(\d+)\n", buf): - offsets.append(int(match.group(1))) - numbytes = [] - for match in re.finditer(br"\d+ GNU.sparse.numbytes=(\d+)\n", buf): - numbytes.append(int(match.group(1))) - next.sparse = list(zip(offsets, numbytes)) - - def _proc_gnusparse_01(self, next, pax_headers): - """Process a GNU tar extended sparse header, version 0.1. - """ - sparse = [int(x) for x in pax_headers["GNU.sparse.map"].split(",")] - next.sparse = list(zip(sparse[::2], sparse[1::2])) - - def _proc_gnusparse_10(self, next, pax_headers, tarfile): - """Process a GNU tar extended sparse header, version 1.0. - """ - fields = None - sparse = [] - buf = tarfile.fileobj.read(BLOCKSIZE) - fields, buf = buf.split(b"\n", 1) - fields = int(fields) - while len(sparse) < fields * 2: - if b"\n" not in buf: - buf += tarfile.fileobj.read(BLOCKSIZE) - number, buf = buf.split(b"\n", 1) - sparse.append(int(number)) - next.offset_data = tarfile.fileobj.tell() - next.sparse = list(zip(sparse[::2], sparse[1::2])) - - def _apply_pax_info(self, pax_headers, encoding, errors): - """Replace fields with supplemental information from a previous - pax extended or global header. - """ - for keyword, value in pax_headers.items(): - if keyword == "GNU.sparse.name": - setattr(self, "path", value) - elif keyword == "GNU.sparse.size": - setattr(self, "size", int(value)) - elif keyword == "GNU.sparse.realsize": - setattr(self, "size", int(value)) - elif keyword in PAX_FIELDS: - if keyword in PAX_NUMBER_FIELDS: - try: - value = PAX_NUMBER_FIELDS[keyword](value) - except ValueError: - value = 0 - if keyword == "path": - value = value.rstrip("/") - setattr(self, keyword, value) - - self.pax_headers = pax_headers.copy() - - def _decode_pax_field(self, value, encoding, fallback_encoding, fallback_errors): - """Decode a single field from a pax record. - """ - try: - return value.decode(encoding, "strict") - except UnicodeDecodeError: - return value.decode(fallback_encoding, fallback_errors) - - def _block(self, count): - """Round up a byte count by BLOCKSIZE and return it, - e.g. _block(834) => 1024. - """ - blocks, remainder = divmod(count, BLOCKSIZE) - if remainder: - blocks += 1 - return blocks * BLOCKSIZE - - def isreg(self): - return self.type in REGULAR_TYPES - def isfile(self): - return self.isreg() - def isdir(self): - return self.type == DIRTYPE - def issym(self): - return self.type == SYMTYPE - def islnk(self): - return self.type == LNKTYPE - def ischr(self): - return self.type == CHRTYPE - def isblk(self): - return self.type == BLKTYPE - def isfifo(self): - return self.type == FIFOTYPE - def issparse(self): - return self.sparse is not None - def isdev(self): - return self.type in (CHRTYPE, BLKTYPE, FIFOTYPE) -# class TarInfo - -class TarFile(object): - """The TarFile Class provides an interface to tar archives. - """ - - debug = 0 # May be set from 0 (no msgs) to 3 (all msgs) - - dereference = False # If true, add content of linked file to the - # tar file, else the link. - - ignore_zeros = False # If true, skips empty or invalid blocks and - # continues processing. - - errorlevel = 1 # If 0, fatal errors only appear in debug - # messages (if debug >= 0). If > 0, errors - # are passed to the caller as exceptions. - - format = DEFAULT_FORMAT # The format to use when creating an archive. - - encoding = ENCODING # Encoding for 8-bit character strings. - - errors = None # Error handler for unicode conversion. - - tarinfo = TarInfo # The default TarInfo class to use. - - fileobject = ExFileObject # The default ExFileObject class to use. - - def __init__(self, name=None, mode="r", fileobj=None, format=None, - tarinfo=None, dereference=None, ignore_zeros=None, encoding=None, - errors="surrogateescape", pax_headers=None, debug=None, errorlevel=None): - """Open an (uncompressed) tar archive `name'. `mode' is either 'r' to - read from an existing archive, 'a' to append data to an existing - file or 'w' to create a new file overwriting an existing one. `mode' - defaults to 'r'. - If `fileobj' is given, it is used for reading or writing data. If it - can be determined, `mode' is overridden by `fileobj's mode. - `fileobj' is not closed, when TarFile is closed. - """ - if len(mode) > 1 or mode not in "raw": - raise ValueError("mode must be 'r', 'a' or 'w'") - self.mode = mode - self._mode = {"r": "rb", "a": "r+b", "w": "wb"}[mode] - - if not fileobj: - if self.mode == "a" and not os.path.exists(name): - # Create nonexistent files in append mode. - self.mode = "w" - self._mode = "wb" - fileobj = bltn_open(name, self._mode) - self._extfileobj = False - else: - if name is None and hasattr(fileobj, "name"): - name = fileobj.name - if hasattr(fileobj, "mode"): - self._mode = fileobj.mode - self._extfileobj = True - self.name = os.path.abspath(name) if name else None - self.fileobj = fileobj - - # Init attributes. - if format is not None: - self.format = format - if tarinfo is not None: - self.tarinfo = tarinfo - if dereference is not None: - self.dereference = dereference - if ignore_zeros is not None: - self.ignore_zeros = ignore_zeros - if encoding is not None: - self.encoding = encoding - self.errors = errors - - if pax_headers is not None and self.format == PAX_FORMAT: - self.pax_headers = pax_headers - else: - self.pax_headers = {} - - if debug is not None: - self.debug = debug - if errorlevel is not None: - self.errorlevel = errorlevel - - # Init datastructures. - self.closed = False - self.members = [] # list of members as TarInfo objects - self._loaded = False # flag if all members have been read - self.offset = self.fileobj.tell() - # current position in the archive file - self.inodes = {} # dictionary caching the inodes of - # archive members already added - - try: - if self.mode == "r": - self.firstmember = None - self.firstmember = self.next() - - if self.mode == "a": - # Move to the end of the archive, - # before the first empty block. - while True: - self.fileobj.seek(self.offset) - try: - tarinfo = self.tarinfo.fromtarfile(self) - self.members.append(tarinfo) - except EOFHeaderError: - self.fileobj.seek(self.offset) - break - except HeaderError as e: - raise ReadError(str(e)) - - if self.mode in "aw": - self._loaded = True - - if self.pax_headers: - buf = self.tarinfo.create_pax_global_header(self.pax_headers.copy()) - self.fileobj.write(buf) - self.offset += len(buf) - except: - if not self._extfileobj: - self.fileobj.close() - self.closed = True - raise - - #-------------------------------------------------------------------------- - # Below are the classmethods which act as alternate constructors to the - # TarFile class. The open() method is the only one that is needed for - # public use; it is the "super"-constructor and is able to select an - # adequate "sub"-constructor for a particular compression using the mapping - # from OPEN_METH. - # - # This concept allows one to subclass TarFile without losing the comfort of - # the super-constructor. A sub-constructor is registered and made available - # by adding it to the mapping in OPEN_METH. - - @classmethod - def open(cls, name=None, mode="r", fileobj=None, bufsize=RECORDSIZE, **kwargs): - """Open a tar archive for reading, writing or appending. Return - an appropriate TarFile class. - - mode: - 'r' or 'r:*' open for reading with transparent compression - 'r:' open for reading exclusively uncompressed - 'r:gz' open for reading with gzip compression - 'r:bz2' open for reading with bzip2 compression - 'a' or 'a:' open for appending, creating the file if necessary - 'w' or 'w:' open for writing without compression - 'w:gz' open for writing with gzip compression - 'w:bz2' open for writing with bzip2 compression - - 'r|*' open a stream of tar blocks with transparent compression - 'r|' open an uncompressed stream of tar blocks for reading - 'r|gz' open a gzip compressed stream of tar blocks - 'r|bz2' open a bzip2 compressed stream of tar blocks - 'w|' open an uncompressed stream for writing - 'w|gz' open a gzip compressed stream for writing - 'w|bz2' open a bzip2 compressed stream for writing - """ - - if not name and not fileobj: - raise ValueError("nothing to open") - - if mode in ("r", "r:*"): - # Find out which *open() is appropriate for opening the file. - for comptype in cls.OPEN_METH: - func = getattr(cls, cls.OPEN_METH[comptype]) - if fileobj is not None: - saved_pos = fileobj.tell() - try: - return func(name, "r", fileobj, **kwargs) - except (ReadError, CompressionError) as e: - if fileobj is not None: - fileobj.seek(saved_pos) - continue - raise ReadError("file could not be opened successfully") - - elif ":" in mode: - filemode, comptype = mode.split(":", 1) - filemode = filemode or "r" - comptype = comptype or "tar" - - # Select the *open() function according to - # given compression. - if comptype in cls.OPEN_METH: - func = getattr(cls, cls.OPEN_METH[comptype]) - else: - raise CompressionError("unknown compression type %r" % comptype) - return func(name, filemode, fileobj, **kwargs) - - elif "|" in mode: - filemode, comptype = mode.split("|", 1) - filemode = filemode or "r" - comptype = comptype or "tar" - - if filemode not in "rw": - raise ValueError("mode must be 'r' or 'w'") - - stream = _Stream(name, filemode, comptype, fileobj, bufsize) - try: - t = cls(name, filemode, stream, **kwargs) - except: - stream.close() - raise - t._extfileobj = False - return t - - elif mode in "aw": - return cls.taropen(name, mode, fileobj, **kwargs) - - raise ValueError("undiscernible mode") - - @classmethod - def taropen(cls, name, mode="r", fileobj=None, **kwargs): - """Open uncompressed tar archive name for reading or writing. - """ - if len(mode) > 1 or mode not in "raw": - raise ValueError("mode must be 'r', 'a' or 'w'") - return cls(name, mode, fileobj, **kwargs) - - @classmethod - def gzopen(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs): - """Open gzip compressed tar archive name for reading or writing. - Appending is not allowed. - """ - if len(mode) > 1 or mode not in "rw": - raise ValueError("mode must be 'r' or 'w'") - - try: - import gzip - gzip.GzipFile - except (ImportError, AttributeError): - raise CompressionError("gzip module is not available") - - extfileobj = fileobj is not None - try: - fileobj = gzip.GzipFile(name, mode + "b", compresslevel, fileobj) - t = cls.taropen(name, mode, fileobj, **kwargs) - except IOError: - if not extfileobj and fileobj is not None: - fileobj.close() - if fileobj is None: - raise - raise ReadError("not a gzip file") - except: - if not extfileobj and fileobj is not None: - fileobj.close() - raise - t._extfileobj = extfileobj - return t - - @classmethod - def bz2open(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs): - """Open bzip2 compressed tar archive name for reading or writing. - Appending is not allowed. - """ - if len(mode) > 1 or mode not in "rw": - raise ValueError("mode must be 'r' or 'w'.") - - try: - import bz2 - except ImportError: - raise CompressionError("bz2 module is not available") - - if fileobj is not None: - fileobj = _BZ2Proxy(fileobj, mode) - else: - fileobj = bz2.BZ2File(name, mode, compresslevel=compresslevel) - - try: - t = cls.taropen(name, mode, fileobj, **kwargs) - except (IOError, EOFError): - fileobj.close() - raise ReadError("not a bzip2 file") - t._extfileobj = False - return t - - # All *open() methods are registered here. - OPEN_METH = { - "tar": "taropen", # uncompressed tar - "gz": "gzopen", # gzip compressed tar - "bz2": "bz2open" # bzip2 compressed tar - } - - #-------------------------------------------------------------------------- - # The public methods which TarFile provides: - - def close(self): - """Close the TarFile. In write-mode, two finishing zero blocks are - appended to the archive. - """ - if self.closed: - return - - if self.mode in "aw": - self.fileobj.write(NUL * (BLOCKSIZE * 2)) - self.offset += (BLOCKSIZE * 2) - # fill up the end with zero-blocks - # (like option -b20 for tar does) - blocks, remainder = divmod(self.offset, RECORDSIZE) - if remainder > 0: - self.fileobj.write(NUL * (RECORDSIZE - remainder)) - - if not self._extfileobj: - self.fileobj.close() - self.closed = True - - def getmember(self, name): - """Return a TarInfo object for member `name'. If `name' can not be - found in the archive, KeyError is raised. If a member occurs more - than once in the archive, its last occurrence is assumed to be the - most up-to-date version. - """ - tarinfo = self._getmember(name) - if tarinfo is None: - raise KeyError("filename %r not found" % name) - return tarinfo - - def getmembers(self): - """Return the members of the archive as a list of TarInfo objects. The - list has the same order as the members in the archive. - """ - self._check() - if not self._loaded: # if we want to obtain a list of - self._load() # all members, we first have to - # scan the whole archive. - return self.members - - def getnames(self): - """Return the members of the archive as a list of their names. It has - the same order as the list returned by getmembers(). - """ - return [tarinfo.name for tarinfo in self.getmembers()] - - def gettarinfo(self, name=None, arcname=None, fileobj=None): - """Create a TarInfo object for either the file `name' or the file - object `fileobj' (using os.fstat on its file descriptor). You can - modify some of the TarInfo's attributes before you add it using - addfile(). If given, `arcname' specifies an alternative name for the - file in the archive. - """ - self._check("aw") - - # When fileobj is given, replace name by - # fileobj's real name. - if fileobj is not None: - name = fileobj.name - - # Building the name of the member in the archive. - # Backward slashes are converted to forward slashes, - # Absolute paths are turned to relative paths. - if arcname is None: - arcname = name - drv, arcname = os.path.splitdrive(arcname) - arcname = arcname.replace(os.sep, "/") - arcname = arcname.lstrip("/") - - # Now, fill the TarInfo object with - # information specific for the file. - tarinfo = self.tarinfo() - tarinfo.tarfile = self - - # Use os.stat or os.lstat, depending on platform - # and if symlinks shall be resolved. - if fileobj is None: - if hasattr(os, "lstat") and not self.dereference: - statres = os.lstat(name) - else: - statres = os.stat(name) - else: - statres = os.fstat(fileobj.fileno()) - linkname = "" - - stmd = statres.st_mode - if stat.S_ISREG(stmd): - inode = (statres.st_ino, statres.st_dev) - if not self.dereference and statres.st_nlink > 1 and \ - inode in self.inodes and arcname != self.inodes[inode]: - # Is it a hardlink to an already - # archived file? - type = LNKTYPE - linkname = self.inodes[inode] - else: - # The inode is added only if its valid. - # For win32 it is always 0. - type = REGTYPE - if inode[0]: - self.inodes[inode] = arcname - elif stat.S_ISDIR(stmd): - type = DIRTYPE - elif stat.S_ISFIFO(stmd): - type = FIFOTYPE - elif stat.S_ISLNK(stmd): - type = SYMTYPE - linkname = os.readlink(name) - elif stat.S_ISCHR(stmd): - type = CHRTYPE - elif stat.S_ISBLK(stmd): - type = BLKTYPE - else: - return None - - # Fill the TarInfo object with all - # information we can get. - tarinfo.name = arcname - tarinfo.mode = stmd - tarinfo.uid = statres.st_uid - tarinfo.gid = statres.st_gid - if type == REGTYPE: - tarinfo.size = statres.st_size - else: - tarinfo.size = 0 - tarinfo.mtime = statres.st_mtime - tarinfo.type = type - tarinfo.linkname = linkname - if pwd: - try: - tarinfo.uname = pwd.getpwuid(tarinfo.uid)[0] - except KeyError: - pass - if grp: - try: - tarinfo.gname = grp.getgrgid(tarinfo.gid)[0] - except KeyError: - pass - - if type in (CHRTYPE, BLKTYPE): - if hasattr(os, "major") and hasattr(os, "minor"): - tarinfo.devmajor = os.major(statres.st_rdev) - tarinfo.devminor = os.minor(statres.st_rdev) - return tarinfo - - def list(self, verbose=True): - """Print a table of contents to sys.stdout. If `verbose' is False, only - the names of the members are printed. If it is True, an `ls -l'-like - output is produced. - """ - self._check() - - for tarinfo in self: - if verbose: - print(filemode(tarinfo.mode), end=' ') - print("%s/%s" % (tarinfo.uname or tarinfo.uid, - tarinfo.gname or tarinfo.gid), end=' ') - if tarinfo.ischr() or tarinfo.isblk(): - print("%10s" % ("%d,%d" \ - % (tarinfo.devmajor, tarinfo.devminor)), end=' ') - else: - print("%10d" % tarinfo.size, end=' ') - print("%d-%02d-%02d %02d:%02d:%02d" \ - % time.localtime(tarinfo.mtime)[:6], end=' ') - - print(tarinfo.name + ("/" if tarinfo.isdir() else ""), end=' ') - - if verbose: - if tarinfo.issym(): - print("->", tarinfo.linkname, end=' ') - if tarinfo.islnk(): - print("link to", tarinfo.linkname, end=' ') - print() - - def add(self, name, arcname=None, recursive=True, exclude=None, filter=None): - """Add the file `name' to the archive. `name' may be any type of file - (directory, fifo, symbolic link, etc.). If given, `arcname' - specifies an alternative name for the file in the archive. - Directories are added recursively by default. This can be avoided by - setting `recursive' to False. `exclude' is a function that should - return True for each filename to be excluded. `filter' is a function - that expects a TarInfo object argument and returns the changed - TarInfo object, if it returns None the TarInfo object will be - excluded from the archive. - """ - self._check("aw") - - if arcname is None: - arcname = name - - # Exclude pathnames. - if exclude is not None: - import warnings - warnings.warn("use the filter argument instead", - DeprecationWarning, 2) - if exclude(name): - self._dbg(2, "tarfile: Excluded %r" % name) - return - - # Skip if somebody tries to archive the archive... - if self.name is not None and os.path.abspath(name) == self.name: - self._dbg(2, "tarfile: Skipped %r" % name) - return - - self._dbg(1, name) - - # Create a TarInfo object from the file. - tarinfo = self.gettarinfo(name, arcname) - - if tarinfo is None: - self._dbg(1, "tarfile: Unsupported type %r" % name) - return - - # Change or exclude the TarInfo object. - if filter is not None: - tarinfo = filter(tarinfo) - if tarinfo is None: - self._dbg(2, "tarfile: Excluded %r" % name) - return - - # Append the tar header and data to the archive. - if tarinfo.isreg(): - f = bltn_open(name, "rb") - self.addfile(tarinfo, f) - f.close() - - elif tarinfo.isdir(): - self.addfile(tarinfo) - if recursive: - for f in os.listdir(name): - self.add(os.path.join(name, f), os.path.join(arcname, f), - recursive, exclude, filter=filter) - - else: - self.addfile(tarinfo) - - def addfile(self, tarinfo, fileobj=None): - """Add the TarInfo object `tarinfo' to the archive. If `fileobj' is - given, tarinfo.size bytes are read from it and added to the archive. - You can create TarInfo objects using gettarinfo(). - On Windows platforms, `fileobj' should always be opened with mode - 'rb' to avoid irritation about the file size. - """ - self._check("aw") - - tarinfo = copy.copy(tarinfo) - - buf = tarinfo.tobuf(self.format, self.encoding, self.errors) - self.fileobj.write(buf) - self.offset += len(buf) - - # If there's data to follow, append it. - if fileobj is not None: - copyfileobj(fileobj, self.fileobj, tarinfo.size) - blocks, remainder = divmod(tarinfo.size, BLOCKSIZE) - if remainder > 0: - self.fileobj.write(NUL * (BLOCKSIZE - remainder)) - blocks += 1 - self.offset += blocks * BLOCKSIZE - - self.members.append(tarinfo) - - def extractall(self, path=".", members=None): - """Extract all members from the archive to the current working - directory and set owner, modification time and permissions on - directories afterwards. `path' specifies a different directory - to extract to. `members' is optional and must be a subset of the - list returned by getmembers(). - """ - directories = [] - - if members is None: - members = self - - for tarinfo in members: - if tarinfo.isdir(): - # Extract directories with a safe mode. - directories.append(tarinfo) - tarinfo = copy.copy(tarinfo) - tarinfo.mode = 0o700 - # Do not set_attrs directories, as we will do that further down - self.extract(tarinfo, path, set_attrs=not tarinfo.isdir()) - - # Reverse sort directories. - directories.sort(key=lambda a: a.name) - directories.reverse() - - # Set correct owner, mtime and filemode on directories. - for tarinfo in directories: - dirpath = os.path.join(path, tarinfo.name) - try: - self.chown(tarinfo, dirpath) - self.utime(tarinfo, dirpath) - self.chmod(tarinfo, dirpath) - except ExtractError as e: - if self.errorlevel > 1: - raise - else: - self._dbg(1, "tarfile: %s" % e) - - def extract(self, member, path="", set_attrs=True): - """Extract a member from the archive to the current working directory, - using its full name. Its file information is extracted as accurately - as possible. `member' may be a filename or a TarInfo object. You can - specify a different directory using `path'. File attributes (owner, - mtime, mode) are set unless `set_attrs' is False. - """ - self._check("r") - - if isinstance(member, str): - tarinfo = self.getmember(member) - else: - tarinfo = member - - # Prepare the link target for makelink(). - if tarinfo.islnk(): - tarinfo._link_target = os.path.join(path, tarinfo.linkname) - - try: - self._extract_member(tarinfo, os.path.join(path, tarinfo.name), - set_attrs=set_attrs) - except EnvironmentError as e: - if self.errorlevel > 0: - raise - else: - if e.filename is None: - self._dbg(1, "tarfile: %s" % e.strerror) - else: - self._dbg(1, "tarfile: %s %r" % (e.strerror, e.filename)) - except ExtractError as e: - if self.errorlevel > 1: - raise - else: - self._dbg(1, "tarfile: %s" % e) - - def extractfile(self, member): - """Extract a member from the archive as a file object. `member' may be - a filename or a TarInfo object. If `member' is a regular file, a - file-like object is returned. If `member' is a link, a file-like - object is constructed from the link's target. If `member' is none of - the above, None is returned. - The file-like object is read-only and provides the following - methods: read(), readline(), readlines(), seek() and tell() - """ - self._check("r") - - if isinstance(member, str): - tarinfo = self.getmember(member) - else: - tarinfo = member - - if tarinfo.isreg(): - return self.fileobject(self, tarinfo) - - elif tarinfo.type not in SUPPORTED_TYPES: - # If a member's type is unknown, it is treated as a - # regular file. - return self.fileobject(self, tarinfo) - - elif tarinfo.islnk() or tarinfo.issym(): - if isinstance(self.fileobj, _Stream): - # A small but ugly workaround for the case that someone tries - # to extract a (sym)link as a file-object from a non-seekable - # stream of tar blocks. - raise StreamError("cannot extract (sym)link as file object") - else: - # A (sym)link's file object is its target's file object. - return self.extractfile(self._find_link_target(tarinfo)) - else: - # If there's no data associated with the member (directory, chrdev, - # blkdev, etc.), return None instead of a file object. - return None - - def _extract_member(self, tarinfo, targetpath, set_attrs=True): - """Extract the TarInfo object tarinfo to a physical - file called targetpath. - """ - # Fetch the TarInfo object for the given name - # and build the destination pathname, replacing - # forward slashes to platform specific separators. - targetpath = targetpath.rstrip("/") - targetpath = targetpath.replace("/", os.sep) - - # Create all upper directories. - upperdirs = os.path.dirname(targetpath) - if upperdirs and not os.path.exists(upperdirs): - # Create directories that are not part of the archive with - # default permissions. - os.makedirs(upperdirs) - - if tarinfo.islnk() or tarinfo.issym(): - self._dbg(1, "%s -> %s" % (tarinfo.name, tarinfo.linkname)) - else: - self._dbg(1, tarinfo.name) - - if tarinfo.isreg(): - self.makefile(tarinfo, targetpath) - elif tarinfo.isdir(): - self.makedir(tarinfo, targetpath) - elif tarinfo.isfifo(): - self.makefifo(tarinfo, targetpath) - elif tarinfo.ischr() or tarinfo.isblk(): - self.makedev(tarinfo, targetpath) - elif tarinfo.islnk() or tarinfo.issym(): - self.makelink(tarinfo, targetpath) - elif tarinfo.type not in SUPPORTED_TYPES: - self.makeunknown(tarinfo, targetpath) - else: - self.makefile(tarinfo, targetpath) - - if set_attrs: - self.chown(tarinfo, targetpath) - if not tarinfo.issym(): - self.chmod(tarinfo, targetpath) - self.utime(tarinfo, targetpath) - - #-------------------------------------------------------------------------- - # Below are the different file methods. They are called via - # _extract_member() when extract() is called. They can be replaced in a - # subclass to implement other functionality. - - def makedir(self, tarinfo, targetpath): - """Make a directory called targetpath. - """ - try: - # Use a safe mode for the directory, the real mode is set - # later in _extract_member(). - os.mkdir(targetpath, 0o700) - except EnvironmentError as e: - if e.errno != errno.EEXIST: - raise - - def makefile(self, tarinfo, targetpath): - """Make a file called targetpath. - """ - source = self.fileobj - source.seek(tarinfo.offset_data) - target = bltn_open(targetpath, "wb") - if tarinfo.sparse is not None: - for offset, size in tarinfo.sparse: - target.seek(offset) - copyfileobj(source, target, size) - else: - copyfileobj(source, target, tarinfo.size) - target.seek(tarinfo.size) - target.truncate() - target.close() - - def makeunknown(self, tarinfo, targetpath): - """Make a file from a TarInfo object with an unknown type - at targetpath. - """ - self.makefile(tarinfo, targetpath) - self._dbg(1, "tarfile: Unknown file type %r, " \ - "extracted as regular file." % tarinfo.type) - - def makefifo(self, tarinfo, targetpath): - """Make a fifo called targetpath. - """ - if hasattr(os, "mkfifo"): - os.mkfifo(targetpath) - else: - raise ExtractError("fifo not supported by system") - - def makedev(self, tarinfo, targetpath): - """Make a character or block device called targetpath. - """ - if not hasattr(os, "mknod") or not hasattr(os, "makedev"): - raise ExtractError("special devices not supported by system") - - mode = tarinfo.mode - if tarinfo.isblk(): - mode |= stat.S_IFBLK - else: - mode |= stat.S_IFCHR - - os.mknod(targetpath, mode, - os.makedev(tarinfo.devmajor, tarinfo.devminor)) - - def makelink(self, tarinfo, targetpath): - """Make a (symbolic) link called targetpath. If it cannot be created - (platform limitation), we try to make a copy of the referenced file - instead of a link. - """ - try: - # For systems that support symbolic and hard links. - if tarinfo.issym(): - os.symlink(tarinfo.linkname, targetpath) - else: - # See extract(). - if os.path.exists(tarinfo._link_target): - os.link(tarinfo._link_target, targetpath) - else: - self._extract_member(self._find_link_target(tarinfo), - targetpath) - except symlink_exception: - if tarinfo.issym(): - linkpath = os.path.join(os.path.dirname(tarinfo.name), - tarinfo.linkname) - else: - linkpath = tarinfo.linkname - else: - try: - self._extract_member(self._find_link_target(tarinfo), - targetpath) - except KeyError: - raise ExtractError("unable to resolve link inside archive") - - def chown(self, tarinfo, targetpath): - """Set owner of targetpath according to tarinfo. - """ - if pwd and hasattr(os, "geteuid") and os.geteuid() == 0: - # We have to be root to do so. - try: - g = grp.getgrnam(tarinfo.gname)[2] - except KeyError: - g = tarinfo.gid - try: - u = pwd.getpwnam(tarinfo.uname)[2] - except KeyError: - u = tarinfo.uid - try: - if tarinfo.issym() and hasattr(os, "lchown"): - os.lchown(targetpath, u, g) - else: - if sys.platform != "os2emx": - os.chown(targetpath, u, g) - except EnvironmentError as e: - raise ExtractError("could not change owner") - - def chmod(self, tarinfo, targetpath): - """Set file permissions of targetpath according to tarinfo. - """ - if hasattr(os, 'chmod'): - try: - os.chmod(targetpath, tarinfo.mode) - except EnvironmentError as e: - raise ExtractError("could not change mode") - - def utime(self, tarinfo, targetpath): - """Set modification time of targetpath according to tarinfo. - """ - if not hasattr(os, 'utime'): - return - try: - os.utime(targetpath, (tarinfo.mtime, tarinfo.mtime)) - except EnvironmentError as e: - raise ExtractError("could not change modification time") - - #-------------------------------------------------------------------------- - def next(self): - """Return the next member of the archive as a TarInfo object, when - TarFile is opened for reading. Return None if there is no more - available. - """ - self._check("ra") - if self.firstmember is not None: - m = self.firstmember - self.firstmember = None - return m - - # Read the next block. - self.fileobj.seek(self.offset) - tarinfo = None - while True: - try: - tarinfo = self.tarinfo.fromtarfile(self) - except EOFHeaderError as e: - if self.ignore_zeros: - self._dbg(2, "0x%X: %s" % (self.offset, e)) - self.offset += BLOCKSIZE - continue - except InvalidHeaderError as e: - if self.ignore_zeros: - self._dbg(2, "0x%X: %s" % (self.offset, e)) - self.offset += BLOCKSIZE - continue - elif self.offset == 0: - raise ReadError(str(e)) - except EmptyHeaderError: - if self.offset == 0: - raise ReadError("empty file") - except TruncatedHeaderError as e: - if self.offset == 0: - raise ReadError(str(e)) - except SubsequentHeaderError as e: - raise ReadError(str(e)) - break - - if tarinfo is not None: - self.members.append(tarinfo) - else: - self._loaded = True - - return tarinfo - - #-------------------------------------------------------------------------- - # Little helper methods: - - def _getmember(self, name, tarinfo=None, normalize=False): - """Find an archive member by name from bottom to top. - If tarinfo is given, it is used as the starting point. - """ - # Ensure that all members have been loaded. - members = self.getmembers() - - # Limit the member search list up to tarinfo. - if tarinfo is not None: - members = members[:members.index(tarinfo)] - - if normalize: - name = os.path.normpath(name) - - for member in reversed(members): - if normalize: - member_name = os.path.normpath(member.name) - else: - member_name = member.name - - if name == member_name: - return member - - def _load(self): - """Read through the entire archive file and look for readable - members. - """ - while True: - tarinfo = self.next() - if tarinfo is None: - break - self._loaded = True - - def _check(self, mode=None): - """Check if TarFile is still open, and if the operation's mode - corresponds to TarFile's mode. - """ - if self.closed: - raise IOError("%s is closed" % self.__class__.__name__) - if mode is not None and self.mode not in mode: - raise IOError("bad operation for mode %r" % self.mode) - - def _find_link_target(self, tarinfo): - """Find the target member of a symlink or hardlink member in the - archive. - """ - if tarinfo.issym(): - # Always search the entire archive. - linkname = os.path.dirname(tarinfo.name) + "/" + tarinfo.linkname - limit = None - else: - # Search the archive before the link, because a hard link is - # just a reference to an already archived file. - linkname = tarinfo.linkname - limit = tarinfo - - member = self._getmember(linkname, tarinfo=limit, normalize=True) - if member is None: - raise KeyError("linkname %r not found" % linkname) - return member - - def __iter__(self): - """Provide an iterator object. - """ - if self._loaded: - return iter(self.members) - else: - return TarIter(self) - - def _dbg(self, level, msg): - """Write debugging output to sys.stderr. - """ - if level <= self.debug: - print(msg, file=sys.stderr) - - def __enter__(self): - self._check() - return self - - def __exit__(self, type, value, traceback): - if type is None: - self.close() - else: - # An exception occurred. We must not call close() because - # it would try to write end-of-archive blocks and padding. - if not self._extfileobj: - self.fileobj.close() - self.closed = True -# class TarFile - -class TarIter(object): - """Iterator Class. - - for tarinfo in TarFile(...): - suite... - """ - - def __init__(self, tarfile): - """Construct a TarIter object. - """ - self.tarfile = tarfile - self.index = 0 - def __iter__(self): - """Return iterator object. - """ - return self - - def __next__(self): - """Return the next item using TarFile's next() method. - When all members have been read, set TarFile as _loaded. - """ - # Fix for SF #1100429: Under rare circumstances it can - # happen that getmembers() is called during iteration, - # which will cause TarIter to stop prematurely. - if not self.tarfile._loaded: - tarinfo = self.tarfile.next() - if not tarinfo: - self.tarfile._loaded = True - raise StopIteration - else: - try: - tarinfo = self.tarfile.members[self.index] - except IndexError: - raise StopIteration - self.index += 1 - return tarinfo - - next = __next__ # for Python 2.x - -#-------------------- -# exported functions -#-------------------- -def is_tarfile(name): - """Return True if name points to a tar archive that we - are able to handle, else return False. - """ - try: - t = open(name) - t.close() - return True - except TarError: - return False - -bltn_open = open -open = TarFile.open diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/tarfile.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/tarfile.pyc deleted file mode 100644 index 34401acdb7e3f3f5c3528e106bc7c07c825f0dd3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 86950 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 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/compat.py b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/compat.py deleted file mode 100644 index ff328c8..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/compat.py +++ /dev/null @@ -1,1120 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2013-2017 Vinay Sajip. -# Licensed to the Python Software Foundation under a contributor agreement. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -from __future__ import absolute_import - -import os -import re -import sys - -try: - import ssl -except ImportError: # pragma: no cover - ssl = None - -if sys.version_info[0] < 3: # pragma: no cover - from StringIO import StringIO - string_types = basestring, - text_type = unicode - from types import FileType as file_type - import __builtin__ as builtins - import ConfigParser as configparser - from ._backport import shutil - from urlparse import urlparse, urlunparse, urljoin, urlsplit, urlunsplit - from urllib import (urlretrieve, quote as _quote, unquote, url2pathname, - pathname2url, ContentTooShortError, splittype) - - def quote(s): - if isinstance(s, unicode): - s = s.encode('utf-8') - return _quote(s) - - import urllib2 - from urllib2 import (Request, urlopen, URLError, HTTPError, - HTTPBasicAuthHandler, HTTPPasswordMgr, - HTTPHandler, HTTPRedirectHandler, - build_opener) - if ssl: - from urllib2 import HTTPSHandler - import httplib - import xmlrpclib - import Queue as queue - from HTMLParser import HTMLParser - import htmlentitydefs - raw_input = raw_input - from itertools import ifilter as filter - from itertools import ifilterfalse as filterfalse - - _userprog = None - def splituser(host): - """splituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'.""" - global _userprog - if _userprog is None: - import re - _userprog = re.compile('^(.*)@(.*)$') - - match = _userprog.match(host) - if match: return match.group(1, 2) - return None, host - -else: # pragma: no cover - from io import StringIO - string_types = str, - text_type = str - from io import TextIOWrapper as file_type - import builtins - import configparser - import shutil - from urllib.parse import (urlparse, urlunparse, urljoin, splituser, quote, - unquote, urlsplit, urlunsplit, splittype) - from urllib.request import (urlopen, urlretrieve, Request, url2pathname, - pathname2url, - HTTPBasicAuthHandler, HTTPPasswordMgr, - HTTPHandler, HTTPRedirectHandler, - build_opener) - if ssl: - from urllib.request import HTTPSHandler - from urllib.error import HTTPError, URLError, ContentTooShortError - import http.client as httplib - import urllib.request as urllib2 - import xmlrpc.client as xmlrpclib - import queue - from html.parser import HTMLParser - import html.entities as htmlentitydefs - raw_input = input - from itertools import filterfalse - filter = filter - -try: - from ssl import match_hostname, CertificateError -except ImportError: # pragma: no cover - class CertificateError(ValueError): - pass - - - def _dnsname_match(dn, hostname, max_wildcards=1): - """Matching according to RFC 6125, section 6.4.3 - - http://tools.ietf.org/html/rfc6125#section-6.4.3 - """ - pats = [] - if not dn: - return False - - parts = dn.split('.') - leftmost, remainder = parts[0], parts[1:] - - wildcards = leftmost.count('*') - if wildcards > max_wildcards: - # Issue #17980: avoid denials of service by refusing more - # than one wildcard per fragment. A survey of established - # policy among SSL implementations showed it to be a - # reasonable choice. - raise CertificateError( - "too many wildcards in certificate DNS name: " + repr(dn)) - - # speed up common case w/o wildcards - if not wildcards: - return dn.lower() == hostname.lower() - - # RFC 6125, section 6.4.3, subitem 1. - # The client SHOULD NOT attempt to match a presented identifier in which - # the wildcard character comprises a label other than the left-most label. - if leftmost == '*': - # When '*' is a fragment by itself, it matches a non-empty dotless - # fragment. - pats.append('[^.]+') - elif leftmost.startswith('xn--') or hostname.startswith('xn--'): - # RFC 6125, section 6.4.3, subitem 3. - # The client SHOULD NOT attempt to match a presented identifier - # where the wildcard character is embedded within an A-label or - # U-label of an internationalized domain name. - pats.append(re.escape(leftmost)) - else: - # Otherwise, '*' matches any dotless string, e.g. www* - pats.append(re.escape(leftmost).replace(r'\*', '[^.]*')) - - # add the remaining fragments, ignore any wildcards - for frag in remainder: - pats.append(re.escape(frag)) - - pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE) - return pat.match(hostname) - - - def match_hostname(cert, hostname): - """Verify that *cert* (in decoded format as returned by - SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125 - rules are followed, but IP addresses are not accepted for *hostname*. - - CertificateError is raised on failure. On success, the function - returns nothing. - """ - if not cert: - raise ValueError("empty or no certificate, match_hostname needs a " - "SSL socket or SSL context with either " - "CERT_OPTIONAL or CERT_REQUIRED") - dnsnames = [] - san = cert.get('subjectAltName', ()) - for key, value in san: - if key == 'DNS': - if _dnsname_match(value, hostname): - return - dnsnames.append(value) - if not dnsnames: - # The subject is only checked when there is no dNSName entry - # in subjectAltName - for sub in cert.get('subject', ()): - for key, value in sub: - # XXX according to RFC 2818, the most specific Common Name - # must be used. - if key == 'commonName': - if _dnsname_match(value, hostname): - return - dnsnames.append(value) - if len(dnsnames) > 1: - raise CertificateError("hostname %r " - "doesn't match either of %s" - % (hostname, ', '.join(map(repr, dnsnames)))) - elif len(dnsnames) == 1: - raise CertificateError("hostname %r " - "doesn't match %r" - % (hostname, dnsnames[0])) - else: - raise CertificateError("no appropriate commonName or " - "subjectAltName fields were found") - - -try: - from types import SimpleNamespace as Container -except ImportError: # pragma: no cover - class Container(object): - """ - A generic container for when multiple values need to be returned - """ - def __init__(self, **kwargs): - self.__dict__.update(kwargs) - - -try: - from shutil import which -except ImportError: # pragma: no cover - # Implementation from Python 3.3 - def which(cmd, mode=os.F_OK | os.X_OK, path=None): - """Given a command, mode, and a PATH string, return the path which - conforms to the given mode on the PATH, or None if there is no such - file. - - `mode` defaults to os.F_OK | os.X_OK. `path` defaults to the result - of os.environ.get("PATH"), or can be overridden with a custom search - path. - - """ - # Check that a given file can be accessed with the correct mode. - # Additionally check that `file` is not a directory, as on Windows - # directories pass the os.access check. - def _access_check(fn, mode): - return (os.path.exists(fn) and os.access(fn, mode) - and not os.path.isdir(fn)) - - # If we're given a path with a directory part, look it up directly rather - # than referring to PATH directories. This includes checking relative to the - # current directory, e.g. ./script - if os.path.dirname(cmd): - if _access_check(cmd, mode): - return cmd - return None - - if path is None: - path = os.environ.get("PATH", os.defpath) - if not path: - return None - path = path.split(os.pathsep) - - if sys.platform == "win32": - # The current directory takes precedence on Windows. - if not os.curdir in path: - path.insert(0, os.curdir) - - # PATHEXT is necessary to check on Windows. - pathext = os.environ.get("PATHEXT", "").split(os.pathsep) - # See if the given file matches any of the expected path extensions. - # This will allow us to short circuit when given "python.exe". - # If it does match, only test that one, otherwise we have to try - # others. - if any(cmd.lower().endswith(ext.lower()) for ext in pathext): - files = [cmd] - else: - files = [cmd + ext for ext in pathext] - else: - # On other platforms you don't have things like PATHEXT to tell you - # what file suffixes are executable, so just pass on cmd as-is. - files = [cmd] - - seen = set() - for dir in path: - normdir = os.path.normcase(dir) - if not normdir in seen: - seen.add(normdir) - for thefile in files: - name = os.path.join(dir, thefile) - if _access_check(name, mode): - return name - return None - - -# ZipFile is a context manager in 2.7, but not in 2.6 - -from zipfile import ZipFile as BaseZipFile - -if hasattr(BaseZipFile, '__enter__'): # pragma: no cover - ZipFile = BaseZipFile -else: # pragma: no cover - from zipfile import ZipExtFile as BaseZipExtFile - - class ZipExtFile(BaseZipExtFile): - def __init__(self, base): - self.__dict__.update(base.__dict__) - - def __enter__(self): - return self - - def __exit__(self, *exc_info): - self.close() - # return None, so if an exception occurred, it will propagate - - class ZipFile(BaseZipFile): - def __enter__(self): - return self - - def __exit__(self, *exc_info): - self.close() - # return None, so if an exception occurred, it will propagate - - def open(self, *args, **kwargs): - base = BaseZipFile.open(self, *args, **kwargs) - return ZipExtFile(base) - -try: - from platform import python_implementation -except ImportError: # pragma: no cover - def python_implementation(): - """Return a string identifying the Python implementation.""" - if 'PyPy' in sys.version: - return 'PyPy' - if os.name == 'java': - return 'Jython' - if sys.version.startswith('IronPython'): - return 'IronPython' - return 'CPython' - -try: - import sysconfig -except ImportError: # pragma: no cover - from ._backport import sysconfig - -try: - callable = callable -except NameError: # pragma: no cover - from collections import Callable - - def callable(obj): - return isinstance(obj, Callable) - - -try: - fsencode = os.fsencode - fsdecode = os.fsdecode -except AttributeError: # pragma: no cover - # Issue #99: on some systems (e.g. containerised), - # sys.getfilesystemencoding() returns None, and we need a real value, - # so fall back to utf-8. From the CPython 2.7 docs relating to Unix and - # sys.getfilesystemencoding(): the return value is "the user’s preference - # according to the result of nl_langinfo(CODESET), or None if the - # nl_langinfo(CODESET) failed." - _fsencoding = sys.getfilesystemencoding() or 'utf-8' - if _fsencoding == 'mbcs': - _fserrors = 'strict' - else: - _fserrors = 'surrogateescape' - - def fsencode(filename): - if isinstance(filename, bytes): - return filename - elif isinstance(filename, text_type): - return filename.encode(_fsencoding, _fserrors) - else: - raise TypeError("expect bytes or str, not %s" % - type(filename).__name__) - - def fsdecode(filename): - if isinstance(filename, text_type): - return filename - elif isinstance(filename, bytes): - return filename.decode(_fsencoding, _fserrors) - else: - raise TypeError("expect bytes or str, not %s" % - type(filename).__name__) - -try: - from tokenize import detect_encoding -except ImportError: # pragma: no cover - from codecs import BOM_UTF8, lookup - import re - - cookie_re = re.compile(r"coding[:=]\s*([-\w.]+)") - - def _get_normal_name(orig_enc): - """Imitates get_normal_name in tokenizer.c.""" - # Only care about the first 12 characters. - enc = orig_enc[:12].lower().replace("_", "-") - if enc == "utf-8" or enc.startswith("utf-8-"): - return "utf-8" - if enc in ("latin-1", "iso-8859-1", "iso-latin-1") or \ - enc.startswith(("latin-1-", "iso-8859-1-", "iso-latin-1-")): - return "iso-8859-1" - return orig_enc - - def detect_encoding(readline): - """ - The detect_encoding() function is used to detect the encoding that should - be used to decode a Python source file. It requires one argument, readline, - in the same way as the tokenize() generator. - - It will call readline a maximum of twice, and return the encoding used - (as a string) and a list of any lines (left as bytes) it has read in. - - It detects the encoding from the presence of a utf-8 bom or an encoding - cookie as specified in pep-0263. If both a bom and a cookie are present, - but disagree, a SyntaxError will be raised. If the encoding cookie is an - invalid charset, raise a SyntaxError. Note that if a utf-8 bom is found, - 'utf-8-sig' is returned. - - If no encoding is specified, then the default of 'utf-8' will be returned. - """ - try: - filename = readline.__self__.name - except AttributeError: - filename = None - bom_found = False - encoding = None - default = 'utf-8' - def read_or_stop(): - try: - return readline() - except StopIteration: - return b'' - - def find_cookie(line): - try: - # Decode as UTF-8. Either the line is an encoding declaration, - # in which case it should be pure ASCII, or it must be UTF-8 - # per default encoding. - line_string = line.decode('utf-8') - except UnicodeDecodeError: - msg = "invalid or missing encoding declaration" - if filename is not None: - msg = '{} for {!r}'.format(msg, filename) - raise SyntaxError(msg) - - matches = cookie_re.findall(line_string) - if not matches: - return None - encoding = _get_normal_name(matches[0]) - try: - codec = lookup(encoding) - except LookupError: - # This behaviour mimics the Python interpreter - if filename is None: - msg = "unknown encoding: " + encoding - else: - msg = "unknown encoding for {!r}: {}".format(filename, - encoding) - raise SyntaxError(msg) - - if bom_found: - if codec.name != 'utf-8': - # This behaviour mimics the Python interpreter - if filename is None: - msg = 'encoding problem: utf-8' - else: - msg = 'encoding problem for {!r}: utf-8'.format(filename) - raise SyntaxError(msg) - encoding += '-sig' - return encoding - - first = read_or_stop() - if first.startswith(BOM_UTF8): - bom_found = True - first = first[3:] - default = 'utf-8-sig' - if not first: - return default, [] - - encoding = find_cookie(first) - if encoding: - return encoding, [first] - - second = read_or_stop() - if not second: - return default, [first] - - encoding = find_cookie(second) - if encoding: - return encoding, [first, second] - - return default, [first, second] - -# For converting & <-> & etc. -try: - from html import escape -except ImportError: - from cgi import escape -if sys.version_info[:2] < (3, 4): - unescape = HTMLParser().unescape -else: - from html import unescape - -try: - from collections import ChainMap -except ImportError: # pragma: no cover - from collections import MutableMapping - - try: - from reprlib import recursive_repr as _recursive_repr - except ImportError: - def _recursive_repr(fillvalue='...'): - ''' - Decorator to make a repr function return fillvalue for a recursive - call - ''' - - def decorating_function(user_function): - repr_running = set() - - def wrapper(self): - key = id(self), get_ident() - if key in repr_running: - return fillvalue - repr_running.add(key) - try: - result = user_function(self) - finally: - repr_running.discard(key) - return result - - # Can't use functools.wraps() here because of bootstrap issues - wrapper.__module__ = getattr(user_function, '__module__') - wrapper.__doc__ = getattr(user_function, '__doc__') - wrapper.__name__ = getattr(user_function, '__name__') - wrapper.__annotations__ = getattr(user_function, '__annotations__', {}) - return wrapper - - return decorating_function - - class ChainMap(MutableMapping): - ''' A ChainMap groups multiple dicts (or other mappings) together - to create a single, updateable view. - - The underlying mappings are stored in a list. That list is public and can - accessed or updated using the *maps* attribute. There is no other state. - - Lookups search the underlying mappings successively until a key is found. - In contrast, writes, updates, and deletions only operate on the first - mapping. - - ''' - - def __init__(self, *maps): - '''Initialize a ChainMap by setting *maps* to the given mappings. - If no mappings are provided, a single empty dictionary is used. - - ''' - self.maps = list(maps) or [{}] # always at least one map - - def __missing__(self, key): - raise KeyError(key) - - def __getitem__(self, key): - for mapping in self.maps: - try: - return mapping[key] # can't use 'key in mapping' with defaultdict - except KeyError: - pass - return self.__missing__(key) # support subclasses that define __missing__ - - def get(self, key, default=None): - return self[key] if key in self else default - - def __len__(self): - return len(set().union(*self.maps)) # reuses stored hash values if possible - - def __iter__(self): - return iter(set().union(*self.maps)) - - def __contains__(self, key): - return any(key in m for m in self.maps) - - def __bool__(self): - return any(self.maps) - - @_recursive_repr() - def __repr__(self): - return '{0.__class__.__name__}({1})'.format( - self, ', '.join(map(repr, self.maps))) - - @classmethod - def fromkeys(cls, iterable, *args): - 'Create a ChainMap with a single dict created from the iterable.' - return cls(dict.fromkeys(iterable, *args)) - - def copy(self): - 'New ChainMap or subclass with a new copy of maps[0] and refs to maps[1:]' - return self.__class__(self.maps[0].copy(), *self.maps[1:]) - - __copy__ = copy - - def new_child(self): # like Django's Context.push() - 'New ChainMap with a new dict followed by all previous maps.' - return self.__class__({}, *self.maps) - - @property - def parents(self): # like Django's Context.pop() - 'New ChainMap from maps[1:].' - return self.__class__(*self.maps[1:]) - - def __setitem__(self, key, value): - self.maps[0][key] = value - - def __delitem__(self, key): - try: - del self.maps[0][key] - except KeyError: - raise KeyError('Key not found in the first mapping: {!r}'.format(key)) - - def popitem(self): - 'Remove and return an item pair from maps[0]. Raise KeyError is maps[0] is empty.' - try: - return self.maps[0].popitem() - except KeyError: - raise KeyError('No keys found in the first mapping.') - - def pop(self, key, *args): - 'Remove *key* from maps[0] and return its value. Raise KeyError if *key* not in maps[0].' - try: - return self.maps[0].pop(key, *args) - except KeyError: - raise KeyError('Key not found in the first mapping: {!r}'.format(key)) - - def clear(self): - 'Clear maps[0], leaving maps[1:] intact.' - self.maps[0].clear() - -try: - from importlib.util import cache_from_source # Python >= 3.4 -except ImportError: # pragma: no cover - try: - from imp import cache_from_source - except ImportError: # pragma: no cover - def cache_from_source(path, debug_override=None): - assert path.endswith('.py') - if debug_override is None: - debug_override = __debug__ - if debug_override: - suffix = 'c' - else: - suffix = 'o' - return path + suffix - -try: - from collections import OrderedDict -except ImportError: # pragma: no cover -## {{{ http://code.activestate.com/recipes/576693/ (r9) -# Backport of OrderedDict() class that runs on Python 2.4, 2.5, 2.6, 2.7 and pypy. -# Passes Python2.7's test suite and incorporates all the latest updates. - try: - from thread import get_ident as _get_ident - except ImportError: - from dummy_thread import get_ident as _get_ident - - try: - from _abcoll import KeysView, ValuesView, ItemsView - except ImportError: - pass - - - class OrderedDict(dict): - 'Dictionary that remembers insertion order' - # An inherited dict maps keys to values. - # The inherited dict provides __getitem__, __len__, __contains__, and get. - # The remaining methods are order-aware. - # Big-O running times for all methods are the same as for regular dictionaries. - - # The internal self.__map dictionary maps keys to links in a doubly linked list. - # The circular doubly linked list starts and ends with a sentinel element. - # The sentinel element never gets deleted (this simplifies the algorithm). - # Each link is stored as a list of length three: [PREV, NEXT, KEY]. - - def __init__(self, *args, **kwds): - '''Initialize an ordered dictionary. Signature is the same as for - regular dictionaries, but keyword arguments are not recommended - because their insertion order is arbitrary. - - ''' - if len(args) > 1: - raise TypeError('expected at most 1 arguments, got %d' % len(args)) - try: - self.__root - except AttributeError: - self.__root = root = [] # sentinel node - root[:] = [root, root, None] - self.__map = {} - self.__update(*args, **kwds) - - def __setitem__(self, key, value, dict_setitem=dict.__setitem__): - 'od.__setitem__(i, y) <==> od[i]=y' - # Setting a new item creates a new link which goes at the end of the linked - # list, and the inherited dictionary is updated with the new key/value pair. - if key not in self: - root = self.__root - last = root[0] - last[1] = root[0] = self.__map[key] = [last, root, key] - dict_setitem(self, key, value) - - def __delitem__(self, key, dict_delitem=dict.__delitem__): - 'od.__delitem__(y) <==> del od[y]' - # Deleting an existing item uses self.__map to find the link which is - # then removed by updating the links in the predecessor and successor nodes. - dict_delitem(self, key) - link_prev, link_next, key = self.__map.pop(key) - link_prev[1] = link_next - link_next[0] = link_prev - - def __iter__(self): - 'od.__iter__() <==> iter(od)' - root = self.__root - curr = root[1] - while curr is not root: - yield curr[2] - curr = curr[1] - - def __reversed__(self): - 'od.__reversed__() <==> reversed(od)' - root = self.__root - curr = root[0] - while curr is not root: - yield curr[2] - curr = curr[0] - - def clear(self): - 'od.clear() -> None. Remove all items from od.' - try: - for node in self.__map.itervalues(): - del node[:] - root = self.__root - root[:] = [root, root, None] - self.__map.clear() - except AttributeError: - pass - dict.clear(self) - - def popitem(self, last=True): - '''od.popitem() -> (k, v), return and remove a (key, value) pair. - Pairs are returned in LIFO order if last is true or FIFO order if false. - - ''' - if not self: - raise KeyError('dictionary is empty') - root = self.__root - if last: - link = root[0] - link_prev = link[0] - link_prev[1] = root - root[0] = link_prev - else: - link = root[1] - link_next = link[1] - root[1] = link_next - link_next[0] = root - key = link[2] - del self.__map[key] - value = dict.pop(self, key) - return key, value - - # -- the following methods do not depend on the internal structure -- - - def keys(self): - 'od.keys() -> list of keys in od' - return list(self) - - def values(self): - 'od.values() -> list of values in od' - return [self[key] for key in self] - - def items(self): - 'od.items() -> list of (key, value) pairs in od' - return [(key, self[key]) for key in self] - - def iterkeys(self): - 'od.iterkeys() -> an iterator over the keys in od' - return iter(self) - - def itervalues(self): - 'od.itervalues -> an iterator over the values in od' - for k in self: - yield self[k] - - def iteritems(self): - 'od.iteritems -> an iterator over the (key, value) items in od' - for k in self: - yield (k, self[k]) - - def update(*args, **kwds): - '''od.update(E, **F) -> None. Update od from dict/iterable E and F. - - If E is a dict instance, does: for k in E: od[k] = E[k] - If E has a .keys() method, does: for k in E.keys(): od[k] = E[k] - Or if E is an iterable of items, does: for k, v in E: od[k] = v - In either case, this is followed by: for k, v in F.items(): od[k] = v - - ''' - if len(args) > 2: - raise TypeError('update() takes at most 2 positional ' - 'arguments (%d given)' % (len(args),)) - elif not args: - raise TypeError('update() takes at least 1 argument (0 given)') - self = args[0] - # Make progressively weaker assumptions about "other" - other = () - if len(args) == 2: - other = args[1] - if isinstance(other, dict): - for key in other: - self[key] = other[key] - elif hasattr(other, 'keys'): - for key in other.keys(): - self[key] = other[key] - else: - for key, value in other: - self[key] = value - for key, value in kwds.items(): - self[key] = value - - __update = update # let subclasses override update without breaking __init__ - - __marker = object() - - def pop(self, key, default=__marker): - '''od.pop(k[,d]) -> v, remove specified key and return the corresponding value. - If key is not found, d is returned if given, otherwise KeyError is raised. - - ''' - if key in self: - result = self[key] - del self[key] - return result - if default is self.__marker: - raise KeyError(key) - return default - - def setdefault(self, key, default=None): - 'od.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not in od' - if key in self: - return self[key] - self[key] = default - return default - - def __repr__(self, _repr_running=None): - 'od.__repr__() <==> repr(od)' - if not _repr_running: _repr_running = {} - call_key = id(self), _get_ident() - if call_key in _repr_running: - return '...' - _repr_running[call_key] = 1 - try: - if not self: - return '%s()' % (self.__class__.__name__,) - return '%s(%r)' % (self.__class__.__name__, self.items()) - finally: - del _repr_running[call_key] - - def __reduce__(self): - 'Return state information for pickling' - items = [[k, self[k]] for k in self] - inst_dict = vars(self).copy() - for k in vars(OrderedDict()): - inst_dict.pop(k, None) - if inst_dict: - return (self.__class__, (items,), inst_dict) - return self.__class__, (items,) - - def copy(self): - 'od.copy() -> a shallow copy of od' - return self.__class__(self) - - @classmethod - def fromkeys(cls, iterable, value=None): - '''OD.fromkeys(S[, v]) -> New ordered dictionary with keys from S - and values equal to v (which defaults to None). - - ''' - d = cls() - for key in iterable: - d[key] = value - return d - - def __eq__(self, other): - '''od.__eq__(y) <==> od==y. Comparison to another OD is order-sensitive - while comparison to a regular mapping is order-insensitive. - - ''' - if isinstance(other, OrderedDict): - return len(self)==len(other) and self.items() == other.items() - return dict.__eq__(self, other) - - def __ne__(self, other): - return not self == other - - # -- the following methods are only used in Python 2.7 -- - - def viewkeys(self): - "od.viewkeys() -> a set-like object providing a view on od's keys" - return KeysView(self) - - def viewvalues(self): - "od.viewvalues() -> an object providing a view on od's values" - return ValuesView(self) - - def viewitems(self): - "od.viewitems() -> a set-like object providing a view on od's items" - return ItemsView(self) - -try: - from logging.config import BaseConfigurator, valid_ident -except ImportError: # pragma: no cover - IDENTIFIER = re.compile('^[a-z_][a-z0-9_]*$', re.I) - - - def valid_ident(s): - m = IDENTIFIER.match(s) - if not m: - raise ValueError('Not a valid Python identifier: %r' % s) - return True - - - # The ConvertingXXX classes are wrappers around standard Python containers, - # and they serve to convert any suitable values in the container. The - # conversion converts base dicts, lists and tuples to their wrapped - # equivalents, whereas strings which match a conversion format are converted - # appropriately. - # - # Each wrapper should have a configurator attribute holding the actual - # configurator to use for conversion. - - class ConvertingDict(dict): - """A converting dictionary wrapper.""" - - def __getitem__(self, key): - value = dict.__getitem__(self, key) - result = self.configurator.convert(value) - #If the converted value is different, save for next time - if value is not result: - self[key] = result - if type(result) in (ConvertingDict, ConvertingList, - ConvertingTuple): - result.parent = self - result.key = key - return result - - def get(self, key, default=None): - value = dict.get(self, key, default) - result = self.configurator.convert(value) - #If the converted value is different, save for next time - if value is not result: - self[key] = result - if type(result) in (ConvertingDict, ConvertingList, - ConvertingTuple): - result.parent = self - result.key = key - return result - - def pop(self, key, default=None): - value = dict.pop(self, key, default) - result = self.configurator.convert(value) - if value is not result: - if type(result) in (ConvertingDict, ConvertingList, - ConvertingTuple): - result.parent = self - result.key = key - return result - - class ConvertingList(list): - """A converting list wrapper.""" - def __getitem__(self, key): - value = list.__getitem__(self, key) - result = self.configurator.convert(value) - #If the converted value is different, save for next time - if value is not result: - self[key] = result - if type(result) in (ConvertingDict, ConvertingList, - ConvertingTuple): - result.parent = self - result.key = key - return result - - def pop(self, idx=-1): - value = list.pop(self, idx) - result = self.configurator.convert(value) - if value is not result: - if type(result) in (ConvertingDict, ConvertingList, - ConvertingTuple): - result.parent = self - return result - - class ConvertingTuple(tuple): - """A converting tuple wrapper.""" - def __getitem__(self, key): - value = tuple.__getitem__(self, key) - result = self.configurator.convert(value) - if value is not result: - if type(result) in (ConvertingDict, ConvertingList, - ConvertingTuple): - result.parent = self - result.key = key - return result - - class BaseConfigurator(object): - """ - The configurator base class which defines some useful defaults. - """ - - CONVERT_PATTERN = re.compile(r'^(?P<prefix>[a-z]+)://(?P<suffix>.*)$') - - WORD_PATTERN = re.compile(r'^\s*(\w+)\s*') - DOT_PATTERN = re.compile(r'^\.\s*(\w+)\s*') - INDEX_PATTERN = re.compile(r'^\[\s*(\w+)\s*\]\s*') - DIGIT_PATTERN = re.compile(r'^\d+$') - - value_converters = { - 'ext' : 'ext_convert', - 'cfg' : 'cfg_convert', - } - - # We might want to use a different one, e.g. importlib - importer = staticmethod(__import__) - - def __init__(self, config): - self.config = ConvertingDict(config) - self.config.configurator = self - - def resolve(self, s): - """ - Resolve strings to objects using standard import and attribute - syntax. - """ - name = s.split('.') - used = name.pop(0) - try: - found = self.importer(used) - for frag in name: - used += '.' + frag - try: - found = getattr(found, frag) - except AttributeError: - self.importer(used) - found = getattr(found, frag) - return found - except ImportError: - e, tb = sys.exc_info()[1:] - v = ValueError('Cannot resolve %r: %s' % (s, e)) - v.__cause__, v.__traceback__ = e, tb - raise v - - def ext_convert(self, value): - """Default converter for the ext:// protocol.""" - return self.resolve(value) - - def cfg_convert(self, value): - """Default converter for the cfg:// protocol.""" - rest = value - m = self.WORD_PATTERN.match(rest) - if m is None: - raise ValueError("Unable to convert %r" % value) - else: - rest = rest[m.end():] - d = self.config[m.groups()[0]] - #print d, rest - while rest: - m = self.DOT_PATTERN.match(rest) - if m: - d = d[m.groups()[0]] - else: - m = self.INDEX_PATTERN.match(rest) - if m: - idx = m.groups()[0] - if not self.DIGIT_PATTERN.match(idx): - d = d[idx] - else: - try: - n = int(idx) # try as number first (most likely) - d = d[n] - except TypeError: - d = d[idx] - if m: - rest = rest[m.end():] - else: - raise ValueError('Unable to convert ' - '%r at %r' % (value, rest)) - #rest should be empty - return d - - def convert(self, value): - """ - Convert values to an appropriate type. dicts, lists and tuples are - replaced by their converting alternatives. Strings are checked to - see if they have a conversion format and are converted if they do. - """ - if not isinstance(value, ConvertingDict) and isinstance(value, dict): - value = ConvertingDict(value) - value.configurator = self - elif not isinstance(value, ConvertingList) and isinstance(value, list): - value = ConvertingList(value) - value.configurator = self - elif not isinstance(value, ConvertingTuple) and\ - isinstance(value, tuple): - value = ConvertingTuple(value) - value.configurator = self - elif isinstance(value, string_types): - m = self.CONVERT_PATTERN.match(value) - if m: - d = m.groupdict() - prefix = d['prefix'] - converter = self.value_converters.get(prefix, None) - if converter: - suffix = d['suffix'] - converter = getattr(self, converter) - value = converter(suffix) - return value - - def configure_custom(self, config): - """Configure an object with a user-supplied factory.""" - c = config.pop('()') - if not callable(c): - c = self.resolve(c) - props = config.pop('.', None) - # Check for valid identifiers - kwargs = dict([(k, config[k]) for k in config if valid_ident(k)]) - result = c(**kwargs) - if props: - for name, value in props.items(): - setattr(result, name, value) - return result - - def as_tuple(self, value): - """Utility function which converts lists to tuples.""" - if isinstance(value, list): - value = tuple(value) - return value diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/compat.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/compat.pyc deleted file mode 100644 index e5ac4e544a930d998ba76e248703161064c3f00a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44256 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 MJv_8|%jV(#4bV$2s{jB1 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/database.py b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/database.py deleted file mode 100644 index b13cdac..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/database.py +++ /dev/null @@ -1,1339 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2012-2017 The Python Software Foundation. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -"""PEP 376 implementation.""" - -from __future__ import unicode_literals - -import base64 -import codecs -import contextlib -import hashlib -import logging -import os -import posixpath -import sys -import zipimport - -from . import DistlibException, resources -from .compat import StringIO -from .version import get_scheme, UnsupportedVersionError -from .metadata import (Metadata, METADATA_FILENAME, WHEEL_METADATA_FILENAME, - LEGACY_METADATA_FILENAME) -from .util import (parse_requirement, cached_property, parse_name_and_version, - read_exports, write_exports, CSVReader, CSVWriter) - - -__all__ = ['Distribution', 'BaseInstalledDistribution', - 'InstalledDistribution', 'EggInfoDistribution', - 'DistributionPath'] - - -logger = logging.getLogger(__name__) - -EXPORTS_FILENAME = 'pydist-exports.json' -COMMANDS_FILENAME = 'pydist-commands.json' - -DIST_FILES = ('INSTALLER', METADATA_FILENAME, 'RECORD', 'REQUESTED', - 'RESOURCES', EXPORTS_FILENAME, 'SHARED') - -DISTINFO_EXT = '.dist-info' - - -class _Cache(object): - """ - A simple cache mapping names and .dist-info paths to distributions - """ - def __init__(self): - """ - Initialise an instance. There is normally one for each DistributionPath. - """ - self.name = {} - self.path = {} - self.generated = False - - def clear(self): - """ - Clear the cache, setting it to its initial state. - """ - self.name.clear() - self.path.clear() - self.generated = False - - def add(self, dist): - """ - Add a distribution to the cache. - :param dist: The distribution to add. - """ - if dist.path not in self.path: - self.path[dist.path] = dist - self.name.setdefault(dist.key, []).append(dist) - - -class DistributionPath(object): - """ - Represents a set of distributions installed on a path (typically sys.path). - """ - def __init__(self, path=None, include_egg=False): - """ - Create an instance from a path, optionally including legacy (distutils/ - setuptools/distribute) distributions. - :param path: The path to use, as a list of directories. If not specified, - sys.path is used. - :param include_egg: If True, this instance will look for and return legacy - distributions as well as those based on PEP 376. - """ - if path is None: - path = sys.path - self.path = path - self._include_dist = True - self._include_egg = include_egg - - self._cache = _Cache() - self._cache_egg = _Cache() - self._cache_enabled = True - self._scheme = get_scheme('default') - - def _get_cache_enabled(self): - return self._cache_enabled - - def _set_cache_enabled(self, value): - self._cache_enabled = value - - cache_enabled = property(_get_cache_enabled, _set_cache_enabled) - - def clear_cache(self): - """ - Clears the internal cache. - """ - self._cache.clear() - self._cache_egg.clear() - - - def _yield_distributions(self): - """ - Yield .dist-info and/or .egg(-info) distributions. - """ - # We need to check if we've seen some resources already, because on - # some Linux systems (e.g. some Debian/Ubuntu variants) there are - # symlinks which alias other files in the environment. - seen = set() - for path in self.path: - finder = resources.finder_for_path(path) - if finder is None: - continue - r = finder.find('') - if not r or not r.is_container: - continue - rset = sorted(r.resources) - for entry in rset: - r = finder.find(entry) - if not r or r.path in seen: - continue - if self._include_dist and entry.endswith(DISTINFO_EXT): - possible_filenames = [METADATA_FILENAME, - WHEEL_METADATA_FILENAME, - LEGACY_METADATA_FILENAME] - for metadata_filename in possible_filenames: - metadata_path = posixpath.join(entry, metadata_filename) - pydist = finder.find(metadata_path) - if pydist: - break - else: - continue - - with contextlib.closing(pydist.as_stream()) as stream: - metadata = Metadata(fileobj=stream, scheme='legacy') - logger.debug('Found %s', r.path) - seen.add(r.path) - yield new_dist_class(r.path, metadata=metadata, - env=self) - elif self._include_egg and entry.endswith(('.egg-info', - '.egg')): - logger.debug('Found %s', r.path) - seen.add(r.path) - yield old_dist_class(r.path, self) - - def _generate_cache(self): - """ - Scan the path for distributions and populate the cache with - those that are found. - """ - gen_dist = not self._cache.generated - gen_egg = self._include_egg and not self._cache_egg.generated - if gen_dist or gen_egg: - for dist in self._yield_distributions(): - if isinstance(dist, InstalledDistribution): - self._cache.add(dist) - else: - self._cache_egg.add(dist) - - if gen_dist: - self._cache.generated = True - if gen_egg: - self._cache_egg.generated = True - - @classmethod - def distinfo_dirname(cls, name, version): - """ - The *name* and *version* parameters are converted into their - filename-escaped form, i.e. any ``'-'`` characters are replaced - with ``'_'`` other than the one in ``'dist-info'`` and the one - separating the name from the version number. - - :parameter name: is converted to a standard distribution name by replacing - any runs of non- alphanumeric characters with a single - ``'-'``. - :type name: string - :parameter version: is converted to a standard version string. Spaces - become dots, and all other non-alphanumeric characters - (except dots) become dashes, with runs of multiple - dashes condensed to a single dash. - :type version: string - :returns: directory name - :rtype: string""" - name = name.replace('-', '_') - return '-'.join([name, version]) + DISTINFO_EXT - - def get_distributions(self): - """ - Provides an iterator that looks for distributions and returns - :class:`InstalledDistribution` or - :class:`EggInfoDistribution` instances for each one of them. - - :rtype: iterator of :class:`InstalledDistribution` and - :class:`EggInfoDistribution` instances - """ - if not self._cache_enabled: - for dist in self._yield_distributions(): - yield dist - else: - self._generate_cache() - - for dist in self._cache.path.values(): - yield dist - - if self._include_egg: - for dist in self._cache_egg.path.values(): - yield dist - - def get_distribution(self, name): - """ - Looks for a named distribution on the path. - - This function only returns the first result found, as no more than one - value is expected. If nothing is found, ``None`` is returned. - - :rtype: :class:`InstalledDistribution`, :class:`EggInfoDistribution` - or ``None`` - """ - result = None - name = name.lower() - if not self._cache_enabled: - for dist in self._yield_distributions(): - if dist.key == name: - result = dist - break - else: - self._generate_cache() - - if name in self._cache.name: - result = self._cache.name[name][0] - elif self._include_egg and name in self._cache_egg.name: - result = self._cache_egg.name[name][0] - return result - - def provides_distribution(self, name, version=None): - """ - Iterates over all distributions to find which distributions provide *name*. - If a *version* is provided, it will be used to filter the results. - - This function only returns the first result found, since no more than - one values are expected. If the directory is not found, returns ``None``. - - :parameter version: a version specifier that indicates the version - required, conforming to the format in ``PEP-345`` - - :type name: string - :type version: string - """ - matcher = None - if version is not None: - try: - matcher = self._scheme.matcher('%s (%s)' % (name, version)) - except ValueError: - raise DistlibException('invalid name or version: %r, %r' % - (name, version)) - - for dist in self.get_distributions(): - # We hit a problem on Travis where enum34 was installed and doesn't - # have a provides attribute ... - if not hasattr(dist, 'provides'): - logger.debug('No "provides": %s', dist) - else: - provided = dist.provides - - for p in provided: - p_name, p_ver = parse_name_and_version(p) - if matcher is None: - if p_name == name: - yield dist - break - else: - if p_name == name and matcher.match(p_ver): - yield dist - break - - def get_file_path(self, name, relative_path): - """ - Return the path to a resource file. - """ - dist = self.get_distribution(name) - if dist is None: - raise LookupError('no distribution named %r found' % name) - return dist.get_resource_path(relative_path) - - def get_exported_entries(self, category, name=None): - """ - Return all of the exported entries in a particular category. - - :param category: The category to search for entries. - :param name: If specified, only entries with that name are returned. - """ - for dist in self.get_distributions(): - r = dist.exports - if category in r: - d = r[category] - if name is not None: - if name in d: - yield d[name] - else: - for v in d.values(): - yield v - - -class Distribution(object): - """ - A base class for distributions, whether installed or from indexes. - Either way, it must have some metadata, so that's all that's needed - for construction. - """ - - build_time_dependency = False - """ - Set to True if it's known to be only a build-time dependency (i.e. - not needed after installation). - """ - - requested = False - """A boolean that indicates whether the ``REQUESTED`` metadata file is - present (in other words, whether the package was installed by user - request or it was installed as a dependency).""" - - def __init__(self, metadata): - """ - Initialise an instance. - :param metadata: The instance of :class:`Metadata` describing this - distribution. - """ - self.metadata = metadata - self.name = metadata.name - self.key = self.name.lower() # for case-insensitive comparisons - self.version = metadata.version - self.locator = None - self.digest = None - self.extras = None # additional features requested - self.context = None # environment marker overrides - self.download_urls = set() - self.digests = {} - - @property - def source_url(self): - """ - The source archive download URL for this distribution. - """ - return self.metadata.source_url - - download_url = source_url # Backward compatibility - - @property - def name_and_version(self): - """ - A utility property which displays the name and version in parentheses. - """ - return '%s (%s)' % (self.name, self.version) - - @property - def provides(self): - """ - A set of distribution names and versions provided by this distribution. - :return: A set of "name (version)" strings. - """ - plist = self.metadata.provides - s = '%s (%s)' % (self.name, self.version) - if s not in plist: - plist.append(s) - return plist - - def _get_requirements(self, req_attr): - md = self.metadata - logger.debug('Getting requirements from metadata %r', md.todict()) - reqts = getattr(md, req_attr) - return set(md.get_requirements(reqts, extras=self.extras, - env=self.context)) - - @property - def run_requires(self): - return self._get_requirements('run_requires') - - @property - def meta_requires(self): - return self._get_requirements('meta_requires') - - @property - def build_requires(self): - return self._get_requirements('build_requires') - - @property - def test_requires(self): - return self._get_requirements('test_requires') - - @property - def dev_requires(self): - return self._get_requirements('dev_requires') - - def matches_requirement(self, req): - """ - Say if this instance matches (fulfills) a requirement. - :param req: The requirement to match. - :rtype req: str - :return: True if it matches, else False. - """ - # Requirement may contain extras - parse to lose those - # from what's passed to the matcher - r = parse_requirement(req) - scheme = get_scheme(self.metadata.scheme) - try: - matcher = scheme.matcher(r.requirement) - except UnsupportedVersionError: - # XXX compat-mode if cannot read the version - logger.warning('could not read version %r - using name only', - req) - name = req.split()[0] - matcher = scheme.matcher(name) - - name = matcher.key # case-insensitive - - result = False - for p in self.provides: - p_name, p_ver = parse_name_and_version(p) - if p_name != name: - continue - try: - result = matcher.match(p_ver) - break - except UnsupportedVersionError: - pass - return result - - def __repr__(self): - """ - Return a textual representation of this instance, - """ - if self.source_url: - suffix = ' [%s]' % self.source_url - else: - suffix = '' - return '<Distribution %s (%s)%s>' % (self.name, self.version, suffix) - - def __eq__(self, other): - """ - See if this distribution is the same as another. - :param other: The distribution to compare with. To be equal to one - another. distributions must have the same type, name, - version and source_url. - :return: True if it is the same, else False. - """ - if type(other) is not type(self): - result = False - else: - result = (self.name == other.name and - self.version == other.version and - self.source_url == other.source_url) - return result - - def __hash__(self): - """ - Compute hash in a way which matches the equality test. - """ - return hash(self.name) + hash(self.version) + hash(self.source_url) - - -class BaseInstalledDistribution(Distribution): - """ - This is the base class for installed distributions (whether PEP 376 or - legacy). - """ - - hasher = None - - def __init__(self, metadata, path, env=None): - """ - Initialise an instance. - :param metadata: An instance of :class:`Metadata` which describes the - distribution. This will normally have been initialised - from a metadata file in the ``path``. - :param path: The path of the ``.dist-info`` or ``.egg-info`` - directory for the distribution. - :param env: This is normally the :class:`DistributionPath` - instance where this distribution was found. - """ - super(BaseInstalledDistribution, self).__init__(metadata) - self.path = path - self.dist_path = env - - def get_hash(self, data, hasher=None): - """ - Get the hash of some data, using a particular hash algorithm, if - specified. - - :param data: The data to be hashed. - :type data: bytes - :param hasher: The name of a hash implementation, supported by hashlib, - or ``None``. Examples of valid values are ``'sha1'``, - ``'sha224'``, ``'sha384'``, '``sha256'``, ``'md5'`` and - ``'sha512'``. If no hasher is specified, the ``hasher`` - attribute of the :class:`InstalledDistribution` instance - is used. If the hasher is determined to be ``None``, MD5 - is used as the hashing algorithm. - :returns: The hash of the data. If a hasher was explicitly specified, - the returned hash will be prefixed with the specified hasher - followed by '='. - :rtype: str - """ - if hasher is None: - hasher = self.hasher - if hasher is None: - hasher = hashlib.md5 - prefix = '' - else: - hasher = getattr(hashlib, hasher) - prefix = '%s=' % self.hasher - digest = hasher(data).digest() - digest = base64.urlsafe_b64encode(digest).rstrip(b'=').decode('ascii') - return '%s%s' % (prefix, digest) - - -class InstalledDistribution(BaseInstalledDistribution): - """ - Created with the *path* of the ``.dist-info`` directory provided to the - constructor. It reads the metadata contained in ``pydist.json`` when it is - instantiated., or uses a passed in Metadata instance (useful for when - dry-run mode is being used). - """ - - hasher = 'sha256' - - def __init__(self, path, metadata=None, env=None): - self.modules = [] - self.finder = finder = resources.finder_for_path(path) - if finder is None: - raise ValueError('finder unavailable for %s' % path) - if env and env._cache_enabled and path in env._cache.path: - metadata = env._cache.path[path].metadata - elif metadata is None: - r = finder.find(METADATA_FILENAME) - # Temporary - for Wheel 0.23 support - if r is None: - r = finder.find(WHEEL_METADATA_FILENAME) - # Temporary - for legacy support - if r is None: - r = finder.find('METADATA') - if r is None: - raise ValueError('no %s found in %s' % (METADATA_FILENAME, - path)) - with contextlib.closing(r.as_stream()) as stream: - metadata = Metadata(fileobj=stream, scheme='legacy') - - super(InstalledDistribution, self).__init__(metadata, path, env) - - if env and env._cache_enabled: - env._cache.add(self) - - r = finder.find('REQUESTED') - self.requested = r is not None - p = os.path.join(path, 'top_level.txt') - if os.path.exists(p): - with open(p, 'rb') as f: - data = f.read() - self.modules = data.splitlines() - - def __repr__(self): - return '<InstalledDistribution %r %s at %r>' % ( - self.name, self.version, self.path) - - def __str__(self): - return "%s %s" % (self.name, self.version) - - def _get_records(self): - """ - Get the list of installed files for the distribution - :return: A list of tuples of path, hash and size. Note that hash and - size might be ``None`` for some entries. The path is exactly - as stored in the file (which is as in PEP 376). - """ - results = [] - r = self.get_distinfo_resource('RECORD') - with contextlib.closing(r.as_stream()) as stream: - with CSVReader(stream=stream) as record_reader: - # Base location is parent dir of .dist-info dir - #base_location = os.path.dirname(self.path) - #base_location = os.path.abspath(base_location) - for row in record_reader: - missing = [None for i in range(len(row), 3)] - path, checksum, size = row + missing - #if not os.path.isabs(path): - # path = path.replace('/', os.sep) - # path = os.path.join(base_location, path) - results.append((path, checksum, size)) - return results - - @cached_property - def exports(self): - """ - Return the information exported by this distribution. - :return: A dictionary of exports, mapping an export category to a dict - of :class:`ExportEntry` instances describing the individual - export entries, and keyed by name. - """ - result = {} - r = self.get_distinfo_resource(EXPORTS_FILENAME) - if r: - result = self.read_exports() - return result - - def read_exports(self): - """ - Read exports data from a file in .ini format. - - :return: A dictionary of exports, mapping an export category to a list - of :class:`ExportEntry` instances describing the individual - export entries. - """ - result = {} - r = self.get_distinfo_resource(EXPORTS_FILENAME) - if r: - with contextlib.closing(r.as_stream()) as stream: - result = read_exports(stream) - return result - - def write_exports(self, exports): - """ - Write a dictionary of exports to a file in .ini format. - :param exports: A dictionary of exports, mapping an export category to - a list of :class:`ExportEntry` instances describing the - individual export entries. - """ - rf = self.get_distinfo_file(EXPORTS_FILENAME) - with open(rf, 'w') as f: - write_exports(exports, f) - - def get_resource_path(self, relative_path): - """ - NOTE: This API may change in the future. - - Return the absolute path to a resource file with the given relative - path. - - :param relative_path: The path, relative to .dist-info, of the resource - of interest. - :return: The absolute path where the resource is to be found. - """ - r = self.get_distinfo_resource('RESOURCES') - with contextlib.closing(r.as_stream()) as stream: - with CSVReader(stream=stream) as resources_reader: - for relative, destination in resources_reader: - if relative == relative_path: - return destination - raise KeyError('no resource file with relative path %r ' - 'is installed' % relative_path) - - def list_installed_files(self): - """ - Iterates over the ``RECORD`` entries and returns a tuple - ``(path, hash, size)`` for each line. - - :returns: iterator of (path, hash, size) - """ - for result in self._get_records(): - yield result - - def write_installed_files(self, paths, prefix, dry_run=False): - """ - Writes the ``RECORD`` file, using the ``paths`` iterable passed in. Any - existing ``RECORD`` file is silently overwritten. - - prefix is used to determine when to write absolute paths. - """ - prefix = os.path.join(prefix, '') - base = os.path.dirname(self.path) - base_under_prefix = base.startswith(prefix) - base = os.path.join(base, '') - record_path = self.get_distinfo_file('RECORD') - logger.info('creating %s', record_path) - if dry_run: - return None - with CSVWriter(record_path) as writer: - for path in paths: - if os.path.isdir(path) or path.endswith(('.pyc', '.pyo')): - # do not put size and hash, as in PEP-376 - hash_value = size = '' - else: - size = '%d' % os.path.getsize(path) - with open(path, 'rb') as fp: - hash_value = self.get_hash(fp.read()) - if path.startswith(base) or (base_under_prefix and - path.startswith(prefix)): - path = os.path.relpath(path, base) - writer.writerow((path, hash_value, size)) - - # add the RECORD file itself - if record_path.startswith(base): - record_path = os.path.relpath(record_path, base) - writer.writerow((record_path, '', '')) - return record_path - - def check_installed_files(self): - """ - Checks that the hashes and sizes of the files in ``RECORD`` are - matched by the files themselves. Returns a (possibly empty) list of - mismatches. Each entry in the mismatch list will be a tuple consisting - of the path, 'exists', 'size' or 'hash' according to what didn't match - (existence is checked first, then size, then hash), the expected - value and the actual value. - """ - mismatches = [] - base = os.path.dirname(self.path) - record_path = self.get_distinfo_file('RECORD') - for path, hash_value, size in self.list_installed_files(): - if not os.path.isabs(path): - path = os.path.join(base, path) - if path == record_path: - continue - if not os.path.exists(path): - mismatches.append((path, 'exists', True, False)) - elif os.path.isfile(path): - actual_size = str(os.path.getsize(path)) - if size and actual_size != size: - mismatches.append((path, 'size', size, actual_size)) - elif hash_value: - if '=' in hash_value: - hasher = hash_value.split('=', 1)[0] - else: - hasher = None - - with open(path, 'rb') as f: - actual_hash = self.get_hash(f.read(), hasher) - if actual_hash != hash_value: - mismatches.append((path, 'hash', hash_value, actual_hash)) - return mismatches - - @cached_property - def shared_locations(self): - """ - A dictionary of shared locations whose keys are in the set 'prefix', - 'purelib', 'platlib', 'scripts', 'headers', 'data' and 'namespace'. - The corresponding value is the absolute path of that category for - this distribution, and takes into account any paths selected by the - user at installation time (e.g. via command-line arguments). In the - case of the 'namespace' key, this would be a list of absolute paths - for the roots of namespace packages in this distribution. - - The first time this property is accessed, the relevant information is - read from the SHARED file in the .dist-info directory. - """ - result = {} - shared_path = os.path.join(self.path, 'SHARED') - if os.path.isfile(shared_path): - with codecs.open(shared_path, 'r', encoding='utf-8') as f: - lines = f.read().splitlines() - for line in lines: - key, value = line.split('=', 1) - if key == 'namespace': - result.setdefault(key, []).append(value) - else: - result[key] = value - return result - - def write_shared_locations(self, paths, dry_run=False): - """ - Write shared location information to the SHARED file in .dist-info. - :param paths: A dictionary as described in the documentation for - :meth:`shared_locations`. - :param dry_run: If True, the action is logged but no file is actually - written. - :return: The path of the file written to. - """ - shared_path = os.path.join(self.path, 'SHARED') - logger.info('creating %s', shared_path) - if dry_run: - return None - lines = [] - for key in ('prefix', 'lib', 'headers', 'scripts', 'data'): - path = paths[key] - if os.path.isdir(paths[key]): - lines.append('%s=%s' % (key, path)) - for ns in paths.get('namespace', ()): - lines.append('namespace=%s' % ns) - - with codecs.open(shared_path, 'w', encoding='utf-8') as f: - f.write('\n'.join(lines)) - return shared_path - - def get_distinfo_resource(self, path): - if path not in DIST_FILES: - raise DistlibException('invalid path for a dist-info file: ' - '%r at %r' % (path, self.path)) - finder = resources.finder_for_path(self.path) - if finder is None: - raise DistlibException('Unable to get a finder for %s' % self.path) - return finder.find(path) - - def get_distinfo_file(self, path): - """ - Returns a path located under the ``.dist-info`` directory. Returns a - string representing the path. - - :parameter path: a ``'/'``-separated path relative to the - ``.dist-info`` directory or an absolute path; - If *path* is an absolute path and doesn't start - with the ``.dist-info`` directory path, - a :class:`DistlibException` is raised - :type path: str - :rtype: str - """ - # Check if it is an absolute path # XXX use relpath, add tests - if path.find(os.sep) >= 0: - # it's an absolute path? - distinfo_dirname, path = path.split(os.sep)[-2:] - if distinfo_dirname != self.path.split(os.sep)[-1]: - raise DistlibException( - 'dist-info file %r does not belong to the %r %s ' - 'distribution' % (path, self.name, self.version)) - - # The file must be relative - if path not in DIST_FILES: - raise DistlibException('invalid path for a dist-info file: ' - '%r at %r' % (path, self.path)) - - return os.path.join(self.path, path) - - def list_distinfo_files(self): - """ - Iterates over the ``RECORD`` entries and returns paths for each line if - the path is pointing to a file located in the ``.dist-info`` directory - or one of its subdirectories. - - :returns: iterator of paths - """ - base = os.path.dirname(self.path) - for path, checksum, size in self._get_records(): - # XXX add separator or use real relpath algo - if not os.path.isabs(path): - path = os.path.join(base, path) - if path.startswith(self.path): - yield path - - def __eq__(self, other): - return (isinstance(other, InstalledDistribution) and - self.path == other.path) - - # See http://docs.python.org/reference/datamodel#object.__hash__ - __hash__ = object.__hash__ - - -class EggInfoDistribution(BaseInstalledDistribution): - """Created with the *path* of the ``.egg-info`` directory or file provided - to the constructor. It reads the metadata contained in the file itself, or - if the given path happens to be a directory, the metadata is read from the - file ``PKG-INFO`` under that directory.""" - - requested = True # as we have no way of knowing, assume it was - shared_locations = {} - - def __init__(self, path, env=None): - def set_name_and_version(s, n, v): - s.name = n - s.key = n.lower() # for case-insensitive comparisons - s.version = v - - self.path = path - self.dist_path = env - if env and env._cache_enabled and path in env._cache_egg.path: - metadata = env._cache_egg.path[path].metadata - set_name_and_version(self, metadata.name, metadata.version) - else: - metadata = self._get_metadata(path) - - # Need to be set before caching - set_name_and_version(self, metadata.name, metadata.version) - - if env and env._cache_enabled: - env._cache_egg.add(self) - super(EggInfoDistribution, self).__init__(metadata, path, env) - - def _get_metadata(self, path): - requires = None - - def parse_requires_data(data): - """Create a list of dependencies from a requires.txt file. - - *data*: the contents of a setuptools-produced requires.txt file. - """ - reqs = [] - lines = data.splitlines() - for line in lines: - line = line.strip() - if line.startswith('['): - logger.warning('Unexpected line: quitting requirement scan: %r', - line) - break - r = parse_requirement(line) - if not r: - logger.warning('Not recognised as a requirement: %r', line) - continue - if r.extras: - logger.warning('extra requirements in requires.txt are ' - 'not supported') - if not r.constraints: - reqs.append(r.name) - else: - cons = ', '.join('%s%s' % c for c in r.constraints) - reqs.append('%s (%s)' % (r.name, cons)) - return reqs - - def parse_requires_path(req_path): - """Create a list of dependencies from a requires.txt file. - - *req_path*: the path to a setuptools-produced requires.txt file. - """ - - reqs = [] - try: - with codecs.open(req_path, 'r', 'utf-8') as fp: - reqs = parse_requires_data(fp.read()) - except IOError: - pass - return reqs - - tl_path = tl_data = None - if path.endswith('.egg'): - if os.path.isdir(path): - p = os.path.join(path, 'EGG-INFO') - meta_path = os.path.join(p, 'PKG-INFO') - metadata = Metadata(path=meta_path, scheme='legacy') - req_path = os.path.join(p, 'requires.txt') - tl_path = os.path.join(p, 'top_level.txt') - requires = parse_requires_path(req_path) - else: - # FIXME handle the case where zipfile is not available - zipf = zipimport.zipimporter(path) - fileobj = StringIO( - zipf.get_data('EGG-INFO/PKG-INFO').decode('utf8')) - metadata = Metadata(fileobj=fileobj, scheme='legacy') - try: - data = zipf.get_data('EGG-INFO/requires.txt') - tl_data = zipf.get_data('EGG-INFO/top_level.txt').decode('utf-8') - requires = parse_requires_data(data.decode('utf-8')) - except IOError: - requires = None - elif path.endswith('.egg-info'): - if os.path.isdir(path): - req_path = os.path.join(path, 'requires.txt') - requires = parse_requires_path(req_path) - path = os.path.join(path, 'PKG-INFO') - tl_path = os.path.join(path, 'top_level.txt') - metadata = Metadata(path=path, scheme='legacy') - else: - raise DistlibException('path must end with .egg-info or .egg, ' - 'got %r' % path) - - if requires: - metadata.add_requirements(requires) - # look for top-level modules in top_level.txt, if present - if tl_data is None: - if tl_path is not None and os.path.exists(tl_path): - with open(tl_path, 'rb') as f: - tl_data = f.read().decode('utf-8') - if not tl_data: - tl_data = [] - else: - tl_data = tl_data.splitlines() - self.modules = tl_data - return metadata - - def __repr__(self): - return '<EggInfoDistribution %r %s at %r>' % ( - self.name, self.version, self.path) - - def __str__(self): - return "%s %s" % (self.name, self.version) - - def check_installed_files(self): - """ - Checks that the hashes and sizes of the files in ``RECORD`` are - matched by the files themselves. Returns a (possibly empty) list of - mismatches. Each entry in the mismatch list will be a tuple consisting - of the path, 'exists', 'size' or 'hash' according to what didn't match - (existence is checked first, then size, then hash), the expected - value and the actual value. - """ - mismatches = [] - record_path = os.path.join(self.path, 'installed-files.txt') - if os.path.exists(record_path): - for path, _, _ in self.list_installed_files(): - if path == record_path: - continue - if not os.path.exists(path): - mismatches.append((path, 'exists', True, False)) - return mismatches - - def list_installed_files(self): - """ - Iterates over the ``installed-files.txt`` entries and returns a tuple - ``(path, hash, size)`` for each line. - - :returns: a list of (path, hash, size) - """ - - def _md5(path): - f = open(path, 'rb') - try: - content = f.read() - finally: - f.close() - return hashlib.md5(content).hexdigest() - - def _size(path): - return os.stat(path).st_size - - record_path = os.path.join(self.path, 'installed-files.txt') - result = [] - if os.path.exists(record_path): - with codecs.open(record_path, 'r', encoding='utf-8') as f: - for line in f: - line = line.strip() - p = os.path.normpath(os.path.join(self.path, line)) - # "./" is present as a marker between installed files - # and installation metadata files - if not os.path.exists(p): - logger.warning('Non-existent file: %s', p) - if p.endswith(('.pyc', '.pyo')): - continue - #otherwise fall through and fail - if not os.path.isdir(p): - result.append((p, _md5(p), _size(p))) - result.append((record_path, None, None)) - return result - - def list_distinfo_files(self, absolute=False): - """ - Iterates over the ``installed-files.txt`` entries and returns paths for - each line if the path is pointing to a file located in the - ``.egg-info`` directory or one of its subdirectories. - - :parameter absolute: If *absolute* is ``True``, each returned path is - transformed into a local absolute path. Otherwise the - raw value from ``installed-files.txt`` is returned. - :type absolute: boolean - :returns: iterator of paths - """ - record_path = os.path.join(self.path, 'installed-files.txt') - if os.path.exists(record_path): - skip = True - with codecs.open(record_path, 'r', encoding='utf-8') as f: - for line in f: - line = line.strip() - if line == './': - skip = False - continue - if not skip: - p = os.path.normpath(os.path.join(self.path, line)) - if p.startswith(self.path): - if absolute: - yield p - else: - yield line - - def __eq__(self, other): - return (isinstance(other, EggInfoDistribution) and - self.path == other.path) - - # See http://docs.python.org/reference/datamodel#object.__hash__ - __hash__ = object.__hash__ - -new_dist_class = InstalledDistribution -old_dist_class = EggInfoDistribution - - -class DependencyGraph(object): - """ - Represents a dependency graph between distributions. - - The dependency relationships are stored in an ``adjacency_list`` that maps - distributions to a list of ``(other, label)`` tuples where ``other`` - is a distribution and the edge is labeled with ``label`` (i.e. the version - specifier, if such was provided). Also, for more efficient traversal, for - every distribution ``x``, a list of predecessors is kept in - ``reverse_list[x]``. An edge from distribution ``a`` to - distribution ``b`` means that ``a`` depends on ``b``. If any missing - dependencies are found, they are stored in ``missing``, which is a - dictionary that maps distributions to a list of requirements that were not - provided by any other distributions. - """ - - def __init__(self): - self.adjacency_list = {} - self.reverse_list = {} - self.missing = {} - - def add_distribution(self, distribution): - """Add the *distribution* to the graph. - - :type distribution: :class:`distutils2.database.InstalledDistribution` - or :class:`distutils2.database.EggInfoDistribution` - """ - self.adjacency_list[distribution] = [] - self.reverse_list[distribution] = [] - #self.missing[distribution] = [] - - def add_edge(self, x, y, label=None): - """Add an edge from distribution *x* to distribution *y* with the given - *label*. - - :type x: :class:`distutils2.database.InstalledDistribution` or - :class:`distutils2.database.EggInfoDistribution` - :type y: :class:`distutils2.database.InstalledDistribution` or - :class:`distutils2.database.EggInfoDistribution` - :type label: ``str`` or ``None`` - """ - self.adjacency_list[x].append((y, label)) - # multiple edges are allowed, so be careful - if x not in self.reverse_list[y]: - self.reverse_list[y].append(x) - - def add_missing(self, distribution, requirement): - """ - Add a missing *requirement* for the given *distribution*. - - :type distribution: :class:`distutils2.database.InstalledDistribution` - or :class:`distutils2.database.EggInfoDistribution` - :type requirement: ``str`` - """ - logger.debug('%s missing %r', distribution, requirement) - self.missing.setdefault(distribution, []).append(requirement) - - def _repr_dist(self, dist): - return '%s %s' % (dist.name, dist.version) - - def repr_node(self, dist, level=1): - """Prints only a subgraph""" - output = [self._repr_dist(dist)] - for other, label in self.adjacency_list[dist]: - dist = self._repr_dist(other) - if label is not None: - dist = '%s [%s]' % (dist, label) - output.append(' ' * level + str(dist)) - suboutput = self.repr_node(other, level + 1) - subs = suboutput.split('\n') - output.extend(subs[1:]) - return '\n'.join(output) - - def to_dot(self, f, skip_disconnected=True): - """Writes a DOT output for the graph to the provided file *f*. - - If *skip_disconnected* is set to ``True``, then all distributions - that are not dependent on any other distribution are skipped. - - :type f: has to support ``file``-like operations - :type skip_disconnected: ``bool`` - """ - disconnected = [] - - f.write("digraph dependencies {\n") - for dist, adjs in self.adjacency_list.items(): - if len(adjs) == 0 and not skip_disconnected: - disconnected.append(dist) - for other, label in adjs: - if not label is None: - f.write('"%s" -> "%s" [label="%s"]\n' % - (dist.name, other.name, label)) - else: - f.write('"%s" -> "%s"\n' % (dist.name, other.name)) - if not skip_disconnected and len(disconnected) > 0: - f.write('subgraph disconnected {\n') - f.write('label = "Disconnected"\n') - f.write('bgcolor = red\n') - - for dist in disconnected: - f.write('"%s"' % dist.name) - f.write('\n') - f.write('}\n') - f.write('}\n') - - def topological_sort(self): - """ - Perform a topological sort of the graph. - :return: A tuple, the first element of which is a topologically sorted - list of distributions, and the second element of which is a - list of distributions that cannot be sorted because they have - circular dependencies and so form a cycle. - """ - result = [] - # Make a shallow copy of the adjacency list - alist = {} - for k, v in self.adjacency_list.items(): - alist[k] = v[:] - while True: - # See what we can remove in this run - to_remove = [] - for k, v in list(alist.items())[:]: - if not v: - to_remove.append(k) - del alist[k] - if not to_remove: - # What's left in alist (if anything) is a cycle. - break - # Remove from the adjacency list of others - for k, v in alist.items(): - alist[k] = [(d, r) for d, r in v if d not in to_remove] - logger.debug('Moving to result: %s', - ['%s (%s)' % (d.name, d.version) for d in to_remove]) - result.extend(to_remove) - return result, list(alist.keys()) - - def __repr__(self): - """Representation of the graph""" - output = [] - for dist, adjs in self.adjacency_list.items(): - output.append(self.repr_node(dist)) - return '\n'.join(output) - - -def make_graph(dists, scheme='default'): - """Makes a dependency graph from the given distributions. - - :parameter dists: a list of distributions - :type dists: list of :class:`distutils2.database.InstalledDistribution` and - :class:`distutils2.database.EggInfoDistribution` instances - :rtype: a :class:`DependencyGraph` instance - """ - scheme = get_scheme(scheme) - graph = DependencyGraph() - provided = {} # maps names to lists of (version, dist) tuples - - # first, build the graph and find out what's provided - for dist in dists: - graph.add_distribution(dist) - - for p in dist.provides: - name, version = parse_name_and_version(p) - logger.debug('Add to provided: %s, %s, %s', name, version, dist) - provided.setdefault(name, []).append((version, dist)) - - # now make the edges - for dist in dists: - requires = (dist.run_requires | dist.meta_requires | - dist.build_requires | dist.dev_requires) - for req in requires: - try: - matcher = scheme.matcher(req) - except UnsupportedVersionError: - # XXX compat-mode if cannot read the version - logger.warning('could not read version %r - using name only', - req) - name = req.split()[0] - matcher = scheme.matcher(name) - - name = matcher.key # case-insensitive - - matched = False - if name in provided: - for version, provider in provided[name]: - try: - match = matcher.match(version) - except UnsupportedVersionError: - match = False - - if match: - graph.add_edge(dist, provider, req) - matched = True - break - if not matched: - graph.add_missing(dist, req) - return graph - - -def get_dependent_dists(dists, dist): - """Recursively generate a list of distributions from *dists* that are - dependent on *dist*. - - :param dists: a list of distributions - :param dist: a distribution, member of *dists* for which we are interested - """ - if dist not in dists: - raise DistlibException('given distribution %r is not a member ' - 'of the list' % dist.name) - graph = make_graph(dists) - - dep = [dist] # dependent distributions - todo = graph.reverse_list[dist] # list of nodes we should inspect - - while todo: - d = todo.pop() - dep.append(d) - for succ in graph.reverse_list[d]: - if succ not in dep: - todo.append(succ) - - dep.pop(0) # remove dist from dep, was there to prevent infinite loops - return dep - - -def get_required_dists(dists, dist): - """Recursively generate a list of distributions from *dists* that are - required by *dist*. - - :param dists: a list of distributions - :param dist: a distribution, member of *dists* for which we are interested - """ - if dist not in dists: - raise DistlibException('given distribution %r is not a member ' - 'of the list' % dist.name) - graph = make_graph(dists) - - req = [] # required distributions - todo = graph.adjacency_list[dist] # list of nodes we should inspect - - while todo: - d = todo.pop()[0] - req.append(d) - for pred in graph.adjacency_list[d]: - if pred not in req: - todo.append(pred) - - return req - - -def make_dist(name, version, **kwargs): - """ - A convenience method for making a dist given just a name and version. - """ - summary = kwargs.pop('summary', 'Placeholder for summary') - md = Metadata(**kwargs) - md.name = name - md.version = version - md.summary = summary or 'Placeholder for summary' - return Distribution(md) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/database.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/database.pyc deleted file mode 100644 index 2f0902611ee6cc115b1728b59ae3a83c7176b8a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53896 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 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/index.py b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/index.py deleted file mode 100644 index 2406be2..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/index.py +++ /dev/null @@ -1,516 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2013 Vinay Sajip. -# Licensed to the Python Software Foundation under a contributor agreement. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -import hashlib -import logging -import os -import shutil -import subprocess -import tempfile -try: - from threading import Thread -except ImportError: - from dummy_threading import Thread - -from . import DistlibException -from .compat import (HTTPBasicAuthHandler, Request, HTTPPasswordMgr, - urlparse, build_opener, string_types) -from .util import cached_property, zip_dir, ServerProxy - -logger = logging.getLogger(__name__) - -DEFAULT_INDEX = 'https://pypi.python.org/pypi' -DEFAULT_REALM = 'pypi' - -class PackageIndex(object): - """ - This class represents a package index compatible with PyPI, the Python - Package Index. - """ - - boundary = b'----------ThIs_Is_tHe_distlib_index_bouNdaRY_$' - - def __init__(self, url=None): - """ - Initialise an instance. - - :param url: The URL of the index. If not specified, the URL for PyPI is - used. - """ - self.url = url or DEFAULT_INDEX - self.read_configuration() - scheme, netloc, path, params, query, frag = urlparse(self.url) - if params or query or frag or scheme not in ('http', 'https'): - raise DistlibException('invalid repository: %s' % self.url) - self.password_handler = None - self.ssl_verifier = None - self.gpg = None - self.gpg_home = None - with open(os.devnull, 'w') as sink: - # Use gpg by default rather than gpg2, as gpg2 insists on - # prompting for passwords - for s in ('gpg', 'gpg2'): - try: - rc = subprocess.check_call([s, '--version'], stdout=sink, - stderr=sink) - if rc == 0: - self.gpg = s - break - except OSError: - pass - - def _get_pypirc_command(self): - """ - Get the distutils command for interacting with PyPI configurations. - :return: the command. - """ - from distutils.core import Distribution - from distutils.config import PyPIRCCommand - d = Distribution() - return PyPIRCCommand(d) - - def read_configuration(self): - """ - Read the PyPI access configuration as supported by distutils, getting - PyPI to do the actual work. This populates ``username``, ``password``, - ``realm`` and ``url`` attributes from the configuration. - """ - # get distutils to do the work - c = self._get_pypirc_command() - c.repository = self.url - cfg = c._read_pypirc() - self.username = cfg.get('username') - self.password = cfg.get('password') - self.realm = cfg.get('realm', 'pypi') - self.url = cfg.get('repository', self.url) - - def save_configuration(self): - """ - Save the PyPI access configuration. You must have set ``username`` and - ``password`` attributes before calling this method. - - Again, distutils is used to do the actual work. - """ - self.check_credentials() - # get distutils to do the work - c = self._get_pypirc_command() - c._store_pypirc(self.username, self.password) - - def check_credentials(self): - """ - Check that ``username`` and ``password`` have been set, and raise an - exception if not. - """ - if self.username is None or self.password is None: - raise DistlibException('username and password must be set') - pm = HTTPPasswordMgr() - _, netloc, _, _, _, _ = urlparse(self.url) - pm.add_password(self.realm, netloc, self.username, self.password) - self.password_handler = HTTPBasicAuthHandler(pm) - - def register(self, metadata): - """ - Register a distribution on PyPI, using the provided metadata. - - :param metadata: A :class:`Metadata` instance defining at least a name - and version number for the distribution to be - registered. - :return: The HTTP response received from PyPI upon submission of the - request. - """ - self.check_credentials() - metadata.validate() - d = metadata.todict() - d[':action'] = 'verify' - request = self.encode_request(d.items(), []) - response = self.send_request(request) - d[':action'] = 'submit' - request = self.encode_request(d.items(), []) - return self.send_request(request) - - def _reader(self, name, stream, outbuf): - """ - Thread runner for reading lines of from a subprocess into a buffer. - - :param name: The logical name of the stream (used for logging only). - :param stream: The stream to read from. This will typically a pipe - connected to the output stream of a subprocess. - :param outbuf: The list to append the read lines to. - """ - while True: - s = stream.readline() - if not s: - break - s = s.decode('utf-8').rstrip() - outbuf.append(s) - logger.debug('%s: %s' % (name, s)) - stream.close() - - def get_sign_command(self, filename, signer, sign_password, - keystore=None): - """ - Return a suitable command for signing a file. - - :param filename: The pathname to the file to be signed. - :param signer: The identifier of the signer of the file. - :param sign_password: The passphrase for the signer's - private key used for signing. - :param keystore: The path to a directory which contains the keys - used in verification. If not specified, the - instance's ``gpg_home`` attribute is used instead. - :return: The signing command as a list suitable to be - passed to :class:`subprocess.Popen`. - """ - cmd = [self.gpg, '--status-fd', '2', '--no-tty'] - if keystore is None: - keystore = self.gpg_home - if keystore: - cmd.extend(['--homedir', keystore]) - if sign_password is not None: - cmd.extend(['--batch', '--passphrase-fd', '0']) - td = tempfile.mkdtemp() - sf = os.path.join(td, os.path.basename(filename) + '.asc') - cmd.extend(['--detach-sign', '--armor', '--local-user', - signer, '--output', sf, filename]) - logger.debug('invoking: %s', ' '.join(cmd)) - return cmd, sf - - def run_command(self, cmd, input_data=None): - """ - Run a command in a child process , passing it any input data specified. - - :param cmd: The command to run. - :param input_data: If specified, this must be a byte string containing - data to be sent to the child process. - :return: A tuple consisting of the subprocess' exit code, a list of - lines read from the subprocess' ``stdout``, and a list of - lines read from the subprocess' ``stderr``. - """ - kwargs = { - 'stdout': subprocess.PIPE, - 'stderr': subprocess.PIPE, - } - if input_data is not None: - kwargs['stdin'] = subprocess.PIPE - stdout = [] - stderr = [] - p = subprocess.Popen(cmd, **kwargs) - # We don't use communicate() here because we may need to - # get clever with interacting with the command - t1 = Thread(target=self._reader, args=('stdout', p.stdout, stdout)) - t1.start() - t2 = Thread(target=self._reader, args=('stderr', p.stderr, stderr)) - t2.start() - if input_data is not None: - p.stdin.write(input_data) - p.stdin.close() - - p.wait() - t1.join() - t2.join() - return p.returncode, stdout, stderr - - def sign_file(self, filename, signer, sign_password, keystore=None): - """ - Sign a file. - - :param filename: The pathname to the file to be signed. - :param signer: The identifier of the signer of the file. - :param sign_password: The passphrase for the signer's - private key used for signing. - :param keystore: The path to a directory which contains the keys - used in signing. If not specified, the instance's - ``gpg_home`` attribute is used instead. - :return: The absolute pathname of the file where the signature is - stored. - """ - cmd, sig_file = self.get_sign_command(filename, signer, sign_password, - keystore) - rc, stdout, stderr = self.run_command(cmd, - sign_password.encode('utf-8')) - if rc != 0: - raise DistlibException('sign command failed with error ' - 'code %s' % rc) - return sig_file - - def upload_file(self, metadata, filename, signer=None, sign_password=None, - filetype='sdist', pyversion='source', keystore=None): - """ - Upload a release file to the index. - - :param metadata: A :class:`Metadata` instance defining at least a name - and version number for the file to be uploaded. - :param filename: The pathname of the file to be uploaded. - :param signer: The identifier of the signer of the file. - :param sign_password: The passphrase for the signer's - private key used for signing. - :param filetype: The type of the file being uploaded. This is the - distutils command which produced that file, e.g. - ``sdist`` or ``bdist_wheel``. - :param pyversion: The version of Python which the release relates - to. For code compatible with any Python, this would - be ``source``, otherwise it would be e.g. ``3.2``. - :param keystore: The path to a directory which contains the keys - used in signing. If not specified, the instance's - ``gpg_home`` attribute is used instead. - :return: The HTTP response received from PyPI upon submission of the - request. - """ - self.check_credentials() - if not os.path.exists(filename): - raise DistlibException('not found: %s' % filename) - metadata.validate() - d = metadata.todict() - sig_file = None - if signer: - if not self.gpg: - logger.warning('no signing program available - not signed') - else: - sig_file = self.sign_file(filename, signer, sign_password, - keystore) - with open(filename, 'rb') as f: - file_data = f.read() - md5_digest = hashlib.md5(file_data).hexdigest() - sha256_digest = hashlib.sha256(file_data).hexdigest() - d.update({ - ':action': 'file_upload', - 'protocol_version': '1', - 'filetype': filetype, - 'pyversion': pyversion, - 'md5_digest': md5_digest, - 'sha256_digest': sha256_digest, - }) - files = [('content', os.path.basename(filename), file_data)] - if sig_file: - with open(sig_file, 'rb') as f: - sig_data = f.read() - files.append(('gpg_signature', os.path.basename(sig_file), - sig_data)) - shutil.rmtree(os.path.dirname(sig_file)) - request = self.encode_request(d.items(), files) - return self.send_request(request) - - def upload_documentation(self, metadata, doc_dir): - """ - Upload documentation to the index. - - :param metadata: A :class:`Metadata` instance defining at least a name - and version number for the documentation to be - uploaded. - :param doc_dir: The pathname of the directory which contains the - documentation. This should be the directory that - contains the ``index.html`` for the documentation. - :return: The HTTP response received from PyPI upon submission of the - request. - """ - self.check_credentials() - if not os.path.isdir(doc_dir): - raise DistlibException('not a directory: %r' % doc_dir) - fn = os.path.join(doc_dir, 'index.html') - if not os.path.exists(fn): - raise DistlibException('not found: %r' % fn) - metadata.validate() - name, version = metadata.name, metadata.version - zip_data = zip_dir(doc_dir).getvalue() - fields = [(':action', 'doc_upload'), - ('name', name), ('version', version)] - files = [('content', name, zip_data)] - request = self.encode_request(fields, files) - return self.send_request(request) - - def get_verify_command(self, signature_filename, data_filename, - keystore=None): - """ - Return a suitable command for verifying a file. - - :param signature_filename: The pathname to the file containing the - signature. - :param data_filename: The pathname to the file containing the - signed data. - :param keystore: The path to a directory which contains the keys - used in verification. If not specified, the - instance's ``gpg_home`` attribute is used instead. - :return: The verifying command as a list suitable to be - passed to :class:`subprocess.Popen`. - """ - cmd = [self.gpg, '--status-fd', '2', '--no-tty'] - if keystore is None: - keystore = self.gpg_home - if keystore: - cmd.extend(['--homedir', keystore]) - cmd.extend(['--verify', signature_filename, data_filename]) - logger.debug('invoking: %s', ' '.join(cmd)) - return cmd - - def verify_signature(self, signature_filename, data_filename, - keystore=None): - """ - Verify a signature for a file. - - :param signature_filename: The pathname to the file containing the - signature. - :param data_filename: The pathname to the file containing the - signed data. - :param keystore: The path to a directory which contains the keys - used in verification. If not specified, the - instance's ``gpg_home`` attribute is used instead. - :return: True if the signature was verified, else False. - """ - if not self.gpg: - raise DistlibException('verification unavailable because gpg ' - 'unavailable') - cmd = self.get_verify_command(signature_filename, data_filename, - keystore) - rc, stdout, stderr = self.run_command(cmd) - if rc not in (0, 1): - raise DistlibException('verify command failed with error ' - 'code %s' % rc) - return rc == 0 - - def download_file(self, url, destfile, digest=None, reporthook=None): - """ - This is a convenience method for downloading a file from an URL. - Normally, this will be a file from the index, though currently - no check is made for this (i.e. a file can be downloaded from - anywhere). - - The method is just like the :func:`urlretrieve` function in the - standard library, except that it allows digest computation to be - done during download and checking that the downloaded data - matched any expected value. - - :param url: The URL of the file to be downloaded (assumed to be - available via an HTTP GET request). - :param destfile: The pathname where the downloaded file is to be - saved. - :param digest: If specified, this must be a (hasher, value) - tuple, where hasher is the algorithm used (e.g. - ``'md5'``) and ``value`` is the expected value. - :param reporthook: The same as for :func:`urlretrieve` in the - standard library. - """ - if digest is None: - digester = None - logger.debug('No digest specified') - else: - if isinstance(digest, (list, tuple)): - hasher, digest = digest - else: - hasher = 'md5' - digester = getattr(hashlib, hasher)() - logger.debug('Digest specified: %s' % digest) - # The following code is equivalent to urlretrieve. - # We need to do it this way so that we can compute the - # digest of the file as we go. - with open(destfile, 'wb') as dfp: - # addinfourl is not a context manager on 2.x - # so we have to use try/finally - sfp = self.send_request(Request(url)) - try: - headers = sfp.info() - blocksize = 8192 - size = -1 - read = 0 - blocknum = 0 - if "content-length" in headers: - size = int(headers["Content-Length"]) - if reporthook: - reporthook(blocknum, blocksize, size) - while True: - block = sfp.read(blocksize) - if not block: - break - read += len(block) - dfp.write(block) - if digester: - digester.update(block) - blocknum += 1 - if reporthook: - reporthook(blocknum, blocksize, size) - finally: - sfp.close() - - # check that we got the whole file, if we can - if size >= 0 and read < size: - raise DistlibException( - 'retrieval incomplete: got only %d out of %d bytes' - % (read, size)) - # if we have a digest, it must match. - if digester: - actual = digester.hexdigest() - if digest != actual: - raise DistlibException('%s digest mismatch for %s: expected ' - '%s, got %s' % (hasher, destfile, - digest, actual)) - logger.debug('Digest verified: %s', digest) - - def send_request(self, req): - """ - Send a standard library :class:`Request` to PyPI and return its - response. - - :param req: The request to send. - :return: The HTTP response from PyPI (a standard library HTTPResponse). - """ - handlers = [] - if self.password_handler: - handlers.append(self.password_handler) - if self.ssl_verifier: - handlers.append(self.ssl_verifier) - opener = build_opener(*handlers) - return opener.open(req) - - def encode_request(self, fields, files): - """ - Encode fields and files for posting to an HTTP server. - - :param fields: The fields to send as a list of (fieldname, value) - tuples. - :param files: The files to send as a list of (fieldname, filename, - file_bytes) tuple. - """ - # Adapted from packaging, which in turn was adapted from - # http://code.activestate.com/recipes/146306 - - parts = [] - boundary = self.boundary - for k, values in fields: - if not isinstance(values, (list, tuple)): - values = [values] - - for v in values: - parts.extend(( - b'--' + boundary, - ('Content-Disposition: form-data; name="%s"' % - k).encode('utf-8'), - b'', - v.encode('utf-8'))) - for key, filename, value in files: - parts.extend(( - b'--' + boundary, - ('Content-Disposition: form-data; name="%s"; filename="%s"' % - (key, filename)).encode('utf-8'), - b'', - value)) - - parts.extend((b'--' + boundary + b'--', b'')) - - body = b'\r\n'.join(parts) - ct = b'multipart/form-data; boundary=' + boundary - headers = { - 'Content-type': ct, - 'Content-length': str(len(body)) - } - return Request(self.url, body, headers) - - def search(self, terms, operator=None): - if isinstance(terms, string_types): - terms = {'name': terms} - rpc_proxy = ServerProxy(self.url, timeout=3.0) - try: - return rpc_proxy.search(terms, operator or 'and') - finally: - rpc_proxy('close')() diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/index.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/index.pyc deleted file mode 100644 index ee51985ff4289371be4731b3ee2a61a6abb97033..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20999 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 MQaD#2SsyF>FDI`*eE<Le diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/locators.py b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/locators.py deleted file mode 100644 index 5c655c3..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/locators.py +++ /dev/null @@ -1,1295 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2012-2015 Vinay Sajip. -# Licensed to the Python Software Foundation under a contributor agreement. -# See LICENSE.txt and CONTRIBUTORS.txt. -# - -import gzip -from io import BytesIO -import json -import logging -import os -import posixpath -import re -try: - import threading -except ImportError: # pragma: no cover - import dummy_threading as threading -import zlib - -from . import DistlibException -from .compat import (urljoin, urlparse, urlunparse, url2pathname, pathname2url, - queue, quote, unescape, string_types, build_opener, - HTTPRedirectHandler as BaseRedirectHandler, text_type, - Request, HTTPError, URLError) -from .database import Distribution, DistributionPath, make_dist -from .metadata import Metadata, MetadataInvalidError -from .util import (cached_property, parse_credentials, ensure_slash, - split_filename, get_project_data, parse_requirement, - parse_name_and_version, ServerProxy, normalize_name) -from .version import get_scheme, UnsupportedVersionError -from .wheel import Wheel, is_compatible - -logger = logging.getLogger(__name__) - -HASHER_HASH = re.compile(r'^(\w+)=([a-f0-9]+)') -CHARSET = re.compile(r';\s*charset\s*=\s*(.*)\s*$', re.I) -HTML_CONTENT_TYPE = re.compile('text/html|application/x(ht)?ml') -DEFAULT_INDEX = 'https://pypi.python.org/pypi' - -def get_all_distribution_names(url=None): - """ - Return all distribution names known by an index. - :param url: The URL of the index. - :return: A list of all known distribution names. - """ - if url is None: - url = DEFAULT_INDEX - client = ServerProxy(url, timeout=3.0) - try: - return client.list_packages() - finally: - client('close')() - -class RedirectHandler(BaseRedirectHandler): - """ - A class to work around a bug in some Python 3.2.x releases. - """ - # There's a bug in the base version for some 3.2.x - # (e.g. 3.2.2 on Ubuntu Oneiric). If a Location header - # returns e.g. /abc, it bails because it says the scheme '' - # is bogus, when actually it should use the request's - # URL for the scheme. See Python issue #13696. - def http_error_302(self, req, fp, code, msg, headers): - # Some servers (incorrectly) return multiple Location headers - # (so probably same goes for URI). Use first header. - newurl = None - for key in ('location', 'uri'): - if key in headers: - newurl = headers[key] - break - if newurl is None: # pragma: no cover - return - urlparts = urlparse(newurl) - if urlparts.scheme == '': - newurl = urljoin(req.get_full_url(), newurl) - if hasattr(headers, 'replace_header'): - headers.replace_header(key, newurl) - else: - headers[key] = newurl - return BaseRedirectHandler.http_error_302(self, req, fp, code, msg, - headers) - - http_error_301 = http_error_303 = http_error_307 = http_error_302 - -class Locator(object): - """ - A base class for locators - things that locate distributions. - """ - source_extensions = ('.tar.gz', '.tar.bz2', '.tar', '.zip', '.tgz', '.tbz') - binary_extensions = ('.egg', '.exe', '.whl') - excluded_extensions = ('.pdf',) - - # A list of tags indicating which wheels you want to match. The default - # value of None matches against the tags compatible with the running - # Python. If you want to match other values, set wheel_tags on a locator - # instance to a list of tuples (pyver, abi, arch) which you want to match. - wheel_tags = None - - downloadable_extensions = source_extensions + ('.whl',) - - def __init__(self, scheme='default'): - """ - Initialise an instance. - :param scheme: Because locators look for most recent versions, they - need to know the version scheme to use. This specifies - the current PEP-recommended scheme - use ``'legacy'`` - if you need to support existing distributions on PyPI. - """ - self._cache = {} - self.scheme = scheme - # Because of bugs in some of the handlers on some of the platforms, - # we use our own opener rather than just using urlopen. - self.opener = build_opener(RedirectHandler()) - # If get_project() is called from locate(), the matcher instance - # is set from the requirement passed to locate(). See issue #18 for - # why this can be useful to know. - self.matcher = None - self.errors = queue.Queue() - - def get_errors(self): - """ - Return any errors which have occurred. - """ - result = [] - while not self.errors.empty(): # pragma: no cover - try: - e = self.errors.get(False) - result.append(e) - except self.errors.Empty: - continue - self.errors.task_done() - return result - - def clear_errors(self): - """ - Clear any errors which may have been logged. - """ - # Just get the errors and throw them away - self.get_errors() - - def clear_cache(self): - self._cache.clear() - - def _get_scheme(self): - return self._scheme - - def _set_scheme(self, value): - self._scheme = value - - scheme = property(_get_scheme, _set_scheme) - - def _get_project(self, name): - """ - For a given project, get a dictionary mapping available versions to Distribution - instances. - - This should be implemented in subclasses. - - If called from a locate() request, self.matcher will be set to a - matcher for the requirement to satisfy, otherwise it will be None. - """ - raise NotImplementedError('Please implement in the subclass') - - def get_distribution_names(self): - """ - Return all the distribution names known to this locator. - """ - raise NotImplementedError('Please implement in the subclass') - - def get_project(self, name): - """ - For a given project, get a dictionary mapping available versions to Distribution - instances. - - This calls _get_project to do all the work, and just implements a caching layer on top. - """ - if self._cache is None: # pragma: no cover - result = self._get_project(name) - elif name in self._cache: - result = self._cache[name] - else: - self.clear_errors() - result = self._get_project(name) - self._cache[name] = result - return result - - def score_url(self, url): - """ - Give an url a score which can be used to choose preferred URLs - for a given project release. - """ - t = urlparse(url) - basename = posixpath.basename(t.path) - compatible = True - is_wheel = basename.endswith('.whl') - is_downloadable = basename.endswith(self.downloadable_extensions) - if is_wheel: - compatible = is_compatible(Wheel(basename), self.wheel_tags) - return (t.scheme == 'https', 'pypi.python.org' in t.netloc, - is_downloadable, is_wheel, compatible, basename) - - def prefer_url(self, url1, url2): - """ - Choose one of two URLs where both are candidates for distribution - archives for the same version of a distribution (for example, - .tar.gz vs. zip). - - The current implementation favours https:// URLs over http://, archives - from PyPI over those from other locations, wheel compatibility (if a - wheel) and then the archive name. - """ - result = url2 - if url1: - s1 = self.score_url(url1) - s2 = self.score_url(url2) - if s1 > s2: - result = url1 - if result != url2: - logger.debug('Not replacing %r with %r', url1, url2) - else: - logger.debug('Replacing %r with %r', url1, url2) - return result - - def split_filename(self, filename, project_name): - """ - Attempt to split a filename in project name, version and Python version. - """ - return split_filename(filename, project_name) - - def convert_url_to_download_info(self, url, project_name): - """ - See if a URL is a candidate for a download URL for a project (the URL - has typically been scraped from an HTML page). - - If it is, a dictionary is returned with keys "name", "version", - "filename" and "url"; otherwise, None is returned. - """ - def same_project(name1, name2): - return normalize_name(name1) == normalize_name(name2) - - result = None - scheme, netloc, path, params, query, frag = urlparse(url) - if frag.lower().startswith('egg='): # pragma: no cover - logger.debug('%s: version hint in fragment: %r', - project_name, frag) - m = HASHER_HASH.match(frag) - if m: - algo, digest = m.groups() - else: - algo, digest = None, None - origpath = path - if path and path[-1] == '/': # pragma: no cover - path = path[:-1] - if path.endswith('.whl'): - try: - wheel = Wheel(path) - if not is_compatible(wheel, self.wheel_tags): - logger.debug('Wheel not compatible: %s', path) - else: - if project_name is None: - include = True - else: - include = same_project(wheel.name, project_name) - if include: - result = { - 'name': wheel.name, - 'version': wheel.version, - 'filename': wheel.filename, - 'url': urlunparse((scheme, netloc, origpath, - params, query, '')), - 'python-version': ', '.join( - ['.'.join(list(v[2:])) for v in wheel.pyver]), - } - except Exception as e: # pragma: no cover - logger.warning('invalid path for wheel: %s', path) - elif not path.endswith(self.downloadable_extensions): # pragma: no cover - logger.debug('Not downloadable: %s', path) - else: # downloadable extension - path = filename = posixpath.basename(path) - for ext in self.downloadable_extensions: - if path.endswith(ext): - path = path[:-len(ext)] - t = self.split_filename(path, project_name) - if not t: # pragma: no cover - logger.debug('No match for project/version: %s', path) - else: - name, version, pyver = t - if not project_name or same_project(project_name, name): - result = { - 'name': name, - 'version': version, - 'filename': filename, - 'url': urlunparse((scheme, netloc, origpath, - params, query, '')), - #'packagetype': 'sdist', - } - if pyver: # pragma: no cover - result['python-version'] = pyver - break - if result and algo: - result['%s_digest' % algo] = digest - return result - - def _get_digest(self, info): - """ - Get a digest from a dictionary by looking at keys of the form - 'algo_digest'. - - Returns a 2-tuple (algo, digest) if found, else None. Currently - looks only for SHA256, then MD5. - """ - result = None - for algo in ('sha256', 'md5'): - key = '%s_digest' % algo - if key in info: - result = (algo, info[key]) - break - return result - - def _update_version_data(self, result, info): - """ - Update a result dictionary (the final result from _get_project) with a - dictionary for a specific version, which typically holds information - gleaned from a filename or URL for an archive for the distribution. - """ - name = info.pop('name') - version = info.pop('version') - if version in result: - dist = result[version] - md = dist.metadata - else: - dist = make_dist(name, version, scheme=self.scheme) - md = dist.metadata - dist.digest = digest = self._get_digest(info) - url = info['url'] - result['digests'][url] = digest - if md.source_url != info['url']: - md.source_url = self.prefer_url(md.source_url, url) - result['urls'].setdefault(version, set()).add(url) - dist.locator = self - result[version] = dist - - def locate(self, requirement, prereleases=False): - """ - Find the most recent distribution which matches the given - requirement. - - :param requirement: A requirement of the form 'foo (1.0)' or perhaps - 'foo (>= 1.0, < 2.0, != 1.3)' - :param prereleases: If ``True``, allow pre-release versions - to be located. Otherwise, pre-release versions - are not returned. - :return: A :class:`Distribution` instance, or ``None`` if no such - distribution could be located. - """ - result = None - r = parse_requirement(requirement) - if r is None: # pragma: no cover - raise DistlibException('Not a valid requirement: %r' % requirement) - scheme = get_scheme(self.scheme) - self.matcher = matcher = scheme.matcher(r.requirement) - logger.debug('matcher: %s (%s)', matcher, type(matcher).__name__) - versions = self.get_project(r.name) - if len(versions) > 2: # urls and digests keys are present - # sometimes, versions are invalid - slist = [] - vcls = matcher.version_class - for k in versions: - if k in ('urls', 'digests'): - continue - try: - if not matcher.match(k): - logger.debug('%s did not match %r', matcher, k) - else: - if prereleases or not vcls(k).is_prerelease: - slist.append(k) - else: - logger.debug('skipping pre-release ' - 'version %s of %s', k, matcher.name) - except Exception: # pragma: no cover - logger.warning('error matching %s with %r', matcher, k) - pass # slist.append(k) - if len(slist) > 1: - slist = sorted(slist, key=scheme.key) - if slist: - logger.debug('sorted list: %s', slist) - version = slist[-1] - result = versions[version] - if result: - if r.extras: - result.extras = r.extras - result.download_urls = versions.get('urls', {}).get(version, set()) - d = {} - sd = versions.get('digests', {}) - for url in result.download_urls: - if url in sd: # pragma: no cover - d[url] = sd[url] - result.digests = d - self.matcher = None - return result - - -class PyPIRPCLocator(Locator): - """ - This locator uses XML-RPC to locate distributions. It therefore - cannot be used with simple mirrors (that only mirror file content). - """ - def __init__(self, url, **kwargs): - """ - Initialise an instance. - - :param url: The URL to use for XML-RPC. - :param kwargs: Passed to the superclass constructor. - """ - super(PyPIRPCLocator, self).__init__(**kwargs) - self.base_url = url - self.client = ServerProxy(url, timeout=3.0) - - def get_distribution_names(self): - """ - Return all the distribution names known to this locator. - """ - return set(self.client.list_packages()) - - def _get_project(self, name): - result = {'urls': {}, 'digests': {}} - versions = self.client.package_releases(name, True) - for v in versions: - urls = self.client.release_urls(name, v) - data = self.client.release_data(name, v) - metadata = Metadata(scheme=self.scheme) - metadata.name = data['name'] - metadata.version = data['version'] - metadata.license = data.get('license') - metadata.keywords = data.get('keywords', []) - metadata.summary = data.get('summary') - dist = Distribution(metadata) - if urls: - info = urls[0] - metadata.source_url = info['url'] - dist.digest = self._get_digest(info) - dist.locator = self - result[v] = dist - for info in urls: - url = info['url'] - digest = self._get_digest(info) - result['urls'].setdefault(v, set()).add(url) - result['digests'][url] = digest - return result - -class PyPIJSONLocator(Locator): - """ - This locator uses PyPI's JSON interface. It's very limited in functionality - and probably not worth using. - """ - def __init__(self, url, **kwargs): - super(PyPIJSONLocator, self).__init__(**kwargs) - self.base_url = ensure_slash(url) - - def get_distribution_names(self): - """ - Return all the distribution names known to this locator. - """ - raise NotImplementedError('Not available from this locator') - - def _get_project(self, name): - result = {'urls': {}, 'digests': {}} - url = urljoin(self.base_url, '%s/json' % quote(name)) - try: - resp = self.opener.open(url) - data = resp.read().decode() # for now - d = json.loads(data) - md = Metadata(scheme=self.scheme) - data = d['info'] - md.name = data['name'] - md.version = data['version'] - md.license = data.get('license') - md.keywords = data.get('keywords', []) - md.summary = data.get('summary') - dist = Distribution(md) - dist.locator = self - urls = d['urls'] - result[md.version] = dist - for info in d['urls']: - url = info['url'] - dist.download_urls.add(url) - dist.digests[url] = self._get_digest(info) - result['urls'].setdefault(md.version, set()).add(url) - result['digests'][url] = self._get_digest(info) - # Now get other releases - for version, infos in d['releases'].items(): - if version == md.version: - continue # already done - omd = Metadata(scheme=self.scheme) - omd.name = md.name - omd.version = version - odist = Distribution(omd) - odist.locator = self - result[version] = odist - for info in infos: - url = info['url'] - odist.download_urls.add(url) - odist.digests[url] = self._get_digest(info) - result['urls'].setdefault(version, set()).add(url) - result['digests'][url] = self._get_digest(info) -# for info in urls: -# md.source_url = info['url'] -# dist.digest = self._get_digest(info) -# dist.locator = self -# for info in urls: -# url = info['url'] -# result['urls'].setdefault(md.version, set()).add(url) -# result['digests'][url] = self._get_digest(info) - except Exception as e: - self.errors.put(text_type(e)) - logger.exception('JSON fetch failed: %s', e) - return result - - -class Page(object): - """ - This class represents a scraped HTML page. - """ - # The following slightly hairy-looking regex just looks for the contents of - # an anchor link, which has an attribute "href" either immediately preceded - # or immediately followed by a "rel" attribute. The attribute values can be - # declared with double quotes, single quotes or no quotes - which leads to - # the length of the expression. - _href = re.compile(""" -(rel\\s*=\\s*(?:"(?P<rel1>[^"]*)"|'(?P<rel2>[^']*)'|(?P<rel3>[^>\\s\n]*))\\s+)? -href\\s*=\\s*(?:"(?P<url1>[^"]*)"|'(?P<url2>[^']*)'|(?P<url3>[^>\\s\n]*)) -(\\s+rel\\s*=\\s*(?:"(?P<rel4>[^"]*)"|'(?P<rel5>[^']*)'|(?P<rel6>[^>\\s\n]*)))? -""", re.I | re.S | re.X) - _base = re.compile(r"""<base\s+href\s*=\s*['"]?([^'">]+)""", re.I | re.S) - - def __init__(self, data, url): - """ - Initialise an instance with the Unicode page contents and the URL they - came from. - """ - self.data = data - self.base_url = self.url = url - m = self._base.search(self.data) - if m: - self.base_url = m.group(1) - - _clean_re = re.compile(r'[^a-z0-9$&+,/:;=?@.#%_\\|-]', re.I) - - @cached_property - def links(self): - """ - Return the URLs of all the links on a page together with information - about their "rel" attribute, for determining which ones to treat as - downloads and which ones to queue for further scraping. - """ - def clean(url): - "Tidy up an URL." - scheme, netloc, path, params, query, frag = urlparse(url) - return urlunparse((scheme, netloc, quote(path), - params, query, frag)) - - result = set() - for match in self._href.finditer(self.data): - d = match.groupdict('') - rel = (d['rel1'] or d['rel2'] or d['rel3'] or - d['rel4'] or d['rel5'] or d['rel6']) - url = d['url1'] or d['url2'] or d['url3'] - url = urljoin(self.base_url, url) - url = unescape(url) - url = self._clean_re.sub(lambda m: '%%%2x' % ord(m.group(0)), url) - result.add((url, rel)) - # We sort the result, hoping to bring the most recent versions - # to the front - result = sorted(result, key=lambda t: t[0], reverse=True) - return result - - -class SimpleScrapingLocator(Locator): - """ - A locator which scrapes HTML pages to locate downloads for a distribution. - This runs multiple threads to do the I/O; performance is at least as good - as pip's PackageFinder, which works in an analogous fashion. - """ - - # These are used to deal with various Content-Encoding schemes. - decoders = { - 'deflate': zlib.decompress, - 'gzip': lambda b: gzip.GzipFile(fileobj=BytesIO(d)).read(), - 'none': lambda b: b, - } - - def __init__(self, url, timeout=None, num_workers=10, **kwargs): - """ - Initialise an instance. - :param url: The root URL to use for scraping. - :param timeout: The timeout, in seconds, to be applied to requests. - This defaults to ``None`` (no timeout specified). - :param num_workers: The number of worker threads you want to do I/O, - This defaults to 10. - :param kwargs: Passed to the superclass. - """ - super(SimpleScrapingLocator, self).__init__(**kwargs) - self.base_url = ensure_slash(url) - self.timeout = timeout - self._page_cache = {} - self._seen = set() - self._to_fetch = queue.Queue() - self._bad_hosts = set() - self.skip_externals = False - self.num_workers = num_workers - self._lock = threading.RLock() - # See issue #45: we need to be resilient when the locator is used - # in a thread, e.g. with concurrent.futures. We can't use self._lock - # as it is for coordinating our internal threads - the ones created - # in _prepare_threads. - self._gplock = threading.RLock() - self.platform_check = False # See issue #112 - - def _prepare_threads(self): - """ - Threads are created only when get_project is called, and terminate - before it returns. They are there primarily to parallelise I/O (i.e. - fetching web pages). - """ - self._threads = [] - for i in range(self.num_workers): - t = threading.Thread(target=self._fetch) - t.setDaemon(True) - t.start() - self._threads.append(t) - - def _wait_threads(self): - """ - Tell all the threads to terminate (by sending a sentinel value) and - wait for them to do so. - """ - # Note that you need two loops, since you can't say which - # thread will get each sentinel - for t in self._threads: - self._to_fetch.put(None) # sentinel - for t in self._threads: - t.join() - self._threads = [] - - def _get_project(self, name): - result = {'urls': {}, 'digests': {}} - with self._gplock: - self.result = result - self.project_name = name - url = urljoin(self.base_url, '%s/' % quote(name)) - self._seen.clear() - self._page_cache.clear() - self._prepare_threads() - try: - logger.debug('Queueing %s', url) - self._to_fetch.put(url) - self._to_fetch.join() - finally: - self._wait_threads() - del self.result - return result - - platform_dependent = re.compile(r'\b(linux_(i\d86|x86_64|arm\w+)|' - r'win(32|_amd64)|macosx_?\d+)\b', re.I) - - def _is_platform_dependent(self, url): - """ - Does an URL refer to a platform-specific download? - """ - return self.platform_dependent.search(url) - - def _process_download(self, url): - """ - See if an URL is a suitable download for a project. - - If it is, register information in the result dictionary (for - _get_project) about the specific version it's for. - - Note that the return value isn't actually used other than as a boolean - value. - """ - if self.platform_check and self._is_platform_dependent(url): - info = None - else: - info = self.convert_url_to_download_info(url, self.project_name) - logger.debug('process_download: %s -> %s', url, info) - if info: - with self._lock: # needed because self.result is shared - self._update_version_data(self.result, info) - return info - - def _should_queue(self, link, referrer, rel): - """ - Determine whether a link URL from a referring page and with a - particular "rel" attribute should be queued for scraping. - """ - scheme, netloc, path, _, _, _ = urlparse(link) - if path.endswith(self.source_extensions + self.binary_extensions + - self.excluded_extensions): - result = False - elif self.skip_externals and not link.startswith(self.base_url): - result = False - elif not referrer.startswith(self.base_url): - result = False - elif rel not in ('homepage', 'download'): - result = False - elif scheme not in ('http', 'https', 'ftp'): - result = False - elif self._is_platform_dependent(link): - result = False - else: - host = netloc.split(':', 1)[0] - if host.lower() == 'localhost': - result = False - else: - result = True - logger.debug('should_queue: %s (%s) from %s -> %s', link, rel, - referrer, result) - return result - - def _fetch(self): - """ - Get a URL to fetch from the work queue, get the HTML page, examine its - links for download candidates and candidates for further scraping. - - This is a handy method to run in a thread. - """ - while True: - url = self._to_fetch.get() - try: - if url: - page = self.get_page(url) - if page is None: # e.g. after an error - continue - for link, rel in page.links: - if link not in self._seen: - try: - self._seen.add(link) - if (not self._process_download(link) and - self._should_queue(link, url, rel)): - logger.debug('Queueing %s from %s', link, url) - self._to_fetch.put(link) - except MetadataInvalidError: # e.g. invalid versions - pass - except Exception as e: # pragma: no cover - self.errors.put(text_type(e)) - finally: - # always do this, to avoid hangs :-) - self._to_fetch.task_done() - if not url: - #logger.debug('Sentinel seen, quitting.') - break - - def get_page(self, url): - """ - Get the HTML for an URL, possibly from an in-memory cache. - - XXX TODO Note: this cache is never actually cleared. It's assumed that - the data won't get stale over the lifetime of a locator instance (not - necessarily true for the default_locator). - """ - # http://peak.telecommunity.com/DevCenter/EasyInstall#package-index-api - scheme, netloc, path, _, _, _ = urlparse(url) - if scheme == 'file' and os.path.isdir(url2pathname(path)): - url = urljoin(ensure_slash(url), 'index.html') - - if url in self._page_cache: - result = self._page_cache[url] - logger.debug('Returning %s from cache: %s', url, result) - else: - host = netloc.split(':', 1)[0] - result = None - if host in self._bad_hosts: - logger.debug('Skipping %s due to bad host %s', url, host) - else: - req = Request(url, headers={'Accept-encoding': 'identity'}) - try: - logger.debug('Fetching %s', url) - resp = self.opener.open(req, timeout=self.timeout) - logger.debug('Fetched %s', url) - headers = resp.info() - content_type = headers.get('Content-Type', '') - if HTML_CONTENT_TYPE.match(content_type): - final_url = resp.geturl() - data = resp.read() - encoding = headers.get('Content-Encoding') - if encoding: - decoder = self.decoders[encoding] # fail if not found - data = decoder(data) - encoding = 'utf-8' - m = CHARSET.search(content_type) - if m: - encoding = m.group(1) - try: - data = data.decode(encoding) - except UnicodeError: # pragma: no cover - data = data.decode('latin-1') # fallback - result = Page(data, final_url) - self._page_cache[final_url] = result - except HTTPError as e: - if e.code != 404: - logger.exception('Fetch failed: %s: %s', url, e) - except URLError as e: # pragma: no cover - logger.exception('Fetch failed: %s: %s', url, e) - with self._lock: - self._bad_hosts.add(host) - except Exception as e: # pragma: no cover - logger.exception('Fetch failed: %s: %s', url, e) - finally: - self._page_cache[url] = result # even if None (failure) - return result - - _distname_re = re.compile('<a href=[^>]*>([^<]+)<') - - def get_distribution_names(self): - """ - Return all the distribution names known to this locator. - """ - result = set() - page = self.get_page(self.base_url) - if not page: - raise DistlibException('Unable to get %s' % self.base_url) - for match in self._distname_re.finditer(page.data): - result.add(match.group(1)) - return result - -class DirectoryLocator(Locator): - """ - This class locates distributions in a directory tree. - """ - - def __init__(self, path, **kwargs): - """ - Initialise an instance. - :param path: The root of the directory tree to search. - :param kwargs: Passed to the superclass constructor, - except for: - * recursive - if True (the default), subdirectories are - recursed into. If False, only the top-level directory - is searched, - """ - self.recursive = kwargs.pop('recursive', True) - super(DirectoryLocator, self).__init__(**kwargs) - path = os.path.abspath(path) - if not os.path.isdir(path): # pragma: no cover - raise DistlibException('Not a directory: %r' % path) - self.base_dir = path - - def should_include(self, filename, parent): - """ - Should a filename be considered as a candidate for a distribution - archive? As well as the filename, the directory which contains it - is provided, though not used by the current implementation. - """ - return filename.endswith(self.downloadable_extensions) - - def _get_project(self, name): - result = {'urls': {}, 'digests': {}} - for root, dirs, files in os.walk(self.base_dir): - for fn in files: - if self.should_include(fn, root): - fn = os.path.join(root, fn) - url = urlunparse(('file', '', - pathname2url(os.path.abspath(fn)), - '', '', '')) - info = self.convert_url_to_download_info(url, name) - if info: - self._update_version_data(result, info) - if not self.recursive: - break - return result - - def get_distribution_names(self): - """ - Return all the distribution names known to this locator. - """ - result = set() - for root, dirs, files in os.walk(self.base_dir): - for fn in files: - if self.should_include(fn, root): - fn = os.path.join(root, fn) - url = urlunparse(('file', '', - pathname2url(os.path.abspath(fn)), - '', '', '')) - info = self.convert_url_to_download_info(url, None) - if info: - result.add(info['name']) - if not self.recursive: - break - return result - -class JSONLocator(Locator): - """ - This locator uses special extended metadata (not available on PyPI) and is - the basis of performant dependency resolution in distlib. Other locators - require archive downloads before dependencies can be determined! As you - might imagine, that can be slow. - """ - def get_distribution_names(self): - """ - Return all the distribution names known to this locator. - """ - raise NotImplementedError('Not available from this locator') - - def _get_project(self, name): - result = {'urls': {}, 'digests': {}} - data = get_project_data(name) - if data: - for info in data.get('files', []): - if info['ptype'] != 'sdist' or info['pyversion'] != 'source': - continue - # We don't store summary in project metadata as it makes - # the data bigger for no benefit during dependency - # resolution - dist = make_dist(data['name'], info['version'], - summary=data.get('summary', - 'Placeholder for summary'), - scheme=self.scheme) - md = dist.metadata - md.source_url = info['url'] - # TODO SHA256 digest - if 'digest' in info and info['digest']: - dist.digest = ('md5', info['digest']) - md.dependencies = info.get('requirements', {}) - dist.exports = info.get('exports', {}) - result[dist.version] = dist - result['urls'].setdefault(dist.version, set()).add(info['url']) - return result - -class DistPathLocator(Locator): - """ - This locator finds installed distributions in a path. It can be useful for - adding to an :class:`AggregatingLocator`. - """ - def __init__(self, distpath, **kwargs): - """ - Initialise an instance. - - :param distpath: A :class:`DistributionPath` instance to search. - """ - super(DistPathLocator, self).__init__(**kwargs) - assert isinstance(distpath, DistributionPath) - self.distpath = distpath - - def _get_project(self, name): - dist = self.distpath.get_distribution(name) - if dist is None: - result = {'urls': {}, 'digests': {}} - else: - result = { - dist.version: dist, - 'urls': {dist.version: set([dist.source_url])}, - 'digests': {dist.version: set([None])} - } - return result - - -class AggregatingLocator(Locator): - """ - This class allows you to chain and/or merge a list of locators. - """ - def __init__(self, *locators, **kwargs): - """ - Initialise an instance. - - :param locators: The list of locators to search. - :param kwargs: Passed to the superclass constructor, - except for: - * merge - if False (the default), the first successful - search from any of the locators is returned. If True, - the results from all locators are merged (this can be - slow). - """ - self.merge = kwargs.pop('merge', False) - self.locators = locators - super(AggregatingLocator, self).__init__(**kwargs) - - def clear_cache(self): - super(AggregatingLocator, self).clear_cache() - for locator in self.locators: - locator.clear_cache() - - def _set_scheme(self, value): - self._scheme = value - for locator in self.locators: - locator.scheme = value - - scheme = property(Locator.scheme.fget, _set_scheme) - - def _get_project(self, name): - result = {} - for locator in self.locators: - d = locator.get_project(name) - if d: - if self.merge: - files = result.get('urls', {}) - digests = result.get('digests', {}) - # next line could overwrite result['urls'], result['digests'] - result.update(d) - df = result.get('urls') - if files and df: - for k, v in files.items(): - if k in df: - df[k] |= v - else: - df[k] = v - dd = result.get('digests') - if digests and dd: - dd.update(digests) - else: - # See issue #18. If any dists are found and we're looking - # for specific constraints, we only return something if - # a match is found. For example, if a DirectoryLocator - # returns just foo (1.0) while we're looking for - # foo (>= 2.0), we'll pretend there was nothing there so - # that subsequent locators can be queried. Otherwise we - # would just return foo (1.0) which would then lead to a - # failure to find foo (>= 2.0), because other locators - # weren't searched. Note that this only matters when - # merge=False. - if self.matcher is None: - found = True - else: - found = False - for k in d: - if self.matcher.match(k): - found = True - break - if found: - result = d - break - return result - - def get_distribution_names(self): - """ - Return all the distribution names known to this locator. - """ - result = set() - for locator in self.locators: - try: - result |= locator.get_distribution_names() - except NotImplementedError: - pass - return result - - -# We use a legacy scheme simply because most of the dists on PyPI use legacy -# versions which don't conform to PEP 426 / PEP 440. -default_locator = AggregatingLocator( - JSONLocator(), - SimpleScrapingLocator('https://pypi.python.org/simple/', - timeout=3.0), - scheme='legacy') - -locate = default_locator.locate - -NAME_VERSION_RE = re.compile(r'(?P<name>[\w-]+)\s*' - r'\(\s*(==\s*)?(?P<ver>[^)]+)\)$') - -class DependencyFinder(object): - """ - Locate dependencies for distributions. - """ - - def __init__(self, locator=None): - """ - Initialise an instance, using the specified locator - to locate distributions. - """ - self.locator = locator or default_locator - self.scheme = get_scheme(self.locator.scheme) - - def add_distribution(self, dist): - """ - Add a distribution to the finder. This will update internal information - about who provides what. - :param dist: The distribution to add. - """ - logger.debug('adding distribution %s', dist) - name = dist.key - self.dists_by_name[name] = dist - self.dists[(name, dist.version)] = dist - for p in dist.provides: - name, version = parse_name_and_version(p) - logger.debug('Add to provided: %s, %s, %s', name, version, dist) - self.provided.setdefault(name, set()).add((version, dist)) - - def remove_distribution(self, dist): - """ - Remove a distribution from the finder. This will update internal - information about who provides what. - :param dist: The distribution to remove. - """ - logger.debug('removing distribution %s', dist) - name = dist.key - del self.dists_by_name[name] - del self.dists[(name, dist.version)] - for p in dist.provides: - name, version = parse_name_and_version(p) - logger.debug('Remove from provided: %s, %s, %s', name, version, dist) - s = self.provided[name] - s.remove((version, dist)) - if not s: - del self.provided[name] - - def get_matcher(self, reqt): - """ - Get a version matcher for a requirement. - :param reqt: The requirement - :type reqt: str - :return: A version matcher (an instance of - :class:`distlib.version.Matcher`). - """ - try: - matcher = self.scheme.matcher(reqt) - except UnsupportedVersionError: # pragma: no cover - # XXX compat-mode if cannot read the version - name = reqt.split()[0] - matcher = self.scheme.matcher(name) - return matcher - - def find_providers(self, reqt): - """ - Find the distributions which can fulfill a requirement. - - :param reqt: The requirement. - :type reqt: str - :return: A set of distribution which can fulfill the requirement. - """ - matcher = self.get_matcher(reqt) - name = matcher.key # case-insensitive - result = set() - provided = self.provided - if name in provided: - for version, provider in provided[name]: - try: - match = matcher.match(version) - except UnsupportedVersionError: - match = False - - if match: - result.add(provider) - break - return result - - def try_to_replace(self, provider, other, problems): - """ - Attempt to replace one provider with another. This is typically used - when resolving dependencies from multiple sources, e.g. A requires - (B >= 1.0) while C requires (B >= 1.1). - - For successful replacement, ``provider`` must meet all the requirements - which ``other`` fulfills. - - :param provider: The provider we are trying to replace with. - :param other: The provider we're trying to replace. - :param problems: If False is returned, this will contain what - problems prevented replacement. This is currently - a tuple of the literal string 'cantreplace', - ``provider``, ``other`` and the set of requirements - that ``provider`` couldn't fulfill. - :return: True if we can replace ``other`` with ``provider``, else - False. - """ - rlist = self.reqts[other] - unmatched = set() - for s in rlist: - matcher = self.get_matcher(s) - if not matcher.match(provider.version): - unmatched.add(s) - if unmatched: - # can't replace other with provider - problems.add(('cantreplace', provider, other, - frozenset(unmatched))) - result = False - else: - # can replace other with provider - self.remove_distribution(other) - del self.reqts[other] - for s in rlist: - self.reqts.setdefault(provider, set()).add(s) - self.add_distribution(provider) - result = True - return result - - def find(self, requirement, meta_extras=None, prereleases=False): - """ - Find a distribution and all distributions it depends on. - - :param requirement: The requirement specifying the distribution to - find, or a Distribution instance. - :param meta_extras: A list of meta extras such as :test:, :build: and - so on. - :param prereleases: If ``True``, allow pre-release versions to be - returned - otherwise, don't return prereleases - unless they're all that's available. - - Return a set of :class:`Distribution` instances and a set of - problems. - - The distributions returned should be such that they have the - :attr:`required` attribute set to ``True`` if they were - from the ``requirement`` passed to ``find()``, and they have the - :attr:`build_time_dependency` attribute set to ``True`` unless they - are post-installation dependencies of the ``requirement``. - - The problems should be a tuple consisting of the string - ``'unsatisfied'`` and the requirement which couldn't be satisfied - by any distribution known to the locator. - """ - - self.provided = {} - self.dists = {} - self.dists_by_name = {} - self.reqts = {} - - meta_extras = set(meta_extras or []) - if ':*:' in meta_extras: - meta_extras.remove(':*:') - # :meta: and :run: are implicitly included - meta_extras |= set([':test:', ':build:', ':dev:']) - - if isinstance(requirement, Distribution): - dist = odist = requirement - logger.debug('passed %s as requirement', odist) - else: - dist = odist = self.locator.locate(requirement, - prereleases=prereleases) - if dist is None: - raise DistlibException('Unable to locate %r' % requirement) - logger.debug('located %s', odist) - dist.requested = True - problems = set() - todo = set([dist]) - install_dists = set([odist]) - while todo: - dist = todo.pop() - name = dist.key # case-insensitive - if name not in self.dists_by_name: - self.add_distribution(dist) - else: - #import pdb; pdb.set_trace() - other = self.dists_by_name[name] - if other != dist: - self.try_to_replace(dist, other, problems) - - ireqts = dist.run_requires | dist.meta_requires - sreqts = dist.build_requires - ereqts = set() - if meta_extras and dist in install_dists: - for key in ('test', 'build', 'dev'): - e = ':%s:' % key - if e in meta_extras: - ereqts |= getattr(dist, '%s_requires' % key) - all_reqts = ireqts | sreqts | ereqts - for r in all_reqts: - providers = self.find_providers(r) - if not providers: - logger.debug('No providers found for %r', r) - provider = self.locator.locate(r, prereleases=prereleases) - # If no provider is found and we didn't consider - # prereleases, consider them now. - if provider is None and not prereleases: - provider = self.locator.locate(r, prereleases=True) - if provider is None: - logger.debug('Cannot satisfy %r', r) - problems.add(('unsatisfied', r)) - else: - n, v = provider.key, provider.version - if (n, v) not in self.dists: - todo.add(provider) - providers.add(provider) - if r in ireqts and dist in install_dists: - install_dists.add(provider) - logger.debug('Adding %s to install_dists', - provider.name_and_version) - for p in providers: - name = p.key - if name not in self.dists_by_name: - self.reqts.setdefault(p, set()).add(r) - else: - other = self.dists_by_name[name] - if other != p: - # see if other can be replaced by p - self.try_to_replace(p, other, problems) - - dists = set(self.dists.values()) - for dist in dists: - dist.build_time_dependency = dist not in install_dists - if dist.build_time_dependency: - logger.debug('%s is a build-time dependency only.', - dist.name_and_version) - logger.debug('find done for %s', odist) - return dists, problems diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/locators.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/locators.pyc deleted file mode 100644 index 9b08c288ad7cf5c71015e7615c6a35f7950ce996..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49817 zcmeIbdvqLEe&2b!0fGPslHdy@B}yt%q6kVP_>jcWa7d99K}npEKu(bw(h#Xev%3H^ z*$<$rK>{+FWK5lL)*0LD?CegQj6E8Aoa1b=+01Mno@8SGVJG$^@y_meoj51S+Ro<0 zc^sd-9B1Pb$NTyIZdG*wq~x*V6Da4bguc9W>(;IN_}$<8{;KEStsi{m(;Kc=T=HKZ z|DNU-ALwze%3s0NotyOeqN^8Nqv$4!u8`d8ag#l1y<Rujo95TJ$u()d&rSBF`L%9x zty>ySFZ<nOzq`_W%=JbC?$)4df43_X(zXY6vsrLglXtCilj~fS*Y&#kkZY`Wlk4dR z*K1sTgKKPblN()Q*i8<*#wItp$u%~+$<3~@#Z7K;jje8St7~j?liOTl#7&O4#&$Qk z-8FW&$sMk-(@j3&8jrfkM_pr=o809ZkGaXmT;p*!`M7^apQ}IN8iAV(Tw}MJ-0d2B z+~gjAZ>_68=^9VD$){XnubbTKOZ#2@Y1i22Cil6<sGA&hjs0$NziT|>CZBPQXWitp zu5rLk9&n9=Zt|dOjJe4%*Er-R5BcW@T>Y?X9C4FJT;r&lJnBmaUHv)Nc-~Du?;0<- z$roH9>UB4dx#%PAe!)$?=%Tgm=0{z1on0PJFNZAiF?XNUJCPQyw>l?Xb%UFH$wjAJ zb)$QiMozoxu!|mX(*;-E<lc4ezH{F(dB#;YyXa*r-IA4_b=9pdI%}odveI!^9Z5^K zXQk&{bw}F5&aCtmSA8U{`)F4Bs;llwOCQThUvt&R)6yrh((|qwq@}yF(vQ39p0xDI ztn?Eu;_tkM6!DIyTy?LjKFvfFs{34ZlnE+KzV4#e-OV@L<QwTs?YEhlaMfqh{y&?w zctM-w(&zzpP3?F1Z(_7SwzHPx<)uy(pTAI3fiE2<H(rZ7_1cYdi<M}uQ)@LxH>UL$ z+Vz{QTC>wn0r|OdJB~Vo{$io&FNgf)(YbPGwpngO9TlV(M|rBVhJyKpXdy~+txn`y zY({aVJm;T?JMCI?rqo%Qi(+fy#zL)LEw$#NX4LL%p^4WnU%nVd)ml5MbY3ert98l; zDDOmz9ed7(7)HD*?${kYajxBNwe59phOgVjD44|AD>U$S?Z$!z-AQL6Ex5>dtd&Oj zR#d7|b+o7lH5YG0opQC@DR;K!F3vY^m+Q5ve}{EU^H?cYW}|9puFXi=ou$qu%536F zm3CB(nw?s??gtz-<AruqitFWgwzGk1@m#&uDNWbvk<F_*I1_c$)J>+KWF6=>*Jj|% zO@k&oBiT#zWQoZt-HzI^hPjSgm!dY87u&7HC3{h`)o#%BccPN2`(bL8^|qMqv#8s- ze3K5&%`ux%^;5nzKUSL-E%KGwD5`hXldHw0N~-}B)Na(Hcrzt$k6yd;?EaIZZ<P;D zA3pfe>(B0wAEEeT*Wza?vj$h>PVyTaduBiXJQY9AZLRI0*-oQ=w>-yeRA{i(JhV7E z+u47rQIB^~Wwz6qi;o{VG`BQY8=G6|%(j|it@eyvR|M$lo_cqdU;J^ByHJlFcdOsE zx4BNi-E*$Vn~GKrhAC?E-7C0vHn_V5ce6)Z^U@Wb;HuiIjYmP@Dg~ED)o%Phk_-m? z7e<|hb~7l~>w(}Ug`_~U8V9$Utvk)&#!^sj2DN52S{$>7jsp$lM!-fn9$cP{0>CtA zO$Qya`C4sj`*?6BsMEA+=rz902Vdr!whhs#HKNu+XNFGlU;pU|+l7^SD~?8cDd{Mg zXf-2SxbbtZoO$#0%cb)Z<L9o1kLkYFQ|~Ozl`FT(Gg0gTM7v14TNJuduK{+W<eVjO zi`=2PcI|e#6CJu;ZXcR%)vLhFp?4M!Ej`!1(Y$l($g%n6;bZORk5yib7e88kr+t|J zX66oEJ~UUGJ6LPR9R_%?bL5Sg(nS^74=`?4TkS&{F(~U$y#+|L+OZa1;3SCUG25=` z^czse`?(tnHMzc_!a!kjp{KB+*wGGMfm14~qyGdqFY}A{l0+~aEI(;c=oK0SpAq%A zURaD?SPM9c@RChTe2(h2vS)${dpQm|t>8|peJd!pTMNx<P!4V^%&@jW+-gL@MT6Mj zxv`^Ti$Oc8N98z*{qj{bwL&C9-Dmm5Unijt_xjx8sMw70>w&ws*4^cAjl0$7+Uu3! zawk<T&aZd;UAb$_j=&v?2`B^d6amKf`rX}rcas6J8;Y*|p6eKp-vr3nCDbYERlp04 z3i7G*KPZ2*&t7R23iI!&s(<YXZ6xSD4buScVN=m$uWsM(W4~xb6NW-<<%E!WC|YRO zI{f1d8?~dkdbtvnW}`A7<L6XJH+>>bo*32Cgj$?XB?gEdTZLLW!|;NK=>-5nkg92% zEyv|fryU+r4N;YsneP=4V7(ApDMcb4rRNSGwRhQ0iKF_o^%;B%&Twve&dMvTYGmb& zc*eiUx*uD&n$aC~K;66*EqUT+<g^p7?xqQ!r%R{#8MbvjeTDUfp~7IHpR||X#=<s! zTZ-%XcU1FdeJ|OTDwT{CD3uzm>Owu@QWZ+2YO7KzS;G%b<dFx9o_nz9Bi%_^HFOd_ z%V0jDnGwwP_4M@(Y_$Qt?om#KQu|N04Nd$anPq4K#vNe*#vLgH#+^O%grp6yMm2ET zktJY?t3$@&4!G)iLn?z}euZ7Q1@lX0NX)M?>l5a8a)XODx@f(NHW>Si@Uqz|Y;slO zgAp>|f%V81S2Z3OQ3L*0CEHxp_+JDLcwd!lcU9wk5j)^}RkBmOb`{na*85SRwcU&? zew8FaYd6?432vKiwSyE12M3{AFmYhK*>cAhN6RQ-g4kjK%2=n|9-Db5*4DQCjdza5 zy~%~oyi=P?N~q^=-AFRg%#1II79*dzGh6qWx$3knR5h9|FVs5~ZPN62mVA7gq-JbD z$zv&?wjc(84SFBp0=z{Di{>+6KtpNVQaMW{_F65*Z^K{MoQV3LZ`Q=j)tDQj@DQ+O zCGx0T_Y*?zQPlC^<)~6#pl&vM^;YXvp!saHAn<UxkklYy+u{Ra2$r&UslD8P%_yph z%!nN@&LMd$@GsLXUNr`PQHz6kE~?a~Yf=1ut%>!hEVSEt|HX3`57L!Z1HQ7#OOgf; zs=Z)pYF|B?DOZ;EO-;RDW3}mEskIQKJxn;rAX<ci11rnHBWN`th!@XyCv9R>jHn^e zlCjd^VXi}Qv9?3)ju#S)6xhl)${o1Yc4!D|4OKsB(ua1cVRX;IgfFNOHP=NqtHQWw z2b4-Rz^7E2CLe3au798~(6hOBpkPdF4<#Cj0dRxN3~WHbElvq0Z}MkcX*}zeo=i(T zJVWLo!tk*WVR5#uaHaW(>rI}5Ye30yMM{qO0n=?HH=yk>xs+Yu*-IuX#xL^PY?)JD zx49JfISua2)+)2XZ25K+v?>Na)$TeP@d(9z8~YhG=8%OnC@8d*yn+}M*=oY+18Y`z z&Z>#dcgpcCC`&Uk>CKkTDz~GUJq}C5(ysC{YSqMV_~}^U$^;+R+h^S7=EA1Jmcm+6 zTTt~_KU+{qdw$|I>s|cv66M*9pM^JUgIZQhc%!`JC;dhgHNhq`Gf{5dz3?AirXgEI zo4Hk<C~@Hx4JMhY@8&udK6PszoEizZc@UQ}&cow`;o$HUDj2X>lOLKv3Pbrp8ru3k zF8vrEvi!nRevIkJ1Q~|P68ZZ>HLQ}L+!KNy$PFu{vHI7bT7sj50I-{hE&0KPSGnmI zP-xf|5cSEzYHwmKTM0yzjPG+?rpxxg_@t0QY+<{CR=>+M2bT;z#V1+6Y~Q{DNiPR8 zHAL4S(cK&fm_iDxwTcuP<@Qq00PTq$mT#A9^)gzMjP#3ok3%g}c{Xd<WMo(jxT>to zQ~24|LcJQ?K!ebjtD8y)(k+Q|;f9H%%N{vD9aNB+sWIJdHRzRbB+=-8co5U29S9`! zj3rbxxKl&%K-<icx>nBKomLPJBOW5Bky1qjuUb64bRcMPvwcT=QmvD<CJjWFT*Lu$ zd(nj9?ie%zwVRG2QEW<zn`m{;cZYgTVp|Tl#5$U0i+@*9K_R?ndnbW{ALQBt*I<VC zvd#1Uz$GG@&3Q_OSrSdngPNd3Ma2BWo5v})`TLsb@S3JisOiH%MWo{tBFYcht9pKn zJAPh!jrs54TEDX@hgV8)E&EnVk==G_JQCX&W~q5D!CF+6PUUn`A5^wex1Y9a6BP== z+PO!i?=W_Zx+l0u#Du@gJF^x0ua6G2yW=1adD@Ouwr&D7(oP+Kv#16)7Z5!%q!EJ* zM7@NU>gA=VE&jaIn(IQ(gsBjX2767++YB{)lcdY1h1XRUs*K+%?myvnK}@p!{w$ZV zwwYVI5e{u*VYoO*y1rmQBbqFM!GK288%)otdJuu%)Up>%I}FhDNQ-(84!g(QM9lZq zP@CDMAj0e0Oik9F7G+0|!d+U^-2v0I^-2w`HqikTrI4$lI^%MkpfFLf*(;`{NfS<s z7f3R|dKC&I$rDWz>lRm9?I_{NE0lt;5!p;itjxAh{z8kQX?Ru2P&s#nL1FI|<SNxm zcGo=<xs7m}3O<%Db%hdsR4C7D=fuR%wc^^MOhcwck`_T&+0<uNsxe(|V<(bCgbWbh zsZm#^hbpS`dJCHigt3H809y%kGY<D~FWgOHs;E1%Ka@J<nb^cS6A;jAL(jbUVFI6k z(By?qSV<r3+A8eTSTC$8Qx9{IfBP!Ku%^+LRvOK(>q5pAw`K?k?gM(2K3dpOsPs@O z_|=@A<rjY^3E%{*0><q-T|_022Ch8bG7<3}pi2qDVXteSQhlBha2i0~>T&I|rcjz= z0GL0X>Ooq(la?AvOiKN831jq~dB*6hheHUz89eT^3=o0Y2*|wwmw?6`O$2zUhOG+= zia;}u?laIYw?R_3lN!b%09PpkWww%K&jq7uDOxOxWjK(vl4zuY+woX{>S_NnwyLWV z$<U)2qk`%3?bbp&4pKXmA4Cfcj1^&-0<|Xn%U)%imNXrKRm5n;hO|Osjy#zbgdfm! zMD-wr&>AMerC=1TN|*1l8v6}@Gj`7-C2us-Q*PVt00`if*wE6k3$O2O!-6r@d)x6= zZiWxJ;ZZs3==CrrVzzDLS0hXrrquTmxquD0JYrj#%uz%8rY4V%_<xSB@&=NW?lGTs z(BJ0D#_b0CZ2xRT={>-2q&VXDkoJ*&wudCqcsd~97JU~t6yuK4MZ;%09ced=<COt7 zC<mztR}5@Id~9J3WFRWqn^=Mp)m?YdJjb<@cXVm0p{cZ4Z*fno!mH2chU)6CYF@<5 zx?V#?DiiLqX)G|IV2*cDVWA7(CiDY3@znKNp9B41cEYZOf$H9XyEo|W4hq@a2Srie zP*nS>NUn&j;Up>u0|BET{hOG>xCU#jb9dLd_ID}8CdKpDK!8K;-g?(Wtv=Gd#AJ34 zbMIQ${wqqWy>2JwH5tXy>wx|Um7xko18nrX{eKjeepQr*LcMLH!@7QVqoL9vfk*sX zX(!D_M@gai=Y%a8vsllK1&pirhFx>Bq1KJ=CVeo#qVVppYyas&4ODF9)qZzOxs9$m z;B)Bx2i-9o3S@hOL*QAM3OcvW!6DEgYzxOQE8N^HWuczkg2C_!cMm(k29@HyaF_f> z_XL&sd%Ni7?-calusg<@Fx)Hizf$b&&|9>Ge+R4hW>?U(V?5xsjG7Tq<7#ub;3q~@ zWV_mm|GiaYeHfds*!-8Sv%}ronM_x&7I=$W{6(9u?R4#LxqI};Ciw1FHPYT(<PyWK zzg(v^&>J3Atz@FMxx3q-h{XgNwq$Qx(2Z+7?%s&Ix82>_p$CTIKU(xe?Cyv<-~Ody z4MN9oG`m<rG_@E_e)oA5#oVFiNuia@*opaHDl%gi=QkJmyFy|6w~Kd&EX6EK9R@e# zMr0%9>e8tAns{@bAYO_PiNWk5ApydgxbKAc8SO)1knllP!*gmWLKzj^<H3x^VCoET zr@?8WUSER$gEGXGHvTrLpx+E$yZpxM!5lXIJgq|?0M@EOdX_0D=#Te7;CZ7MSTf^a zkMPZ&1HqmIZSCoj(>*DE+GC_?59oH!$GXD*fj}a^hM6|oMR}D}*V4lrUD7;B+7sqA z^GwEyvq6_BmE<yFa=%e0b?r!&TW!K4Ryd|dsrd1)bZr>2VB9not&^tq*c%_u=mMe_ zOVNZiD9^~V=QwoQoVtvIJ(RKGu?YJW;}n{Z_mo?xM?4Ul0A||6WRb$#)DFj#h#Ffj zFffUhjn&kpcms*|r8$^9W8OM7@8Sf=z%dB?jP=kvjEIV}NFh|5y4?t9YNCaH3!98R zlK||Yq+zQh(y$jsyM}v7$18RxCPsHrnltdr{!wq;!Hr5p9P?VcV-iBxQoT76^KN?W z%%#`Pg(dxCi*Ii>SzrbSjJY_Jjm3lpFFwrbGE!oKDj??k1c{q5PR4xT^!B+WI&DRA zh%xW5%xlgj_)fXqgsTccxGub*q@qRy#&~fVWgHbLG<L}*KfI&Mca%s(_U5gca#a%R zwmAsJHWu`8?Ir7gAi`FxVVC9lOv@_!DK!3|)vnE$T&1qtN?9Lk%}RX%X9X?y?NGbR zhHITfv<jsm$xQ`RdbI_2!9k_f)ZB|{D|K3#NQT*Ly7g<^k3p+4n&HCmIL-<K$nhKD z=(ZJyNJs3d2fl7I&J1vPMafA$I6CP6A?z}Jg_FgNh3$5KOJSI2H<>K8h0+mfuC@Q+ z3u%AY+#|5#Xsc*$1t@3vnd=X{16rcR7oGX%95xmQ9;L^Ph-UDI+R1zBm?TEY&S|)k zV%J|sNKK+!{7WPmI)63M7;A^5n%bQH7{4+ZkWGc$2@E$UUS#akM%Kzc0ZOvZ_T>Z| zuSXQgIeM_OfLIias^$UYCcSXK=+d;@mktCGhC0LDW5HQ(C9Zc3)9OQvnh1&`{BY^D zGe=)IX2$Dg@W%KHT@-J?8qb!wZIIWfz7RhI3z+wXuV#KfRP+4sUgpN!@4AwQK*4XK z@8xEALN)lUvc}2uZhjVzu;mQ3x_&v@2=W9=#vp6#f+d5a-yj3K!cI(dNyg;r(wN_6 zfOOg<aG*$1JHA;kqJ6Hp+Z-Bs48DWZIA>gm^L11RI9iLnJXwP6HnvLKuYAL}fEQfj zcEVSlfWwsA7rZNXr2_az)+%-U4cKd>{ytZt5>NHHo$>;Mu}8TD(KfXf?ZDNEOXuBs zBkVGrhV}1tC#q`!`+f!<{~MAFVBegR><?UeOE2)4nM{o1nXWa<_4KAm(0N7Ye$T3O zW#!!Co_$KZAu1`!mB1}Kc9(OS#dR@;2x}ji$e;CX1_MPiW2d@e9)K?n&R&2!s2Be2 za;1*GyB~5G_b}r(+F<C~gHCK%9^@BKm{QI5%v@{E5Is6Hb4Lzk3h@-=Pbl|&B%W5H zp}?b#$3v+MeOc5=JY=jbtU2~?xmvZ?CT=O-$<7pKMxH*eb~8F@osvezWcx<d-e_H4 z<&C$MZk84dbW+b}^OruO9Vjl*^=$;l%hheDxC3f2LT&?eU`OFeu53q2pP6ZZ-vrkq zOG(q4N~(SrQYcaGi1wS;hK&H@SObA_Ce&{-N|K!ixFbKAcqShV?YY#yh`r7JVZV^_ z0BT@~v}%BD!b6CZG=n^ZG+_cK8(RvxuN2@mv|rhX8ze9<B4e&ap89ekIwS3g;{2?e z|6kRsrO2uxr<#x)|Et8mi9JgbsU&?udp%xLK%n&XZVtPl_O^mNMv?vO(L!@1eHJ`` z983@BCB44Ft9m<|O>PWvE-3(0h@XgA-B(cMD!(flk0A!6FOBEZ1qr5j$I&48Y#YNa zFg#%mCi*MZl=;r-DFjee9Rg!9OY~wLxgIzF6~i*1sn?2{yAjv^X2EBm#HA5yjV>Yb z^~x7a_-VTyMnd)IO4WAi7Wx9(Rn0X?P1FaAW1{HDvg6mEG|d6RH-Nw_Z!3~P7T<}i z$3G|Lw-x!jqAOZ_L@x$p{L)i$$qrk@PXJyST6qP(Z?op*9l`Q?&jdwzd#k+dB5z*K zTF6;mb2L72K+D~fJ9+Lh^*a})3-(R7TEXa%vBUfK1t2s|FU*$bx@Ll$_gR+pkGym; z;Hd+_iQuUI*{#dx_V3F&mvjRqT<Y$8JV550nv&{&Y6`Kl4wsLjEW-25n}AapBx@sk zWiEqF3nPa&URTG03rveynGgKlo08sHa@2#8>2Y7Ai92ql^y5?GIotdcbi(`nVdic# zCds%{lupwghU?1ggF{%hvX#_wpN=D|A3q8{l7v+b?3_t{;gF%)X3Fv)(UwdVjP8y1 zn=}{xNuCUUkR%p?;1&vX8=qCzv*M=WTQ%>3@Q|5Td$5zpd6Hht!^ul@rb3QAl|?j_ zOks?dS%YFbD`E#0)T87y5}@u(a1}K(SI~sSjcSBm-m{!F_JqoeBECk>1iT!?=0rb} z);K*B%4sT`Qet%KkLocgZWACX*|LS7PK&YcbU`t^pyxiL<hxbD*l-(#jmoZ(k=o@r zd_$GKs7h))6?;WvW1DN+*j~>2G1ZdwvHPOfYsNLic5Zm$e^OvKfiE^eQ)9bb;hd1_ z-wMGVB162@>(r|s29m3(@<4l)uEm$RbnE*du@bK~7IqePAy92D_L*oVp{$2eso95% z0|;B|snt)79o!j)7!ULB05zWC-_2YNA=F7V?<J$PH2(W_Aoeagn$od{dJ%h_zTL-_ z*gKhIiWaYvFc3RM3*l)JJJS_=7OQKUw9*@Jr|qSj#nR3kM2jYYS99ea>}S;^)ZB%i zP@*|BV|sW+x$jW&7Kt%^s8Q@hnTMXYbq_bI1oELW&R9KDIfS3nrLlxxR&GMcUnCjj zmrGW|`!yV=3!mZ_kCEVK&wBHJUte*sIJ9M8!@$~s9{s<uI50HOH?V17<G=|2etckf zV7r|hkQFVwc=q)bZu#0CFRR)8BoSWi2qmP(q`gbV3<=7ZfTYYCxw`l25qY&4-ZgJ3 z18R^t=JPnX`o`-Ad7G>|9@v)|7BL*2$MPcsCNwm%Hc;V;l%)1|Q=P_ULkt=<IVypv z&0pSxW?y8Y1X{c%hVBl!Sy8!)@MaG`by479{<s~(1Rw-)FffoshwNLBNCk6gZV8gc z_>-6?W)hAQzA+i7xcQ90yr2JiR^eeM)tCo)f=kp%rlu>>B=v8h6q`Y(d6BbF2unO6 zh6P9PsO`^3F;2YO7AhR%>OLGkN#C>;_>V(tw(UJe)Pv#ID7H;vdqJ)QCfz)yVy$@B zROTfqVJF{_F3hhAxNGHpPzX{za%)E<Z3tHN(+Z#EXJnd{Ww{XNz2ytuKe0A`oEq7h zc)d;L$+L`?kp4S8c4)JXt~~+f?mYX65*@R73-^)p8WstCt2|jkXkXT3X=bn_>L2OR zGeya5Zo=chrUT>0^iL7f75jjhv&jScp^<D3go4Fa3UJ)x*Iz0~bn`Wk&`kZH8pvk8 z(3EsY3o1k+^F~H)A(y#=bR?XpLkogfQ1Tbjk#ON<u+%)L5-$@`vR1H6dn!awK~SR5 zq#l(Fb%i<!a%)`suu=q~oyc>t=?(ffAZE}HL^rf5^t<1cFcg|#R6;1@QQm+qW$~&W zAHV*F#KGionNf4kN?bBzxbr3!I`lMK62a#t!k3rs5QkKy$g2ktWFA4PJM8$oLg}SZ z@iP-$*3y%qu4Z5@w>hwjqmFmyK_iKqSv5B0LcGvuKo?mrz)mnWx=lH4Tsw!IoHQ+^ z0)naM&CH#Y7@M`MK&PR@t!l-X#jGQqPy6e-@smn^O35ZAKcpnnlZ0Q=<qs>d&F~&M z@4jTp4{OgfAb(y}{<spc)m{UlcYi@eKcd8RBpQ{eLsoeUi81(}wS_b-uCNt0N{9Kj z!Bnm1|IL;YJ2q%n1NN`{-~w1S!@8cKKBe)TR${D)c4nxyyTh~Gs^C-+gU@M<{bc$$ zZ!xfLpsyqSjhKUvU%D{y2gx1Wp<Tnj4{`^3-M%=`8xaIMQG1$$tl|kMgsn$KUu)Dj zKF`fydZFnxneynd_T&TtS9b%`*^-H8Y#8ip3o%003LZdwfbjsfWgf}{Ncm)DeRjPL zvvrS62z!QqRmsmNvGv@c++QPEK{&&&tBjvdR%LnB!Eb1J#rZf?bq^BEVQxS$Ap)Sq zWv=*tu+%bsf)|+(p1J9p&N=T}ogBHjM$HcuA^mwxVUCb$&N4#!m$>mTLYi?QFpUsW z4^bnYo-Um$0$aG`$c)gVnfEGDymIa*)KWxMsy`!Ys$dFEh^HQe%4Fme3hFhavK%Bt z5(3Ccc26Ir3FH85Mlm6TzGNUrSfPu)(CC*Q9F}lKMz5w1o>D^ZAmH-mhB$hfNf(D8 zn|ISY<Jad><*8RFQV;#5Xrm3()Uvpq_!n_+L^tH}t#+kKv=%dM;`=<9P*<LuA1Yi~ z{5SS`beSj?nZfbvzib{#>r4k}>P>nnr=+hI=6}GPo!|`eb7`7ksf*Vem*F!o7tDdh z){&1BbFjgcm;>@G=sJdttIQB@YpfVDPD1ZHWbQpM<ec{OcOUQXz)k!>;mVcfM^O|% zVv6FwfPHGC*LXkbZtilO$K<ud((za5Jnn8jVX9M#<VZyvCgVdkXh(MW5K}1ajSt<7 zTTRaj7&-3p11neo;Wm>YQeGn#D`FUYIx?39&f`Q?>90lu?pSOA!<3<@P53H_F#$S+ zYMC|%|Gg=mbF<jlg|*ZhlV0S+9RJ?<lrQNue^$wRN{nOqLFF=L#af20G-9v163#PY z&fG#Lly=J0Wah4b>LCg8qwVk2Q(fN1CPV$j*ftmbv}$}+$&V^A-o{jkHlqNNKei>y zSZuFrHT<#7mc$VAELdgAAqM3ag!V3z5%aSPtrJ=(*qhD9=yVw%&-iRI&C>`*pht_3 zQA@ff?+}_YM#Ipbpz!2?+yb`#x56Na&i{<&K_F`kQZEdW7WyL2Ulsnf|5WfYzxW-J zyv~G>1>ks4n=)%G?Q<{dVy%0b-AF8hq)Ksl72N|z^|*IYuneY^dXq}JyUs<pVy;mI zwmCr#P{Nqj^?CZxWwX4d0JmizlYJ&fh18iXb7J#6Qv8qf;3(TU4JdT#_@2>I7f(=f z<fXUX-gEt#{d?~2OG=JXvX7E|cawtWD0t~wJV+T~h@RblYH${1&Wff`@~&u#lI2ZN zkZ)>ml*S&~r{^E&(+ey6bS&2=Iu!3_geRo)pv_$G-rBe4`l(UIv*#tkD^+@^r4`k` zXZgj_SWDW4A0$(>L*N8H&^3f0qvT|4Es&U@Y3=h$<!GBRlV;mQEKGd*Z_#X~k9fEe z$=e5{_Ia~e6H+v%!&Je=VkQPJS<R`{btkEy!Z2r-uEN4>3|=4PF_gGgujCOoQ_{S6 zy*($4E3<|h&GE}0RWfPrr_)Em&yrhZBqjECC+wF$_P=HTW%o7^kJ)?Pdb@n^9l~Wj z_4Km`4jup4$y2Atp4?lycJ1!L>lOC1MF!GtvGwhtgjHfE5g7o+?LHYik-lkb>rX7% zBD2rNum6NJB3fDYb<U}Tt-5pWwiE&|7HJOVEGdIIOLA~#Nv_|sZajgyV(xSHEb59R zC-%v7C;~9EFth8u%^NO^u8`L)cqkAB(NF+Q%B>DC3X{ksY#lyQR4&YqVlei43D`jk zm4X8^nt=O-qVzt3N>R4>ACqKInP|xj06FVqCqk05Z}nQ!9F~HzhsjQhBVs6UJ;*-H z>!W;wa9RS>T07Xomd3r6h(Zb@7acG~C^SE6H;CuJ@e1!uf)NliEs9Tg0}OawD{5*s z@>^heWqkb>yk>QJ0XdK^8OF<mK~oB+Kp=ICIm(_U<C%7*>l$wK%rKLQA2fbx-rImJ z&mZ9-m@ngIS#4&RdG>zeiJnpN^W|D~DOi|egUX|2%nOG-+z5qPj05sVtF(tayCtQL z`7Vb4opRr!<d2c8?k+Plp!4|6gW77Qd@Vi>bvHNIgl|g@uCS&@(~{@X%=2mHg*0<4 zoY&aeBvvGhU(tH#r|Gfv*iME`>6Zj;uHS5|&4@>z6S1(?-o1N|E^6iy_hn5n+OqH$ zRigGj1c=JG<P-IB<3_do(#JH5^vhd&vtd)}hb=~fZOzDc`a`f2esp@o4+tW&$}kcB zGF>>84#X6b?MT+wXw;bIFLK-9rX(V3!^hjK3ZvaN%3}<*krsKC<phHPJ*Wg*GZ2Rw z)7WFqt$P;!&v46Bnz>_%e^+IuVEnXlV!Q1jfYED6DOf!nj7@`~%BMA7kEk<iF~h-7 zZ^YkL|BF%HQP|$|Xkk<$*$S;8xJFWiO|rbxk*Umrecn>Vq;u|S_^W#G7nF!7hW|v# zh>~9;=^_xzt%@q@Tl8Z<GoT?VC|F<bV})JCfpy!8oRR_d&9HY#$1K3pE47Z=)i3jl z|1wFQzphy<LC<0z14BRrA;iZZ!OE?1#}qsa_bJpCYu&qW%^Xqc*F6Oh8?cPo2vh=> z&1oliYB*~$$o<sckdRg)661ZOYMdVOfyV3vkV=Re<^zpwNn6-tEIF~me0;HO;?1|J z|Njq(5!W-RK`9}0o+ppH2TP3XrIym<@QOdkSzcy2_57V_RND*9IA{>nrzSV#4to!g zS=5sg>!RT24_)|}+>zv^qzGF&LZWbEL{1cK4Q5)cs&$S$aU)T^Ui5)0<yRH8QwL8S zdY4<LXj>T{($-9Cfu0e3m2;QAI|i*dN!IZ|%}`t~V?V1&*hK<b7fv@L6WbNEj!KJl zybmbYL6iw=LnmQcH*T80veAke&X*cOd6mp7+||xcgzcXtXDHG(#f>i5uL{HqN4_D5 zw+{Ym(rhNQXKf}lB_R9sD2{4+9RF{Xvr8qb*8hpL|2FqcxUt$G{i&$mqP{)+gmB_N zMZ%IY@eGH3Ba3>kS=3qFyfz)~i5l3_p=!#&;i6>p`F`PkQ*PQVv|`yUZ|9>vx;Gjm z1MfO4hsxyH&C4&hm|c)+>_ORo8HbC%%)Dou?Zf4*uC%n$X5Vh%i(q0_*Kq$JTbVqS zgpT!bX_Jcs+A=YkEsp2o*Ka;|WyR+8rhWNlab6$^^q2F_%d)n|6VGGY)>EmI+$b(` z$y>4@b=AcCL60ZBYA!TN+Pn~I-!lqsz#ZeC=8H3&p}=!@%ABC`$OFXDJ)M^ICzpAk zYex=0Fq6NVH$(S<32)RiL(8wTa4QTg=HOsnVFcEliIV7cU7jQ6z@A003(pHGjh*1& zizy||fg4G;TH@e%CpL#3bB2)*pLrFv!Dz9yo|`Uf#3NLwlhO1L8g<JvIbi8qhOJ67 zbCws4<Cu6yh_*yPy~?fbfeYhFYzX0h)Y!gGvdTMMJNT2@>9S?H!4WtULg>Mj_%q!& zldak4O-I`A85*x}G2?fxbBmXf%`c}5iODaUEbYZ)!wP2HD0op5c~*NHu~d>Owh4HD zHZ`0rvMfcqGr!Yafubk6lAl!1Qi!{pkT!Xn5)2$7Q}rijIIGnRa*;|z;e3cDoMWXb zG4Yc6SyMO6-$>^+;jxH8jU&=!^e7fUL87Cgebg|y*RU+I8FZqIh))))l3hVOfw5fh zB?B=NUZWc(6vw$uXsQ*C-qF1zHe)|yDkWsvAgNt$&O{z8ev5ndgdeMA6A%_aqp2A$ zM-4Rfa6_Kgwqt#v+%UVANF#(bJD9e*FlNpPau;O+qjb!5!JNEO9Q^PIx*MJBF(N5+ zEm%9tFV>J2cMItQALG|KmF(dujiX_}GU%=>a=JOGGi-IJU<^fJe#~9TAhk;m7HBvF zgv$|njWn)LvM5^d3}k{)PKu#It!jbG$`OW>023B`&4Nf|ZQUsYPx9;nf*J`9jazvH zC*m1O-VJ|Kxxb@iuM&1bF1p)?VdW&zl{BJs*_O0yVguaTVKn)}9RH|j!GstDo3>~_ zMdo2<QNKdp{{`FmTu6;-%ZVmctO5&&J`9s7Y8BI)CMHwe!1u=(0z(z3y}B26RI2a} zXGw^6KmcHGR@D&)9vc!b@AWn5HSvGJI9IBMz3>Xs)m7?F6~H+lLvJ9{BIONaJzQfT zi`Vh*C#7Q&Bw*b#gV1kN=*7@G%4tG!#;$*_%TFo!4JB)}@-5}&lyqT$j<~R&yE&cf zax2s7?ql;@`HTSIae6Al(4f(ZUFH)rh>>WR|2GxaK|SIV)VOwI6zO+iu{2t{R(<i< z-NhG=m5x1sx7=>%s|I)P)S9Eu9lcvBH>$^;-+#AJuC(IC(y43JXZK&bVNj)s)bA|6 zSTn69<<H=Tt)J-J#<`R2zws7YL$7%QtrM$Bdk{5cLXr<=N7qs<;;HOWe+Ygvt);a~ z)ktAg+3w;0MX^=z=07dP>Mn<Uuc9PJ{FK|sI{T-zNSe6B`%l2TmY>bz5*a^_Nfftq zHo1i6LZqA6=$U0>-j(q_ee6;E1k4A(YeIEo33}be5Kg7F?)!K6J!dWh2`y(EijaTu zYLk~{1buIw8BgOkn6lKwQrui?9gF6eu8|>B7SV@m$(_zQpM_m$M>E(@S?-+nSzNb- z--n!n1Vd-*zWnTCrm0TZ>FksvoC0z&Pv$y+TZ_bPL}~vb`<8`~1%}exhiqNxELbcF z3nb<P6;U7Y889VaQ%lOOtSk0pmspt2h*1-+vKvs#&Z!)H3GCx}iSR$OqT!&>ijk4e z>CzBU7t8!7m3>)>WaciD;5pLItBjvdRzu=6zkdaJST@ox368bz-5|#ei`(qT`5@{u z6GBCXGBeI&3?CuX(+z3xQ^h@=r~VI3y$}bWYGNqhz1;)%b}&i%RYA87%ze$Oa3-y; z#sF(oG7p*|ijqp$Yv5gT_u}tPZ!L-3phmhySe!4Ug;lff;D$osSJJ`@)-*h?(Yp3G z((;d(Lk{umOmT%kjn*phXobGrN4Le1KlUAQa(tIzs0q)51Wni)bXFLD7$>`zankWM z?8<&nrD%EANnh;rcw%x<#5-@kDdTI`yk(-Ud1#eA3e`u3yrD;ov^nE<4+q25b!wG` zdiepvP7r4yRn06z2o?CE2L)%->CEz74~cYkk?wm_Jt#(4Sf=;z2z)uBGiRLbaWiSw zDDh&R)Ma%O?4G2^zqw?u&CYfC004XAz&4LZ=0m_u+|Lu~D{XI>)11X76CdCs^(8O& zCzN#ILt^|T<)oSn|B8|cCI7FIKdi*etlF9^6)#d~tMCu$Mx-R$pBAs(2#bwai(vC$ z1dJnp;XhUN!%8$_vlQ7Zl>CXPUJ5n#Ro=wLF6O6R4s!7`bk41LoXxu)eqk5C%_d<= z%G6<{0gf|K!Xc-PsSKcPoo($GnZCs%1$KA)Ib-6C`M+-l+joB3E&aUUz5Q#pn~Y|$ zpS`FF<<T+YbMB5s;#>TpZCm+x|A6_3nSIaelpt){oEO|uDM0|*-lm*PSWbU2)c(12 z+j{y4am3#Lb1C=fcOE-h#1YIvU+oa91Qlo?p`q~H;?OIhq5h!-kpC6V^ImZLUD564 zer|K}nA=-8z^lDWBSfJ>35L@;K7xiU%#llkHF<@p!r)>FA=N`j436^l<OS%z$8=^S z=2Z)ck!Z6LZ!Lu|7X6YcD6mcAgDtBp^AsV71;PK2d!U0|W31UXY-6W82&p>@J}7*V zyVU-F&@P*G%~VNJOcR^Ei4Bz_`m-%N{DOL0#Jo%|rP<C=$SsU5$B?Icd}365oZn`~ zV!y$q?I}|cfM`6i{591w4*fml)&Xnbb|u-~^a9#8-TjP`k1G+Rho2<z&fYKRQk&1V zuh3YyMUB|Dy`*aVR*$-dJ#^+<+KXfA$6D>W9@m4vgtR=0^uo1q?;^3=&8Hm;RnLY( zU(pzG&1JS9{{amxBei);ITQ)$%{)3qqb8*pg5W}JnHto>9)4Ahk1IY32F?I7WDe1u zEg;$j$gj0?;h#<N6q-YX_jm9c4}S;tSo0H#O@`taxeuF<s3q<eP<%zmqkT`Kp}bJ^ zpBDhgVS+;5f(WSw28--RuA#D!6lkjgnfcT6@BB((=_7^YA^a!kY$8|U$%)^rouOB6 zhZ$D^$JnH*wP#h)Y1`gR!tr4(f<T)uCPzs)JtCJ+`^aPai6Tc%bZ*}to+nSRHS)BD zTx(_~=1#t-8(jN`3@zX=%aM7!KXLd>TvdtD2Pxa6dP&$gYdwjK_qPhf$GgdAY7CE1 zhssL?e}iv8e}Z7l3;6a`GXM$gG9>gn3Pa%UW6$#U<wPnkQ+j3r`!vn`*`iURP;FP5 zKSC3aTN9HwsBQv}Z8BHXEly!j{zg$V6<BmPR)Q&FCFcJ|v3ZNfcH3iL^p8EHp5C;_ zeg8I(8<FszOq`VwHMU9Ac$!9@vPOR9eH+mrRK44Cf=^%N>eA>4z#faA%<z&>W`+ud z!@PXS8TnQm^RYg{_E->j;i!WRRC63!sOS@hIYHs-)vLkf3*#38Nestn&eW6Ck;v1O z1-&aO*e4M9AVpwjAUFZI(2$`3DI@EWx}(!OplnGQAhiG`Af~@0G%9EMYan+%V`qLl znZ+?ZX&+!W=(g76yE$>3XgUcfVEEi#;Xemd5_iQ(!@NpUJcmqlrVjES-P1P*%>&E3 z4tW)cpBtMFabn>xGu!3eOqXyeJwy+0R^{zT?5ODjaWs13IBx<Dc+5Wi*jci3@@Fb? z$~_o0agF0mrkQy~&d2_>re?RkSt0YsIeaM`&-w$R2QTZ``xpf#VWg$!(&ogkEp(<2 zzG%MDh}bOck=p0zyhUxZMlpOc0p{kcp-qhL<sl!r864?av1ioOR4wKkoS|}FJ!D5m zenXdCLZh&To+|wZ-PoYyRV9B@$&*Sxuf#~1PGgBQm(E_8xO{Hna_RDSTs-Fw=nGQ= z5V+QaKTFo8u4-=8ZGV#N>}zMjOXn_|PQ$!q!k<$;%}(NKcur?*!*5X#ZdCH3lAl*1 zaV-2#O5RiQ84^!wGa9&pPYt(eSQ0zK5#^34_rEK#b=6C;i|Nd+{~oE-h!&s7&Zhn} zS2lojoz2*ijK=(XJ`66?I~dr%6Mel#ciq6_9Khc}47BxjR9{qfq`1>4?l5ttbu3@b z)H>uZXK5dE&AUza7?-T0|6BPf001A7gDcj*j}|u+Vj-s!@JC1nC-J$x{>)4GuAabi z^+bg}m>yOe^DMtuo>mZQQ4vp6eQG8a&mhMikx+$JTsXDpMnLdB2+!hkRzwgOqvmkO z+#0{W%lsd`SPa#L{#j$(E6l%<eD$bDuNIS(;VO>}G6nnZ{kW~|&^Mc=5&|~}*%25+ z<Mol2Wd94b243FM4FhKT%z+N{;!G6&V^tD3dBFWeaydn-!RJmj@oC-Qw~FjqiMJnS z9(~v|zGkJsdn1TWj}#`1JgxK-(vrW!r#;QYsm;-l%Xb_G8jv9++4;QcSsG?j<%a)E zW&d2szfdxu8>U9;a=|?+vzgteoI2K>8_TVRwkZ5{`f*nK?I|*SYx;V8RKoQ=8y_85 z&;Of|EsJ<sZ5?=QVE4esHWtkWHEv%)hB&|eeqj%e(p-dB4}2i0ak1}`d05y3_)Xoi zFPI9g$EQdP<V}k4uJ=YZ(MRV&-n-9Gq)#%7Q^3D9u_IPQHMD>9(~8;TO4S5Yhr5jN zpKMicFA+oS9WHE-elIF{IBGa&_N7==m^q&DC8?Gvz9B(Xf+N0^)bP8V3$<$BWlw?} ze3s?THt@IUFQKrR-nqaWCXz^s%Lgjj9-EJOSBCq2ggkg(mjr)QNBqn2toy0yIQjP( zlv;dgE!LMG4hFU9Kp~VAP6Cd~vpf6wc+bL(wBvmAPbT5_Yc5EdgTvtTY73@qI<W7u z5zI&t9n~(M|2SBO$E$aj{r#JRAM`U6RlCD9FNCb$7V7{;GAMT&gac{&Fn6Ima=hsK ztahzAQ#_-bVS!!B0pBviJ6FCDYu!RIydghNZFL?1?Agv~iuJ^Y#be=&kfS&UH@FSN zsKZHHx{>F#i_Y>hvH@(fdqm%COC%<vU)7^2TwL;M%3R2K;*P+R#PFN?(uZm4GcAVk z#+vtsd|WDtT6iirLv$xID&wrf`lmsiEv9F8$pY`YF7~GkV~$=W>k~kLHvBd{Ab2QR zkcF99JKbzn1dP#Y)jk)fP{-*<oGj2{cVBr8=QKmL@Hn}(yiFOH0Yevnz3Shf7NeVJ z4U;gt;-S3(tIu$vctZVbRkd~xGcPaxO>sLcvliR<lJV<bwP5C{AOE6#h<W__A4|_q zph-Y-Maze(;-o$8IUXygP)9D%!h`>NwOiCY6+o}X4}m|Wb+A8w2tZ*jr~|e&6@yx! zGAc-~G(<D+b@FHt=6}x3pVZ$KJ+aQk`%v8NbNu;85uzzM19bR^_NT-ZA74S6*py9o z%Jo~}LESv0#CGX@s`;}9TI2A5ZhTI;FDnsF$VI5kOw87tFt=sc{62cJ$#~|8Jl*`T zn2U^mfh>D}QkkOnn9@oij1{Co{L&-j2@}g;T|d7JeEuF68CSgcvx$OAi(uN`@$3Ja z!Az>uTC}q{<JUi%hB|@j8od?F9JQy-EUJ|?{S*2xKm~FQl|^!q{)-BLM5?@{-2Wvo z<8>!?WCvIh%m6&-qJL6ETH0e;<A4#+R+#@uH-A)r1~lt6{EPFu9Dn|cqsEB*!Sdc+ zz_ZA36W&kVIBp{(hXq{UF8u8k{Jp2dfKcn=&FRK|E7EUxRLOHno>w9s)1+QwHZ55d zj#Hd30FnS4Ect@~_oxA!Kb`QBx-E_{Jgvm&uI<mab*aX><5|5yi6=OrK@HL&9P^7r z3hN&jHV?=T3;+^PKl(sE8K-v|cHK`k7+0LAk$hAz^TZ$wu|<E=XOh#1yr!GVebX`d zzOnyUPtBViME_t?Ad|3}nO{4R^b?1T%95=9t@?sK6)Dq!=rs~j65=w|hxx{m*oaxs z;nb256Mzg(QhcFz1F47?gcDF;vh=`ORNXCdkK3#f??!EARwTJRgQY~I8`ps3iI@nT zo;n*=V)B=Jw}6#E8|?G{KNg3U>QDkL@z~swZJBoks$%XEw-&Ll{rt}Ii(h6sAI23h zsi09NH9494QelyJyeKa~&^<{QjPdLLIf=pn0=941^tkw=X0ykbfVn_A>&VT2R0?x{ z08lo0o%iJQrVQ@BJtQmC?Vxv%wx=h>qRb)Sf7}tk^E|Mg=Lq=C(G*nqy=IsA`*s6W ze*5psIG|cwaCVaiagyhq6sf<%Ni1D80FCg4o6<rm!)zFB(i;c5ku~U`6|k}Idx?<_ z`o0)d`6vo|ULyaT&CF$<?GPq5+clq_o{PK{TU*KG5&N=(zA0zCqz~rk<A*YQA2ll8 zPVOR~&59He93{8Z=Sd_huP7Ay^C7VRCvv8@$;B%53d?A5j;KDdKVkNW9*_<+7rFZj zy8Iy}-$!DN<o9g&F@|9gK)dlDj1J|_l4X35R}y_*js1v{A0_Ex>s6sXq8i^L=zp4w z*d1Bzb{2v{U+-3^j<=+*$Br&fTKUqB6};E^3OXdh^Pveq^#W_cru64ZITTh%!cUC@ zUKbHb-&ac$Fp6)F`g|8P4J$9BK01#mEsP8%`hss>luNWT5{WG=WrDg9yQUZF0$yv5 zc<-_@$g{ASg)}}hGlLVF3<c>Kwy6Z$3uiIVu3AUxbPyA~AsYpRA(tc{gc5Zu=n4*; z()d|zJ%|A%)B_bj9+LAcI$300kr4ZS`kAakqG8cMy^`kPftWSx-C)cQQ`JoP4PzRG zliE|_Y)tD|BjA<~;v5Qx;KbnE8DdxB9Mo!>Il<KUX%}+B=xMd{b*iuOCeu)UJcUQs zr>#`c%Jn9{v-}(X5fat{m4XCKPgrd65WM7T^1?%i5Y8vBI!-G}L@-nMF?81~u`brQ z8EYiD!2%~YX>a)*#b~6B9w0!llta?q2SL+lYEIPSrua@jeeD&%bUF#rCp4MUd>h^~ zL?<SEmDfOs?yFh@^ZG-M8!BusO1b-3;j!XFQJS&VdaT=X%dHBY)|U9u6of2f%pmdn z*$5Ayh6<(jpVsnae(^<;55{WnEAPT|6H2DfMW*J3$VVo0>PV|sNW+6zTo_`+q(NcM z)3Tw0oMsx#*Scd|tG0P%7X6b>$sB?@HzLld1abw${0euSv0>JRv99X0ei!&zL|uXJ z13KyiZJFx_hztl6s)G&ks16}G5fZ-1v}L&J+eKz+x4g!AWoI9Ty#A}}nf*+fj@dNA zE0xS%HHe-CjtFaZ97AKWc}TUB*}q;XoVpq;X=&6zIuG(A@aLG!bHJ;$y9(s2nKYwk zy<;>!&E~$qA(*T&^nxA`s_HaNdqVgDy#t=|?g4864I6(#GE65uL1B1Sh^n7l`ZBMe z76WhOBu5&?RrVnv4L=RQ`w$pIQZv~;ND2E{?E@LWR}l64Fl))tB*oCpjwYd<<j(wK zcH$&G0W3O`n~E#C)CA;C9ejzhE}mNz6sK<eLN*ns-G@Duq{vXhS^hPb&t&)GyUC|0 zja-gj-)N4R5YD1(So2$!jbAN<SC!bZA10Rrg-PA`5RCsV`teKM@hk9<aS5_UNZV@T zzs|DN;BE;dbkSV3ba?Gt!PD<9<6s_fZ3{*W2iX1(33~t&z{B85?@EW-2~?Ss81_V( zM0}Iz=Gg`w;6iFcf*^mxl!xCSaI;B$kO#f|1#@_{Ps5^*Mx`i+xSvplO9rqL@3RX% zC+5Fbk&k_;E)u!WcR}wkHDx<2;FRW5^~JQ|h54{B|E7%=M%8me8|6HQr(5$mIcbww zd`3MVzrH7lED1GGup;xXZ|_QKqtYz!cLmS5HVq;=>pO367UqW?e_lN<V9B#U>$vuC zGo{>F7Qp+-XifY#jl#dJJFh9(s{~@3_-lWf+(W|_3*LM%KhsDmfS_r@tJC3EbnB02 z1wMwKee7+OH>h}_UlxE$$Z*Js`YxY73!x85$k${D$&t@X6gOFZ%aA;<<%J@pc|X6t z!a9%LG{+f8i-`cc0ZjJ_ZV}~3vZcqgI!m}Q+OC$}1-5`HSJ>UXNHcO}K5d@PTkv#d z$5Sye!u`Q2sy$2lMY`$Xz+~NPT;`C7INT2d5>emQf$uX1k74|8x3UKP1rLWS<aT3n zjUWj9gg>EVT#1mRnQNxu`n^|&+U|m&<yM7Ih@StH;82pFK2gEPC)NzC*;X7lU;%;C zPruLcwOurP*f^VGt@g|z|CxtF=I=Jcqx{!@+7DE~SVzRJEX7C2D)^whdtQ3$+MR>A zKoM{78W97Z89jNDbpI*c$FGt&fctfK|5M%zB-Q0E`Oqd6y+QxcSI>!mip(-j9Ojw` zaRgdKXJ&C`6j{bI<DfdvcVndSd^eT*j8Dgtm<W&X<39R~@#6zDZ9&D2k$PQzDA985 zvh-ui6cRZdg4hlH&Z-ryEPH7VuVWKQIZZ3oq-{&^HOQJgU$da=iOyh}Co%@^;cWH+ zA2{0>%jBda3X+6T%brDIup+vSjF8Hix$qSewizv$c;Zr#dXV~v@lVhbThb2~Z=-GY zjJ72|j;s*)K(j4QHbaA=2+X&%v0na{LpWwSh&7XMbI#;LmQN%XCg!V#MdLfM__k_6 z_QtPYlJ*NzAtF7Cb<JAf*jm!M=?b8I)V|;AU7gK&ou<*Z-1o8+KIv8?jq~>k43!iF z>VN#>B-xUksp7}5Y`G*Mc>zQLe#Qb54)4?u0zA2tH%p|57-Rs-6<=}mrzG#p5*ER` zDd6ycsiW(BkW)E%2`vvQdN(?>Zf)~xOtfmtD&n;JDC1D~c_wv<khkrD<d^uoblqrA zXo=R7sG+!YW2q!0VXA8@F+H#eAZgdbU3#RSBz?h3HL+m8TPlA<Iq6JL-cjEgGbC%t zYG7K!YRug-rO#1;@i0AfeZ$axJW=5THj^4i3!F2M{xe*>KS%@X2G1vjS(XFy$;EmG z%;n!ZFaycy=T~7l^Kc9s8=p2*2CG_hC+AN){&JxG7wB>Z+93}2xN@z4?j*vzd~bdi z_|6*2!Fljs4&QC-Ru05>&}l1_>UbrP2i!~sVm(g*aXF;RPMdQW7o>-80Egj(5?08C z7nBn`hZo72VaE3)cTy>X;qa5`a|X>uQ#|vqDuBF&Zu`zIgXJ@VWjQ{3SROQ?Q?RVh zpY?f&7RJ*iHPU#I%o35-fmlP;!lB46MZ}rsU`ja^2vhnAF{Q%ApkGs6=@XdUM+_<R zNER|(q#*vkNiukO)lSkW_MvRd$yWpu_pqD^s|x}NPUIfnq`z$Xm-z+!K=qOOtkvT( zw4s?%9f)hU+$(qV5yh3S9K{NeYTr={Wsjt)p3FocsFM*qX<+OPeP2FmPvsOh$eD0f znoc9oUS0}xspAR$hG{xfMZNSjgb`O64N3%*?mJnCOM)8n5$x{~tP~Z5+_0aRunhZs zfeXLt8I*u>pzk8iCe7&k42A_IjsqfVOm_YgZjqCsR<d*a`bDGP96MiY2dZd*hfFNS z0qjb1J5a}CK;4p{j$Nsv<_gA-$>5BTA8xxy-9TyK;`|xMpGn@msi^b|^fFsk@vTO> z^GHPWSD#>(o(?r4UR#8;5g4TamOG2|L2%fG*5KQKL}C$151H@CL;B%Wjk%trfN7tu z4zCCaonVCiBSOMk=7k>yDl?tod*pIHYoAh;*L2sc7be!(V=UA%Lf-xmxbvGSOjJnm z4dl_;jupSaLLs_-A8$(*-0jGKIwL)3(l|1>cGxml{U;P8uqxUKuLxp8AYbDaPkFt{ zM^ev5*hde323I2CU^>$o#T?zk8vw{n)HaVfDIzIrf5sdckZp{$6{m^1$=ueay}Ai* zRe(Eby)fD=h|Rima`B+=#@@6W>>Fr1l8JTnKKr8k-Y@e~?xX%O^jyF@!Fx+4;>!2* z<Y4|xhc7kESx`CxNy(o8?`j3;@-vzQCE!dO=q%x7QCfGuM=rnFYy(-SFmn&OZL~O* z2<6>l)He&H>3tgDHKVbaF)(kkpSs7NM_&&7r+fKm`YeaRg0oqjAiZ}4^qRf<74v^c zwf$7K!H5DJ2&Sge@k~t-%oDpnBNB~aE3eo>-46I&KQ(0|=don(BaCIQOtyR4wkJL5 z6@JP-;2B>Q^Cs<deii4Tiw%-S>@^Rxun%iNXJrEqJj*L@)cM|qeYw~hL~=F@`ATtV z5=i0^&6MVjJf=t^`!{V5D8RQKX{DN<&Mp)re$w@Bg#4_DG*b>b3ksZ?+Ef&-7|BP% zEt9ejq{=A`Td92?U{cAipH?$n6Is@51rv0c!^+)-OuLf(Yp!GYCh<vMs8@B|Gg;)^ z45!S2on_!m1FI@ZkgjF7FBZKc-zu<Oj~{Zn!4|0d26iV0^}6$5dMXpD#0111bsHxC zG!;EB`W`uR6k=1oV;{Bi*!)eQ?;ln*oj5Q>Y!10!rOX<(=}W~jgB<@p`?{|X<3iKZ z`f7Mt?HEB2Em&nnL<%o<Ly5qX$^3t(@ckZ&-4?~bkQR0``o2ES2qK;JDE8fYKA*B) z+^n#^M1_n)*-Z&t8MqSFUXn2jflACUpo~9YUvzVa&8f}UUEy(<T{Qi-%(P&b-7q$& z-E>)K3(#N97_)mp+%7!_=Yz0eMleZyUin@hOox>KnWN<rNkHw<{DhGKi@HWFv|gsk zC?wTkYN}h!C*oTY$Ni!E?wO;cHS<_gYfwp^P-s_34KxkUdsry?X2b!$N|&j(1axBY zhl?;w?XUKb>ij*ASbfgh`_DIuwlH`F^)L!$A8gd%n}@95P)L0#67s_zj(E8E{UNK! zfp}V?5c=3db*3Kv3=KEwHuti=0ZEQfgv8|VedQ!PbM>1tRlv|`zJIf@ct#-z#;+gK zS$sJJZg3;XQGLH8U(>nz4rln8CmP^3({O?F_w!#X@MruVuNrbMQ}1O?@Gt(jj_;3O ze^2M>HM$*ka-NlDXq#Ppq$inEW|9;2QcM|n<!}Ml+49_Dd_=|eOLJGz6NcLSv%D&+ zp@;@s%=s{@{pao2J}`ijV)6#;H#_B+$aSiOI?_Y?EQ8WVT=CvkcaL-S%-=Ru(TfVU zEdNvs$kWubWnrE-=dNiH1CS<@2D6DJ4;W?-B_sAPd(;L!f24;cTfC#z#;>>BJp{oK z^=BnmEcU1`cy8`e1;3Qcni^+t0LuJ}R%02Uj2NK!8%!i^XMjR={;tfgD_)u3R=6T~ zwXxoOOwdV#_qMym6YlPIy7hbltpXP~Gywl`gQ~|}`<v-98o&~mK`S}`%^v=)B*W#! zehbnTP|B<(Q478gRFRQ=6BAZwMMQ|iPUIPOojXc&(0Ef5#XD=ED<`Bv!~<e$5+u#@ z4oI~5hSAt%O=VOqml03QAvppc1mih9awf`liBHlIIfyGzFJF?E7@Ycis90X)6w8rf zRtL6@cL=C_{6KL0#zL*m34I3sfqjWvHuSW28Oy{0FvUoZJkv5YCHguwMMPQo&xr9j zm{drGa+pqqcmBYarEVG=KQtP5rxxQXUbRRL{+?P+-~541Ei{S1z&nXsD<;gdie<&A zE2ke@%q?hWac-IKgb_Jz$5f9`<)^>v07x4Gm!xvmjg;-mwR?HR%6C0caxuVcX^g2+ zZwc{((vDo#?s0t)=J-^?995^fUx=|DFs<qI>(HjPafeCDp3gLXQ)wIGs;8!iT$X-A zdumEBH@e?e(DP*P-w}hHl0s-?VIV6@AJnVdT4bG)9}Q7LItLSXQ#+!!+~Sk)oGW_0 zVs_I>&&_8!;aTmZVl21QlzsJVYu1OUseODMfH%j}1RUSTjHLW%juB18_LRlsghTd7 z))EH~%gv?boBURjFBAyqS&`II)ZMvp53J1bXO5fajNg<NP$Suwv2=FFtI_S_7Jxcg zsl7m+Kq%7~gny1|cIdSm1t76N?QPrX6@R55AK+b>7<Rugi?)cEq0#U~x6Q6|d~bX_ z7BjmyhCQ=a#PLq9Co=m2UzayazUlIK!6xpW^<Sj-bF#!)TVsfG^J=jgu~TRr7yuKJ zEV=12<M>H?rM$EV`zWMz(4w<sZt6I6aa?%Jl=gyB;R7FtMUh1`0_(m;X0v8(*z_{8 zQM0I-3dB^wrWAflOz{_aFubJPOG-49oCf(zy8Meu_9~%<XUC0e*X;1NsOk?CpU_QX z*vr)Oj`|DwPK%#IGr1Us&Pv1x`(2b3>C6U7I&JmvJJg}~)GCD1`>tBB2B5Q)Xedoe zFeSD{#*FQIA->5K8*@}Vvp3QFm|D{c=jeq&koV{RKUMK<4Z$F#Rc%?<m#vo9E6I(= zUXG3y8OO45Hw*HS<YV)4N$-?Q0tVKUQ2xK9MeJR#_6be2p;6cLAHz2FyB2JfB^FJD zVD3lB#GmEDJ)%<u{9lv{?)u^`Bo*}T7SjaZ5lJoluLvb+6u)7lm?7ev_&fSe_8`~0 z2@vh$n+z9r^lTye$q>(u6u019J<OdQ{NzHVbYo!;{wYJnJp}sHGkU`&?j;7k6)q75 zub-f&9wbeqH1X4*N)YO0%{$9x*XDUOY#ZSx=*M17uZ(g!Yd6$Cu#rF&!vi}8Mn`3_ z2>&&Sxfj)1l44!>4Ham|@SPQolg)&?G^`uC_0N?2mhKDC&o^{F#(UW-UQd-z#Up=O ztUNuZ4~y90VcX#b$BGeBPQJe+<l@f@3mu1&JpD%$`jrz@hh}-wt3s*N!{?O9#_FRK zS&SeJ3<j0A6PJp!d67ppn^kLzk}oLPs$?69?LLm@)&0kcwyWIsuyAo`hkRuD^|q|X zlzUu>P(^6iE>P~jSF&4)#B1AupqJN~FQR4|$e3aHpR2|nQSvX8?AClduH<Q58Z14d z+_NM$J$!hE@EqRB=4-n1GfKXt<kyuvqla~ZB|NFboL660PRP_8A12Pcajx{KbK#}) z7bZ&KIRgL#zizS`fM_dpqS2}@)T5WQTCv<+v?~>l$p5ccfa_JlZm#z3!ftZ9hqFb+ vjqLwz>`Z`n!^jgOzvE7g93DA0a(v`Jj+_~JdSutgTZ$>@@y0-LW6%Ew>9Mza diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/manifest.py b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/manifest.py deleted file mode 100644 index ca0fe44..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/manifest.py +++ /dev/null @@ -1,393 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2012-2013 Python Software Foundation. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -""" -Class representing the list of files in a distribution. - -Equivalent to distutils.filelist, but fixes some problems. -""" -import fnmatch -import logging -import os -import re -import sys - -from . import DistlibException -from .compat import fsdecode -from .util import convert_path - - -__all__ = ['Manifest'] - -logger = logging.getLogger(__name__) - -# a \ followed by some spaces + EOL -_COLLAPSE_PATTERN = re.compile('\\\\w*\n', re.M) -_COMMENTED_LINE = re.compile('#.*?(?=\n)|\n(?=$)', re.M | re.S) - -# -# Due to the different results returned by fnmatch.translate, we need -# to do slightly different processing for Python 2.7 and 3.2 ... this needed -# to be brought in for Python 3.6 onwards. -# -_PYTHON_VERSION = sys.version_info[:2] - -class Manifest(object): - """A list of files built by on exploring the filesystem and filtered by - applying various patterns to what we find there. - """ - - def __init__(self, base=None): - """ - Initialise an instance. - - :param base: The base directory to explore under. - """ - self.base = os.path.abspath(os.path.normpath(base or os.getcwd())) - self.prefix = self.base + os.sep - self.allfiles = None - self.files = set() - - # - # Public API - # - - def findall(self): - """Find all files under the base and set ``allfiles`` to the absolute - pathnames of files found. - """ - from stat import S_ISREG, S_ISDIR, S_ISLNK - - self.allfiles = allfiles = [] - root = self.base - stack = [root] - pop = stack.pop - push = stack.append - - while stack: - root = pop() - names = os.listdir(root) - - for name in names: - fullname = os.path.join(root, name) - - # Avoid excess stat calls -- just one will do, thank you! - stat = os.stat(fullname) - mode = stat.st_mode - if S_ISREG(mode): - allfiles.append(fsdecode(fullname)) - elif S_ISDIR(mode) and not S_ISLNK(mode): - push(fullname) - - def add(self, item): - """ - Add a file to the manifest. - - :param item: The pathname to add. This can be relative to the base. - """ - if not item.startswith(self.prefix): - item = os.path.join(self.base, item) - self.files.add(os.path.normpath(item)) - - def add_many(self, items): - """ - Add a list of files to the manifest. - - :param items: The pathnames to add. These can be relative to the base. - """ - for item in items: - self.add(item) - - def sorted(self, wantdirs=False): - """ - Return sorted files in directory order - """ - - def add_dir(dirs, d): - dirs.add(d) - logger.debug('add_dir added %s', d) - if d != self.base: - parent, _ = os.path.split(d) - assert parent not in ('', '/') - add_dir(dirs, parent) - - result = set(self.files) # make a copy! - if wantdirs: - dirs = set() - for f in result: - add_dir(dirs, os.path.dirname(f)) - result |= dirs - return [os.path.join(*path_tuple) for path_tuple in - sorted(os.path.split(path) for path in result)] - - def clear(self): - """Clear all collected files.""" - self.files = set() - self.allfiles = [] - - def process_directive(self, directive): - """ - Process a directive which either adds some files from ``allfiles`` to - ``files``, or removes some files from ``files``. - - :param directive: The directive to process. This should be in a format - compatible with distutils ``MANIFEST.in`` files: - - http://docs.python.org/distutils/sourcedist.html#commands - """ - # Parse the line: split it up, make sure the right number of words - # is there, and return the relevant words. 'action' is always - # defined: it's the first word of the line. Which of the other - # three are defined depends on the action; it'll be either - # patterns, (dir and patterns), or (dirpattern). - action, patterns, thedir, dirpattern = self._parse_directive(directive) - - # OK, now we know that the action is valid and we have the - # right number of words on the line for that action -- so we - # can proceed with minimal error-checking. - if action == 'include': - for pattern in patterns: - if not self._include_pattern(pattern, anchor=True): - logger.warning('no files found matching %r', pattern) - - elif action == 'exclude': - for pattern in patterns: - found = self._exclude_pattern(pattern, anchor=True) - #if not found: - # logger.warning('no previously-included files ' - # 'found matching %r', pattern) - - elif action == 'global-include': - for pattern in patterns: - if not self._include_pattern(pattern, anchor=False): - logger.warning('no files found matching %r ' - 'anywhere in distribution', pattern) - - elif action == 'global-exclude': - for pattern in patterns: - found = self._exclude_pattern(pattern, anchor=False) - #if not found: - # logger.warning('no previously-included files ' - # 'matching %r found anywhere in ' - # 'distribution', pattern) - - elif action == 'recursive-include': - for pattern in patterns: - if not self._include_pattern(pattern, prefix=thedir): - logger.warning('no files found matching %r ' - 'under directory %r', pattern, thedir) - - elif action == 'recursive-exclude': - for pattern in patterns: - found = self._exclude_pattern(pattern, prefix=thedir) - #if not found: - # logger.warning('no previously-included files ' - # 'matching %r found under directory %r', - # pattern, thedir) - - elif action == 'graft': - if not self._include_pattern(None, prefix=dirpattern): - logger.warning('no directories found matching %r', - dirpattern) - - elif action == 'prune': - if not self._exclude_pattern(None, prefix=dirpattern): - logger.warning('no previously-included directories found ' - 'matching %r', dirpattern) - else: # pragma: no cover - # This should never happen, as it should be caught in - # _parse_template_line - raise DistlibException( - 'invalid action %r' % action) - - # - # Private API - # - - def _parse_directive(self, directive): - """ - Validate a directive. - :param directive: The directive to validate. - :return: A tuple of action, patterns, thedir, dir_patterns - """ - words = directive.split() - if len(words) == 1 and words[0] not in ('include', 'exclude', - 'global-include', - 'global-exclude', - 'recursive-include', - 'recursive-exclude', - 'graft', 'prune'): - # no action given, let's use the default 'include' - words.insert(0, 'include') - - action = words[0] - patterns = thedir = dir_pattern = None - - if action in ('include', 'exclude', - 'global-include', 'global-exclude'): - if len(words) < 2: - raise DistlibException( - '%r expects <pattern1> <pattern2> ...' % action) - - patterns = [convert_path(word) for word in words[1:]] - - elif action in ('recursive-include', 'recursive-exclude'): - if len(words) < 3: - raise DistlibException( - '%r expects <dir> <pattern1> <pattern2> ...' % action) - - thedir = convert_path(words[1]) - patterns = [convert_path(word) for word in words[2:]] - - elif action in ('graft', 'prune'): - if len(words) != 2: - raise DistlibException( - '%r expects a single <dir_pattern>' % action) - - dir_pattern = convert_path(words[1]) - - else: - raise DistlibException('unknown action %r' % action) - - return action, patterns, thedir, dir_pattern - - def _include_pattern(self, pattern, anchor=True, prefix=None, - is_regex=False): - """Select strings (presumably filenames) from 'self.files' that - match 'pattern', a Unix-style wildcard (glob) pattern. - - Patterns are not quite the same as implemented by the 'fnmatch' - module: '*' and '?' match non-special characters, where "special" - is platform-dependent: slash on Unix; colon, slash, and backslash on - DOS/Windows; and colon on Mac OS. - - If 'anchor' is true (the default), then the pattern match is more - stringent: "*.py" will match "foo.py" but not "foo/bar.py". If - 'anchor' is false, both of these will match. - - If 'prefix' is supplied, then only filenames starting with 'prefix' - (itself a pattern) and ending with 'pattern', with anything in between - them, will match. 'anchor' is ignored in this case. - - If 'is_regex' is true, 'anchor' and 'prefix' are ignored, and - 'pattern' is assumed to be either a string containing a regex or a - regex object -- no translation is done, the regex is just compiled - and used as-is. - - Selected strings will be added to self.files. - - Return True if files are found. - """ - # XXX docstring lying about what the special chars are? - found = False - pattern_re = self._translate_pattern(pattern, anchor, prefix, is_regex) - - # delayed loading of allfiles list - if self.allfiles is None: - self.findall() - - for name in self.allfiles: - if pattern_re.search(name): - self.files.add(name) - found = True - return found - - def _exclude_pattern(self, pattern, anchor=True, prefix=None, - is_regex=False): - """Remove strings (presumably filenames) from 'files' that match - 'pattern'. - - Other parameters are the same as for 'include_pattern()', above. - The list 'self.files' is modified in place. Return True if files are - found. - - This API is public to allow e.g. exclusion of SCM subdirs, e.g. when - packaging source distributions - """ - found = False - pattern_re = self._translate_pattern(pattern, anchor, prefix, is_regex) - for f in list(self.files): - if pattern_re.search(f): - self.files.remove(f) - found = True - return found - - def _translate_pattern(self, pattern, anchor=True, prefix=None, - is_regex=False): - """Translate a shell-like wildcard pattern to a compiled regular - expression. - - Return the compiled regex. If 'is_regex' true, - then 'pattern' is directly compiled to a regex (if it's a string) - or just returned as-is (assumes it's a regex object). - """ - if is_regex: - if isinstance(pattern, str): - return re.compile(pattern) - else: - return pattern - - if _PYTHON_VERSION > (3, 2): - # ditch start and end characters - start, _, end = self._glob_to_re('_').partition('_') - - if pattern: - pattern_re = self._glob_to_re(pattern) - if _PYTHON_VERSION > (3, 2): - assert pattern_re.startswith(start) and pattern_re.endswith(end) - else: - pattern_re = '' - - base = re.escape(os.path.join(self.base, '')) - if prefix is not None: - # ditch end of pattern character - if _PYTHON_VERSION <= (3, 2): - empty_pattern = self._glob_to_re('') - prefix_re = self._glob_to_re(prefix)[:-len(empty_pattern)] - else: - prefix_re = self._glob_to_re(prefix) - assert prefix_re.startswith(start) and prefix_re.endswith(end) - prefix_re = prefix_re[len(start): len(prefix_re) - len(end)] - sep = os.sep - if os.sep == '\\': - sep = r'\\' - if _PYTHON_VERSION <= (3, 2): - pattern_re = '^' + base + sep.join((prefix_re, - '.*' + pattern_re)) - else: - pattern_re = pattern_re[len(start): len(pattern_re) - len(end)] - pattern_re = r'%s%s%s%s.*%s%s' % (start, base, prefix_re, sep, - pattern_re, end) - else: # no prefix -- respect anchor flag - if anchor: - if _PYTHON_VERSION <= (3, 2): - pattern_re = '^' + base + pattern_re - else: - pattern_re = r'%s%s%s' % (start, base, pattern_re[len(start):]) - - return re.compile(pattern_re) - - def _glob_to_re(self, pattern): - """Translate a shell-like glob pattern to a regular expression. - - Return a string containing the regex. Differs from - 'fnmatch.translate()' in that '*' does not match "special characters" - (which are platform-specific). - """ - pattern_re = fnmatch.translate(pattern) - - # '?' and '*' in the glob pattern become '.' and '.*' in the RE, which - # IMHO is wrong -- '?' and '*' aren't supposed to match slash in Unix, - # and by extension they shouldn't match such "special characters" under - # any OS. So change all non-escaped dots in the RE to match any - # character except the special characters (currently: just os.sep). - sep = os.sep - if os.sep == '\\': - # we're using a regex to manipulate a regex, so we need - # to escape the backslash twice - sep = r'\\\\' - escaped = r'\1[^%s]' % sep - pattern_re = re.sub(r'((?<!\\)(\\\\)*)\.', escaped, pattern_re) - return pattern_re diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/manifest.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/manifest.pyc deleted file mode 100644 index 484abcc1d3ab3b3420439a2f1dcfe7266d9f3a99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12954 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 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/markers.py b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/markers.py deleted file mode 100644 index ee1f3e2..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/markers.py +++ /dev/null @@ -1,131 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2012-2017 Vinay Sajip. -# Licensed to the Python Software Foundation under a contributor agreement. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -""" -Parser for the environment markers micro-language defined in PEP 508. -""" - -# Note: In PEP 345, the micro-language was Python compatible, so the ast -# module could be used to parse it. However, PEP 508 introduced operators such -# as ~= and === which aren't in Python, necessitating a different approach. - -import os -import sys -import platform -import re - -from .compat import python_implementation, urlparse, string_types -from .util import in_venv, parse_marker - -__all__ = ['interpret'] - -def _is_literal(o): - if not isinstance(o, string_types) or not o: - return False - return o[0] in '\'"' - -class Evaluator(object): - """ - This class is used to evaluate marker expessions. - """ - - operations = { - '==': lambda x, y: x == y, - '===': lambda x, y: x == y, - '~=': lambda x, y: x == y or x > y, - '!=': lambda x, y: x != y, - '<': lambda x, y: x < y, - '<=': lambda x, y: x == y or x < y, - '>': lambda x, y: x > y, - '>=': lambda x, y: x == y or x > y, - 'and': lambda x, y: x and y, - 'or': lambda x, y: x or y, - 'in': lambda x, y: x in y, - 'not in': lambda x, y: x not in y, - } - - def evaluate(self, expr, context): - """ - Evaluate a marker expression returned by the :func:`parse_requirement` - function in the specified context. - """ - if isinstance(expr, string_types): - if expr[0] in '\'"': - result = expr[1:-1] - else: - if expr not in context: - raise SyntaxError('unknown variable: %s' % expr) - result = context[expr] - else: - assert isinstance(expr, dict) - op = expr['op'] - if op not in self.operations: - raise NotImplementedError('op not implemented: %s' % op) - elhs = expr['lhs'] - erhs = expr['rhs'] - if _is_literal(expr['lhs']) and _is_literal(expr['rhs']): - raise SyntaxError('invalid comparison: %s %s %s' % (elhs, op, erhs)) - - lhs = self.evaluate(elhs, context) - rhs = self.evaluate(erhs, context) - result = self.operations[op](lhs, rhs) - return result - -def default_context(): - def format_full_version(info): - version = '%s.%s.%s' % (info.major, info.minor, info.micro) - kind = info.releaselevel - if kind != 'final': - version += kind[0] + str(info.serial) - return version - - if hasattr(sys, 'implementation'): - implementation_version = format_full_version(sys.implementation.version) - implementation_name = sys.implementation.name - else: - implementation_version = '0' - implementation_name = '' - - result = { - 'implementation_name': implementation_name, - 'implementation_version': implementation_version, - 'os_name': os.name, - 'platform_machine': platform.machine(), - 'platform_python_implementation': platform.python_implementation(), - 'platform_release': platform.release(), - 'platform_system': platform.system(), - 'platform_version': platform.version(), - 'platform_in_venv': str(in_venv()), - 'python_full_version': platform.python_version(), - 'python_version': platform.python_version()[:3], - 'sys_platform': sys.platform, - } - return result - -DEFAULT_CONTEXT = default_context() -del default_context - -evaluator = Evaluator() - -def interpret(marker, execution_context=None): - """ - Interpret a marker and return a result depending on environment. - - :param marker: The marker to interpret. - :type marker: str - :param execution_context: The context used for name lookup. - :type execution_context: mapping - """ - try: - expr, rest = parse_marker(marker) - except Exception as e: - raise SyntaxError('Unable to interpret marker syntax: %s: %s' % (marker, e)) - if rest and rest[0] != '#': - raise SyntaxError('unexpected trailing data in marker: %s: %s' % (marker, rest)) - context = dict(DEFAULT_CONTEXT) - if execution_context: - context.update(execution_context) - return evaluator.evaluate(expr, context) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/markers.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/markers.pyc deleted file mode 100644 index 5f1ed98a8af7eb256fdc4ed76b6b26109a45bb48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7112 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 TIZL%>tvS8aX};QY>Y)DvbySAL diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/metadata.py b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/metadata.py deleted file mode 100644 index 77eed7f..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/metadata.py +++ /dev/null @@ -1,1094 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2012 The Python Software Foundation. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -"""Implementation of the Metadata for Python packages PEPs. - -Supports all metadata formats (1.0, 1.1, 1.2, and 2.0 experimental). -""" -from __future__ import unicode_literals - -import codecs -from email import message_from_file -import json -import logging -import re - - -from . import DistlibException, __version__ -from .compat import StringIO, string_types, text_type -from .markers import interpret -from .util import extract_by_key, get_extras -from .version import get_scheme, PEP440_VERSION_RE - -logger = logging.getLogger(__name__) - - -class MetadataMissingError(DistlibException): - """A required metadata is missing""" - - -class MetadataConflictError(DistlibException): - """Attempt to read or write metadata fields that are conflictual.""" - - -class MetadataUnrecognizedVersionError(DistlibException): - """Unknown metadata version number.""" - - -class MetadataInvalidError(DistlibException): - """A metadata value is invalid""" - -# public API of this module -__all__ = ['Metadata', 'PKG_INFO_ENCODING', 'PKG_INFO_PREFERRED_VERSION'] - -# Encoding used for the PKG-INFO files -PKG_INFO_ENCODING = 'utf-8' - -# preferred version. Hopefully will be changed -# to 1.2 once PEP 345 is supported everywhere -PKG_INFO_PREFERRED_VERSION = '1.1' - -_LINE_PREFIX_1_2 = re.compile('\n \\|') -_LINE_PREFIX_PRE_1_2 = re.compile('\n ') -_241_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', - 'Summary', 'Description', - 'Keywords', 'Home-page', 'Author', 'Author-email', - 'License') - -_314_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', - 'Supported-Platform', 'Summary', 'Description', - 'Keywords', 'Home-page', 'Author', 'Author-email', - 'License', 'Classifier', 'Download-URL', 'Obsoletes', - 'Provides', 'Requires') - -_314_MARKERS = ('Obsoletes', 'Provides', 'Requires', 'Classifier', - 'Download-URL') - -_345_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', - 'Supported-Platform', 'Summary', 'Description', - 'Keywords', 'Home-page', 'Author', 'Author-email', - 'Maintainer', 'Maintainer-email', 'License', - 'Classifier', 'Download-URL', 'Obsoletes-Dist', - 'Project-URL', 'Provides-Dist', 'Requires-Dist', - 'Requires-Python', 'Requires-External') - -_345_MARKERS = ('Provides-Dist', 'Requires-Dist', 'Requires-Python', - 'Obsoletes-Dist', 'Requires-External', 'Maintainer', - 'Maintainer-email', 'Project-URL') - -_426_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', - 'Supported-Platform', 'Summary', 'Description', - 'Keywords', 'Home-page', 'Author', 'Author-email', - 'Maintainer', 'Maintainer-email', 'License', - 'Classifier', 'Download-URL', 'Obsoletes-Dist', - 'Project-URL', 'Provides-Dist', 'Requires-Dist', - 'Requires-Python', 'Requires-External', 'Private-Version', - 'Obsoleted-By', 'Setup-Requires-Dist', 'Extension', - 'Provides-Extra') - -_426_MARKERS = ('Private-Version', 'Provides-Extra', 'Obsoleted-By', - 'Setup-Requires-Dist', 'Extension') - -# See issue #106: Sometimes 'Requires' occurs wrongly in the metadata. Include -# it in the tuple literal below to allow it (for now) -_566_FIELDS = _426_FIELDS + ('Description-Content-Type', 'Requires') - -_566_MARKERS = ('Description-Content-Type',) - -_ALL_FIELDS = set() -_ALL_FIELDS.update(_241_FIELDS) -_ALL_FIELDS.update(_314_FIELDS) -_ALL_FIELDS.update(_345_FIELDS) -_ALL_FIELDS.update(_426_FIELDS) -_ALL_FIELDS.update(_566_FIELDS) - -EXTRA_RE = re.compile(r'''extra\s*==\s*("([^"]+)"|'([^']+)')''') - - -def _version2fieldlist(version): - if version == '1.0': - return _241_FIELDS - elif version == '1.1': - return _314_FIELDS - elif version == '1.2': - return _345_FIELDS - elif version in ('1.3', '2.1'): - return _345_FIELDS + _566_FIELDS - elif version == '2.0': - return _426_FIELDS - raise MetadataUnrecognizedVersionError(version) - - -def _best_version(fields): - """Detect the best version depending on the fields used.""" - def _has_marker(keys, markers): - for marker in markers: - if marker in keys: - return True - return False - - keys = [] - for key, value in fields.items(): - if value in ([], 'UNKNOWN', None): - continue - keys.append(key) - - possible_versions = ['1.0', '1.1', '1.2', '1.3', '2.0', '2.1'] - - # first let's try to see if a field is not part of one of the version - for key in keys: - if key not in _241_FIELDS and '1.0' in possible_versions: - possible_versions.remove('1.0') - logger.debug('Removed 1.0 due to %s', key) - if key not in _314_FIELDS and '1.1' in possible_versions: - possible_versions.remove('1.1') - logger.debug('Removed 1.1 due to %s', key) - if key not in _345_FIELDS and '1.2' in possible_versions: - possible_versions.remove('1.2') - logger.debug('Removed 1.2 due to %s', key) - if key not in _566_FIELDS and '1.3' in possible_versions: - possible_versions.remove('1.3') - logger.debug('Removed 1.3 due to %s', key) - if key not in _566_FIELDS and '2.1' in possible_versions: - if key != 'Description': # In 2.1, description allowed after headers - possible_versions.remove('2.1') - logger.debug('Removed 2.1 due to %s', key) - if key not in _426_FIELDS and '2.0' in possible_versions: - possible_versions.remove('2.0') - logger.debug('Removed 2.0 due to %s', key) - - # possible_version contains qualified versions - if len(possible_versions) == 1: - return possible_versions[0] # found ! - elif len(possible_versions) == 0: - logger.debug('Out of options - unknown metadata set: %s', fields) - raise MetadataConflictError('Unknown metadata set') - - # let's see if one unique marker is found - is_1_1 = '1.1' in possible_versions and _has_marker(keys, _314_MARKERS) - is_1_2 = '1.2' in possible_versions and _has_marker(keys, _345_MARKERS) - is_2_1 = '2.1' in possible_versions and _has_marker(keys, _566_MARKERS) - is_2_0 = '2.0' in possible_versions and _has_marker(keys, _426_MARKERS) - if int(is_1_1) + int(is_1_2) + int(is_2_1) + int(is_2_0) > 1: - raise MetadataConflictError('You used incompatible 1.1/1.2/2.0/2.1 fields') - - # we have the choice, 1.0, or 1.2, or 2.0 - # - 1.0 has a broken Summary field but works with all tools - # - 1.1 is to avoid - # - 1.2 fixes Summary but has little adoption - # - 2.0 adds more features and is very new - if not is_1_1 and not is_1_2 and not is_2_1 and not is_2_0: - # we couldn't find any specific marker - if PKG_INFO_PREFERRED_VERSION in possible_versions: - return PKG_INFO_PREFERRED_VERSION - if is_1_1: - return '1.1' - if is_1_2: - return '1.2' - if is_2_1: - return '2.1' - - return '2.0' - -_ATTR2FIELD = { - 'metadata_version': 'Metadata-Version', - 'name': 'Name', - 'version': 'Version', - 'platform': 'Platform', - 'supported_platform': 'Supported-Platform', - 'summary': 'Summary', - 'description': 'Description', - 'keywords': 'Keywords', - 'home_page': 'Home-page', - 'author': 'Author', - 'author_email': 'Author-email', - 'maintainer': 'Maintainer', - 'maintainer_email': 'Maintainer-email', - 'license': 'License', - 'classifier': 'Classifier', - 'download_url': 'Download-URL', - 'obsoletes_dist': 'Obsoletes-Dist', - 'provides_dist': 'Provides-Dist', - 'requires_dist': 'Requires-Dist', - 'setup_requires_dist': 'Setup-Requires-Dist', - 'requires_python': 'Requires-Python', - 'requires_external': 'Requires-External', - 'requires': 'Requires', - 'provides': 'Provides', - 'obsoletes': 'Obsoletes', - 'project_url': 'Project-URL', - 'private_version': 'Private-Version', - 'obsoleted_by': 'Obsoleted-By', - 'extension': 'Extension', - 'provides_extra': 'Provides-Extra', -} - -_PREDICATE_FIELDS = ('Requires-Dist', 'Obsoletes-Dist', 'Provides-Dist') -_VERSIONS_FIELDS = ('Requires-Python',) -_VERSION_FIELDS = ('Version',) -_LISTFIELDS = ('Platform', 'Classifier', 'Obsoletes', - 'Requires', 'Provides', 'Obsoletes-Dist', - 'Provides-Dist', 'Requires-Dist', 'Requires-External', - 'Project-URL', 'Supported-Platform', 'Setup-Requires-Dist', - 'Provides-Extra', 'Extension') -_LISTTUPLEFIELDS = ('Project-URL',) - -_ELEMENTSFIELD = ('Keywords',) - -_UNICODEFIELDS = ('Author', 'Maintainer', 'Summary', 'Description') - -_MISSING = object() - -_FILESAFE = re.compile('[^A-Za-z0-9.]+') - - -def _get_name_and_version(name, version, for_filename=False): - """Return the distribution name with version. - - If for_filename is true, return a filename-escaped form.""" - if for_filename: - # For both name and version any runs of non-alphanumeric or '.' - # characters are replaced with a single '-'. Additionally any - # spaces in the version string become '.' - name = _FILESAFE.sub('-', name) - version = _FILESAFE.sub('-', version.replace(' ', '.')) - return '%s-%s' % (name, version) - - -class LegacyMetadata(object): - """The legacy metadata of a release. - - Supports versions 1.0, 1.1 and 1.2 (auto-detected). You can - instantiate the class with one of these arguments (or none): - - *path*, the path to a metadata file - - *fileobj* give a file-like object with metadata as content - - *mapping* is a dict-like object - - *scheme* is a version scheme name - """ - # TODO document the mapping API and UNKNOWN default key - - def __init__(self, path=None, fileobj=None, mapping=None, - scheme='default'): - if [path, fileobj, mapping].count(None) < 2: - raise TypeError('path, fileobj and mapping are exclusive') - self._fields = {} - self.requires_files = [] - self._dependencies = None - self.scheme = scheme - if path is not None: - self.read(path) - elif fileobj is not None: - self.read_file(fileobj) - elif mapping is not None: - self.update(mapping) - self.set_metadata_version() - - def set_metadata_version(self): - self._fields['Metadata-Version'] = _best_version(self._fields) - - def _write_field(self, fileobj, name, value): - fileobj.write('%s: %s\n' % (name, value)) - - def __getitem__(self, name): - return self.get(name) - - def __setitem__(self, name, value): - return self.set(name, value) - - def __delitem__(self, name): - field_name = self._convert_name(name) - try: - del self._fields[field_name] - except KeyError: - raise KeyError(name) - - def __contains__(self, name): - return (name in self._fields or - self._convert_name(name) in self._fields) - - def _convert_name(self, name): - if name in _ALL_FIELDS: - return name - name = name.replace('-', '_').lower() - return _ATTR2FIELD.get(name, name) - - def _default_value(self, name): - if name in _LISTFIELDS or name in _ELEMENTSFIELD: - return [] - return 'UNKNOWN' - - def _remove_line_prefix(self, value): - if self.metadata_version in ('1.0', '1.1'): - return _LINE_PREFIX_PRE_1_2.sub('\n', value) - else: - return _LINE_PREFIX_1_2.sub('\n', value) - - def __getattr__(self, name): - if name in _ATTR2FIELD: - return self[name] - raise AttributeError(name) - - # - # Public API - # - -# dependencies = property(_get_dependencies, _set_dependencies) - - def get_fullname(self, filesafe=False): - """Return the distribution name with version. - - If filesafe is true, return a filename-escaped form.""" - return _get_name_and_version(self['Name'], self['Version'], filesafe) - - def is_field(self, name): - """return True if name is a valid metadata key""" - name = self._convert_name(name) - return name in _ALL_FIELDS - - def is_multi_field(self, name): - name = self._convert_name(name) - return name in _LISTFIELDS - - def read(self, filepath): - """Read the metadata values from a file path.""" - fp = codecs.open(filepath, 'r', encoding='utf-8') - try: - self.read_file(fp) - finally: - fp.close() - - def read_file(self, fileob): - """Read the metadata values from a file object.""" - msg = message_from_file(fileob) - self._fields['Metadata-Version'] = msg['metadata-version'] - - # When reading, get all the fields we can - for field in _ALL_FIELDS: - if field not in msg: - continue - if field in _LISTFIELDS: - # we can have multiple lines - values = msg.get_all(field) - if field in _LISTTUPLEFIELDS and values is not None: - values = [tuple(value.split(',')) for value in values] - self.set(field, values) - else: - # single line - value = msg[field] - if value is not None and value != 'UNKNOWN': - self.set(field, value) - # logger.debug('Attempting to set metadata for %s', self) - # self.set_metadata_version() - - def write(self, filepath, skip_unknown=False): - """Write the metadata fields to filepath.""" - fp = codecs.open(filepath, 'w', encoding='utf-8') - try: - self.write_file(fp, skip_unknown) - finally: - fp.close() - - def write_file(self, fileobject, skip_unknown=False): - """Write the PKG-INFO format data to a file object.""" - self.set_metadata_version() - - for field in _version2fieldlist(self['Metadata-Version']): - values = self.get(field) - if skip_unknown and values in ('UNKNOWN', [], ['UNKNOWN']): - continue - if field in _ELEMENTSFIELD: - self._write_field(fileobject, field, ','.join(values)) - continue - if field not in _LISTFIELDS: - if field == 'Description': - if self.metadata_version in ('1.0', '1.1'): - values = values.replace('\n', '\n ') - else: - values = values.replace('\n', '\n |') - values = [values] - - if field in _LISTTUPLEFIELDS: - values = [','.join(value) for value in values] - - for value in values: - self._write_field(fileobject, field, value) - - def update(self, other=None, **kwargs): - """Set metadata values from the given iterable `other` and kwargs. - - Behavior is like `dict.update`: If `other` has a ``keys`` method, - they are looped over and ``self[key]`` is assigned ``other[key]``. - Else, ``other`` is an iterable of ``(key, value)`` iterables. - - Keys that don't match a metadata field or that have an empty value are - dropped. - """ - def _set(key, value): - if key in _ATTR2FIELD and value: - self.set(self._convert_name(key), value) - - if not other: - # other is None or empty container - pass - elif hasattr(other, 'keys'): - for k in other.keys(): - _set(k, other[k]) - else: - for k, v in other: - _set(k, v) - - if kwargs: - for k, v in kwargs.items(): - _set(k, v) - - def set(self, name, value): - """Control then set a metadata field.""" - name = self._convert_name(name) - - if ((name in _ELEMENTSFIELD or name == 'Platform') and - not isinstance(value, (list, tuple))): - if isinstance(value, string_types): - value = [v.strip() for v in value.split(',')] - else: - value = [] - elif (name in _LISTFIELDS and - not isinstance(value, (list, tuple))): - if isinstance(value, string_types): - value = [value] - else: - value = [] - - if logger.isEnabledFor(logging.WARNING): - project_name = self['Name'] - - scheme = get_scheme(self.scheme) - if name in _PREDICATE_FIELDS and value is not None: - for v in value: - # check that the values are valid - if not scheme.is_valid_matcher(v.split(';')[0]): - logger.warning( - "'%s': '%s' is not valid (field '%s')", - project_name, v, name) - # FIXME this rejects UNKNOWN, is that right? - elif name in _VERSIONS_FIELDS and value is not None: - if not scheme.is_valid_constraint_list(value): - logger.warning("'%s': '%s' is not a valid version (field '%s')", - project_name, value, name) - elif name in _VERSION_FIELDS and value is not None: - if not scheme.is_valid_version(value): - logger.warning("'%s': '%s' is not a valid version (field '%s')", - project_name, value, name) - - if name in _UNICODEFIELDS: - if name == 'Description': - value = self._remove_line_prefix(value) - - self._fields[name] = value - - def get(self, name, default=_MISSING): - """Get a metadata field.""" - name = self._convert_name(name) - if name not in self._fields: - if default is _MISSING: - default = self._default_value(name) - return default - if name in _UNICODEFIELDS: - value = self._fields[name] - return value - elif name in _LISTFIELDS: - value = self._fields[name] - if value is None: - return [] - res = [] - for val in value: - if name not in _LISTTUPLEFIELDS: - res.append(val) - else: - # That's for Project-URL - res.append((val[0], val[1])) - return res - - elif name in _ELEMENTSFIELD: - value = self._fields[name] - if isinstance(value, string_types): - return value.split(',') - return self._fields[name] - - def check(self, strict=False): - """Check if the metadata is compliant. If strict is True then raise if - no Name or Version are provided""" - self.set_metadata_version() - - # XXX should check the versions (if the file was loaded) - missing, warnings = [], [] - - for attr in ('Name', 'Version'): # required by PEP 345 - if attr not in self: - missing.append(attr) - - if strict and missing != []: - msg = 'missing required metadata: %s' % ', '.join(missing) - raise MetadataMissingError(msg) - - for attr in ('Home-page', 'Author'): - if attr not in self: - missing.append(attr) - - # checking metadata 1.2 (XXX needs to check 1.1, 1.0) - if self['Metadata-Version'] != '1.2': - return missing, warnings - - scheme = get_scheme(self.scheme) - - def are_valid_constraints(value): - for v in value: - if not scheme.is_valid_matcher(v.split(';')[0]): - return False - return True - - for fields, controller in ((_PREDICATE_FIELDS, are_valid_constraints), - (_VERSIONS_FIELDS, - scheme.is_valid_constraint_list), - (_VERSION_FIELDS, - scheme.is_valid_version)): - for field in fields: - value = self.get(field, None) - if value is not None and not controller(value): - warnings.append("Wrong value for '%s': %s" % (field, value)) - - return missing, warnings - - def todict(self, skip_missing=False): - """Return fields as a dict. - - Field names will be converted to use the underscore-lowercase style - instead of hyphen-mixed case (i.e. home_page instead of Home-page). - """ - self.set_metadata_version() - - mapping_1_0 = ( - ('metadata_version', 'Metadata-Version'), - ('name', 'Name'), - ('version', 'Version'), - ('summary', 'Summary'), - ('home_page', 'Home-page'), - ('author', 'Author'), - ('author_email', 'Author-email'), - ('license', 'License'), - ('description', 'Description'), - ('keywords', 'Keywords'), - ('platform', 'Platform'), - ('classifiers', 'Classifier'), - ('download_url', 'Download-URL'), - ) - - data = {} - for key, field_name in mapping_1_0: - if not skip_missing or field_name in self._fields: - data[key] = self[field_name] - - if self['Metadata-Version'] == '1.2': - mapping_1_2 = ( - ('requires_dist', 'Requires-Dist'), - ('requires_python', 'Requires-Python'), - ('requires_external', 'Requires-External'), - ('provides_dist', 'Provides-Dist'), - ('obsoletes_dist', 'Obsoletes-Dist'), - ('project_url', 'Project-URL'), - ('maintainer', 'Maintainer'), - ('maintainer_email', 'Maintainer-email'), - ) - for key, field_name in mapping_1_2: - if not skip_missing or field_name in self._fields: - if key != 'project_url': - data[key] = self[field_name] - else: - data[key] = [','.join(u) for u in self[field_name]] - - elif self['Metadata-Version'] == '1.1': - mapping_1_1 = ( - ('provides', 'Provides'), - ('requires', 'Requires'), - ('obsoletes', 'Obsoletes'), - ) - for key, field_name in mapping_1_1: - if not skip_missing or field_name in self._fields: - data[key] = self[field_name] - - return data - - def add_requirements(self, requirements): - if self['Metadata-Version'] == '1.1': - # we can't have 1.1 metadata *and* Setuptools requires - for field in ('Obsoletes', 'Requires', 'Provides'): - if field in self: - del self[field] - self['Requires-Dist'] += requirements - - # Mapping API - # TODO could add iter* variants - - def keys(self): - return list(_version2fieldlist(self['Metadata-Version'])) - - def __iter__(self): - for key in self.keys(): - yield key - - def values(self): - return [self[key] for key in self.keys()] - - def items(self): - return [(key, self[key]) for key in self.keys()] - - def __repr__(self): - return '<%s %s %s>' % (self.__class__.__name__, self.name, - self.version) - - -METADATA_FILENAME = 'pydist.json' -WHEEL_METADATA_FILENAME = 'metadata.json' -LEGACY_METADATA_FILENAME = 'METADATA' - - -class Metadata(object): - """ - The metadata of a release. This implementation uses 2.0 (JSON) - metadata where possible. If not possible, it wraps a LegacyMetadata - instance which handles the key-value metadata format. - """ - - METADATA_VERSION_MATCHER = re.compile(r'^\d+(\.\d+)*$') - - NAME_MATCHER = re.compile('^[0-9A-Z]([0-9A-Z_.-]*[0-9A-Z])?$', re.I) - - VERSION_MATCHER = PEP440_VERSION_RE - - SUMMARY_MATCHER = re.compile('.{1,2047}') - - METADATA_VERSION = '2.0' - - GENERATOR = 'distlib (%s)' % __version__ - - MANDATORY_KEYS = { - 'name': (), - 'version': (), - 'summary': ('legacy',), - } - - INDEX_KEYS = ('name version license summary description author ' - 'author_email keywords platform home_page classifiers ' - 'download_url') - - DEPENDENCY_KEYS = ('extras run_requires test_requires build_requires ' - 'dev_requires provides meta_requires obsoleted_by ' - 'supports_environments') - - SYNTAX_VALIDATORS = { - 'metadata_version': (METADATA_VERSION_MATCHER, ()), - 'name': (NAME_MATCHER, ('legacy',)), - 'version': (VERSION_MATCHER, ('legacy',)), - 'summary': (SUMMARY_MATCHER, ('legacy',)), - } - - __slots__ = ('_legacy', '_data', 'scheme') - - def __init__(self, path=None, fileobj=None, mapping=None, - scheme='default'): - if [path, fileobj, mapping].count(None) < 2: - raise TypeError('path, fileobj and mapping are exclusive') - self._legacy = None - self._data = None - self.scheme = scheme - #import pdb; pdb.set_trace() - if mapping is not None: - try: - self._validate_mapping(mapping, scheme) - self._data = mapping - except MetadataUnrecognizedVersionError: - self._legacy = LegacyMetadata(mapping=mapping, scheme=scheme) - self.validate() - else: - data = None - if path: - with open(path, 'rb') as f: - data = f.read() - elif fileobj: - data = fileobj.read() - if data is None: - # Initialised with no args - to be added - self._data = { - 'metadata_version': self.METADATA_VERSION, - 'generator': self.GENERATOR, - } - else: - if not isinstance(data, text_type): - data = data.decode('utf-8') - try: - self._data = json.loads(data) - self._validate_mapping(self._data, scheme) - except ValueError: - # Note: MetadataUnrecognizedVersionError does not - # inherit from ValueError (it's a DistlibException, - # which should not inherit from ValueError). - # The ValueError comes from the json.load - if that - # succeeds and we get a validation error, we want - # that to propagate - self._legacy = LegacyMetadata(fileobj=StringIO(data), - scheme=scheme) - self.validate() - - common_keys = set(('name', 'version', 'license', 'keywords', 'summary')) - - none_list = (None, list) - none_dict = (None, dict) - - mapped_keys = { - 'run_requires': ('Requires-Dist', list), - 'build_requires': ('Setup-Requires-Dist', list), - 'dev_requires': none_list, - 'test_requires': none_list, - 'meta_requires': none_list, - 'extras': ('Provides-Extra', list), - 'modules': none_list, - 'namespaces': none_list, - 'exports': none_dict, - 'commands': none_dict, - 'classifiers': ('Classifier', list), - 'source_url': ('Download-URL', None), - 'metadata_version': ('Metadata-Version', None), - } - - del none_list, none_dict - - def __getattribute__(self, key): - common = object.__getattribute__(self, 'common_keys') - mapped = object.__getattribute__(self, 'mapped_keys') - if key in mapped: - lk, maker = mapped[key] - if self._legacy: - if lk is None: - result = None if maker is None else maker() - else: - result = self._legacy.get(lk) - else: - value = None if maker is None else maker() - if key not in ('commands', 'exports', 'modules', 'namespaces', - 'classifiers'): - result = self._data.get(key, value) - else: - # special cases for PEP 459 - sentinel = object() - result = sentinel - d = self._data.get('extensions') - if d: - if key == 'commands': - result = d.get('python.commands', value) - elif key == 'classifiers': - d = d.get('python.details') - if d: - result = d.get(key, value) - else: - d = d.get('python.exports') - if not d: - d = self._data.get('python.exports') - if d: - result = d.get(key, value) - if result is sentinel: - result = value - elif key not in common: - result = object.__getattribute__(self, key) - elif self._legacy: - result = self._legacy.get(key) - else: - result = self._data.get(key) - return result - - def _validate_value(self, key, value, scheme=None): - if key in self.SYNTAX_VALIDATORS: - pattern, exclusions = self.SYNTAX_VALIDATORS[key] - if (scheme or self.scheme) not in exclusions: - m = pattern.match(value) - if not m: - raise MetadataInvalidError("'%s' is an invalid value for " - "the '%s' property" % (value, - key)) - - def __setattr__(self, key, value): - self._validate_value(key, value) - common = object.__getattribute__(self, 'common_keys') - mapped = object.__getattribute__(self, 'mapped_keys') - if key in mapped: - lk, _ = mapped[key] - if self._legacy: - if lk is None: - raise NotImplementedError - self._legacy[lk] = value - elif key not in ('commands', 'exports', 'modules', 'namespaces', - 'classifiers'): - self._data[key] = value - else: - # special cases for PEP 459 - d = self._data.setdefault('extensions', {}) - if key == 'commands': - d['python.commands'] = value - elif key == 'classifiers': - d = d.setdefault('python.details', {}) - d[key] = value - else: - d = d.setdefault('python.exports', {}) - d[key] = value - elif key not in common: - object.__setattr__(self, key, value) - else: - if key == 'keywords': - if isinstance(value, string_types): - value = value.strip() - if value: - value = value.split() - else: - value = [] - if self._legacy: - self._legacy[key] = value - else: - self._data[key] = value - - @property - def name_and_version(self): - return _get_name_and_version(self.name, self.version, True) - - @property - def provides(self): - if self._legacy: - result = self._legacy['Provides-Dist'] - else: - result = self._data.setdefault('provides', []) - s = '%s (%s)' % (self.name, self.version) - if s not in result: - result.append(s) - return result - - @provides.setter - def provides(self, value): - if self._legacy: - self._legacy['Provides-Dist'] = value - else: - self._data['provides'] = value - - def get_requirements(self, reqts, extras=None, env=None): - """ - Base method to get dependencies, given a set of extras - to satisfy and an optional environment context. - :param reqts: A list of sometimes-wanted dependencies, - perhaps dependent on extras and environment. - :param extras: A list of optional components being requested. - :param env: An optional environment for marker evaluation. - """ - if self._legacy: - result = reqts - else: - result = [] - extras = get_extras(extras or [], self.extras) - for d in reqts: - if 'extra' not in d and 'environment' not in d: - # unconditional - include = True - else: - if 'extra' not in d: - # Not extra-dependent - only environment-dependent - include = True - else: - include = d.get('extra') in extras - if include: - # Not excluded because of extras, check environment - marker = d.get('environment') - if marker: - include = interpret(marker, env) - if include: - result.extend(d['requires']) - for key in ('build', 'dev', 'test'): - e = ':%s:' % key - if e in extras: - extras.remove(e) - # A recursive call, but it should terminate since 'test' - # has been removed from the extras - reqts = self._data.get('%s_requires' % key, []) - result.extend(self.get_requirements(reqts, extras=extras, - env=env)) - return result - - @property - def dictionary(self): - if self._legacy: - return self._from_legacy() - return self._data - - @property - def dependencies(self): - if self._legacy: - raise NotImplementedError - else: - return extract_by_key(self._data, self.DEPENDENCY_KEYS) - - @dependencies.setter - def dependencies(self, value): - if self._legacy: - raise NotImplementedError - else: - self._data.update(value) - - def _validate_mapping(self, mapping, scheme): - if mapping.get('metadata_version') != self.METADATA_VERSION: - raise MetadataUnrecognizedVersionError() - missing = [] - for key, exclusions in self.MANDATORY_KEYS.items(): - if key not in mapping: - if scheme not in exclusions: - missing.append(key) - if missing: - msg = 'Missing metadata items: %s' % ', '.join(missing) - raise MetadataMissingError(msg) - for k, v in mapping.items(): - self._validate_value(k, v, scheme) - - def validate(self): - if self._legacy: - missing, warnings = self._legacy.check(True) - if missing or warnings: - logger.warning('Metadata: missing: %s, warnings: %s', - missing, warnings) - else: - self._validate_mapping(self._data, self.scheme) - - def todict(self): - if self._legacy: - return self._legacy.todict(True) - else: - result = extract_by_key(self._data, self.INDEX_KEYS) - return result - - def _from_legacy(self): - assert self._legacy and not self._data - result = { - 'metadata_version': self.METADATA_VERSION, - 'generator': self.GENERATOR, - } - lmd = self._legacy.todict(True) # skip missing ones - for k in ('name', 'version', 'license', 'summary', 'description', - 'classifier'): - if k in lmd: - if k == 'classifier': - nk = 'classifiers' - else: - nk = k - result[nk] = lmd[k] - kw = lmd.get('Keywords', []) - if kw == ['']: - kw = [] - result['keywords'] = kw - keys = (('requires_dist', 'run_requires'), - ('setup_requires_dist', 'build_requires')) - for ok, nk in keys: - if ok in lmd and lmd[ok]: - result[nk] = [{'requires': lmd[ok]}] - result['provides'] = self.provides - author = {} - maintainer = {} - return result - - LEGACY_MAPPING = { - 'name': 'Name', - 'version': 'Version', - 'license': 'License', - 'summary': 'Summary', - 'description': 'Description', - 'classifiers': 'Classifier', - } - - def _to_legacy(self): - def process_entries(entries): - reqts = set() - for e in entries: - extra = e.get('extra') - env = e.get('environment') - rlist = e['requires'] - for r in rlist: - if not env and not extra: - reqts.add(r) - else: - marker = '' - if extra: - marker = 'extra == "%s"' % extra - if env: - if marker: - marker = '(%s) and %s' % (env, marker) - else: - marker = env - reqts.add(';'.join((r, marker))) - return reqts - - assert self._data and not self._legacy - result = LegacyMetadata() - nmd = self._data - for nk, ok in self.LEGACY_MAPPING.items(): - if nk in nmd: - result[ok] = nmd[nk] - r1 = process_entries(self.run_requires + self.meta_requires) - r2 = process_entries(self.build_requires + self.dev_requires) - if self.extras: - result['Provides-Extra'] = sorted(self.extras) - result['Requires-Dist'] = sorted(r1) - result['Setup-Requires-Dist'] = sorted(r2) - # TODO: other fields such as contacts - return result - - def write(self, path=None, fileobj=None, legacy=False, skip_unknown=True): - if [path, fileobj].count(None) != 1: - raise ValueError('Exactly one of path and fileobj is needed') - self.validate() - if legacy: - if self._legacy: - legacy_md = self._legacy - else: - legacy_md = self._to_legacy() - if path: - legacy_md.write(path, skip_unknown=skip_unknown) - else: - legacy_md.write_file(fileobj, skip_unknown=skip_unknown) - else: - if self._legacy: - d = self._from_legacy() - else: - d = self._data - if fileobj: - json.dump(d, fileobj, ensure_ascii=True, indent=2, - sort_keys=True) - else: - with codecs.open(path, 'w', 'utf-8') as f: - json.dump(d, f, ensure_ascii=True, indent=2, - sort_keys=True) - - def add_requirements(self, requirements): - if self._legacy: - self._legacy.add_requirements(requirements) - else: - run_requires = self._data.setdefault('run_requires', []) - always = None - for entry in run_requires: - if 'environment' not in entry and 'extra' not in entry: - always = entry - break - if always is None: - always = { 'requires': requirements } - run_requires.insert(0, always) - else: - rset = set(always['requires']) | set(requirements) - always['requires'] = sorted(rset) - - def __repr__(self): - name = self.name or '(no name)' - version = self.version or 'no version' - return '<%s %s %s (%s)>' % (self.__class__.__name__, - self.metadata_version, name, version) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/metadata.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/metadata.pyc deleted file mode 100644 index 8a3153d2e4641c9903c0a9e550b91749ac724f52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38836 zcmdU&dvILWec#XSLI44R1VxG<AyLwjB1MqGgQRH6k|<dq0ZNQWkiMWq2@<qiVlTiY z7rVgTT@qBK_(8{yJUwmG={VDgoj7*lG>zRfQ`eJ6lS!R4O<zgfy3@%t%^&F`|8ypq zrqj%{>F4`9_ukzlL0L{S1BS$&J@?#m&pnUd`Mu9?bAPs}@8HKa&&|8|-$Q)A;Ic0I z!!GAa&dri$Tq)}+8Ml;mvsstXb<S0CZZ>E4x?H8pE#2p4?@RA>yV-8LN4*|5+mqxs zxY-S^be}7AyGpNH>T|PwZfT>N-N=)a_P9#FTiWDiH@T(FZg#U<8gR1%{@w;x+2WS& zceD5V>t0vc>Xx>-*==s=0XO@AFYR-c?QUt%%?`Sy9d34q%Y;4d>P{C9xmy`G`=Bdr zbYY)cU<m#06VBao?)BM+TxnBMx;ZV~<w^rd>6WzgVOP38DczcuKH^H-T<HN<+U^#a zmq%TRF63Q_F6?&U26uIjEA6x%JeFMg4()X%`a}nK8%@&=&+_1ISK^V!TxqXcV1D*> zR^xK5nx)5GX}>ECyV3zyI_MUdEJ~6~e|Ld(qE7ou*KF+xR~pgV<2FZKY0Q<zUFnc3 z9d@N7Zh-;Pa#})#Bd+A18gmOQG=2F0eoN^|S32rSA8@5(uJn{!c*xBjbSiwRRjv^| z;X=wkXrs=$9kX=(gIeU-Q5TMBk!QzUIPR_<a^XHLLngj>y!~Rh{o-Kz#fZP~>-e-T zW|@R%wEVM-`dQ07>B=k$Lq6_~X+@voi&cG|FIM(Ld@<24@I|c&zF6oJe6iRk`C`E* z`C`$h_+sHt@x^q$$QPq|i7yu8G+!*~_wdCczRVZ%eugjB;VfUQ&NN@l*EzoE<9WX5 z;fMKRf&#u+mKnZSy9<1=sITzFjK0bjQ+<&y=K3|hnB&*ou~`afmiLUi1z?-D58KpI zYnNrH#{fN~@e*EOmGu;_<_(OSr>J(!EwHUwCLn}4d|IHc%rge<jMkufq07xa>%!x< zZqFtAW!9$sc^7`jmELfl;Hei}=}lFmh0<KQ6(?NjEjN3@l?rb5q$^!=vy-k=OzK@u z>rDxX%?u0iH9tafdTF^5E``-bu~Dv7^R<P1<4Tx68#aoiVxyQ}sMYi5Z#J%QYq>ao zt+*IQ`SVlfqp`lendb6xt=@?8#Y!c=)b_wqk;37_V~0lahsO>pIWm$jR!jLKV~6tL z>T*~w+Y2iP#`?;C$-m(Y9cgS)m#XFYS}814%8jsItVGlP*8SXC3ZsbE7Z&QZrNTnF z5|;JUa5i~#vK%!k<;zp6^Wn0F(%8tILg9K?kGLunhI6X9fn=spFIN{&pKJ7U5!pqd zadSD08ojC#t~Tt_zgk7*D!o~*hYkO>%@k3oUYu_fF5fI%3vV|1C|V2~1uKqxwWKVX zzrqAJGzMnw=+Q%kSEquR)90oO!Bpb`N|VVxTaF?+HdU|J>RKQBr$L?&VY0Wf@mO`z ztP5tWgUv^%Fp;l^E6s8}EVUM*9OajMgRPMl3f1CLSSVP33x%axsaerw4{a0*rP@5x zq_?(`sK({^a=m=L*a*k37wh8-wMvOO9e;au{N|JO%hem#4j)^o9y(S(dTjoK(dyHs zx9f-ax41lhVSKr~JX)?s4IpH+aro?F;k=6M!@^WcwfcC;FWYzmKx4}{1Fg$0K9Lr; zJJZ<CS29T_Yt@BHdA{*o&eHQVG0|v*OUsRXqsDX<OL;*1Mjb$F&DlaZtdt^lK(Uc8 z*2DaK{IX`TGG?<FY@(e&OA!o^wC2fj>oQr|HhDhDWGSCa)+^O|IA2?=mfsFbulkMf zUCx_Yd!>4<TDwtgO;fz5^3~?j<*<Iw&Wv{4UOvgpwC}ak)$7Gdx%6GmhPcFuws|O4 znqi)eR`#vkt01zKZVN!;iD+&hpMXfy@Y2gK7EVu}I#-yQK6!5P^z@6(2dQ#CDLo%d zotg@QsmTO$HSgngv#~Jx!KSb(SiUK2*O&MI-h8Jiw3%Gyn}X5gg`+VbHoGXCE-r;l zVV|T>T{~YXHlRC8c4MZwv{bC$YzmuChS7YzY}nn#@N#(bMy+0o>}@aAmcr3xC`7ZH zsuN9UR=p`q;<KaSQn6gICeM`T!)g>ZH7zj_3rnNvTQ!oCl_Izpbl{tq1pF(tVrlf1 z;EcWO+~ufN2^(Q#{WxE*T`!m7i@;;z$Y$hh5!%6rc5DvP%eXtjBxzftB4IXA8oV0L zH|%x7ILQlq4Z}h4TYQOdQS#nVPp)lU)3T{mC|DJ6Rn7Aro2Lt*NlH3V8a;8dxs8IE zu+dx|O&hSTX;IZuRTQ<UzNa0dxL$1Tq^NC?MnTrpZj4@lx;FQ4)9B-y(ZT1QBN^T^ z{Ki{*=AJmP=bioJ_LJLxU|s}I9|6`$5kAPBd&fzXx|VhIEv`Z5be*;9ylZ6qb<VC2 zxklDs_qc1_u0E;jM$YZ9XS%J<1=r|;3%F0s!qk4;Nb1b6U~f7G=tC)BdjLNYUq5Nz zM*w)0!_XM5zy0R0K+rQFM~)sYoH{*qW^%?~KY93Q=k?JKbX<Sn*s+f5qeqhKKs(hl zCE77D64t)<bZ9-OPeXes;jxYw`K$oMRZ62l^(@n$>1z9Iu)M9Ywwb2M*7z}IlLh{S zbMI!{B5BsGp3w4KHCc6X?x=e+>)y?|ce~s>U8=$IBXz==Ymra7m0gaPzLRxVv+kXo z$t@IJgx4)~#gaE-c4>oK>~`<o=T?_8)Sa9QGqg#40OVSatA9<*@jLffn_pArDi8bC zfR?M>uGDL-qYcp8cn%=rxj)uh;^+Q2d9KTP5kJ>=+jAT2x!n@~<L7o~;`iOx{@ljf zp6j*eUeBOOh@X2sd9J(tx&Aeu`+SBOh@bm>hW?`fxR!Hu@_wuv+S}Niw6XH}WVn6y z`ba8^xS2>9O;b<%qXX%qkz0w}MPQ$5?6uMs+kt<s7ot%Z(yoZ_+;4aGXX6>$YP*w} zhD}Gy;P)xBp3ZdbL)mvSTJpvwcMITPb&|=f%_g@t+bvspUIVPun#rvJyS1S;mfB~N zTU+c_uY+lS$EH;o8{iJ*Y?dt7tA6d!pt@ZBceCp11Ff#|Y=1qI<4OD4;J<q9i=E>; zL<RCQf+rw(V~+97@I-xkj^WJkuKJ@nR&9m}o*CAjYJPxZ65=xtD~qgl8Nnr=uw<oh z8NM1RB9FwTyD>}KjKb2`y!dJ1Eq!K$TlbM!eZ(=3lXHXGbxbF_PJ61y5ba72iwA-= zyff_u8xigc^=8OIId=*vE%XwG$`OVl6DJ_r*WfrC+TuRH&X~%?!7Ih6;Cu7E^eYm^ zcbQEfr41Ql4PKdkdHUSN_e%skkq|MEgc5{Hwd+V=2)_9ed?8}SzUa0)hwpml$X)L| z*>>l4E~x#z^rNk2=bg45nb=&`z?%n1&NUkn`fJ8jMfuTu^LB1O3LDR8Bx0ZM5Cyo| z9O1_6wPs#01}i*YTUth$aJdpn{2xd9ABRrzIUEDy^spEVgC3->r3hjS;jL9e1D4{l zAULop0-m}}tKF*978k?1Jy;4aHx~nSDX@`hV+1=$z~s(V!fGIX%Ow1QNbcE*;AN!l zxB!~lQ6Qq*Q6Q?D6sSSCxW;?4#KWRz)=R(Rf=9UycBxPeNJ*gWg4Dsr5hY))!C^8< z3H9__r5qIw7Y<uHmOYYWkF-jU6b`NPUJ?gd5Z*~T56*DWB@&nI?e5MDWwvL!GxukA z<~C(^vcI;inf7yM(C+NWZDj{;&1}gG<Q~fS|A#UIJ-f2~nI2l|N<LX*qnBc3Q}T8b zC8XJ~JshJ#<II;6Q9^u5<P}z7sgM?nk&4<R44C*134>*8Nf=j<Fbb)JQEW*VK3nh- zhTs5Eqn+(<UB-3vT9g<jg{b~~r?^py#f?I<UNJVimWUe#sY{xg{^eNaXqD7sk-(Q| z|7deA7dp!&0Hh_$rr9%5AuWSN_o9N3V^ZoTGZAwn2c%sxfrZ{kV6hJC4Y9%~T_A}V z$rB}%W+p`GO)XI(9gxWgHtaXvni!oej=p_p^y#s=C+4+}^wB;tuJJ`O5Ul#sB2`ym zE?@`X7vTlib!kaPJfYY{7`d$7&4^bNAHm}pw~%#%Gs9}Md4(ik((0aeYO?F)%T3da z3cm6;%8e@ttwjYYarg9sl%%GSv?{0r8W6`3bWGL|I#iUEx-|-L6_>%05^l$u5^_c@ z&09KVQuV%QbYJA@siqlO;LOy_#HlI6B2n|Q5!ZSM1kbmTT{Ry_`Z5I9-k){G6hh7g zX-3t<0!rWnB>opSJpJwJ?%JB!ooQ^Q<V?6&oWGf<3g#)Xe_9+<f*xhk!ZszStO@>) z)z7+5ph7o}9YF%K980W>F^0;(26kJCF?}lOl}MmWpICckHo8)uWnkqtT4qyhGs7+y z4v1rx5`K#-naK>Z9Og1TxK+HZGTX%1D)WHV$67}H?UvtW`9bUR1D4+*DMppeR)_ga zl^?XqJ1qZ@<#$>hv&xWF#_sT-WiT8(WEm!5mu2#@N~pozGAk&vN2=mHGuSLLdl%pd zD>ln5Jr?x82)I_lVid+uohtWZY#NEJF@3&i@*(Q^VbES}v}BBESUND47Y{IBtlF+H zt#7qaMr&+rs9`w2eIWF)nIQ_%vMx4d48UN3I=0Ha1J76kqxpky5mye5*yGBIp(?gI ztzDJWRK9lk>cRYC`8sXdjvK9%ukoVG!b|?e3E9XOBWZS}nMfK~g6n{3J}6~gF<(Nz z-2Qk{%WLxEN(sm93-f|+t7kN*6fP8-mBzdPSDzdoLs`E-#!D?oU)W5MZ%d|x0C!yj z-;PRM0VJp5PMP{_Au9U};O#TWI)=dtNP+-AEJm-ZFRAiXgtLrV$W)P`Y0lsKjNL>2 zv(_`!$0ei1_kP~)dEu7l)JUJZ1#c`wiL77<X}T==p}C(#>oH=}%mf=m#4~7W^Kf;( z(u`P&VezZR_srLt)kd&emqKe&2$}BH&>6^6dUwMB3B@sl8X?*-crVn1)%h|khj_x+ zq|!xJntW?g8GFcTG?y`7g=SuX3Ko*3Pq2@nd*eH!u(Dto4as^F1C!<BQ3WS>(>h~P zk>f(4TrD>Wg)MC4Nc^bFK9U*8^v3`DVW9kHQ)Zqjoq9CYhbn4q4LW=VxI1nuthJq9 zQ&VeFU+@9$2OlCaQ7{ngUEdiAPSJ(DW<p(enR$Uj^0Cb(bv-*ld(0FCz`KaOc1GKf zd#JT9l8DpiwQJh2W*8b)Yc|s0v~o`?87EoafqNmwdgyn~V{Mb5xkx@X3EDwgYMTm% zo`~{-4`V8z&VGfpq&CKN9-c|+Vj3hJ77CBIjZSzp`Pk?r<)xz&W<&WK>nhR#f&jc_ zCLQ3tu!w$?^v#d*K-(y_ej23!(MCDZK1$XQMa@mLbGDNi^m7-h54$c1$F)9JKkhP_ z40%ri&}~;U?ll8<O~|xoEe)+g10iCbHM5;<)^Us~hM8}hGBX()o;FtQo&b?jC_e!} zWJHrELCS#*bD7NumZt0K*a-VHi6$Yi7tnAm?@eYfMTb_Nz>glbX$b;y_tqAXJXI)& zi9yng3WX;%0m4?AfOP1BA%mX}l40mze`)r%C_lr;i%jA+OmBY6wC~^q)VZ1{rbW9+ ztxUH`D+NzH4SpxioQbU!f!<-HzEZmZRQcN%E(Ax+`VmZX`<|LZTh*sDZyV^EH&pCw z&7D@?<}Oc$sqk|b?X*0+8uPeIJlPDSWyS_J-L65j5<dxNPS0G3EkF`+3R7pM&Q48V zn6a{ZYD$a&gWEFRwP32M=QKfLxg3g`uGaLVp!KAt$H+^m%Vy<K8RR5!V@dH4B#3Ii zHe@8+cBh_|x4Ax>lh~w|+Tn~An~%`#yqqz4g)^t8rwTGupMFhWXwi-YPtlq^(s7qN zZL@w4kaMYO(9%eIjN?-k9aBAAD6gJqP5nS-OE%rrDP->DxfC+%4`>;<#H8Z)Zp*N# zS@pX6;B`%jzz}B`Q*C%Qylq0n<lGb39R{FCCkus_S`#5feL4}sceX`M@nK-dW*lM~ zKxsn)K6$zcQvXVdokY2VY#9|7%+KTfDR$JaX~aRp2d{d!8_zU9tGPA0B38u6t)vY# zzs^%Gf+97|LbFnlC_AG$S5IA6I^QYa4N>g(ye1iT!~hPk11oy!*?fX3u>wq{qI`M5 zBxEmNo9j(Wl1ItvCq;BNxJc5PqkDlL6@5S%Z_Ll@ninmw%eE2P?_y@+eP~0Sz2}B1 z%)n5W&|Q@MfZs|7oNyM}P$_3Bi1w;hK!M%I&NDr01{U>gOr=l;Gb#clnTt>exYeuZ zVIe24aTTjw57I~=k31PH6ZD=p`V-~l@0s^19b8ZwSG?l1Zkq>{KuyNZmOs+8rxT)B zawMJi#-$o2rC?HBRmbNmwb*27vR%3jO#`5%Tv%S;-58vt6PGpd0zH@A2~T^!Cjc6l zK8E-Hgp4G5zX@%gV+1J9F6)l3epBkC$+=&V>jcs-voCjr<8EcIxl4G*2UwY(vxQ-K zSR3}UWtb~*IiHiB2~)JxOP@0>R2MBiBrgh7B-pU8qD{5Oc=D~RTe+_1s~$s`Mv3QP zBs08|_w$A!9_6{XO-fBuD?bGC0E~YKcLDzp&s~%$+?;BfGB&<1Sn-;_u?~aLXsonb zQ_W#4?npZmH*H3}fQ5(!0pX@VyVjIL!k2iqCLG4hg$u8oKLZ0IXCJTX60~80!Bb4R zXc=)OI8V-o;(<?#=`~I!j4wrtR@ab?X|nt_xCbOw+du$TqIv4i+>d#$AJbevxNv9Y ziOjZKAKzxD5sFNagq&~JMiM#qw(%`O5(b`HbHfwxjCbIP$7$!HdF*x|3a>qsdRP<L z!VxzD_;YtVZV0YW7@$^lCekKqlu8&N7P>Z-&oxyMU5u`kmkY63JgBG=AD^s;&sA`S zw|}e?J3NrJS?|CO$Eo6}w9xJ96B+S^rV1Nkr%uidneUTF(CN0vns&i9d^UEnTEsx+ zovbdnm4`a9#>cIFkOd8+N@mGSDNXBeUYS;Hyzam{|J5oXB=C;kvnR2~Y&0D6D|)5y zh&k#217MI9>ZFDE*;t{_3hrNqqLc@L;SnX7Hp5zTYjSS8FjL$Yb2$=D`qLOEt?u@f zhEz$DlXM;&WPRR|xk$e+Vgs5P*4j4@k+fhAm)KD`%I0Ol!%5uENSIwhpch*kJkB{A z8>v$_%N|-v{7ZyVM(*%w%~6V(B^G@S8$#+cQ>j@N#E^Dez2ljQJ4B^E+A-~DAWqFh z@8AvP&XSn2`)aLRHAEK7sa&#qz<jnNCN<&_lPoB~bybO!u#@ivEojiBAD_`S*h|J` z`?5RWP#zIF%IvbVpX=?}?VzXr%)V@_64DkCV%jM8r=KJ9DTZmR%O_EPn9PchUwtbk ztX?@%58Ub*fw?s2IA6`}h-oAcC*bdLLq@EQx{KAlPC#ZG%zPHR4Af|tsxeJ_-Ccwd z)_=yW9yGd(0!EDv-L3v-XqJsDX-0Up`F)IfCTy(DDhV~p3|7sf8><)PhI6S#Vf~WX zX|CPC<fh|0f+qbt5nd@?FJpYe^kpWqOEQ0rc>~I&XJp?_p2vGCU(8>+1j8O(x}?`% zsg*|3mUzicv;S0TFkGCkfZEzSFI|$A<qaO2<1v}oaD7><Qst6wI=(fQHZ_G)*+_CX zex_|e7%VSc8m7Gw&m|sEm3Xx6V|$s7!c=Ob)~frNuwrBW3PVVFOd}mS2x66(h>#BF zbxP!>Z&~9>dsV8}a84?<x;ZayQJ);2ZGxyHWWX!z5n-h<0Rri#!8935p>t;Lqg)W9 zWtDkN_`s`XO+q&&p-t^L#%<35sA9|ZvL58e@J9i?^*_|!6FfRRcgzJxa1kq*h3o(q z3Gn6w733*sV|%m(4JwVt@jw~eq!1#-+*x|v)7f;$>oMA3ithY`Mr!WNeFI(H*&KKU zkEZN4m~#0#&1>~LNbe9ZA?iZvd2?_CDnt{Iqy5Umr;84LRQx%(0N#&z#W)2}^tVb4 zU(|0H*NxzWBLg*rTDHavJ*M7U&baP3WfWNXrmB*up0XF>WegOW5OBv!(o+ADUsg9n zSle4+IeKLYMv-~7UvIAe7uklvL_<($jI$afF19=dIc0<c_QF8U)%a6LWC${=zoVun z=bp7bBQGEp!YVKr^N@zM7e5kh$>?2pQDDyoRT?I~)dd@|MSmApcr!29W-s{Bwil46 zO}I##n&{g}Gsq@1!|bvGYUbOSxQXr71kI&=Bu^8A@2?5AtU9v8TG=3vVO&VGmgJcY z6vWmM&EtlwD%+O7I;5wLGbuABR5bShGddnouT>=WR`cwrJ22CjKVFhJv1uoa*iJL` zk}jVWBkP(Xf&2GG`=7}x6^gCaa0=EDr~I%-a=LM#DNJ%_#bR7F7LPg~ktV<GP{;JJ z49SL^jHxg#y3D~vj`>yRLqiWb0}#|yP5V4pCh-ywI>%+tcc{n4U6-S&s;E@y6o*NL zHss}rOmF#%6TvjckpkmrPUsQ2PD;T$dHUqUg{j2&uv@oe3q*NgqsGe@RF54(Ekg3D zYEc!EBTO^NDGMnN)2Fbg;PNH!Jv6aV19)ydkv!1xns~;%=KPiE(;S~lB*05N>ka0@ z4c?3_<*Fg_K>o)z{={`oTDN<^&%j8}uL$A2Ko8M!p?w$x;XRS<g|SkuKiiw#n&~r{ zZ&OyRRxY!HTJl4Xqo=+HVY&KYzEadEI53^XLo|ISYE%gr5h>vXZ5WW^H5}iMTTPD% z3^V!dB-0gOCe$`(H4M8Bc@>A<^qPxr-*HnW3fldou;h#|WtUr>60Vt?doDp?{zS(w z3VR@th-E`{weojb*QR1Y#6ZU^gzfKMq`JL25l8%p=&Aa}9+9ZBQRp2}Md%OrvYZ|^ z$A25W>c$E&dCk4J7Cx}uZXVoTTQNN>ORnFH^35<^R^jaFnHlYxH+Am^l}Kk{DhcEA z10f$T5$FhbYm>GJwCP=K^Tg&LgIZHj)N#TQ#bckXvmiW8FaAWJDy$}jEWimbq60^p z;#9|vy1BwFCiiHj3$WZotu5Y&Ak3z{nG@%x3H5*pMU^zkUluIR^1-Gfs7}u9F|Hq~ z0*3;qa&7{mZ0x^5!6R<v5jcCO<f`uQymVTtT4(?-)q@T~E15tKS+dV_1cMj!-}!=% z-1dTxxRsCa0tj%A8xqx_`CnBX018l?VN+-X2C|<?C7WI+$)?+_{($_`Ib=drR#rUe z2Fv$ap6DQ1iTaasmrV}oaqn($t1~+HGCB9Mdl#)7PjFfXpGkk<2B5}mk`qLb`JEX~ zs&L6f^y>l$hcHru$E;=Zx>?zo;qT(geHjTraj%Crvjk0PTTWgH=da0BAQ>j*(II9! zQcx)utBo;<BXY{cr;l<oEg1C#XGgL!q`Z2ymKTu}Z~v+{!I)?gdl{EnRJ4Z|$2FP{ zlaCM0;}3b;iF!K(0b}PzycE9Xfm0EOJ0ySY7Ca{BfiRO6#59|<AfKvLgak={kIRgr zMF9*G(>${&G{aZKaU53Ij^iX&EpL?f9DvtbvCy8{26BB0M5w(fMOIEDIo=K>N@{y| zJy>cx&W~6X6Y3VpjdnA;>6x5eI+G*fe6e2RIFqSCrFJn6M{8jtTXP-#onD?@YmH)@ zc}i1ai13DTQuegijNtop$!fTOjpTywSMmc&gmVm&nr~xEhwFjTFlG!vhKpm?!<!*Y z8mg;-zpZ4H#JDH<ali*w!n)V6v~1FX7-I_7WuZj0VWQ@*^=M%v+PYj{ZWF4M{>%gL z0NXMHKA+nnejq#0-48F&%V!8QyOng0w_0c^w9AbH_*4g?ZI5%KNHzpVAuP(X3MWG- z8N$dALZ<YBTi7JYq--jh)n|qCCg+|sJmvK(pq*$zI8{i><gEIn@{|mLXQ0l<S0){Q zhCbO-_)Uvxe=Jj)aHSKjbW(w6N>d6zL+}{_&k)N;Nb^4lV@}RhZhP17cE0PYdIPaw zgpvQp?eE=Xx=G&`(@&!195H%eM+&8%{0kvN>*QD6%2!eMTv8+2`vjFyKW}9Sf<pit zg5Q9ng_)n%ImA0B;hJQb)+C&kyw*Mmr!y<3Gg2q<!kJ;IlAGTkiBCPms&v!ym>Q_1 zCpsk`T{GfFxKk7I<+8=cfB|lx$Uz6n@h?N%&8p&q%-8DSsJQ~o<5dpMz8Sk~OXnnE zLH0iMI9F~iBmImnl~-xSst%XO!m)gM*rvU5x}Av}qjvPK!@!gH_pWW=5#AM>-H9|} z7QWqDZ~5e0kO)K)g+PFu_RMs#X_qYQKzt~un`#qxIUgiM<L|YFBuEYe>0L>90&yqp z=aF>XCWo15h{naAPujpuv|X)>^oW!0oKGZ3wb43k<YN@v7VDtn@R2&(5&R$~Wp)H9 zb=6J}B?WgxB}nVUM~x&<rM2236{Pjj<3|$o(wbArp(L@p=}DpVz31bTNj@5aFimpU zDDtPFRCF#mMAeG3kjP#-XQip3oiy%(M9$X1t+k>#wC={ox{UazN5A6b6$&3oRr*?u zr2k&HPYzY-PBII2CmFnfSvnrON{8Ypo!*<UOYgY@S|qb$8~9?u-Wq$Mb#sjk;cvdj zuJ9GKAMV&1{+1xj--;*k_WjX%{~DXb-~0|c#aGh&uDM-Wx7XY=tykQA<M=x2`Frjj zUrivKEOhJiUb5N-oW7#=N?P&m`^Q(-c1bJ0_a<s}BZ0(LH`oCd%A~Cu?`u2xHnkA6 znH~kaZBO}1@42yj6$9vWBfZD&^40IUsam&_sp;5R{<fg^Zre-f&RfzXT?gV6hgIM6 zeOhoc4ksL+#v30Q!2$7*>B3|p494`#1rl=!ZB;p9itgrZrH6;9xsD9Fwrc~&n)$|) zV*JjlH{E@?9E{ys|9f-Yu!4iAd$yn(Z~xzmj(iYi@&4@5_?|D>>DfZfu4uBch0|oj z^PmNR?-9@Qj9c9=QFn4~mzY0EjBH`FK0B1*^0}2Ajz8mOc(U7JkCETsQ#pU6MR2k9 zk(Lx6YcW%7+5sG$*jbylbBn6;oyhp^kNfpBV0w|qOz#&%q#b@Uwtt-$U3;!rDkaB- ztzT6wzxJ!c0aaZ8{jGCF>B2pr5%Gs2#4jJ>Du0PnwA#I0BDReee3Uz8q4q+lW@dfo zz${faHD*4Hc|H-?bvZ93QJ%~ys(cgEZ%J(57<)gynpxR|-vF#)Y|Jy!Z5Q?ZU^O~J z1M53PuOKYQSXwBsg%S(iw$@<Nh22e;7j08sjic~vvB6TrCY9K-=^h`g`6_&LjRj5B z(fjWhBVkZXpDYx^Fj0#AjTmX3fuLRP09}D#x|-5$fm}W4N^1!W8%D*?3Xzf{@PhJb zV|0)2i%_ue_q=zf6qe+;iJ}w~3O)v+Su&)axmPxC4A~rw2eLoeg6yrC>EXxd=WU@I zy*B)1-8iM>tdes|KCI*wC9f(8l)S0rl9J0xOuNQjha@OjP;yeqq>?jA<eg&1V{gm< zVO@&E1%F@3k1P3tl3hxELJ2t3nVCHJBDoftu-tm+e}d!mqYEI4<iOY6+nvJ%G|-!i z|M&EE^>+8($7f@|zPoxi^zP{2&_C3_t9PXT;r@~SXL~nNw@dYXl!%*>*v76#M2{0e zO=K2dvVoGbQx_&CCoW9bVkT5$o*VX0e2Ikt_!P^_%%`zXL)6XaUySZ>?mxcFT88*d z#P9A=JYA0a$G6P%qC@`#4B*5+kMz4i!f%&R)uVFiCJZoYryjmukRkgRXa7-V6O$V| z0B8TpT`t4|G$EBaiu+>(+eU|^3!V&7ke{>*o+s!wdL`XaD+CLevPc0anfxDd1PB&D zF9;T}U79B-CqcZq8}86!#05}($np=mGQkL_X}1U*aEyQf@x>0_MctkLYsh~+NDTrA z`0BfS*~9+p5xxl8{HXuRQ;~?>zTzG(UQ!V3W70V>JR*g^vD3Xl^~c>On0De2(EI%s zlYmeJ!&dl+3kgDSKzWTJZ<hy?OB&zpuI^E&?6|`2WC}*yCm1II!g+i&xx3dc$CAr^ zF5G92kGDz)w5-lNuE5O7z$+fH%&<abtK@(ycU!=0ttX+FwVs4;-pUtInOP98aI`4Y z3|cX^eQ;|+GTZWmBQ7MUGl8yIAtE{-w`K`C{hVbEDYC-%0F=$&CNYiFg?7tDM_h&c zg)3Mr%AMhs(V0aS7J2x4X3k9?uqKjSk-vfcI?N|=g3R<GtA0{2g3A*DY>Ufs%IXZ9 zVeKRqdD<!C^>l^c8yqz;6&-T$s8^_`FY^wKUae-E^Q|{aPYk~~Mtb1j-llkgx85KS z3lUl7hT}|OY;^8mQh4A)dyO3)`&)-cjvPAr)Vs!G6Zy%4aBAZdojE_eFFIiAH&a0L z&}yP`(B}4mDLS-oD-^445_JV1HH({*kF^o`HWgXkD-z-_FE-{AnLnRM_id`hHi;e& zF(2d8V%SK~vp6(SzTT`RJTa4}m`8~$nZMjDS5k&Kq9@l|_Y%?C>{zYhM9@?a9ERW{ zXcxlj^)glt<GI(?XKJPj@$`s!DM+j|m7|Y^U~|?UbwUqlN=>%<X^=R~j3lV{7j>d! zY#&i4;tYmGvn>|TEnA^%eqV7nA2v1utD<SILA0{`!C4f#+{KkIX1cJ4=uGmL>`bzq z6VT(<+ASx48D2q(%l|F-ZJv0o`WJeqcPFa<zFE#Of|-xfk8G1h9(6ocNUBpu{Pu@m zt8UlG>VK*<y;WrdplAd}4E~Q~2wkD~V08x<C<h`19jFH!R`{gO#8Dl855^FE$ozpo z%@*j7_t4nQ1M)q&YEk>ZZ~j3wM2|@QkmS5xeVU`#xG6F0pX4NV22uv9;gBNj^Wa?v zpB~eey!G9O+6aV)%v98bIJ)}fwc$vd++s*P+G2z7xPl}L<7@E^hUIn;Jf}q4JutWZ zHo!9%9s@jkk9Wl}ZyQ2w;BaFhR4huVaSleqliTKSZ#<HD;UsiE@y4+T9xqN!PX!Yf z&IN&aB?x-WJCI{M9OW@(idYBhhNAICW;}aU5!LL(deFra!|Jeiws}dp(@N6034V-A z)443P7_4>St;BhLgOxJgsx6EM9tt`96E^XGr}-ClV@OjpH96koGJPDf7@#D_XGdmJ z&sKzT+xv-fR9sYo@(ho6Xe|sEw_~)s#`@h%JDvE=<MB2eXU%tD#FVQ`5#Cx+g0-+7 zxmwSC6nbxq5T=j#p#fqkYaRKq0R6&%DOT_SSb~JzVY86VtqqS`FFQ;Y+D}ofS)UIL zwXda*nAet3y%b~qA222ixtEi~SmFqR+eBJ|<Bz$92&?+z5kGCH4~g+jZg`_4wZTiD zHrt>_L{S@3S`>Dwf<C|t=Ag0iQx<p!B<8URE>GQV<$ntq#dz#<osU?Y9~d+_qx`0! zA>0^wmOf!wq#O1)omTs}XP8A(*vhKK*bN5_aQSEDU0Grzba)^`iTG)5rS13%pmQp` zlvFT(4|#^r!VkrT9dG}k%nA?s)<D{f$SOy58>#O`QZ9_`dt&uF+WD*npk=ObdI6s^ zC%C8B=&B!%DVrwYUuM!3;&DF%)k8Kjbo;-zO|OXxv`_`1CljJaY|bGuGv-(|ZDNZc zk6(~rS4DO$Oh*twyViC~A+sH1mA?yQ-wv??JZbDL7G7i_y1ll4ENxl4F)jlW639HV zjTINg+r-DP`)lZtxq%t#^@r%Z<D??8$b&%v@%Yh*;7jz$6N+i&zD(lJ%e|<}F%oOS z&z@!d#No#Rr+3ZJ_)?J|v33uyG7g=3FEb4xB03jm;VXu$5i$5@$+{rxf6UweuaNaA z^#jx^w7UgQhyKhX+3nefK*znAoruRm);fT~p%V~xH%{V8g}!%EVm^`7+>Y<Wyoi;6 zMBm1w)yN3w0Y|Uqz82>xY(pwJw`?9mLQVKN0`=5ub1ws^f#2wge9S;x;`w}xLtq<k zvz04u<(e28P)efm(OM;b!yJEzf6buH<wpKkRspV-pKod0^lBm5oMv91zA*7x;nj&V zrxD!G1v8#E5NBa7xWQI(ZA4k`@*c1!$eF(kC-xL_(x`bHI!tc3U|_ejz6<aDe-j?Y zN5nXg0}ez)6l!G~YpWHO53KpR3UpH<@+Gm|wwzj5BN;k`=hbd8QNb-VE%8LfBXIBE zx-}!dJ6`|$jQyoOoJ_vAjgVC3T<skRwc1tz&^W&G6Nc1r&;v*~#_R6^9yp@w9u?uG zQC)11V~wz-Cn%l@{FXhy-QKh%kNy8lR6&pRwLM1L_OLbVZ*N@dcJ;Fc<Gg}C9ktnj zFnPdd_#7LoR#ih(4V3+ky!q)kutER0Bp<W*ypfV+E8%Pc6b^;-O}W}A^NtY=KUa2I zAf6V6Ugg+A`&8IQ*vz{9&BFG^6eXPAUmxl>L)Wh|8^PC<2=lctJ#r1xRBNO^8Ws9q zP%-3h`<GJ;u@q`H&4LaJiD*DCjHwr12tKA{nZ$l_!87YEyzmRU`%jeoB8j1aLh#R2 zo6kBDfnVqCPipf^F2W$zK?Zuc77^Hz6Y7_#Y-?r{XkIxv!^<-n9-bU^vh%`i`lQHz zkPCPhL8&JJz&uJy`Dm%04{H!SOV&rBljhy~cj~rH;rdRG@d#qy+k?FFONp^T!Vj5C zJ1S@Nj(rzn$9iH>11An)eUU(K69J~g7R;6wax(rj-p1Uu<5GjMUD%%;xFpP>Gss{P z-14i2R{WXCX%kI4yc=u-C2ATIH!yifKjppPjlKD@CimBrr1lQ;8Ep%W_D{KMKpL&{ z0*Le^!+A>+FPug^Zs2XZS>a=^cd=hu2wQ}MWHhH}4D5uG&$AAOCOs%J@x+oaG^yvl z(^PtUXF7dt=Ff4SUf)RyzDXBQ^2af)Y;uef6A!Klv`IO`o{A?0@c@wk711%HEF5|> zN>1!Jpi*@_&F1Gyeo{3j=YC9jDe+yNH+xHSm*&~hk~wDEDn#1nDg@@eJY-S`AdIJj z=jG~OPi`4pi%LU0zb>jTq6?bvqTbi-bUywOPZ>jKk|iRY+{ZI3PdWZBuGaiXhDFJP zD8P`X2E9n;Ux>zy48$EtOpj@V{QM)bpox!z=~fiS$qTp*eFi{`O3UA0mX)l%@%P=z z@8fQ(C@*r9Y5oASYKm!jZJv-*D9UFJ5X*NI(E|0U0{{CcuOoSXgt=(P;?SdeeL?y- zk8rlM94&C*m>(8|Y4tx~P^{$Jbg4ed?`osvEc(oHv0hxtqrq(u@pA%YGQXWc^AVxl z8~iF^G<t(m26&=&bS8bRdfxg6CwxWP_oOZ@aducggoH+(UbXe)jvn}G?OjL*fWWj& z9Aw2rz8rFFO}%ZRcWys;9FK!H(8OH^FJF28TNn8d7Pe_W@Yw2zDgUe+Ce*fd)(~T& z<hE+22r_*>I&M?nOYLKsX9%5Y4eX0jrH=`8euMxw!fo}s55pzuzjj+*ax|nN6=m?7 zO6;KFv~oQpNvryGh{sg;Wfh7OS0I+SzotTOiJ>NB+G_h2e@o8^V;e(Z(g#0SQE8UK z;1QLI3o&FKt}~wcZ91|nJaveS>m|Z3M~(GU3OhM{rxSR{lx?!*CKQ9P9l0SX4O>1s z;tdR=X(nTgw#_mi8Duw)z!DZiOJ%&C`6u}w+Vmy|FWjrOdx6ssu9kBeKSIVY!+lP( z)J>5{U0-YL8jX$p0GW8~TeY~7l(yNqYp|C$KUjdG8KZC-<g~HVp6&hTTnC~I9^B-U zIXQKHYI>5N%6q-=^3>~o_U?swG5^yxB>MUGndx04fZ*c{=JuH(IH*xI&5ThZA1c{T zi`dn+Y0(BWABTI3#{YY|_2t{fE@%*95e71-P$dQk<0C;lVRU>DDl}BLTr5#9B2RJx z@FklTb2H%9<lIwj=Rr(DmpuE736`GluZR?i7xg~_wzA?@p3&b$itGPCTmht6Bvb?w zBHS%q2#Omn;xmDx);}KC`yRFT*_k}857gL*w>Vve+WAWCdZq>P9*>D(H}wY>3OMV3 z5Y}vx7P>~^b1n3>8I4Br-nrFK?pLU9#vD7_e0E~m)H@#Jy_?D&)sUssAD)uX*m90- zv$_0TRS{+lepyLf$-7Fvmt>vs>`&8$e*|z4^M!w=rRyeqj5KvS5ZE~3qyP_sek!%Z zwM$&YJLgoKL2eV=WNe|}8DaZ4w#Oo(rFc_Jp13IB%=kxJv^QOqm;<aPP(te2DO0$& zhbMoGSDlSx2|bhiq_57ujpUQVWp*0QaFh{H^Dr{nxtC{yPbtwj4TG6_u1$Qg#raY0 zuJc0t3|;soErhU`lRA|pNM+>?ndKN2;>k}0$8_>%m}uQ&Puj$K!I4RC$L^vQ9*zCD zayC^qea2CUyqpHVzvi*KUhP#B;v3d^mek*Wp;=OQHA|B13_R6qjmwbRlK^ZyLkYR> zkA?)F;Fj1FZrWipg#(vacT8T7OqtCZtQLR_2(RJ>vkmm~yv6QdYE3Mu6AOvQeb@_r z46xTEB*SHhO4Q-5{IJ1&$5+lc{&d{es|>-XS`$DXF=?YBj!4h<b%|5n&`vpzqW?RN zr;~o-(S#cv)7Lq?=Mp@~d%%FcJKwT*awfX|Eyv+_bwCHC?{~*&KIzA|+{(A?^q-I? zFWBmimwBh@J|zOlV_905yP!`IkCx$Fc=iqtmL3WdGpzE-c^TPz+PqZE!?I<u^d_eC z2cW#M^X23y7mvCQO`qv866V~W+t7}=!={Vg?T+7m+DygUY`TJ@q_qx(h$%tV_SE^S zjnjC9_tAS_Pm0F(Hv~^|4Do%Lhm2ZHL=jdB_(Sg(V5ID4x#|5bZND3h`zB>AVZj6g z6Id!sC8JPgs;XYIuWL8VSJU#fYbK0%cO%n#w$6gBGluv#4C!}-A&!u75HI-*NE4}V zku?bt+tE%cOh+H33feK4c@)t?W(-^LY1DY85PQ|1oVWa$`1i`R`pI!fL3aC*#M>a< z5R)KG+r<#mACQ3veu9mcpqu(G!#g^_yC=p_tidg6u#F8NiT{GNB9GF+jOCMa2RivL zZ-So`;sNOl2?NLg5})|>uS)3a4xu(Kd@0C)hI^frf>F4@bLW?IP{-$~O>@$KRe>%_ z4L7PN=Z@<ditVd_?I`vkJf_pJ3n|-gZT>D9RJ<Bl#;yLknxCBeh7A+s2u3nKl)=)7 zF1@nH@F}lS(A3q>XjqeTAG7{<5ow{U5!;tHB3a)uD^qealAZ`&^WzThDKdjxGXkau z$1OTt|AKs>xFipb)os{FuH$;vASxmW0@Slg43s~$e{p3C$W%B}>pT5^l?l{!h67AH zkbmyE{GNT$9z%iByqemCpPCfE^{fwRaGtC=PTR)hfQmnarMH^+j-I5>&jJPiO7;G= zO2y(^^TBT=mvsx~qgLxC=MR(fq<lTh$!1kVQ;U~NgzKO6|If5##ZZf=D@4hFwk^M8 zv4!ob047SeA>r=LtmRT;R-2B)w?d#Zq5+-1;ccoo&j=dI{0~&~-ddZ<otb)Z0;%@w z#QF1zACsrZpH*t}fwZ4wl5~-%T>S4gb<!1ks@)&b)GvlKBRqP-Qk&)H4|q!p^;SW> z|4}91*2~3w)erlxBkR0s;;;&hTI_}Sr&_RG6tQ62hgh^;6C0#yA0$7BJqSCGU{Ro| z^)UqausAbA7mMt2kRb@cw!S3KgBq~k_pvz_Y-G4lzD4yPGK|FjJr`%hF!4jrRPruF z#yQn*n6}su9C(8beG4zdl_B$KG?uAVTK&PK$)B<e{*GWLl+o}*h82Y;VbA`v46xW; zg$U>&T5udG;otDCCN2rq*K96ReL(@?hz7^-U=3jk5psUyfY3?nVXVe$KI|PinG7Et zZQ6%8I>4+=trq7Sm7Azm?N{Rz-Pf>09GcWZorPg3ELnt7gF75)nuHfAM)T#efm~T? z<%a!wnK>E?1ikx?P{NIt8|1LmJ8d42Kd(zkCSF?j6Xnh*vC|zQwSFu8969q(EH#&w zy*zP6H(@Z_ZJaNu?6m5ND8#C@>$>huuM5DxjGe((N!AzQZKyk--O=Op#qqnWLQ360 zw<4-`W7ix6Ar0{9=3XBmz#j5(l{7lGhllvzAR}O6BYR3uo(<qBN%f0%kF8+h$f6ex z05QN2s*mfI0(}fizF=Pf%Tlv&K*QkL=S8t{?)=L0jz4Kvcve1Qf6qh#V6h9?#uHT_ z)<_`&NT$kW1DdI>;H}8+wqeMeU{^^MW8S*{zPEj8RMU4lP>SbiSDvTjr$db{NQgn< zOXU37AMvZfuPND05`(HZSAS;ck0@-5$n|+u{KKSTv2vrxPi@=VAR#vm{OYjG>kKnr zpo516GvcyE%(h8Y4FTIpx&i)^UjxoQ*ixxz0EQW5+xBp>403@*14s;1mLJmE!wqWH zDKTJC2G+$e=|Y!IuklWnM;mFF*iRD94w$6HMRLSIyE{GFW~Scfy{5Ni-2F+a_>*FD zYDrM+h5xk5I?wMH>Cp+z?*=k*L6T=dt54=FVCMondhvIJ=GqIt)3t_eO#gcwIq+KY z?<^v!qlur2H5$vsUeJ^9+U~9!hqRViC((K(5wxd=4^w*EIX=%DgvJZXaz+^LhIDzi zdzi!2TsZmCRAAPf(?%zzC(ceK#euf5F=nswGvTMtO(!?3Z041-{2I6zBWol0iuz%& z@w3W_vk!hx$-h(b4HCoXc)wI?4IP=({tjMNB7PRB!F!FyUZufDRVdKa51{(UlLBWM zIa<Ybr6=3`PrZMRG_S$0lbFjroTd5b1;3%<Z>m_R3)Fy@UGUo~{I^P^0rz^rpHa?K zVMfyan=XykJ*1q8%SQFSpi2Q@8@zFacQwg){F~3?*NgS>g<3^HfX3fm9l!Zx{c`oj zwZq3&s)vr%j~<)<V6^&l>FxR<{w*$#Ul?C5FOS+;rAlSAaro?F;k=6MgYvpss@2Ei z(?jElQhRLqX7E$I^Rw`W(MQR2--k5}PfVrVgaXg;v*A6NzFapyE}R49=>L{nH>8SV zi4ZTj(yL6hdeU#7<Ed=#6a9U?`v<xPHg4@1I5^Nf(6hCtcXMxVZ%^;TzHR?xU#@rG z_6K|KA3jAV0^t{U9oR&EM~5GOmX|D7&VF*hqiXa775{@0;u(TlO8zGaf+0Dvy9QUb zVgl!4!%j8$5RF>K;9(^a!VTl|+td|ro)Y-jPeA)9W&#w09gL%Ah^Wfan~<<q)wJmX zZ83jZW2@?_$%1~*qEN7t9fZ0sDAaucL)W=Ui31~g;Lnv5l)R-xVn*<QlKo1yD-m=A zJCqz$GN|N$62ZRxzK<D=3|OaLyAVtif+-)V{sXG;x{~ix@@XaCuVhvU(rX;G@&}ds znvx$@a!iTAsyRp<=hB9d;sE`Kwst#Fdx<Ca($v(M!kzboH4*_RK88xjSO1_v+dTmF zHfP7ZU-|P|@#v38x)C+}@4f=rxj_VxEfPbr1G&L2|9?O`Ar6o!|72{)V&n8*x%kTe zjx5&Yn8i~KUuLOxPuCV~&yrB%|Ga~J@nZX)@H^xEr+pk~X?u(HjtH~7XCT+VY49)I KrzQJ#=l&lN^}$X6 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/resources.py b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/resources.py deleted file mode 100644 index 1884016..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/resources.py +++ /dev/null @@ -1,355 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2013-2017 Vinay Sajip. -# Licensed to the Python Software Foundation under a contributor agreement. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -from __future__ import unicode_literals - -import bisect -import io -import logging -import os -import pkgutil -import shutil -import sys -import types -import zipimport - -from . import DistlibException -from .util import cached_property, get_cache_base, path_to_cache_dir, Cache - -logger = logging.getLogger(__name__) - - -cache = None # created when needed - - -class ResourceCache(Cache): - def __init__(self, base=None): - if base is None: - # Use native string to avoid issues on 2.x: see Python #20140. - base = os.path.join(get_cache_base(), str('resource-cache')) - super(ResourceCache, self).__init__(base) - - def is_stale(self, resource, path): - """ - Is the cache stale for the given resource? - - :param resource: The :class:`Resource` being cached. - :param path: The path of the resource in the cache. - :return: True if the cache is stale. - """ - # Cache invalidation is a hard problem :-) - return True - - def get(self, resource): - """ - Get a resource into the cache, - - :param resource: A :class:`Resource` instance. - :return: The pathname of the resource in the cache. - """ - prefix, path = resource.finder.get_cache_info(resource) - if prefix is None: - result = path - else: - result = os.path.join(self.base, self.prefix_to_dir(prefix), path) - dirname = os.path.dirname(result) - if not os.path.isdir(dirname): - os.makedirs(dirname) - if not os.path.exists(result): - stale = True - else: - stale = self.is_stale(resource, path) - if stale: - # write the bytes of the resource to the cache location - with open(result, 'wb') as f: - f.write(resource.bytes) - return result - - -class ResourceBase(object): - def __init__(self, finder, name): - self.finder = finder - self.name = name - - -class Resource(ResourceBase): - """ - A class representing an in-package resource, such as a data file. This is - not normally instantiated by user code, but rather by a - :class:`ResourceFinder` which manages the resource. - """ - is_container = False # Backwards compatibility - - def as_stream(self): - """ - Get the resource as a stream. - - This is not a property to make it obvious that it returns a new stream - each time. - """ - return self.finder.get_stream(self) - - @cached_property - def file_path(self): - global cache - if cache is None: - cache = ResourceCache() - return cache.get(self) - - @cached_property - def bytes(self): - return self.finder.get_bytes(self) - - @cached_property - def size(self): - return self.finder.get_size(self) - - -class ResourceContainer(ResourceBase): - is_container = True # Backwards compatibility - - @cached_property - def resources(self): - return self.finder.get_resources(self) - - -class ResourceFinder(object): - """ - Resource finder for file system resources. - """ - - if sys.platform.startswith('java'): - skipped_extensions = ('.pyc', '.pyo', '.class') - else: - skipped_extensions = ('.pyc', '.pyo') - - def __init__(self, module): - self.module = module - self.loader = getattr(module, '__loader__', None) - self.base = os.path.dirname(getattr(module, '__file__', '')) - - def _adjust_path(self, path): - return os.path.realpath(path) - - def _make_path(self, resource_name): - # Issue #50: need to preserve type of path on Python 2.x - # like os.path._get_sep - if isinstance(resource_name, bytes): # should only happen on 2.x - sep = b'/' - else: - sep = '/' - parts = resource_name.split(sep) - parts.insert(0, self.base) - result = os.path.join(*parts) - return self._adjust_path(result) - - def _find(self, path): - return os.path.exists(path) - - def get_cache_info(self, resource): - return None, resource.path - - def find(self, resource_name): - path = self._make_path(resource_name) - if not self._find(path): - result = None - else: - if self._is_directory(path): - result = ResourceContainer(self, resource_name) - else: - result = Resource(self, resource_name) - result.path = path - return result - - def get_stream(self, resource): - return open(resource.path, 'rb') - - def get_bytes(self, resource): - with open(resource.path, 'rb') as f: - return f.read() - - def get_size(self, resource): - return os.path.getsize(resource.path) - - def get_resources(self, resource): - def allowed(f): - return (f != '__pycache__' and not - f.endswith(self.skipped_extensions)) - return set([f for f in os.listdir(resource.path) if allowed(f)]) - - def is_container(self, resource): - return self._is_directory(resource.path) - - _is_directory = staticmethod(os.path.isdir) - - def iterator(self, resource_name): - resource = self.find(resource_name) - if resource is not None: - todo = [resource] - while todo: - resource = todo.pop(0) - yield resource - if resource.is_container: - rname = resource.name - for name in resource.resources: - if not rname: - new_name = name - else: - new_name = '/'.join([rname, name]) - child = self.find(new_name) - if child.is_container: - todo.append(child) - else: - yield child - - -class ZipResourceFinder(ResourceFinder): - """ - Resource finder for resources in .zip files. - """ - def __init__(self, module): - super(ZipResourceFinder, self).__init__(module) - archive = self.loader.archive - self.prefix_len = 1 + len(archive) - # PyPy doesn't have a _files attr on zipimporter, and you can't set one - if hasattr(self.loader, '_files'): - self._files = self.loader._files - else: - self._files = zipimport._zip_directory_cache[archive] - self.index = sorted(self._files) - - def _adjust_path(self, path): - return path - - def _find(self, path): - path = path[self.prefix_len:] - if path in self._files: - result = True - else: - if path and path[-1] != os.sep: - path = path + os.sep - i = bisect.bisect(self.index, path) - try: - result = self.index[i].startswith(path) - except IndexError: - result = False - if not result: - logger.debug('_find failed: %r %r', path, self.loader.prefix) - else: - logger.debug('_find worked: %r %r', path, self.loader.prefix) - return result - - def get_cache_info(self, resource): - prefix = self.loader.archive - path = resource.path[1 + len(prefix):] - return prefix, path - - def get_bytes(self, resource): - return self.loader.get_data(resource.path) - - def get_stream(self, resource): - return io.BytesIO(self.get_bytes(resource)) - - def get_size(self, resource): - path = resource.path[self.prefix_len:] - return self._files[path][3] - - def get_resources(self, resource): - path = resource.path[self.prefix_len:] - if path and path[-1] != os.sep: - path += os.sep - plen = len(path) - result = set() - i = bisect.bisect(self.index, path) - while i < len(self.index): - if not self.index[i].startswith(path): - break - s = self.index[i][plen:] - result.add(s.split(os.sep, 1)[0]) # only immediate children - i += 1 - return result - - def _is_directory(self, path): - path = path[self.prefix_len:] - if path and path[-1] != os.sep: - path += os.sep - i = bisect.bisect(self.index, path) - try: - result = self.index[i].startswith(path) - except IndexError: - result = False - return result - -_finder_registry = { - type(None): ResourceFinder, - zipimport.zipimporter: ZipResourceFinder -} - -try: - # In Python 3.6, _frozen_importlib -> _frozen_importlib_external - try: - import _frozen_importlib_external as _fi - except ImportError: - import _frozen_importlib as _fi - _finder_registry[_fi.SourceFileLoader] = ResourceFinder - _finder_registry[_fi.FileFinder] = ResourceFinder - del _fi -except (ImportError, AttributeError): - pass - - -def register_finder(loader, finder_maker): - _finder_registry[type(loader)] = finder_maker - -_finder_cache = {} - - -def finder(package): - """ - Return a resource finder for a package. - :param package: The name of the package. - :return: A :class:`ResourceFinder` instance for the package. - """ - if package in _finder_cache: - result = _finder_cache[package] - else: - if package not in sys.modules: - __import__(package) - module = sys.modules[package] - path = getattr(module, '__path__', None) - if path is None: - raise DistlibException('You cannot get a finder for a module, ' - 'only for a package') - loader = getattr(module, '__loader__', None) - finder_maker = _finder_registry.get(type(loader)) - if finder_maker is None: - raise DistlibException('Unable to locate finder for %r' % package) - result = finder_maker(module) - _finder_cache[package] = result - return result - - -_dummy_module = types.ModuleType(str('__dummy__')) - - -def finder_for_path(path): - """ - Return a resource finder for a path, which should represent a container. - - :param path: The path. - :return: A :class:`ResourceFinder` instance for the path. - """ - result = None - # calls any path hooks, gets importer into cache - pkgutil.get_importer(path) - loader = sys.path_importer_cache.get(path) - finder = _finder_registry.get(type(loader)) - if finder: - module = _dummy_module - module.__file__ = os.path.join(path, '') - module.__loader__ = loader - result = finder(module) - return result diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/resources.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/resources.pyc deleted file mode 100644 index 5a41bb4a9e2b84f6778dbf3398e63a747b382f33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15896 zcmd5@-H#ksRzKA}(=$Du@r=ju$CzZ@apHKAwLJ+*oQ-Ae5<8oXSDRr|&c;czq21F} zGgIT9s!mn4?XeQj;w&E$(n?5+koEx{kdP1`VkJOGhzB0v4TKPgN2EOP2OwUM5d40> zTUFg2Cuj)|Ju_2x?!8s_);af{?|Z8L?+bI!eeduGJu7}1`2RCjv#eP&3-ISz-)z^j zwr3vOHS5=`UDG|(>(;K9^(kvlmGx<BPnY$EwHsx9#@aJweb(BuWxZ+bW?7%J_M8Qn zcFOvPY<J$;^LRJf)7D?G-NV*CY`crrUbNjMYcJXE5o;eYFPyTSWebnm13>#2A?+Tw zpkd(=+w?4$u}{n%n7!XVVZp40C)L}mdRHu%vv5VdhpOIF7R;Bu3svt=S#Y?VVX^9c z+=3+wAJ+^=s@^9os<Aix5<voNm%=A3oU@(NcB$R6y|-;|sl@zAYoD>3@e?)`K4rJ( zEd5OnKgF^?&6}}j?{Tu0g=cK%tX&y3p0O)G$I&M=Iy`5aHO=vNoP*<nWdhY+wFu?2 z793UcISZS%^JNRqTksg+<MLgw;F#`SB+xfjkAp0t|HjX%hg!abVi-rgBnUhGC=b(a zKU<G@YjpqhD9iiN#@Fxl!a*J-@#+*uE~4mld)r~q8KlV|O!K|`F#5K_yrcfkMmG!d zBj_4*^X*Qa6x~6T=F{lC#=-dlYJQj{!?YKwry^jGtz9JnKZ8mLM6vav&`*FCDxS~+ zoz_&DHvfho>v142f_aS-d;^t_Fxu?)tfdz$_iU$TJ9W#aNJoGMlX1Oj_OWL%dK#9` z*hio;JT}X*xXazUvC4_pheR|jpuW%}BCAbwVLseV;xOl9Nv1ZjS7j%OV!zJESY)|d zhHQwn^U1CGEQ(Giile;K(Tg-J3;Ua@a6MP?h^fd1sI3js=uS5e*Y0%Fwaug-glV>R z|K8f(i|Iyu_x1~yK8&Bgl)iMS_m%A4tHJ&BdHie**4|kgM1u=aoaNnq|3d!4TU(uP zvrAX!P8bJCx)!)?Un}v<E)Mp5Zr2mIG6HPgeC<iEM{IbJYP8;5g`A7Up5dn`=32$i z^{ka|hb=8xi?0t`n@Os^tq3n}m2dmnTs7wMpqqAgt2>ul?_h?@y?!^#F5fC?=T>VY zjN&afb8vD0U~YmN$XYAe)GN!EwW4?g*4WrI%!g@=ap^E@MQ)4(J<1&PqlX>85OqGi z$_4RBCfe2VMLwxy!h0xyqO7CUe+uwqBvxyRZ%BgNTJ7V%p#s|9G28J9CipH`1b=n= z2#NzzN&NIt-9DbO_|Hh#JCNPeWSyOcO0bb+C7yYp$BJjbRbW2PKAtW|HSMEm_GI5z z&s@>;$d7K`L&ccvcPyW`j~f;*>m3UOjxPXYcx%JbPYtpNFCbsn><1_8W56+EJBz|+ zN$h+R@W1^YX2)|kv|q#D1;Q2Od?U<T-HPf!B6%_*lJoxydA{};#3^2jd*O&)E?2|_ zY9>*}-QDmfB+Maq?C!?;Dy1ugmDy$#gZK9d;3(cq{2AQ!xvio-e~vZEZb{xj8g54S zD4Qvj`6&Jq5J~7LV=u?<c5jEMXL?t750WACsXF{+&P1Yz28cE2ZVEM`+QwcUW~+KN z8NsiBb#E0snh@ME?B_mJlLm@1A*6xUDvAlpJ4tG2w2Ocudz`S$ob=|sX6<Qj8NW-o znzd!GfosKEUmcU;T*OW%=W=&CyGbzYqv<w7Dvt~2KZ#<5p=y&6>ja$WNvt=#`9|{) zI1CULI_@e|PY-SVaATyHxuJz(HtFCRbue#NI)Q{LS;EaFmtr|ksi`8B>;|k$-}y)J zl*oz8H<F?1_s`<yXtgG@P~5xgxH8hbc}>p&c?J!ivQ!Fk1mpy_^l3ozCN4?$h9@>I zx3k(xZjZL|o2XP<38x^0J0S7-2@J1k3t{%l%z}J|+0SO3JI*F7a5SgNW|K59jp>Ge zi$c=$wU(4MWGOg5gPfqE?#2+Q7Y5zl?e11siP`h5Y}ngwbu)<GpqqDFn^8Z!2#pVg z8)cd;PV!cqq`NR(_Amv61tx?I6tp(>TEi?%TeN1+w>E}(D}`J|2X1sVcE8o|hQ#Kr z*4^z0Z{6+2fW=uT08}=q6WBcxHLr@EDgCJBoNm-g6!y+<lxWlBp%S6NQ%>hFgY6e~ zcQ1}~NP!>lqRuJp=@v8&C2uRrTgk?qC>avAZqByT9$cn4ybD`|6IQA#ghkrQqunue zGsa((Nwm`4An~g#l@Zxagtv0qMqSz^#N}NyoMAHa=;Binz`zWgL4VR<Za=_SlkJWj zfq62vBkRs#Ax+A7b5fWh&k11e>w#GS(tC&I0K{ZrW!LASavoiT&!xa|S;{r#UOQcU zP%!nWYc`1>`N?Wu5V={56(L9W!-GS{Q^X4pK{S;3t&-*ZN=eAj>U4sn2Md8@`3Ai1 zPzo1zc`u3cZWO~QBt!aKA^$lRTr~dziV>r#HW6<1p8+82xH8%ajp+uApk{M%W^qa` zf2nD%mB{q)lzxbhR1V$9P;PyQI8@yb^#MZ{N=4p0$@L482K6*aqm;YZ!J!YbWCd1= zM!^KK9!Est?Ca-o-;uzJs2zxne*u6b1e=7;ZI{<kZn)E^)o$1EjCT7EQE|JCO?C!` za}{0aB|T>Wf`4%7U`s43%s5S2V2rV$3IdD@{4u&Xs~&_F74&N#V!)3N&s(5?UweVU zKK2~8K*2tQ7!l}W4?=Vb^dZm~D#*C=nC%>sC4(U2lAbw18-}*%@Ff&dt0jIgNa$%P zYC&1u%J#B697QKGXD|$>FmR`Pr>hDgC%v+g45@i8$|91>O@^QlkePf9mC8(p3xqlr zD1bJTPU|RU1qU16b#WJdxLoT8&bU@g)&;`WhZH-VPCw}a;!bBctEMzeXNbDVIg<<K zJQN8guuV75Q)x-vbK}Q+NZRu9A)Qen=k8@rr#V?nMkJBxzsI+8g=w50^Qsl*Dr<$Q zHeov;qJbD7mKW<*x*#Oh5t>EdrrW1B9>bLUJ7G+vDmvX@XPD(O7JeBpIWgieCOr`w zVN6Q`7z0<348kGlNzxR;IOH|Ob8w4`p+F5|I|#QRz$%IZlVXSmH3gE}K@_EKzitfo z(D*HbI0e1QWnUXoY_CNq%mqbBg;7>UK%~Z;n?FFrSrmqQ2wsS!M(giF6|Zs{qT_;T z+~QJrb`+=}ni&Gqd<KC+1SY<O+N3u~oJZST+w*ILk!)i1MFb2Q-lBIDp@aViar!Gn zQnrEE?;sE*cc4S@_(N32sgYn-{Kp-HJR`|@JlH6iPq-*pC0s_RG0HIE?erf548MhI z94kuripPLa;SM^H0`4M%KqiZ+GN?CjP2J*G)eqKEfBGiF9e9$X6jzNG83P;dVX&lb z9RxP()naL#Uc)>6t1Q@5Jg)=$5plY(mnZ3-Pfaa5&4rx_u(-(oDr;Qk1HmhVi)8a7 z{Ld(!4g5hqS@f21HAj3>Eq5Wr9TCxjARUop))g8}Hymr6LXX4!V3E@~!1a5$#>t7e zk%J_%pGC!qY><${?*~UHvOx@x)DLjDauWpg_IoJyA<lXH3ULL~;7<o*!89_I-$F5I zuKF@y_<dYOFzvInwE}`;+8WF8`3jqC0PBU$*O+KL2=e1RAp0X?N;))0&?I|qc%4U- zucPuSU<2(ov^lmK`@aP$DD4zzWMKaK2Pccu7f1uN)3X!{KVP#C&$@*X6ZEKpd9ihr z^V8XaPys33u3PfBgpk><YGpCad`U!y@LZ<@bCqYB<tgMWI&mhL-HmXP$-s4XI~ojd z@EhLC!#Kl{aN%CHaBrWZH4#ftb}Zt9$=xvcG2!J}<FwLqksz`N{B4;UdbE!N4T#PC zVp5E99S@Ij3s+S_bRvlPKaJP_3Bh+5E!IEVhM?{#bu6~`Asu^-7#u(yOIP>LiP{*C zkn)IWk2L%@s8omnD<=*E1Oc0t{xwD87CP&8??>c`^siV#SW<kJ55MbCfa2ykNzy4A zviCyOr@>n{c^rx3z%1qABM%sl(L&}?CbaalZ8;0soooV_hGuq0i<tC}^+q-EM(@K9 zc;@&n|KI%ZoZ;_gEZfJOHm*m&$DFn7PRU+J+v##r=pY&RToavp_%E_Xt5ODY7wi`Y zV`pp9=%iN({5%N~8N@ov(**Kn5Gr;?Gv!WiJL(4$Rsn)aX(upP{t`fCEfm!MIAp`` zqBpJoOI`!^z%g0{-crpS){-th&#{*HFFo#&>%DpsWBfBLo?>wkg^u{>#FN$r{cetY zgk7E6;bZ~s1cjdeCZDF|>eC<bN0t{2Ltp!Ljx}mDpTb^@s_m1nhN<$Xhhx?4BpCB> zPVh<bqmSBXFI1b1fO!dk+{Kk~l^S)PY{FrwHK&{P<~%M}PT_x}SzoRx*w>B*Wq4#? z_=nO`;UD^-A)+seWiaW?W$(btblE$I{pmo7xn?>_VxrmqB?5$i4Y^}@3B~6IY)a1& zXGwAE;{9l#<E0{GBS}ie<0UKX7g2#0W}pQD7+GG<y7wrCl#>7%1XO6TOEjFo4Or?> zD((qjhjHoqMUxIQ9+<Uw$#C4UgB*vNt+=in*$tR=mLi2ch-J~XBQP!@OK~IkSA86+ zixe4n^>4CJ^A$o%6R4YlweN%?>^@H0xGu#(Kbw4HyPGk_BU$36)aeUWB-$M$X`Yj= zJ7|u)375U45gDEc0|^)g!|sjQmJ9>=@1YnG^JM6lOY%>+oZIakhd?<BT3)U#job-R zr#70R1Up-*Nwf}_Z!NL&uK;UYITGs1WB6w@fC5R#>@?EYiUtfm<inih5gBMThGK)! zxXu!EyW$dSU=q46*E~@q!6D=Wy2gaiccpu}cdG2E+X}-$rE*oaB4ns?9SwPkASk{N z*@~d?>@N&txPw3~To?!CyzMM7s_Dfm<vn=C`|e?A5nEEu;*jouLJY0VE*K%W+&Y`$ zZ>;}rk|I^5=wDTAq>VxTcUjPFbmI4GsEL+0B4jq?{w?154m-&$*Gbi1Ptzpz*VxB+ zVn5m1LXe6J9)ugiEuZ}6)2^0L=^SgCRr0A73X3Mq1Xlshr?_0|ink!IdIf1K$Gp0C z3hg=Q)yHcqBZq`EC6>5=iX$etT(q?0hfvm)v5OO@T^bmyEQN7swiT(PoW-pVMS+Vn zypP)0O3Ak7>N!&s6(=$#BP}TI{sUJLIiB}UjHCqd(vpz)swHvj0a;xN4GL=EEJK24 zPt0F9h=w+el>fvvE=!1HrS}-$hu&lK3Z?cQi0;ExDXvi>b#j%NUe|wC=Fb81ylIyG z*FI#4Xtk@S(cosfz4ahFfv`gxx|u?<@Qou5bE-~kUWt`4^(U&9Z-r+kNzk-G838E# z#6sy&^;aDJFK9f1IE)oUC}q^FV25GkP&uf}HD94n2YJ9Ba?TJ=q>#3$BLT=s>Iy6# z6oV`uxKsCHdQN;^{h*@T2;u)@`Pekn2&^K_mHp7Zjk${na0jC0G&4GpQ;O_R%sxjw z2B4f>1(R_F^Ldyb9k1YJA8y)BrE?O?b?FQxv&+?5WpKj@BkkQRn^XioWt0C+7F`y% zSV$Rg%ez6~U%~%XuAUR~)i%r98o;WO(Dz~C(pto_Pg?RbPB6v&KZS}x;#2C=r#j}H zgfTSb9r0S;;gQ_0><H{+sf8;$BE7^e*$dJFBnfr7;M6OHy`WPgZXWj9*$Xu*>;+NF z3e5>;FVx-F4ImiW3%?+HVMg(B+6#<xJ8hy56|_(LcI@GO@;3mrRP~sK5tDL94nmMy zUfxk|$TA=@sNRRw@T!dYGlcdj7W7QV9L}q3Qb{=vlR|CG&Af)@h~QM4j2fjg@(;K& zf(qx+YaW85xGd+f-kfSKR?(_T3h_x01=LO9W_flcD8C(WnN0dfMOGh9vD0u1!Mb$M z#X0r{MWk2G57*Eg&v$tAmX6kBBFmvqWE{Kz+yVAHNr1F%E~AT<WwjQ6j|TV$YeAbG zX0e(pWUn9VhU2~&OJ9~5rW`lr$Lj`$u0T3F(F|^d{|x)uo#&#?T>XT$EQP0MzvRAj z5obb>77tI+g@izc^$t0T$MDCP7$mHl;ZHS#r1|k`7Thkhf&2~!_Z4jG4JEY<e;bGu zPB}lQXpN=SyJb;2MHgxC$_8~Q6vbyBMW6e4gD1Xaj{L(9m)Z1>Cf~b|#H}J#v^V<T z<e>?Q<OpTnb%tL7!0#tRd`%KFB@@;hV15WxmoRa@mBh$G<tHo^^!u|ecpUwmxVwQ| z5#)3BlOA$a$LBhmt}Arm4)EMdoU`rUz)%@j?roWz6MP{gA06rB40b4B=!2}x@3VN4 z#V!h$jZURiAnJ6~%e*hyC<g}mc1(6mgin;+eTj_0rLxAnw}4~61^g~UWi7&MKSu8z z*PJ&b<Vc+x?(Xh&Iz6II)m6tO8~r{ipl`5@(@o$BP^sq}Tj$P_qQNDwCSaC0L#0$o z&^+lKezAkFu#3;YWyKU=CWLXo5Qxfv&{@GZCvb$^CoJM5Q9I!n{sD@gjN0?<^F``$ zww(<70kV3F3~7*4l?Pbl30M3u{v}hvDqo2D^X(#63Gmvw^OZ?1qPW5BtzjPZ6}_Z0 z<7f^^iK0omLSmJ&yC7H*pU99D=qTFlm80OX*eCsLxk?=cpsH^r%4{W<^dUkeSvYr+ z@AXN+2SKzKtP18=k_UNEiqB>mHPY@eIM)rBTMT2bDvm&$f$k7OkY9tKRal%`sA<_5 zWk7bkTPMg-7kkLIxfgEfN$xrHUgm$m8ZHy}OCjnpsuz7{=u@-!8o+hLHhxP%3>N|K z@h11%f0hL`5tstGeH%NBh&;{CXIQ+z;w2W;?~*MDR+?4OLQn<wJg2SM*-VrBVO-D) zJ{#2`A<iNC;6Vj%H1@hgm_jTHAwM!qO8<sZ@ZUhB=Ud8Qll)`T$#f+izJ@qvgk1m7 z#cP<E=nq(sRy5!(eSPx|*36d&aF=%}C`LpyIh#o=aK&-QSGgM*{g9;^bG{$?Md0#G vZL!{{A3uM*as0{Sv&Y-V->Oqg*6X!8tosFB3*HPw<rD(-je2wCSp9zhhtBx; diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/scripts.py b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/scripts.py deleted file mode 100644 index 8e22cb9..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/scripts.py +++ /dev/null @@ -1,417 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2013-2015 Vinay Sajip. -# Licensed to the Python Software Foundation under a contributor agreement. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -from io import BytesIO -import logging -import os -import re -import struct -import sys - -from .compat import sysconfig, detect_encoding, ZipFile -from .resources import finder -from .util import (FileOperator, get_export_entry, convert_path, - get_executable, in_venv) - -logger = logging.getLogger(__name__) - -_DEFAULT_MANIFEST = ''' -<?xml version="1.0" encoding="UTF-8" standalone="yes"?> -<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> - <assemblyIdentity version="1.0.0.0" - processorArchitecture="X86" - name="%s" - type="win32"/> - - <!-- Identify the application security requirements. --> - <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> - <security> - <requestedPrivileges> - <requestedExecutionLevel level="asInvoker" uiAccess="false"/> - </requestedPrivileges> - </security> - </trustInfo> -</assembly>'''.strip() - -# check if Python is called on the first line with this expression -FIRST_LINE_RE = re.compile(b'^#!.*pythonw?[0-9.]*([ \t].*)?$') -SCRIPT_TEMPLATE = r'''# -*- coding: utf-8 -*- -if __name__ == '__main__': - import sys, re - - def _resolve(module, func): - __import__(module) - mod = sys.modules[module] - parts = func.split('.') - result = getattr(mod, parts.pop(0)) - for p in parts: - result = getattr(result, p) - return result - - try: - sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - - func = _resolve('%(module)s', '%(func)s') - rc = func() # None interpreted as 0 - except Exception as e: # only supporting Python >= 2.6 - sys.stderr.write('%%s\n' %% e) - rc = 1 - sys.exit(rc) -''' - - -def _enquote_executable(executable): - if ' ' in executable: - # make sure we quote only the executable in case of env - # for example /usr/bin/env "/dir with spaces/bin/jython" - # instead of "/usr/bin/env /dir with spaces/bin/jython" - # otherwise whole - if executable.startswith('/usr/bin/env '): - env, _executable = executable.split(' ', 1) - if ' ' in _executable and not _executable.startswith('"'): - executable = '%s "%s"' % (env, _executable) - else: - if not executable.startswith('"'): - executable = '"%s"' % executable - return executable - - -class ScriptMaker(object): - """ - A class to copy or create scripts from source scripts or callable - specifications. - """ - script_template = SCRIPT_TEMPLATE - - executable = None # for shebangs - - def __init__(self, source_dir, target_dir, add_launchers=True, - dry_run=False, fileop=None): - self.source_dir = source_dir - self.target_dir = target_dir - self.add_launchers = add_launchers - self.force = False - self.clobber = False - # It only makes sense to set mode bits on POSIX. - self.set_mode = (os.name == 'posix') or (os.name == 'java' and - os._name == 'posix') - self.variants = set(('', 'X.Y')) - self._fileop = fileop or FileOperator(dry_run) - - self._is_nt = os.name == 'nt' or ( - os.name == 'java' and os._name == 'nt') - - def _get_alternate_executable(self, executable, options): - if options.get('gui', False) and self._is_nt: # pragma: no cover - dn, fn = os.path.split(executable) - fn = fn.replace('python', 'pythonw') - executable = os.path.join(dn, fn) - return executable - - if sys.platform.startswith('java'): # pragma: no cover - def _is_shell(self, executable): - """ - Determine if the specified executable is a script - (contains a #! line) - """ - try: - with open(executable) as fp: - return fp.read(2) == '#!' - except (OSError, IOError): - logger.warning('Failed to open %s', executable) - return False - - def _fix_jython_executable(self, executable): - if self._is_shell(executable): - # Workaround for Jython is not needed on Linux systems. - import java - - if java.lang.System.getProperty('os.name') == 'Linux': - return executable - elif executable.lower().endswith('jython.exe'): - # Use wrapper exe for Jython on Windows - return executable - return '/usr/bin/env %s' % executable - - def _build_shebang(self, executable, post_interp): - """ - Build a shebang line. In the simple case (on Windows, or a shebang line - which is not too long or contains spaces) use a simple formulation for - the shebang. Otherwise, use /bin/sh as the executable, with a contrived - shebang which allows the script to run either under Python or sh, using - suitable quoting. Thanks to Harald Nordgren for his input. - - See also: http://www.in-ulm.de/~mascheck/various/shebang/#length - https://hg.mozilla.org/mozilla-central/file/tip/mach - """ - if os.name != 'posix': - simple_shebang = True - else: - # Add 3 for '#!' prefix and newline suffix. - shebang_length = len(executable) + len(post_interp) + 3 - if sys.platform == 'darwin': - max_shebang_length = 512 - else: - max_shebang_length = 127 - simple_shebang = ((b' ' not in executable) and - (shebang_length <= max_shebang_length)) - - if simple_shebang: - result = b'#!' + executable + post_interp + b'\n' - else: - result = b'#!/bin/sh\n' - result += b"'''exec' " + executable + post_interp + b' "$0" "$@"\n' - result += b"' '''" - return result - - def _get_shebang(self, encoding, post_interp=b'', options=None): - enquote = True - if self.executable: - executable = self.executable - enquote = False # assume this will be taken care of - elif not sysconfig.is_python_build(): - executable = get_executable() - elif in_venv(): # pragma: no cover - executable = os.path.join(sysconfig.get_path('scripts'), - 'python%s' % sysconfig.get_config_var('EXE')) - else: # pragma: no cover - executable = os.path.join( - sysconfig.get_config_var('BINDIR'), - 'python%s%s' % (sysconfig.get_config_var('VERSION'), - sysconfig.get_config_var('EXE'))) - if options: - executable = self._get_alternate_executable(executable, options) - - if sys.platform.startswith('java'): # pragma: no cover - executable = self._fix_jython_executable(executable) - # Normalise case for Windows - executable = os.path.normcase(executable) - # If the user didn't specify an executable, it may be necessary to - # cater for executable paths with spaces (not uncommon on Windows) - if enquote: - executable = _enquote_executable(executable) - # Issue #51: don't use fsencode, since we later try to - # check that the shebang is decodable using utf-8. - executable = executable.encode('utf-8') - # in case of IronPython, play safe and enable frames support - if (sys.platform == 'cli' and '-X:Frames' not in post_interp - and '-X:FullFrames' not in post_interp): # pragma: no cover - post_interp += b' -X:Frames' - shebang = self._build_shebang(executable, post_interp) - # Python parser starts to read a script using UTF-8 until - # it gets a #coding:xxx cookie. The shebang has to be the - # first line of a file, the #coding:xxx cookie cannot be - # written before. So the shebang has to be decodable from - # UTF-8. - try: - shebang.decode('utf-8') - except UnicodeDecodeError: # pragma: no cover - raise ValueError( - 'The shebang (%r) is not decodable from utf-8' % shebang) - # If the script is encoded to a custom encoding (use a - # #coding:xxx cookie), the shebang has to be decodable from - # the script encoding too. - if encoding != 'utf-8': - try: - shebang.decode(encoding) - except UnicodeDecodeError: # pragma: no cover - raise ValueError( - 'The shebang (%r) is not decodable ' - 'from the script encoding (%r)' % (shebang, encoding)) - return shebang - - def _get_script_text(self, entry): - return self.script_template % dict(module=entry.prefix, - func=entry.suffix) - - manifest = _DEFAULT_MANIFEST - - def get_manifest(self, exename): - base = os.path.basename(exename) - return self.manifest % base - - def _write_script(self, names, shebang, script_bytes, filenames, ext): - use_launcher = self.add_launchers and self._is_nt - linesep = os.linesep.encode('utf-8') - if not shebang.endswith(linesep): - shebang += linesep - if not use_launcher: - script_bytes = shebang + script_bytes - else: # pragma: no cover - if ext == 'py': - launcher = self._get_launcher('t') - else: - launcher = self._get_launcher('w') - stream = BytesIO() - with ZipFile(stream, 'w') as zf: - zf.writestr('__main__.py', script_bytes) - zip_data = stream.getvalue() - script_bytes = launcher + shebang + zip_data - for name in names: - outname = os.path.join(self.target_dir, name) - if use_launcher: # pragma: no cover - n, e = os.path.splitext(outname) - if e.startswith('.py'): - outname = n - outname = '%s.exe' % outname - try: - self._fileop.write_binary_file(outname, script_bytes) - except Exception: - # Failed writing an executable - it might be in use. - logger.warning('Failed to write executable - trying to ' - 'use .deleteme logic') - dfname = '%s.deleteme' % outname - if os.path.exists(dfname): - os.remove(dfname) # Not allowed to fail here - os.rename(outname, dfname) # nor here - self._fileop.write_binary_file(outname, script_bytes) - logger.debug('Able to replace executable using ' - '.deleteme logic') - try: - os.remove(dfname) - except Exception: - pass # still in use - ignore error - else: - if self._is_nt and not outname.endswith('.' + ext): # pragma: no cover - outname = '%s.%s' % (outname, ext) - if os.path.exists(outname) and not self.clobber: - logger.warning('Skipping existing file %s', outname) - continue - self._fileop.write_binary_file(outname, script_bytes) - if self.set_mode: - self._fileop.set_executable_mode([outname]) - filenames.append(outname) - - def _make_script(self, entry, filenames, options=None): - post_interp = b'' - if options: - args = options.get('interpreter_args', []) - if args: - args = ' %s' % ' '.join(args) - post_interp = args.encode('utf-8') - shebang = self._get_shebang('utf-8', post_interp, options=options) - script = self._get_script_text(entry).encode('utf-8') - name = entry.name - scriptnames = set() - if '' in self.variants: - scriptnames.add(name) - if 'X' in self.variants: - scriptnames.add('%s%s' % (name, sys.version[0])) - if 'X.Y' in self.variants: - scriptnames.add('%s-%s' % (name, sys.version[:3])) - if options and options.get('gui', False): - ext = 'pyw' - else: - ext = 'py' - self._write_script(scriptnames, shebang, script, filenames, ext) - - def _copy_script(self, script, filenames): - adjust = False - script = os.path.join(self.source_dir, convert_path(script)) - outname = os.path.join(self.target_dir, os.path.basename(script)) - if not self.force and not self._fileop.newer(script, outname): - logger.debug('not copying %s (up-to-date)', script) - return - - # Always open the file, but ignore failures in dry-run mode -- - # that way, we'll get accurate feedback if we can read the - # script. - try: - f = open(script, 'rb') - except IOError: # pragma: no cover - if not self.dry_run: - raise - f = None - else: - first_line = f.readline() - if not first_line: # pragma: no cover - logger.warning('%s: %s is an empty file (skipping)', - self.get_command_name(), script) - return - - match = FIRST_LINE_RE.match(first_line.replace(b'\r\n', b'\n')) - if match: - adjust = True - post_interp = match.group(1) or b'' - - if not adjust: - if f: - f.close() - self._fileop.copy_file(script, outname) - if self.set_mode: - self._fileop.set_executable_mode([outname]) - filenames.append(outname) - else: - logger.info('copying and adjusting %s -> %s', script, - self.target_dir) - if not self._fileop.dry_run: - encoding, lines = detect_encoding(f.readline) - f.seek(0) - shebang = self._get_shebang(encoding, post_interp) - if b'pythonw' in first_line: # pragma: no cover - ext = 'pyw' - else: - ext = 'py' - n = os.path.basename(outname) - self._write_script([n], shebang, f.read(), filenames, ext) - if f: - f.close() - - @property - def dry_run(self): - return self._fileop.dry_run - - @dry_run.setter - def dry_run(self, value): - self._fileop.dry_run = value - - if os.name == 'nt' or (os.name == 'java' and os._name == 'nt'): # pragma: no cover - # Executable launcher support. - # Launchers are from https://bitbucket.org/vinay.sajip/simple_launcher/ - - def _get_launcher(self, kind): - if struct.calcsize('P') == 8: # 64-bit - bits = '64' - else: - bits = '32' - name = '%s%s.exe' % (kind, bits) - # Issue 31: don't hardcode an absolute package name, but - # determine it relative to the current package - distlib_package = __name__.rsplit('.', 1)[0] - result = finder(distlib_package).find(name).bytes - return result - - # Public API follows - - def make(self, specification, options=None): - """ - Make a script. - - :param specification: The specification, which is either a valid export - entry specification (to make a script from a - callable) or a filename (to make a script by - copying from a source location). - :param options: A dictionary of options controlling script generation. - :return: A list of all absolute pathnames written to. - """ - filenames = [] - entry = get_export_entry(specification) - if entry is None: - self._copy_script(specification, filenames) - else: - self._make_script(entry, filenames, options=options) - return filenames - - def make_multiple(self, specifications, options=None): - """ - Take a list of specifications and make scripts from them, - :param specifications: A list of specifications. - :return: A list of all absolute pathnames written to, - """ - filenames = [] - for specification in specifications: - filenames.extend(self.make(specification, options)) - return filenames diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/scripts.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/scripts.pyc deleted file mode 100644 index b81fef9fd95b9a6932e6b4a25210301257b1b9a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14496 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 MWJf0Q*@4mj0Y;GjhX4Qo diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/t32.exe b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/t32.exe deleted file mode 100644 index a09d926872d84ae22a617dfe9ebb560d420b37de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 92672 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 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/t64.exe b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/t64.exe deleted file mode 100644 index 9da9b40de922fb203df6b9a1d0ad4139af536850..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 102400 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�vlnW`{LoXpTySn$@;x8yoz96jn?+Kk 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�?dYNUd4WaURX_A__M4W}D0!0n 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 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/util.py b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/util.py deleted file mode 100644 index 9d4bfd3..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/util.py +++ /dev/null @@ -1,1756 +0,0 @@ -# -# Copyright (C) 2012-2017 The Python Software Foundation. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -import codecs -from collections import deque -import contextlib -import csv -from glob import iglob as std_iglob -import io -import json -import logging -import os -import py_compile -import re -import socket -try: - import ssl -except ImportError: # pragma: no cover - ssl = None -import subprocess -import sys -import tarfile -import tempfile -import textwrap - -try: - import threading -except ImportError: # pragma: no cover - import dummy_threading as threading -import time - -from . import DistlibException -from .compat import (string_types, text_type, shutil, raw_input, StringIO, - cache_from_source, urlopen, urljoin, httplib, xmlrpclib, - splittype, HTTPHandler, BaseConfigurator, valid_ident, - Container, configparser, URLError, ZipFile, fsdecode, - unquote, urlparse) - -logger = logging.getLogger(__name__) - -# -# Requirement parsing code as per PEP 508 -# - -IDENTIFIER = re.compile(r'^([\w\.-]+)\s*') -VERSION_IDENTIFIER = re.compile(r'^([\w\.*+-]+)\s*') -COMPARE_OP = re.compile(r'^(<=?|>=?|={2,3}|[~!]=)\s*') -MARKER_OP = re.compile(r'^((<=?)|(>=?)|={2,3}|[~!]=|in|not\s+in)\s*') -OR = re.compile(r'^or\b\s*') -AND = re.compile(r'^and\b\s*') -NON_SPACE = re.compile(r'(\S+)\s*') -STRING_CHUNK = re.compile(r'([\s\w\.{}()*+#:;,/?!~`@$%^&=|<>\[\]-]+)') - - -def parse_marker(marker_string): - """ - Parse a marker string and return a dictionary containing a marker expression. - - The dictionary will contain keys "op", "lhs" and "rhs" for non-terminals in - the expression grammar, or strings. A string contained in quotes is to be - interpreted as a literal string, and a string not contained in quotes is a - variable (such as os_name). - """ - def marker_var(remaining): - # either identifier, or literal string - m = IDENTIFIER.match(remaining) - if m: - result = m.groups()[0] - remaining = remaining[m.end():] - elif not remaining: - raise SyntaxError('unexpected end of input') - else: - q = remaining[0] - if q not in '\'"': - raise SyntaxError('invalid expression: %s' % remaining) - oq = '\'"'.replace(q, '') - remaining = remaining[1:] - parts = [q] - while remaining: - # either a string chunk, or oq, or q to terminate - if remaining[0] == q: - break - elif remaining[0] == oq: - parts.append(oq) - remaining = remaining[1:] - else: - m = STRING_CHUNK.match(remaining) - if not m: - raise SyntaxError('error in string literal: %s' % remaining) - parts.append(m.groups()[0]) - remaining = remaining[m.end():] - else: - s = ''.join(parts) - raise SyntaxError('unterminated string: %s' % s) - parts.append(q) - result = ''.join(parts) - remaining = remaining[1:].lstrip() # skip past closing quote - return result, remaining - - def marker_expr(remaining): - if remaining and remaining[0] == '(': - result, remaining = marker(remaining[1:].lstrip()) - if remaining[0] != ')': - raise SyntaxError('unterminated parenthesis: %s' % remaining) - remaining = remaining[1:].lstrip() - else: - lhs, remaining = marker_var(remaining) - while remaining: - m = MARKER_OP.match(remaining) - if not m: - break - op = m.groups()[0] - remaining = remaining[m.end():] - rhs, remaining = marker_var(remaining) - lhs = {'op': op, 'lhs': lhs, 'rhs': rhs} - result = lhs - return result, remaining - - def marker_and(remaining): - lhs, remaining = marker_expr(remaining) - while remaining: - m = AND.match(remaining) - if not m: - break - remaining = remaining[m.end():] - rhs, remaining = marker_expr(remaining) - lhs = {'op': 'and', 'lhs': lhs, 'rhs': rhs} - return lhs, remaining - - def marker(remaining): - lhs, remaining = marker_and(remaining) - while remaining: - m = OR.match(remaining) - if not m: - break - remaining = remaining[m.end():] - rhs, remaining = marker_and(remaining) - lhs = {'op': 'or', 'lhs': lhs, 'rhs': rhs} - return lhs, remaining - - return marker(marker_string) - - -def parse_requirement(req): - """ - Parse a requirement passed in as a string. Return a Container - whose attributes contain the various parts of the requirement. - """ - remaining = req.strip() - if not remaining or remaining.startswith('#'): - return None - m = IDENTIFIER.match(remaining) - if not m: - raise SyntaxError('name expected: %s' % remaining) - distname = m.groups()[0] - remaining = remaining[m.end():] - extras = mark_expr = versions = uri = None - if remaining and remaining[0] == '[': - i = remaining.find(']', 1) - if i < 0: - raise SyntaxError('unterminated extra: %s' % remaining) - s = remaining[1:i] - remaining = remaining[i + 1:].lstrip() - extras = [] - while s: - m = IDENTIFIER.match(s) - if not m: - raise SyntaxError('malformed extra: %s' % s) - extras.append(m.groups()[0]) - s = s[m.end():] - if not s: - break - if s[0] != ',': - raise SyntaxError('comma expected in extras: %s' % s) - s = s[1:].lstrip() - if not extras: - extras = None - if remaining: - if remaining[0] == '@': - # it's a URI - remaining = remaining[1:].lstrip() - m = NON_SPACE.match(remaining) - if not m: - raise SyntaxError('invalid URI: %s' % remaining) - uri = m.groups()[0] - t = urlparse(uri) - # there are issues with Python and URL parsing, so this test - # is a bit crude. See bpo-20271, bpo-23505. Python doesn't - # always parse invalid URLs correctly - it should raise - # exceptions for malformed URLs - if not (t.scheme and t.netloc): - raise SyntaxError('Invalid URL: %s' % uri) - remaining = remaining[m.end():].lstrip() - else: - - def get_versions(ver_remaining): - """ - Return a list of operator, version tuples if any are - specified, else None. - """ - m = COMPARE_OP.match(ver_remaining) - versions = None - if m: - versions = [] - while True: - op = m.groups()[0] - ver_remaining = ver_remaining[m.end():] - m = VERSION_IDENTIFIER.match(ver_remaining) - if not m: - raise SyntaxError('invalid version: %s' % ver_remaining) - v = m.groups()[0] - versions.append((op, v)) - ver_remaining = ver_remaining[m.end():] - if not ver_remaining or ver_remaining[0] != ',': - break - ver_remaining = ver_remaining[1:].lstrip() - m = COMPARE_OP.match(ver_remaining) - if not m: - raise SyntaxError('invalid constraint: %s' % ver_remaining) - if not versions: - versions = None - return versions, ver_remaining - - if remaining[0] != '(': - versions, remaining = get_versions(remaining) - else: - i = remaining.find(')', 1) - if i < 0: - raise SyntaxError('unterminated parenthesis: %s' % remaining) - s = remaining[1:i] - remaining = remaining[i + 1:].lstrip() - # As a special diversion from PEP 508, allow a version number - # a.b.c in parentheses as a synonym for ~= a.b.c (because this - # is allowed in earlier PEPs) - if COMPARE_OP.match(s): - versions, _ = get_versions(s) - else: - m = VERSION_IDENTIFIER.match(s) - if not m: - raise SyntaxError('invalid constraint: %s' % s) - v = m.groups()[0] - s = s[m.end():].lstrip() - if s: - raise SyntaxError('invalid constraint: %s' % s) - versions = [('~=', v)] - - if remaining: - if remaining[0] != ';': - raise SyntaxError('invalid requirement: %s' % remaining) - remaining = remaining[1:].lstrip() - - mark_expr, remaining = parse_marker(remaining) - - if remaining and remaining[0] != '#': - raise SyntaxError('unexpected trailing data: %s' % remaining) - - if not versions: - rs = distname - else: - rs = '%s %s' % (distname, ', '.join(['%s %s' % con for con in versions])) - return Container(name=distname, extras=extras, constraints=versions, - marker=mark_expr, url=uri, requirement=rs) - - -def get_resources_dests(resources_root, rules): - """Find destinations for resources files""" - - def get_rel_path(root, path): - # normalizes and returns a lstripped-/-separated path - root = root.replace(os.path.sep, '/') - path = path.replace(os.path.sep, '/') - assert path.startswith(root) - return path[len(root):].lstrip('/') - - destinations = {} - for base, suffix, dest in rules: - prefix = os.path.join(resources_root, base) - for abs_base in iglob(prefix): - abs_glob = os.path.join(abs_base, suffix) - for abs_path in iglob(abs_glob): - resource_file = get_rel_path(resources_root, abs_path) - if dest is None: # remove the entry if it was here - destinations.pop(resource_file, None) - else: - rel_path = get_rel_path(abs_base, abs_path) - rel_dest = dest.replace(os.path.sep, '/').rstrip('/') - destinations[resource_file] = rel_dest + '/' + rel_path - return destinations - - -def in_venv(): - if hasattr(sys, 'real_prefix'): - # virtualenv venvs - result = True - else: - # PEP 405 venvs - result = sys.prefix != getattr(sys, 'base_prefix', sys.prefix) - return result - - -def get_executable(): -# The __PYVENV_LAUNCHER__ dance is apparently no longer needed, as -# changes to the stub launcher mean that sys.executable always points -# to the stub on OS X -# if sys.platform == 'darwin' and ('__PYVENV_LAUNCHER__' -# in os.environ): -# result = os.environ['__PYVENV_LAUNCHER__'] -# else: -# result = sys.executable -# return result - result = os.path.normcase(sys.executable) - if not isinstance(result, text_type): - result = fsdecode(result) - return result - - -def proceed(prompt, allowed_chars, error_prompt=None, default=None): - p = prompt - while True: - s = raw_input(p) - p = prompt - if not s and default: - s = default - if s: - c = s[0].lower() - if c in allowed_chars: - break - if error_prompt: - p = '%c: %s\n%s' % (c, error_prompt, prompt) - return c - - -def extract_by_key(d, keys): - if isinstance(keys, string_types): - keys = keys.split() - result = {} - for key in keys: - if key in d: - result[key] = d[key] - return result - -def read_exports(stream): - if sys.version_info[0] >= 3: - # needs to be a text stream - stream = codecs.getreader('utf-8')(stream) - # Try to load as JSON, falling back on legacy format - data = stream.read() - stream = StringIO(data) - try: - jdata = json.load(stream) - result = jdata['extensions']['python.exports']['exports'] - for group, entries in result.items(): - for k, v in entries.items(): - s = '%s = %s' % (k, v) - entry = get_export_entry(s) - assert entry is not None - entries[k] = entry - return result - except Exception: - stream.seek(0, 0) - - def read_stream(cp, stream): - if hasattr(cp, 'read_file'): - cp.read_file(stream) - else: - cp.readfp(stream) - - cp = configparser.ConfigParser() - try: - read_stream(cp, stream) - except configparser.MissingSectionHeaderError: - stream.close() - data = textwrap.dedent(data) - stream = StringIO(data) - read_stream(cp, stream) - - result = {} - for key in cp.sections(): - result[key] = entries = {} - for name, value in cp.items(key): - s = '%s = %s' % (name, value) - entry = get_export_entry(s) - assert entry is not None - #entry.dist = self - entries[name] = entry - return result - - -def write_exports(exports, stream): - if sys.version_info[0] >= 3: - # needs to be a text stream - stream = codecs.getwriter('utf-8')(stream) - cp = configparser.ConfigParser() - for k, v in exports.items(): - # TODO check k, v for valid values - cp.add_section(k) - for entry in v.values(): - if entry.suffix is None: - s = entry.prefix - else: - s = '%s:%s' % (entry.prefix, entry.suffix) - if entry.flags: - s = '%s [%s]' % (s, ', '.join(entry.flags)) - cp.set(k, entry.name, s) - cp.write(stream) - - -@contextlib.contextmanager -def tempdir(): - td = tempfile.mkdtemp() - try: - yield td - finally: - shutil.rmtree(td) - -@contextlib.contextmanager -def chdir(d): - cwd = os.getcwd() - try: - os.chdir(d) - yield - finally: - os.chdir(cwd) - - -@contextlib.contextmanager -def socket_timeout(seconds=15): - cto = socket.getdefaulttimeout() - try: - socket.setdefaulttimeout(seconds) - yield - finally: - socket.setdefaulttimeout(cto) - - -class cached_property(object): - def __init__(self, func): - self.func = func - #for attr in ('__name__', '__module__', '__doc__'): - # setattr(self, attr, getattr(func, attr, None)) - - def __get__(self, obj, cls=None): - if obj is None: - return self - value = self.func(obj) - object.__setattr__(obj, self.func.__name__, value) - #obj.__dict__[self.func.__name__] = value = self.func(obj) - return value - -def convert_path(pathname): - """Return 'pathname' as a name that will work on the native filesystem. - - The path is split on '/' and put back together again using the current - directory separator. Needed because filenames in the setup script are - always supplied in Unix style, and have to be converted to the local - convention before we can actually use them in the filesystem. Raises - ValueError on non-Unix-ish systems if 'pathname' either starts or - ends with a slash. - """ - if os.sep == '/': - return pathname - if not pathname: - return pathname - if pathname[0] == '/': - raise ValueError("path '%s' cannot be absolute" % pathname) - if pathname[-1] == '/': - raise ValueError("path '%s' cannot end with '/'" % pathname) - - paths = pathname.split('/') - while os.curdir in paths: - paths.remove(os.curdir) - if not paths: - return os.curdir - return os.path.join(*paths) - - -class FileOperator(object): - def __init__(self, dry_run=False): - self.dry_run = dry_run - self.ensured = set() - self._init_record() - - def _init_record(self): - self.record = False - self.files_written = set() - self.dirs_created = set() - - def record_as_written(self, path): - if self.record: - self.files_written.add(path) - - def newer(self, source, target): - """Tell if the target is newer than the source. - - Returns true if 'source' exists and is more recently modified than - 'target', or if 'source' exists and 'target' doesn't. - - Returns false if both exist and 'target' is the same age or younger - than 'source'. Raise PackagingFileError if 'source' does not exist. - - Note that this test is not very accurate: files created in the same - second will have the same "age". - """ - if not os.path.exists(source): - raise DistlibException("file '%r' does not exist" % - os.path.abspath(source)) - if not os.path.exists(target): - return True - - return os.stat(source).st_mtime > os.stat(target).st_mtime - - def copy_file(self, infile, outfile, check=True): - """Copy a file respecting dry-run and force flags. - """ - self.ensure_dir(os.path.dirname(outfile)) - logger.info('Copying %s to %s', infile, outfile) - if not self.dry_run: - msg = None - if check: - if os.path.islink(outfile): - msg = '%s is a symlink' % outfile - elif os.path.exists(outfile) and not os.path.isfile(outfile): - msg = '%s is a non-regular file' % outfile - if msg: - raise ValueError(msg + ' which would be overwritten') - shutil.copyfile(infile, outfile) - self.record_as_written(outfile) - - def copy_stream(self, instream, outfile, encoding=None): - assert not os.path.isdir(outfile) - self.ensure_dir(os.path.dirname(outfile)) - logger.info('Copying stream %s to %s', instream, outfile) - if not self.dry_run: - if encoding is None: - outstream = open(outfile, 'wb') - else: - outstream = codecs.open(outfile, 'w', encoding=encoding) - try: - shutil.copyfileobj(instream, outstream) - finally: - outstream.close() - self.record_as_written(outfile) - - def write_binary_file(self, path, data): - self.ensure_dir(os.path.dirname(path)) - if not self.dry_run: - if os.path.exists(path): - os.remove(path) - with open(path, 'wb') as f: - f.write(data) - self.record_as_written(path) - - def write_text_file(self, path, data, encoding): - self.write_binary_file(path, data.encode(encoding)) - - def set_mode(self, bits, mask, files): - if os.name == 'posix' or (os.name == 'java' and os._name == 'posix'): - # Set the executable bits (owner, group, and world) on - # all the files specified. - for f in files: - if self.dry_run: - logger.info("changing mode of %s", f) - else: - mode = (os.stat(f).st_mode | bits) & mask - logger.info("changing mode of %s to %o", f, mode) - os.chmod(f, mode) - - set_executable_mode = lambda s, f: s.set_mode(0o555, 0o7777, f) - - def ensure_dir(self, path): - path = os.path.abspath(path) - if path not in self.ensured and not os.path.exists(path): - self.ensured.add(path) - d, f = os.path.split(path) - self.ensure_dir(d) - logger.info('Creating %s' % path) - if not self.dry_run: - os.mkdir(path) - if self.record: - self.dirs_created.add(path) - - def byte_compile(self, path, optimize=False, force=False, prefix=None, hashed_invalidation=False): - dpath = cache_from_source(path, not optimize) - logger.info('Byte-compiling %s to %s', path, dpath) - if not self.dry_run: - if force or self.newer(path, dpath): - if not prefix: - diagpath = None - else: - assert path.startswith(prefix) - diagpath = path[len(prefix):] - compile_kwargs = {} - if hashed_invalidation and hasattr(py_compile, 'PycInvalidationMode'): - compile_kwargs['invalidation_mode'] = py_compile.PycInvalidationMode.CHECKED_HASH - py_compile.compile(path, dpath, diagpath, True, **compile_kwargs) # raise error - self.record_as_written(dpath) - return dpath - - def ensure_removed(self, path): - if os.path.exists(path): - if os.path.isdir(path) and not os.path.islink(path): - logger.debug('Removing directory tree at %s', path) - if not self.dry_run: - shutil.rmtree(path) - if self.record: - if path in self.dirs_created: - self.dirs_created.remove(path) - else: - if os.path.islink(path): - s = 'link' - else: - s = 'file' - logger.debug('Removing %s %s', s, path) - if not self.dry_run: - os.remove(path) - if self.record: - if path in self.files_written: - self.files_written.remove(path) - - def is_writable(self, path): - result = False - while not result: - if os.path.exists(path): - result = os.access(path, os.W_OK) - break - parent = os.path.dirname(path) - if parent == path: - break - path = parent - return result - - def commit(self): - """ - Commit recorded changes, turn off recording, return - changes. - """ - assert self.record - result = self.files_written, self.dirs_created - self._init_record() - return result - - def rollback(self): - if not self.dry_run: - for f in list(self.files_written): - if os.path.exists(f): - os.remove(f) - # dirs should all be empty now, except perhaps for - # __pycache__ subdirs - # reverse so that subdirs appear before their parents - dirs = sorted(self.dirs_created, reverse=True) - for d in dirs: - flist = os.listdir(d) - if flist: - assert flist == ['__pycache__'] - sd = os.path.join(d, flist[0]) - os.rmdir(sd) - os.rmdir(d) # should fail if non-empty - self._init_record() - -def resolve(module_name, dotted_path): - if module_name in sys.modules: - mod = sys.modules[module_name] - else: - mod = __import__(module_name) - if dotted_path is None: - result = mod - else: - parts = dotted_path.split('.') - result = getattr(mod, parts.pop(0)) - for p in parts: - result = getattr(result, p) - return result - - -class ExportEntry(object): - def __init__(self, name, prefix, suffix, flags): - self.name = name - self.prefix = prefix - self.suffix = suffix - self.flags = flags - - @cached_property - def value(self): - return resolve(self.prefix, self.suffix) - - def __repr__(self): # pragma: no cover - return '<ExportEntry %s = %s:%s %s>' % (self.name, self.prefix, - self.suffix, self.flags) - - def __eq__(self, other): - if not isinstance(other, ExportEntry): - result = False - else: - result = (self.name == other.name and - self.prefix == other.prefix and - self.suffix == other.suffix and - self.flags == other.flags) - return result - - __hash__ = object.__hash__ - - -ENTRY_RE = re.compile(r'''(?P<name>(\w|[-.+])+) - \s*=\s*(?P<callable>(\w+)([:\.]\w+)*) - \s*(\[\s*(?P<flags>\w+(=\w+)?(,\s*\w+(=\w+)?)*)\s*\])? - ''', re.VERBOSE) - -def get_export_entry(specification): - m = ENTRY_RE.search(specification) - if not m: - result = None - if '[' in specification or ']' in specification: - raise DistlibException("Invalid specification " - "'%s'" % specification) - else: - d = m.groupdict() - name = d['name'] - path = d['callable'] - colons = path.count(':') - if colons == 0: - prefix, suffix = path, None - else: - if colons != 1: - raise DistlibException("Invalid specification " - "'%s'" % specification) - prefix, suffix = path.split(':') - flags = d['flags'] - if flags is None: - if '[' in specification or ']' in specification: - raise DistlibException("Invalid specification " - "'%s'" % specification) - flags = [] - else: - flags = [f.strip() for f in flags.split(',')] - result = ExportEntry(name, prefix, suffix, flags) - return result - - -def get_cache_base(suffix=None): - """ - Return the default base location for distlib caches. If the directory does - not exist, it is created. Use the suffix provided for the base directory, - and default to '.distlib' if it isn't provided. - - On Windows, if LOCALAPPDATA is defined in the environment, then it is - assumed to be a directory, and will be the parent directory of the result. - On POSIX, and on Windows if LOCALAPPDATA is not defined, the user's home - directory - using os.expanduser('~') - will be the parent directory of - the result. - - The result is just the directory '.distlib' in the parent directory as - determined above, or with the name specified with ``suffix``. - """ - if suffix is None: - suffix = '.distlib' - if os.name == 'nt' and 'LOCALAPPDATA' in os.environ: - result = os.path.expandvars('$localappdata') - else: - # Assume posix, or old Windows - result = os.path.expanduser('~') - # we use 'isdir' instead of 'exists', because we want to - # fail if there's a file with that name - if os.path.isdir(result): - usable = os.access(result, os.W_OK) - if not usable: - logger.warning('Directory exists but is not writable: %s', result) - else: - try: - os.makedirs(result) - usable = True - except OSError: - logger.warning('Unable to create %s', result, exc_info=True) - usable = False - if not usable: - result = tempfile.mkdtemp() - logger.warning('Default location unusable, using %s', result) - return os.path.join(result, suffix) - - -def path_to_cache_dir(path): - """ - Convert an absolute path to a directory name for use in a cache. - - The algorithm used is: - - #. On Windows, any ``':'`` in the drive is replaced with ``'---'``. - #. Any occurrence of ``os.sep`` is replaced with ``'--'``. - #. ``'.cache'`` is appended. - """ - d, p = os.path.splitdrive(os.path.abspath(path)) - if d: - d = d.replace(':', '---') - p = p.replace(os.sep, '--') - return d + p + '.cache' - - -def ensure_slash(s): - if not s.endswith('/'): - return s + '/' - return s - - -def parse_credentials(netloc): - username = password = None - if '@' in netloc: - prefix, netloc = netloc.split('@', 1) - if ':' not in prefix: - username = prefix - else: - username, password = prefix.split(':', 1) - return username, password, netloc - - -def get_process_umask(): - result = os.umask(0o22) - os.umask(result) - return result - -def is_string_sequence(seq): - result = True - i = None - for i, s in enumerate(seq): - if not isinstance(s, string_types): - result = False - break - assert i is not None - return result - -PROJECT_NAME_AND_VERSION = re.compile('([a-z0-9_]+([.-][a-z_][a-z0-9_]*)*)-' - '([a-z0-9_.+-]+)', re.I) -PYTHON_VERSION = re.compile(r'-py(\d\.?\d?)') - - -def split_filename(filename, project_name=None): - """ - Extract name, version, python version from a filename (no extension) - - Return name, version, pyver or None - """ - result = None - pyver = None - filename = unquote(filename).replace(' ', '-') - m = PYTHON_VERSION.search(filename) - if m: - pyver = m.group(1) - filename = filename[:m.start()] - if project_name and len(filename) > len(project_name) + 1: - m = re.match(re.escape(project_name) + r'\b', filename) - if m: - n = m.end() - result = filename[:n], filename[n + 1:], pyver - if result is None: - m = PROJECT_NAME_AND_VERSION.match(filename) - if m: - result = m.group(1), m.group(3), pyver - return result - -# Allow spaces in name because of legacy dists like "Twisted Core" -NAME_VERSION_RE = re.compile(r'(?P<name>[\w .-]+)\s*' - r'\(\s*(?P<ver>[^\s)]+)\)$') - -def parse_name_and_version(p): - """ - A utility method used to get name and version from a string. - - From e.g. a Provides-Dist value. - - :param p: A value in a form 'foo (1.0)' - :return: The name and version as a tuple. - """ - m = NAME_VERSION_RE.match(p) - if not m: - raise DistlibException('Ill-formed name/version string: \'%s\'' % p) - d = m.groupdict() - return d['name'].strip().lower(), d['ver'] - -def get_extras(requested, available): - result = set() - requested = set(requested or []) - available = set(available or []) - if '*' in requested: - requested.remove('*') - result |= available - for r in requested: - if r == '-': - result.add(r) - elif r.startswith('-'): - unwanted = r[1:] - if unwanted not in available: - logger.warning('undeclared extra: %s' % unwanted) - if unwanted in result: - result.remove(unwanted) - else: - if r not in available: - logger.warning('undeclared extra: %s' % r) - result.add(r) - return result -# -# Extended metadata functionality -# - -def _get_external_data(url): - result = {} - try: - # urlopen might fail if it runs into redirections, - # because of Python issue #13696. Fixed in locators - # using a custom redirect handler. - resp = urlopen(url) - headers = resp.info() - ct = headers.get('Content-Type') - if not ct.startswith('application/json'): - logger.debug('Unexpected response for JSON request: %s', ct) - else: - reader = codecs.getreader('utf-8')(resp) - #data = reader.read().decode('utf-8') - #result = json.loads(data) - result = json.load(reader) - except Exception as e: - logger.exception('Failed to get external data for %s: %s', url, e) - return result - -_external_data_base_url = 'https://www.red-dove.com/pypi/projects/' - -def get_project_data(name): - url = '%s/%s/project.json' % (name[0].upper(), name) - url = urljoin(_external_data_base_url, url) - result = _get_external_data(url) - return result - -def get_package_data(name, version): - url = '%s/%s/package-%s.json' % (name[0].upper(), name, version) - url = urljoin(_external_data_base_url, url) - return _get_external_data(url) - - -class Cache(object): - """ - A class implementing a cache for resources that need to live in the file system - e.g. shared libraries. This class was moved from resources to here because it - could be used by other modules, e.g. the wheel module. - """ - - def __init__(self, base): - """ - Initialise an instance. - - :param base: The base directory where the cache should be located. - """ - # we use 'isdir' instead of 'exists', because we want to - # fail if there's a file with that name - if not os.path.isdir(base): # pragma: no cover - os.makedirs(base) - if (os.stat(base).st_mode & 0o77) != 0: - logger.warning('Directory \'%s\' is not private', base) - self.base = os.path.abspath(os.path.normpath(base)) - - def prefix_to_dir(self, prefix): - """ - Converts a resource prefix to a directory name in the cache. - """ - return path_to_cache_dir(prefix) - - def clear(self): - """ - Clear the cache. - """ - not_removed = [] - for fn in os.listdir(self.base): - fn = os.path.join(self.base, fn) - try: - if os.path.islink(fn) or os.path.isfile(fn): - os.remove(fn) - elif os.path.isdir(fn): - shutil.rmtree(fn) - except Exception: - not_removed.append(fn) - return not_removed - - -class EventMixin(object): - """ - A very simple publish/subscribe system. - """ - def __init__(self): - self._subscribers = {} - - def add(self, event, subscriber, append=True): - """ - Add a subscriber for an event. - - :param event: The name of an event. - :param subscriber: The subscriber to be added (and called when the - event is published). - :param append: Whether to append or prepend the subscriber to an - existing subscriber list for the event. - """ - subs = self._subscribers - if event not in subs: - subs[event] = deque([subscriber]) - else: - sq = subs[event] - if append: - sq.append(subscriber) - else: - sq.appendleft(subscriber) - - def remove(self, event, subscriber): - """ - Remove a subscriber for an event. - - :param event: The name of an event. - :param subscriber: The subscriber to be removed. - """ - subs = self._subscribers - if event not in subs: - raise ValueError('No subscribers: %r' % event) - subs[event].remove(subscriber) - - def get_subscribers(self, event): - """ - Return an iterator for the subscribers for an event. - :param event: The event to return subscribers for. - """ - return iter(self._subscribers.get(event, ())) - - def publish(self, event, *args, **kwargs): - """ - Publish a event and return a list of values returned by its - subscribers. - - :param event: The event to publish. - :param args: The positional arguments to pass to the event's - subscribers. - :param kwargs: The keyword arguments to pass to the event's - subscribers. - """ - result = [] - for subscriber in self.get_subscribers(event): - try: - value = subscriber(event, *args, **kwargs) - except Exception: - logger.exception('Exception during event publication') - value = None - result.append(value) - logger.debug('publish %s: args = %s, kwargs = %s, result = %s', - event, args, kwargs, result) - return result - -# -# Simple sequencing -# -class Sequencer(object): - def __init__(self): - self._preds = {} - self._succs = {} - self._nodes = set() # nodes with no preds/succs - - def add_node(self, node): - self._nodes.add(node) - - def remove_node(self, node, edges=False): - if node in self._nodes: - self._nodes.remove(node) - if edges: - for p in set(self._preds.get(node, ())): - self.remove(p, node) - for s in set(self._succs.get(node, ())): - self.remove(node, s) - # Remove empties - for k, v in list(self._preds.items()): - if not v: - del self._preds[k] - for k, v in list(self._succs.items()): - if not v: - del self._succs[k] - - def add(self, pred, succ): - assert pred != succ - self._preds.setdefault(succ, set()).add(pred) - self._succs.setdefault(pred, set()).add(succ) - - def remove(self, pred, succ): - assert pred != succ - try: - preds = self._preds[succ] - succs = self._succs[pred] - except KeyError: # pragma: no cover - raise ValueError('%r not a successor of anything' % succ) - try: - preds.remove(pred) - succs.remove(succ) - except KeyError: # pragma: no cover - raise ValueError('%r not a successor of %r' % (succ, pred)) - - def is_step(self, step): - return (step in self._preds or step in self._succs or - step in self._nodes) - - def get_steps(self, final): - if not self.is_step(final): - raise ValueError('Unknown: %r' % final) - result = [] - todo = [] - seen = set() - todo.append(final) - while todo: - step = todo.pop(0) - if step in seen: - # if a step was already seen, - # move it to the end (so it will appear earlier - # when reversed on return) ... but not for the - # final step, as that would be confusing for - # users - if step != final: - result.remove(step) - result.append(step) - else: - seen.add(step) - result.append(step) - preds = self._preds.get(step, ()) - todo.extend(preds) - return reversed(result) - - @property - def strong_connections(self): - #http://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm - index_counter = [0] - stack = [] - lowlinks = {} - index = {} - result = [] - - graph = self._succs - - def strongconnect(node): - # set the depth index for this node to the smallest unused index - index[node] = index_counter[0] - lowlinks[node] = index_counter[0] - index_counter[0] += 1 - stack.append(node) - - # Consider successors - try: - successors = graph[node] - except Exception: - successors = [] - for successor in successors: - if successor not in lowlinks: - # Successor has not yet been visited - strongconnect(successor) - lowlinks[node] = min(lowlinks[node],lowlinks[successor]) - elif successor in stack: - # the successor is in the stack and hence in the current - # strongly connected component (SCC) - lowlinks[node] = min(lowlinks[node],index[successor]) - - # If `node` is a root node, pop the stack and generate an SCC - if lowlinks[node] == index[node]: - connected_component = [] - - while True: - successor = stack.pop() - connected_component.append(successor) - if successor == node: break - component = tuple(connected_component) - # storing the result - result.append(component) - - for node in graph: - if node not in lowlinks: - strongconnect(node) - - return result - - @property - def dot(self): - result = ['digraph G {'] - for succ in self._preds: - preds = self._preds[succ] - for pred in preds: - result.append(' %s -> %s;' % (pred, succ)) - for node in self._nodes: - result.append(' %s;' % node) - result.append('}') - return '\n'.join(result) - -# -# Unarchiving functionality for zip, tar, tgz, tbz, whl -# - -ARCHIVE_EXTENSIONS = ('.tar.gz', '.tar.bz2', '.tar', '.zip', - '.tgz', '.tbz', '.whl') - -def unarchive(archive_filename, dest_dir, format=None, check=True): - - def check_path(path): - if not isinstance(path, text_type): - path = path.decode('utf-8') - p = os.path.abspath(os.path.join(dest_dir, path)) - if not p.startswith(dest_dir) or p[plen] != os.sep: - raise ValueError('path outside destination: %r' % p) - - dest_dir = os.path.abspath(dest_dir) - plen = len(dest_dir) - archive = None - if format is None: - if archive_filename.endswith(('.zip', '.whl')): - format = 'zip' - elif archive_filename.endswith(('.tar.gz', '.tgz')): - format = 'tgz' - mode = 'r:gz' - elif archive_filename.endswith(('.tar.bz2', '.tbz')): - format = 'tbz' - mode = 'r:bz2' - elif archive_filename.endswith('.tar'): - format = 'tar' - mode = 'r' - else: # pragma: no cover - raise ValueError('Unknown format for %r' % archive_filename) - try: - if format == 'zip': - archive = ZipFile(archive_filename, 'r') - if check: - names = archive.namelist() - for name in names: - check_path(name) - else: - archive = tarfile.open(archive_filename, mode) - if check: - names = archive.getnames() - for name in names: - check_path(name) - if format != 'zip' and sys.version_info[0] < 3: - # See Python issue 17153. If the dest path contains Unicode, - # tarfile extraction fails on Python 2.x if a member path name - # contains non-ASCII characters - it leads to an implicit - # bytes -> unicode conversion using ASCII to decode. - for tarinfo in archive.getmembers(): - if not isinstance(tarinfo.name, text_type): - tarinfo.name = tarinfo.name.decode('utf-8') - archive.extractall(dest_dir) - - finally: - if archive: - archive.close() - - -def zip_dir(directory): - """zip a directory tree into a BytesIO object""" - result = io.BytesIO() - dlen = len(directory) - with ZipFile(result, "w") as zf: - for root, dirs, files in os.walk(directory): - for name in files: - full = os.path.join(root, name) - rel = root[dlen:] - dest = os.path.join(rel, name) - zf.write(full, dest) - return result - -# -# Simple progress bar -# - -UNITS = ('', 'K', 'M', 'G','T','P') - - -class Progress(object): - unknown = 'UNKNOWN' - - def __init__(self, minval=0, maxval=100): - assert maxval is None or maxval >= minval - self.min = self.cur = minval - self.max = maxval - self.started = None - self.elapsed = 0 - self.done = False - - def update(self, curval): - assert self.min <= curval - assert self.max is None or curval <= self.max - self.cur = curval - now = time.time() - if self.started is None: - self.started = now - else: - self.elapsed = now - self.started - - def increment(self, incr): - assert incr >= 0 - self.update(self.cur + incr) - - def start(self): - self.update(self.min) - return self - - def stop(self): - if self.max is not None: - self.update(self.max) - self.done = True - - @property - def maximum(self): - return self.unknown if self.max is None else self.max - - @property - def percentage(self): - if self.done: - result = '100 %' - elif self.max is None: - result = ' ?? %' - else: - v = 100.0 * (self.cur - self.min) / (self.max - self.min) - result = '%3d %%' % v - return result - - def format_duration(self, duration): - if (duration <= 0) and self.max is None or self.cur == self.min: - result = '??:??:??' - #elif duration < 1: - # result = '--:--:--' - else: - result = time.strftime('%H:%M:%S', time.gmtime(duration)) - return result - - @property - def ETA(self): - if self.done: - prefix = 'Done' - t = self.elapsed - #import pdb; pdb.set_trace() - else: - prefix = 'ETA ' - if self.max is None: - t = -1 - elif self.elapsed == 0 or (self.cur == self.min): - t = 0 - else: - #import pdb; pdb.set_trace() - t = float(self.max - self.min) - t /= self.cur - self.min - t = (t - 1) * self.elapsed - return '%s: %s' % (prefix, self.format_duration(t)) - - @property - def speed(self): - if self.elapsed == 0: - result = 0.0 - else: - result = (self.cur - self.min) / self.elapsed - for unit in UNITS: - if result < 1000: - break - result /= 1000.0 - return '%d %sB/s' % (result, unit) - -# -# Glob functionality -# - -RICH_GLOB = re.compile(r'\{([^}]*)\}') -_CHECK_RECURSIVE_GLOB = re.compile(r'[^/\\,{]\*\*|\*\*[^/\\,}]') -_CHECK_MISMATCH_SET = re.compile(r'^[^{]*\}|\{[^}]*$') - - -def iglob(path_glob): - """Extended globbing function that supports ** and {opt1,opt2,opt3}.""" - if _CHECK_RECURSIVE_GLOB.search(path_glob): - msg = """invalid glob %r: recursive glob "**" must be used alone""" - raise ValueError(msg % path_glob) - if _CHECK_MISMATCH_SET.search(path_glob): - msg = """invalid glob %r: mismatching set marker '{' or '}'""" - raise ValueError(msg % path_glob) - return _iglob(path_glob) - - -def _iglob(path_glob): - rich_path_glob = RICH_GLOB.split(path_glob, 1) - if len(rich_path_glob) > 1: - assert len(rich_path_glob) == 3, rich_path_glob - prefix, set, suffix = rich_path_glob - for item in set.split(','): - for path in _iglob(''.join((prefix, item, suffix))): - yield path - else: - if '**' not in path_glob: - for item in std_iglob(path_glob): - yield item - else: - prefix, radical = path_glob.split('**', 1) - if prefix == '': - prefix = '.' - if radical == '': - radical = '*' - else: - # we support both - radical = radical.lstrip('/') - radical = radical.lstrip('\\') - for path, dir, files in os.walk(prefix): - path = os.path.normpath(path) - for fn in _iglob(os.path.join(path, radical)): - yield fn - -if ssl: - from .compat import (HTTPSHandler as BaseHTTPSHandler, match_hostname, - CertificateError) - - -# -# HTTPSConnection which verifies certificates/matches domains -# - - class HTTPSConnection(httplib.HTTPSConnection): - ca_certs = None # set this to the path to the certs file (.pem) - check_domain = True # only used if ca_certs is not None - - # noinspection PyPropertyAccess - def connect(self): - sock = socket.create_connection((self.host, self.port), self.timeout) - if getattr(self, '_tunnel_host', False): - self.sock = sock - self._tunnel() - - if not hasattr(ssl, 'SSLContext'): - # For 2.x - if self.ca_certs: - cert_reqs = ssl.CERT_REQUIRED - else: - cert_reqs = ssl.CERT_NONE - self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file, - cert_reqs=cert_reqs, - ssl_version=ssl.PROTOCOL_SSLv23, - ca_certs=self.ca_certs) - else: # pragma: no cover - context = ssl.SSLContext(ssl.PROTOCOL_SSLv23) - context.options |= ssl.OP_NO_SSLv2 - if self.cert_file: - context.load_cert_chain(self.cert_file, self.key_file) - kwargs = {} - if self.ca_certs: - context.verify_mode = ssl.CERT_REQUIRED - context.load_verify_locations(cafile=self.ca_certs) - if getattr(ssl, 'HAS_SNI', False): - kwargs['server_hostname'] = self.host - self.sock = context.wrap_socket(sock, **kwargs) - if self.ca_certs and self.check_domain: - try: - match_hostname(self.sock.getpeercert(), self.host) - logger.debug('Host verified: %s', self.host) - except CertificateError: # pragma: no cover - self.sock.shutdown(socket.SHUT_RDWR) - self.sock.close() - raise - - class HTTPSHandler(BaseHTTPSHandler): - def __init__(self, ca_certs, check_domain=True): - BaseHTTPSHandler.__init__(self) - self.ca_certs = ca_certs - self.check_domain = check_domain - - def _conn_maker(self, *args, **kwargs): - """ - This is called to create a connection instance. Normally you'd - pass a connection class to do_open, but it doesn't actually check for - a class, and just expects a callable. As long as we behave just as a - constructor would have, we should be OK. If it ever changes so that - we *must* pass a class, we'll create an UnsafeHTTPSConnection class - which just sets check_domain to False in the class definition, and - choose which one to pass to do_open. - """ - result = HTTPSConnection(*args, **kwargs) - if self.ca_certs: - result.ca_certs = self.ca_certs - result.check_domain = self.check_domain - return result - - def https_open(self, req): - try: - return self.do_open(self._conn_maker, req) - except URLError as e: - if 'certificate verify failed' in str(e.reason): - raise CertificateError('Unable to verify server certificate ' - 'for %s' % req.host) - else: - raise - - # - # To prevent against mixing HTTP traffic with HTTPS (examples: A Man-In-The- - # Middle proxy using HTTP listens on port 443, or an index mistakenly serves - # HTML containing a http://xyz link when it should be https://xyz), - # you can use the following handler class, which does not allow HTTP traffic. - # - # It works by inheriting from HTTPHandler - so build_opener won't add a - # handler for HTTP itself. - # - class HTTPSOnlyHandler(HTTPSHandler, HTTPHandler): - def http_open(self, req): - raise URLError('Unexpected HTTP request on what should be a secure ' - 'connection: %s' % req) - -# -# XML-RPC with timeouts -# - -_ver_info = sys.version_info[:2] - -if _ver_info == (2, 6): - class HTTP(httplib.HTTP): - def __init__(self, host='', port=None, **kwargs): - if port == 0: # 0 means use port 0, not the default port - port = None - self._setup(self._connection_class(host, port, **kwargs)) - - - if ssl: - class HTTPS(httplib.HTTPS): - def __init__(self, host='', port=None, **kwargs): - if port == 0: # 0 means use port 0, not the default port - port = None - self._setup(self._connection_class(host, port, **kwargs)) - - -class Transport(xmlrpclib.Transport): - def __init__(self, timeout, use_datetime=0): - self.timeout = timeout - xmlrpclib.Transport.__init__(self, use_datetime) - - def make_connection(self, host): - h, eh, x509 = self.get_host_info(host) - if _ver_info == (2, 6): - result = HTTP(h, timeout=self.timeout) - else: - if not self._connection or host != self._connection[0]: - self._extra_headers = eh - self._connection = host, httplib.HTTPConnection(h) - result = self._connection[1] - return result - -if ssl: - class SafeTransport(xmlrpclib.SafeTransport): - def __init__(self, timeout, use_datetime=0): - self.timeout = timeout - xmlrpclib.SafeTransport.__init__(self, use_datetime) - - def make_connection(self, host): - h, eh, kwargs = self.get_host_info(host) - if not kwargs: - kwargs = {} - kwargs['timeout'] = self.timeout - if _ver_info == (2, 6): - result = HTTPS(host, None, **kwargs) - else: - if not self._connection or host != self._connection[0]: - self._extra_headers = eh - self._connection = host, httplib.HTTPSConnection(h, None, - **kwargs) - result = self._connection[1] - return result - - -class ServerProxy(xmlrpclib.ServerProxy): - def __init__(self, uri, **kwargs): - self.timeout = timeout = kwargs.pop('timeout', None) - # The above classes only come into play if a timeout - # is specified - if timeout is not None: - scheme, _ = splittype(uri) - use_datetime = kwargs.get('use_datetime', 0) - if scheme == 'https': - tcls = SafeTransport - else: - tcls = Transport - kwargs['transport'] = t = tcls(timeout, use_datetime=use_datetime) - self.transport = t - xmlrpclib.ServerProxy.__init__(self, uri, **kwargs) - -# -# CSV functionality. This is provided because on 2.x, the csv module can't -# handle Unicode. However, we need to deal with Unicode in e.g. RECORD files. -# - -def _csv_open(fn, mode, **kwargs): - if sys.version_info[0] < 3: - mode += 'b' - else: - kwargs['newline'] = '' - # Python 3 determines encoding from locale. Force 'utf-8' - # file encoding to match other forced utf-8 encoding - kwargs['encoding'] = 'utf-8' - return open(fn, mode, **kwargs) - - -class CSVBase(object): - defaults = { - 'delimiter': str(','), # The strs are used because we need native - 'quotechar': str('"'), # str in the csv API (2.x won't take - 'lineterminator': str('\n') # Unicode) - } - - def __enter__(self): - return self - - def __exit__(self, *exc_info): - self.stream.close() - - -class CSVReader(CSVBase): - def __init__(self, **kwargs): - if 'stream' in kwargs: - stream = kwargs['stream'] - if sys.version_info[0] >= 3: - # needs to be a text stream - stream = codecs.getreader('utf-8')(stream) - self.stream = stream - else: - self.stream = _csv_open(kwargs['path'], 'r') - self.reader = csv.reader(self.stream, **self.defaults) - - def __iter__(self): - return self - - def next(self): - result = next(self.reader) - if sys.version_info[0] < 3: - for i, item in enumerate(result): - if not isinstance(item, text_type): - result[i] = item.decode('utf-8') - return result - - __next__ = next - -class CSVWriter(CSVBase): - def __init__(self, fn, **kwargs): - self.stream = _csv_open(fn, 'w') - self.writer = csv.writer(self.stream, **self.defaults) - - def writerow(self, row): - if sys.version_info[0] < 3: - r = [] - for item in row: - if isinstance(item, text_type): - item = item.encode('utf-8') - r.append(item) - row = r - self.writer.writerow(row) - -# -# Configurator functionality -# - -class Configurator(BaseConfigurator): - - value_converters = dict(BaseConfigurator.value_converters) - value_converters['inc'] = 'inc_convert' - - def __init__(self, config, base=None): - super(Configurator, self).__init__(config) - self.base = base or os.getcwd() - - def configure_custom(self, config): - def convert(o): - if isinstance(o, (list, tuple)): - result = type(o)([convert(i) for i in o]) - elif isinstance(o, dict): - if '()' in o: - result = self.configure_custom(o) - else: - result = {} - for k in o: - result[k] = convert(o[k]) - else: - result = self.convert(o) - return result - - c = config.pop('()') - if not callable(c): - c = self.resolve(c) - props = config.pop('.', None) - # Check for valid identifiers - args = config.pop('[]', ()) - if args: - args = tuple([convert(o) for o in args]) - items = [(k, convert(config[k])) for k in config if valid_ident(k)] - kwargs = dict(items) - result = c(*args, **kwargs) - if props: - for n, v in props.items(): - setattr(result, n, convert(v)) - return result - - def __getitem__(self, key): - result = self.config[key] - if isinstance(result, dict) and '()' in result: - self.config[key] = result = self.configure_custom(result) - return result - - def inc_convert(self, value): - """Default converter for the inc:// protocol.""" - if not os.path.isabs(value): - value = os.path.join(self.base, value) - with codecs.open(value, 'r', encoding='utf-8') as f: - result = json.load(f) - return result - - -class SubprocessMixin(object): - """ - Mixin for running subprocesses and capturing their output - """ - def __init__(self, verbose=False, progress=None): - self.verbose = verbose - self.progress = progress - - def reader(self, stream, context): - """ - Read lines from a subprocess' output stream and either pass to a progress - callable (if specified) or write progress information to sys.stderr. - """ - progress = self.progress - verbose = self.verbose - while True: - s = stream.readline() - if not s: - break - if progress is not None: - progress(s, context) - else: - if not verbose: - sys.stderr.write('.') - else: - sys.stderr.write(s.decode('utf-8')) - sys.stderr.flush() - stream.close() - - def run_command(self, cmd, **kwargs): - p = subprocess.Popen(cmd, stdout=subprocess.PIPE, - stderr=subprocess.PIPE, **kwargs) - t1 = threading.Thread(target=self.reader, args=(p.stdout, 'stdout')) - t1.start() - t2 = threading.Thread(target=self.reader, args=(p.stderr, 'stderr')) - t2.start() - p.wait() - t1.join() - t2.join() - if self.progress is not None: - self.progress('done.', 'main') - elif self.verbose: - sys.stderr.write('done.\n') - return p - - -def normalize_name(name): - """Normalize a python package name a la PEP 503""" - # https://www.python.org/dev/peps/pep-0503/#normalized-names - return re.sub('[-_.]+', '-', name).lower() diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/util.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/util.pyc deleted file mode 100644 index 278e90cdc5d289a1f10cc5b9d8c3e99c4da49ad3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 67805 zcmdVD3z%HTb>De=W-!1E2M^*&@F6rof*62!kRnBi5Jloi0wy_tE<i#WV%ThSH!uUt z^vv|_A!bNGicMOit;miOJGLA@vWXpAe#&<2<jZb$WigRA&L(yeYZE1o6UVZXY+}br z?AY04ll}ew=icrH2*vsGeT(4&=tAAPRduUQomZVYRn`CRR}b(0`ZW`^B>%IL{}1xZ zCI*wF&c9MJoh0KC?@Ojj$xL4|-j|f}cm2tDf01t>86R-GKbc;U%nT;uD?9mCCF84# zd_&3jP!S(a#)pgeZOQm;MSLU~A1UIilkwF>d`&XGCRtinJg!Z~*CuD1Tatmsy5#b3 z()#(NR4UPElAEREV|gprC*$jjA{&zN4MluoGQP2hZ%W2D74gl<_~xFkY)Qtq@RfTy zU)jq?3JBbxmp$Lwnv8Ev>HuOzGJR(<b5}Bc7f|4NFqytPnYkw!zbBb_Uo!r_WM*43 zzAc$4C*$R0=H6ud-ehKbGQK^Txi1;NFPXVN8NWZ7*^!LzNM;^L#ve##b|&LHlbO+E zd^DNam5lF7W_BmzyOWs*lko?WnLWw)o@8ckGQKyN*_Vv(OJ?>b<NK4Dhm!G!l9`8- z@rRRAV>r3={-p6p@&+J!G-<3(E`1=Wuk_<%#p5bJez15P^5ch!$6-G{UOe9B#{<RV zh#x;(Jg)ZR6UE~iKYk>suT9<rtDa2i>l}G1so(C%!KA+4kwZy+gCmE9g8H{Hc@xY# zlGHaj{b*9(?8vdCzQvKJlSY4X>6xT{haT0z<3-BWBIQJpa%WP%D|xfzY+sku?@k)e zCKve1J<gdVA0K}%slU(lKA+UL6|c*k*JDZjUcWw>)VCL}@9VriRdo4&M?RXoLF3b; zzQbisyGIYG0pn+q`c5alkkm&Vc`>Q)a^!4M-|fi9lKO*=e7vZ3k0ax*_N5|mue)>3 zmG5)q6UD3je)V!vf5`PzlKR7rypq)4??^SNKaz}}PwJ2Qv6j?7;7C2GgBSsv4=Uvi z0jH7FL5N6wypwt%se=fS`r%IM#iTx;j8Cdnjj5!5#N&7=sULOymy>!c8J|w-&lV-0 z>y(@+TK~LT-z*--{5V@Yp7i5fQa|My2b20o9hpxWYm?T#6?KR&HSzJKESYI1<LzW- zAsJtQFi$6q9m%CvJ@{ujUw$>IzmPOCr@q)pZ6)=yNu!lCMw1JDN&RD;7gv&Ik~B6X zmll)y$CL8-QqovT>REERFKK<_iaG<tH(qmX=Q@R6bMtu3Ao2Qjzka#%`t@Y~8&^<m zy^=H@NG@IV>sLCjue$UXR@AG0ea)}WcV1spi|RGM`-I=sJMTV`)Ejyj|723XP(b}+ z=k*^;>XS+1kGarPC-v)-`lTZEawqj0lKOPg*yX%4ozypyI%5@hFxyFeGpWz%Vf-6~ z3a3Zgh?%MX%Ac{(64CYwf_h_qq0xPux;Q<1eoAj6Z5^?rQ(1d@>in_AT4Sy~HQOBB zq{1TvS-UmWyjW>3%{8+2kWw3qZ9ldVW=S@=(4Lz1i&phYWvV&1&~C5d#c7v2ak70o z54CD-vQfFvnw_a+vkR?Sqb-rR(3+l|Ycz}arP-;7Pqy20G{%)K&P=!FYQ<AVdRt9t z-$wc4XU?2DUTxN=8?ClFak!c_j?6YMOkG@PRok;IXL_|dJyowv)%lJqBtyG8)uf1e zS9A8cYAYi_&3++$?pUiuSv7EcYVPT&>4sli$m)&SY&~yzbADmA9WUsG%V%pS@$%?P z=dPUFw|C;fUFWjhnOc=6?S8OGywizKeB`OCPxAZ7>+j$5$hE64ed6AUkGRZkzaHiN zuB)Tu*mYf&t5eOZ&Dr+3?7^v~v#ZfB&$iB;*Y`9&F9VTy(yP&Pr=uyOdU)wvrslnV zZFJY}2k$%Z;XV7Gy7v>W9K3(W%MX0y>Jv|%d+FSST3Hiv=-0=upI>%_0Q>^czNtTX zD@oq!H?j65pCY9%d8^OJ+V96w@>a=@1Aa`Bx0B?mWyk4Jp<~vd>fthfP6_ViYI&yG zy4+}$1J%m3zuaoH7g|kT)u(F0$7*Y-%vfpUz{YNo#^PM7k!9rAH|#3UOg4JUT$!4l zE((?}H<q&U_Sw1Zd&=9VC$sJT()N~O7iL@K=4^9syV07NYF4MS@>J9HwW+WBk@Ce> zb%xgNDU&~%o9!zfDq5bmuu-RU*%(4SS-Cx1KHqR{Ab6uii`!(WW^@B|ZnUb?c?Emi zqH0kc<6N};#wx3>?$v5*s(OC9Q69|}YLlvQHmfwNGmTyQ{NCdzMDFKzTA=@CKo5(! zRLV!>8j(`c`jEm)eG)^A^44p8daa~>C2hNwB+cU`lCtNMHhiCqrQ{n*N%IjUx<r3+ z6_vF=xx6xIz3NN@s$+AWkzA+|E1YSC<m)xRt`E9$ie4-w*H$EpKc_;iM~iBCA#VSd zlT-8Gr#Jf4)d8pdv*hZE<kDcmBj0d=sEnKt?+rc7hD&Pr%In*d*U;Pbysqo|PK{?# zJTI-%C&_Sa&>iG)u;^f36X2pP*X1=R)z3?)d`SW*uQ~}?cY0LxIyOa+WLpRpnxI;v zChTZH1hW^wBlu}1GTga6+suDcO*6C}oIFt8k%{XkX6e~o#2VsY!oi%Pax7EM{5v_G z>r0VG??#6y+g5Pm=&`XgC!RiWEVTfcskUpAX7?9cvkP-sTlho^&0tS2L6(bMrrB!D zO;_RYk`C25_<P-)_Vk(b#Mm>HBgbDDdzPU92gUA{X<99q8x@|09BIr1nYYD)W}F8i zUzlz?VZJSJ%+9-IaNc(2<V*}MagbdmwtucQ^=h@<*bkBHzc4#pZ?v-guPyFhdZcx} zdFArMkIgq9daU*6W3>-ui;ve|YdyrDi*x(W?4O&O+dI|F+STdlz3qpezgRh?B>yU} z(wo`V{(4Bu{Stlq=9Uby;9(WMc8ITM2h^IrwWYz*y3z*1wSB{-5n}60!=<6pP~W=J z0B=^8Ry)sz(w5RjVoFh1Q_lq(0eS<!?EfJUX-pPm01=8bCUfozd2PF7JrWE&2YrF2 zE+LYsLo)qI>xBeJft=UTrKqY?R)qfP<n4kxs2=_$$>N+p{;v~Y4^N<s$iOt8eNS=< ztq4lJ1SRI&z{IU2=q32ab#<;#ol_KtBnOknAP6Y)F=(j1DtU}A&R<K;k{Ha1kKI5k z9`8}3yQ90ZyMfMvc&nJVkQ%%|;7>NPsm%0Yl$kT$!ukC_e1B9RPPZ$#hrrnP{Gs&O zV`=5&sZ?@06*;A<KJwnD#~ljxDY#$3UIqIJM)eh=Yal}^QNBDFDfKAFNJ}psvob+a z+FZKZD7m3;J%}g-6(X(!F}D#n;)yyti1$ezIs&|dSc|V1A==jq6Bt`xl06y-0ZxD{ zmMIb-*VWOVBLK(=9zO=R1qUAkVZhYK820&1Ab_#ZLocmi%!7t*5b!qm4Rp2C?+%R} zjWP3ZsS~M(t2<K8FVafiPp~{ABlen)44qlzDO*pFFaX`*&|timhr;C4y6H&h)yed~ zdmuhQ_GKA}^kKgI2EVTXem5#6NUO<}4_OGycxMb#EvY(TlrqKNa`B^y3=A)8RHBt1 z;yDwZB|}5^uivotwzanznKT<wUykt0o}&4%){q&&X-Bf{R{Eeu+i+SB$VhV<;)1n9 zj^g=2;$xavLb)V%H9V2~phZAGDkR(;0wxJNm_z`TZc7GG`v%bS22i1{p^Tw=ezrsi z^;<|G(EN<5g`7e*NK-`5;t@>{@%Ib<uuJxQm<mt?S0(pe8}e7lKA3DNG_F!|5xr|5 zS^U$<)uE*IsZ!n{o8a;eZ7Zomd}*k+Lj%dBVfUfaEkIBrPfx#i7)r8JB@00;u<FT> z#ck#~so=Ug$<kE@hm!e!3#S`Mvd@+P4~?AvY)R4-z`WdF0OmGJ`a^ws?v^bjs9!e@ z%s=-xM^r%%e6Aaqm73RIwRQ3ujl*`iI+<PHr^uQl8|@PyRx3kK1-&Dg>#;EDm;38$ zG$p)to4)6suXWF7`>r|(Xq{sK8EfYzlLi($^ScN3&-%N!-_Y<sYGB)I4FQj2>o@&X z$Mdg_sEwEg1f|~5Ufr)wuD@Yqu7eT~=pE*~(;n>Bb2lrFW%cT6X)2n@49ZYMcUwQ! z8N`i-%v&zH>1N&RqAMm7%I3gBS7M?SwSBo$TgkP3*|lxHp|-&!`)WV3^xB%F`H<|m zlB;(lm)468n6ez5SeIN|>lbU2%`c;F{Xst;qv@L|(#DRz)kW^Kes-6NV9J$tc8|~k z1MXE!&dK2E(XtrHHxqcac`BdHw=g$NwHh-hVCZ347IRlmcY}TIE2qWuzGIDX4Ob>- zWe;dGA2`3zZe+#mx2##XCcCo>nN+(r6Wt3=?D<wqd94uMm&xd)iLmBLo=`~(^hC=U zUUE1QGbT-|u2UW{aJ8zQEJ^jAsZL`Zn9-c9NO$Qy);epm*aJFW(VWY<LhF>OaWGp; zSWMeqNKd$8rJcy9a+sWyR#R?iI{o}SS-*pn8z$>ejyM*WwWcJl)|V{)18G04|D?no z4ctn)k~$hVis_A$;+AI0V&lCN_3P__a-a(sqqTK#1WeIn`?{)m9?AX}RpZ$PteO^m zp-=<S=?dI_SAVD`yWg$ootDhspYTspfNV`Ex;($ee9>*SPN?Z(#uo$kWKAmmbdYPB zX_^oPBcttsd&;je3B*=ZZZFJDgI-e?Ft{w0nJXCmiVF092HH$rm}=DblpE6^<=AYq z5g68+E2i$kl45}KFK9s1k0@QEdfm(&BN1f447aUJW8F#jk(1A#I+PwOrXHRo>$8rW zX)QFmlaaPm#utyJr%#+5t8^#pp2eiwc;`utt!-^dd|Fk3B4b+ZS&MC&d1Esxaz^S` zL$#quvMg%M#YUS+wg)Nu>uSUvHD!gSDf&C)sfwO9coMUYd9$W3O4-71q?A5L{#2#@ z$VuUUV^nN$`NT&Ik`LQtQjBj8!!aS>&6j%2HX7JzSt#q(cCZjp^p1>?cAb059!;?( zPZWb$*pAZ0i_E&I=QJ3X{j%q?W1}0X5&=dRWjL|*0doah@yb+tGCjzPbgKeSU^TJr zK^!Tq7p9m+dDbgb@vL_YJUV^q(2--Q>`-o6hRHr}B{(=eTT7o(RfiQkuHaq;Vzi@D zEZtn18FQ}tm9mOJrV{lwJ)x8#0_ms~O-j?FN)oqQXiXW^Q|T@xiDcU8(?ztB9#d2k zi&jkC0o5|%sk$8McF(AM8;RK;CrDO|FvlJ+N(xCev);^4#-G)tjYi@?;4Qq1+4lyg zkMOh(!%%_VBP-TZW^4b@-Rnx5n62kE46Nm;$g`O;7?t|M%(Sj=Q{U#&2A+oc9xB~Y zstIOm_{q*;t^fClz@w$K^(AmG)bz!FB4&Pc;_oNt&>03~hLwTSMq;M#uvnQ`QR7x7 zi=Wqch3<HC;?GGn@8&~Bgk^UqS$xy^ta2Tlcr}rp88xxaO-(3==oE;FRY~j5+jIo? z$4jAKZ%gyD&P{!h8*LTQ)oGF?7Wt$~S{z+NSHqQ|FWGW+gdYvOEqQ`U&dxu>Z!>bF zA5*IkKifg@G}vFRvzR4Q5yBv|@gD=D7p8b(#V4x?a{6_I@i`uV1@k5F6S!ao(=3VJ zgfM(}I!d!eGNllj*)h>9MspIOuSnd+>?r11r)@kMGw$yn73HMwBM4h(W~MP$ZBLq9 zvc_CGrk5JpLnv4+^&>2>YVUNT8T?-zaM9N6Y&)&+w2Wk<S*qB3t1(?sS5`yjnL3*E z-2tv{Dy0*|$7~Z%Unc4X2bU2?Fk^H7=Vs>&ob(lv&8y%GG9e2d21;i%E9$v<Wov<9 zP3y{`mh>WkL3EzQ!{B=h7cNXKI!&3J#*&TF)Y|I#tm3@IgH}^JZ#+hlxJ3&pLMOj2 z`rUa@?aMeG(pq9Xa?G!&K`fLoEO+xR=^t7-2<zGegVArT7!Zu--qQO@HNDrMND7&; z$leVv0DprjT6YL{p^fJIOfdaIM7{0HAK$Q+DB?le9TnP+<&v%negwQ_#T2ab=g?=Q z_)S(b%@Tqdma_B^Y3U4smu=~l-r9I$W9>3RS*@LFYT@A3`vqBHO~PuxP=5~;)q6wn zgG4$UmEK9Aw;>-C22S823@3X;-3$gI0OugoaEt}#=unSwt;y`A1{6~n8?7xg78|vN zwpI@PIF)(5qgiXD;*zP>{@)Y86Fmz>yY1cAf#L8bFmi3FrWOmx`rj~olL)|(!RLyA z+4`g~PBIKg8jQR`RE@MgDA5xkF9gRGNsB2yGhG%<!gP%&MEbz9FApZIiI~!0rMl{A z6E9*y($CZx+s)Nv9*fQp5@)c$X=E&;F1=?*O$y^M%WN9%Kv~IUbEoOqD~(nxfhlbc zPl>s<Rd<%5cvr8~CYfHFbv3lQ2T3@Kx?XQws1~bZb6pjxw#;Zx3u}!={Yed(RMEt` zkF=cCDDu)+M$nT6OZSAHq5<p-;)^^mc9NAAvMr1b7Q1gSvbKjvd13bZpwf>{+?TIL zG4L8FQYnlnPUF*$Ht=A=KTRl48?nb?44|GQ)o6GO>|A0!fo}p;ivalyn1`6x@U)CT z6*+jqP-|DtFI8yFm|&}9SPFjy*%6p^P3@P7p~Ig4kd$C7LT#AvWl;UWd^t~g7ZehU zdIduXTLQ2a>j~R$k}Ulh@gS6zJTuT`?QVb?SMVFO*>@534bFwXBW^_#Ra*e9RW7C? zt>VSe!Ze5mM17Fb$}mBpQ$mAwmy|izPOX<Qv10nY&H9rmlmbu8e+K=o9s1qb=Do=P z<RN!e`H{*-fnk&0@(-q2vNP!_Yrex$5-zP(15rhnu(qL}qLTsuGM;TdO-*D7-`BaK zvfGuv#LW8=mc9VU^}xBV7JV+)uU}K;mo^4Grju(UQoIL%5$fs_FrLL1oB@5;ex64s z0yL{-z!PXtZ`b^{LG#Z_*MVj=p!wm_+4(n1q56vZgqHzpt{{xCVxfIu?}u_>&~7wk z70HZAEN4&RO~V8YC#cNwG>>QEHB4nc0voHnOFw>ym!eqDFMwlfo8q!K8CInx-QXFF ziRZe+zG@lstgzLn)~zcAWnSS$`Yozb>`*T+%*FDmiqz(ujMCSr;<?Ko2e;f}A^pS+ zkCt2(HLAU$#&v!6p$nlajWaiE;39Wn*3FkUSuK3(5OS&qMP3|G(Nw_p)1?f*CnZnM zR_kU|_zcZt_IL~7sFA8*ZEY>Z<iDz-8uX4kpUY>B#^qFoBTEr1uQ<xtX4`7ZT=4u9 zepJnir!kj;49DG^m{SN}YSWlztxm}Q?@Fs0Lr`znv2GPPvM891it(hH5BsY!gt*n0 z6bn|W3hhY}=taw?P(8)8E_<#YGEBLmSAUXN`X>~~*qk0GaFw{i;MmC1GL656)#IO2 z$XOx4QMCt6`HsF3m~lU-u)egFzY=%r`MXMHfWDzYy}O;%VRDR=ZfDZIp|r+}^W<Z? zZxRz02&0bh%l?qyk7D8lV?vt&{9*l-ocwW9pVzUDPJF+4uV?%4Z?SVrfYRa{(vu1f zy<l|-jvXwRx%#Kgz;E;V#%A$-@pBlb^LYILHqOIH()t@(z=KI66kx-Vh>*!M(K>y2 zjXtb*Yn7E5L23RHEd8h@HT<`iRR|I{WnyM$JF){<*m4H-(vEB*x3-PSSYsMY|CD0i zE)a?|pqwjMof<7uMEbpY`B}XbO;_vnN{-H^RO4BeURI`q3Ov;ieqNZaUd%j4jk!pp z-NjDVZ=Ejvj0%Y)0*il0v11B;SivrWWyE4lSKU@w<;3(qB{U9=4KxNhxAv`$2_V*` zAzTxBrY-_PjbFB#AdnL=iDLB{Vj3HD=`4)C*K4Sx?IVR2CbpI{m6<uulr@Aim+Nr2 zxm0xr|DS<9<{r$pY2ee(9|yOb>8pimUVVzSYC673O@Y??F}hjtQVTm^>CWf`mQwQC zW<$x-2IxWiU2+)p3ddd;^;4bgAqE9_Te}ispf*VpEELnX$zufM-SUAZ{mV4te-ccF zi3Chg_4}qI5&pjdjiHjw)-E^Nb~Oh;#e8ULrZI~*x>x|R>-yACCN!21`fRhF8<yL% z%LhJNuA(QEcC`IR-wjNbyaA^C>Fb&Uvb5D+5&`;;Q139m>>h#!4(zDEiF95zm!b5d z3ctzbn1Lh>i%Um~Q@JB5Ctd*8g>tbLQnVmc+7aUX!a}naup3bR#`J~s=ZP#M)K>BN z3R=}vyHfc%!AqS<N;T1q+NhuV_5>07Mz3UdM!L{FejODRTX@c>3;@#QH-KbBF7aOh z3Xyh50d?HyH+%jP%8x}y1;JtKQ>9|YR<S>JrQ&&I`bCvc!zdB-I-RAT<9Qk3CmN_! zq)Ar(XMxYO3)9yU#@4<u8{N_`so{E4sm#pQF{M^2={r0IApQoiZVw#0)oeNa0&VzN zwO`}S0?3LE!x6lV06$Blqd&=cmWf>80Q8c_ppvbSiQXO*I@D26u3H_4EHvMZEH!7b zQK`pU2Aqn;0Sr#1Wbr<K6jTZ$(swF?Vy2eZC{>zYK;dD9;0N=x(|Q%t>{9Z_MTAlT zvtOon`P%kQ*_pMhwllU7*wvvuS#6iS;o-_`>vCDk+_+6>k>k}ytZFP}2(F%u5~@WT z6m0oWft~xQkmV7a&dcYkwaaW>05K-nn^C>U;&FLFGXz&#TWHC{*6ZeoA<%!8EgGy$ zRK3)`uUsC(_Jh;J`9`g}zyi9YyPBz;6|Mm~S(qzlH7#Lwmf)+?SE_8%$QI_<=@X74 zFEpnXaZ+EJZp8M8$tvCPmI}FtFsqWkFVE^MtCZDgx5=-Xn#s@t{5KlqD~)ok%9fH^ zdjXr;5`Cc>mN<*{c-<!;R4%90sjQK?rWZBI@I*)u(k2nLXzx@uS<al@egr)u(qI+V zyII0frR7?19M2dW;9V_e)75M;oC&<<F~#VH&D{gCb4RvQP1W{~^NlhK4ztsE!+2Mh z8T-3(QF+wO`1M$TU!htPZMO^QTS^l;F@TJlqj(0)zS`(6w*-F|UoFtgvn@R=r<c8E zTlt840qGr4``sia!)t9wlqZ1w0$8P3?<LihCC_!A2KP?pP9QZE&>!(}%gP@o60))Z zy(2CWk*41_k(=J_q6kLeeoNB9q=Ct5z}do^ZH43PxE^!{7BW{l!d`0|oV3w;$SD|f zh8<a(@GX6Aox|IbH`(WnW88?}-YyS3eU$yx_OR3D>e$`8QL<Ya&AVmyeWb!hU{}a) znN4{lZdEfj@<`h(#Ml72J^ik?mMX1<X8Myw0@k2~RwH(8gj|KZXIu49H6_B*ze~_% z__v(bzr*MMiAG<DoG>LB36m#DUbH>J|6c2bkqQLZ>FkHDxP^QU8V0uu5aEOI{Asp- z#ZqAOJ0K&?$Sk6wxe_KbV-_ToRchD(U_!BEBKRyLXnuvyfAt2?^pRHl44N_tz~U0t z3mp51*t8DrXhy=^yay`%WKI811%IEwIt#Po9#mN7Rb`Pv3{$0=6+`nc1ppzqaKnnA zx}gMjU;I`gwx`$G!|EGSJx{l^1{z(d-YsCKgX|e0OD?Gca@bLn$%{f1<?-?W<R-{x zf14JaX|NY@D*P64*FmsK_BI=={2+)BO_E@-7MsgxxtfK<XA>a~U@E;ca_q#<5Z9W_ z;+kq^B;o)Bc!_L7N3-*q>$Ut*RXgLWJH31HYgAR_Dc5HkS#xLmCM~%j`cPBO&mzv; z47Z|Fl;*fANPF~#hW1J>%`P-AHbNAtDeiC475qUZZrKi6yIj49h9Q0(61TUNY7z3c z9iQxJ*ce-JRb!h#-^P|`$dVQH0RO%k!VU^O5L!?<r`JO8XSA~eqnHhb8Woy`21PyD zPFJ>fT>!H?7*{cb^3ENtod#F8aXms<^kFF*<CO{>%y*INlBiw?w51duuGl)AwJS54 z0EQ|2i$w)7@UANca{1Vd`J^%Tw?%4_%*n`l)}OW_cnA7wA~o^T4#`Pi1jj)zh4%~w zK&V6<Ck&MkpQIP5ns1qqvY(d~QOmWg(|(5?2kiF~MO&|U5ms)?ti5(#V|Q}R-2(PL z;zJ`ONuTeOkQs6yY5jz(enjd6$riF{V=H4cV#8&$Nb5(@0Zf*zU7I{}z5GM;?a1sL zcxL>93gtYCdl6oMt);!lR+9%xXbm-32E!gKT9+4AZq`=NW3gjuiq8YMTt&y6!J+W7 z(XB|665489T$rx50;RP}t$by2icP>*W*4TVb(c};TDhnivrRr$do0{5$gQrAO{f7= zEve^5uj$!~5UY_=s}&aap6U7RRHg={|A=qq&mx2LZ}J=_J86zJ0OI6-$V1E_JBUo3 z6!2HE&p0k*!K6{UYzZ@yU0g=o9?F~V<){+$8n)2>ttgjTw;lw?SC@96Y|3Q6q13^4 zb;1JXuMoLGUW{a0C1K?M1#0686Y__tW0wp(<$D(ytV*)ai2&+hx0senPa!6%tg?am zO+0N_UyMYuh0UU`#H-gf_Mowy_-u}qjb9%8N$F!bR%3t9v0D0&`Y~p&SE02qGuF2{ z2#Pj^$@siiY_8bM(P*-oMNYed_F$H(n#zQ2RbuHsQ}7!KzN+9i6^Jzia*12$KnPpu z1C?ZrFHi}aN&5ZDd;>}e-Q>W67B-XqU&`>i1h(>nUhj!TLUo}MEm<#w(w2k7t3pC4 zt@qr4{di;Fny%SOs;!YpP6{`&PV-H%&OoLNqzJZJtkt)UIt5*%qtrofJb+%H&9`pM z{UuoI$w&Sy`1R2OAK;-;j>LSGHvJviVQ2Li#g30rjHgFYEFt|{3jUpf&nxg?X=H8u zib>|5=h4V>VHwF>nqw?`oW~QCNst)Py&9c0ywT_kLFnPWYZ6x{^z*35z#5|xLQ7Ue zOofJS?=(x4l6v7z18Op9bZvoMa2RKo5gHOX0S%w;B3SGeEY$uaSe!c0VR7HbL+~&# z3Ts)mw|I<w>EG=~*i;zGzB^gGBmf<qs92uE{SfId=4+G^%E6xIA9XqK)~2yb#@WN5 z=s_GMay<bC$3J|H(G%1JP&l6DJNzg|iscg+v$3#T%x1Yq=cVea)l8m`xKlNyYD!f` zR$h?U)hhT+(k+x{d;C(5tM97aw%uT0U*$3Q*+14>FD#(O>A)D}tW6S)E#zO+d*RXf zDVUQYGu7;}a|!BM`Ugb@m0m`aSVcRS2)h$|g$qF!d;8_SwW04$i9Vr+ejU0HY=bTs zd1RFMh-~Nmq>oL_pe;`QS8y%n$^$&cRB{)u-SK7a?-SG2ne+APlaH&vv?<Ii>YX}Z z%KtecUEyvviIrDez(}nFP=30|0A4!72ubl8!*3)Rbz#~Ci#~@i=bz2ZLi>=%2v;q? zyME0@&G3hl>`(a%XsxckP)=EQkMD2-UFSRVKP`2(-eKgKWa<%_EJEkB*K}88r@zYU z^zSJ!JO7GevKj{4|EglYsX!dxSj%!P^4&Iqe?Z!e-0f{;7EUkU(7Nd#){t(b9olNY z9makKTHNiR@;ZJsF*hlG9kHwaFw7d)zGOtI7CR6uWMedPhlLnb_A0^LaQ)Du2VJjO zLwH@hDdS{17JpYJ^E}3oo4aL`Vift70CO=$cpLc`FKiUr_>7m{=cLM@^M%5vM|SF> z@Ubld^CQlU<W>@17PJ*~!VJMIWmWQ-fzGTY{40b$a!eIEhkkc>somJi7RI^Qv{Xz$ z*aMm*r<Q8@4n=R1cwVebGBe)^<wWy_(D}qIZq(|2U1<juj47}RcwVt91hg3g^HL=~ z-$+-&48k+%_^~6;9y?k&e(3aZGtwf*Ar-Ygp^@t96V^ayIk#+P>a}3Eo@<4dhPr~g zxRy(MTW-v)YXa`l^{MJbKdd2p{=LfOD_Cik+v0tmAu3?>j8OP)T9|;e(j4z#3Nq9u z@BBgg=-&-Wn<tA~X_(EiHVCpHrm;6TMr&=se_%M~A+2vK@^qONNjT@=#AE&gKAZil zOtM$xwE<&_q6PcG^>ReJ`9%cmS;r6eTk^P&H8|D$w<Pl;rTNb1i;uN_Ob8AKZ1Oog zlh`H@pC&^gMT)Qgnp@hb68zT}`TE-8>#O~B8bdm~u#+`DO#$e!nCD27OSJ+bb_gfS zm$Kw>!d7JT0?TMkc^$Eg7M66%Ks7jZJE^M_n|J<OW&14!UnK~XYn)%W7%GGGg7hyc z=<v=^o@Ht6+I~Vulz?1525Q%YSQpSfQcMf=j|msI(<-r3O@@P!YR#CFOzh28q!=TG zjU5?^<ym7W$FvEJZ`LR#FdcL};1r{W*luhs>$3xXKG!KEr(~v!Y0>svxafmH962CQ z{I1Klbh7lz3a%d}8!@mEHnJG%vz3$2dQx+vB-^1@OF*#5iJf&BheINKD$L#5#lh*p zg=o_r+4b;(0Ya_e568*~8M-SY`*{#$P-v~7oEs&Ig(7_Pq|lH7DaG(Yxv^-Jy-2~1 zrSu3p->2HLIkPsz609}nM#c_To!mEj;X?ijvf4vbshzTU-mV=iEJUUQO9_!cDs3YD z6@s4S293co0$!t!c%b7;g1LmAb|>ppuNqv|>VxRoeD_z0<Z%Am$>QSzwH~e69i12z zlraeb<&Lt}vXQ8x6PD(;Cj2|AsXGM`_mt4C%91E&UX*im;)0Y$)q@4dGf>$}v1<Mm zh456)qtN^eUT*jK{EM(eXod`Il7O*mc10ET)RdYDi_D*0Wof?Zd6ilbmLoGz(e#)_ zbgLov<~WwKQkh$-`M}Q#S`5Rbxn-z}Dxh8YUQD`y49)vYUKvh^jd~2fWWK+kVjVlu zy-F3FTQf>Cj%a8?Cy=sfUd_8KeB+e&f~v6TDqBV;IjbA3+39KdR{;6K({jkWgf|Xs zLWFB4$0oZBZ!C?48~K;iyI)jb4)%^>>bCWv^w$*=sM6n7a8SX2P$0`g`hP1JC;=2H zLz>ccH&j`J3)Ox-InvDv?o@D>f*k~1a&zpKulD{O8vSduBP$bOkN=9H6+;6<8%J&* zSvxc|)IT&b)HgJ;>Gq*b#D*<vgbG46Q{ktHfVYSn6d)-j+wwSxI_a`GqSav@z<VCy zcHp)=#14wSpsnUJN`y?IKIOr9%jAlj5H8A!$yp@CR%+ac1|Z2zrYAB%Vj;Ntllf+B zREe1|tRPAD1$kI5E%IzUXVR~os@9HiYn!oie<g<0)37CSrVRp{6Ci2~2;q`t`@Np) z?0J=YptRfmcyGu1R0Ej4NzfhBTRogPyTGUA)y8*p<(4)~$X|X4-wjR7HfT$Wb}*>_ z$F#Sh#-sm8mL2AoeV711^g20mSUICa4;iSh<+}kN<=A}OD1;(4aR&WVtMNskVZ1>I zmhLpnb|BDD67i@jVtahAFNOWSJ>>{L@t>fY?z+cK-;yH+;#QAA`VL?IK>>f2+JMTS zzct~cenJ_8LhJ&%p}#V35`ybpeM;HVy%gy7`aR(S@j2S{qw1W7Gzp(<bxWh{Zk36E zCF;=iol^=28xJI#bECIUQ+=Wb3AF^G{ZH&RAbc`3#N*W0g+c0(*9R?)mXXplxE1vE zxmKm}lLCkkUVD?wBsF~c86<Tg8fo+km>lXtY~O}E9ygq<UjrL7iCHvu;AG95u$y9w z6RJ!%#Tq(1k`!^)F6x-&X<;MXC;YKUyBQSKK10#M9(M!wYwRFx8G$O<QmHiNE0v!S zNHy&fNQap9#NRL!cjfgvWJtfDK!};{SBD=~@Yi^>Hc+X^K!J}i3Cq|ukHrtDQ^T}_ ziNxUA0R-)ECcoLyr%pW~`SRrGxhq#++Pm+;iCquw>ge-w>FEC9B=V2&QxV)Tr!_-S zu?KgJzI5Q+z6r&4|2N8xatwKt_G0;y<RATr3OzNthZo&PYSHt=uBX06L(I`6MmnT_ z8o-Ap01iu-!v^rYJz)c#S1U+INnnpXf<5A`lR7aFMVZIkA87t$sX3^L5d`oC^H|<_ z<#nrcZ({6*MWfcvCfo+G1o9zh0c8Q7ASS8bu2+y;AGSWMe9cGwZk3PC`WY$S*L@6K zTs2YJHJyW)TudJt;zO8WIy<!1>zbCl3;&^~3q$Yf0<~VG<wFTa=@6j`eZlvT9GzJ2 zBU>;k`tU{_5x2cWR<ITQ1_LA3MGCyZw%(kq1>~_*0y%wxz$@mt^{_Zft7eNK-ZI(F z*drzORN#m8p##>3d}5ZFs1MLGIhjm2k~;l3hXKVLp;2ws^23hA=VMcsPN&w1@n#n_ ze2&^-x_({_6RR0jL%pv)Kj14`mENxm;w+vngtYE>?$l<d*&TZWhhJ`!_IK0Rzb;~Z zKM`>tIVQ*+C_QR8-&Lr%Hid8EdBktEA7_+jlZM!9hcxa6JYWteAmx`^dq7%m24`## z{E&lC_qcFVDaZnJ>En)j28-iC5L9!0kqAPe{+h~EglwQrSR23Bc|ape938J%$cXH# zxrG~aS7xp1eN{^M(iWHL81ooL(C=(>ueWP!<M(gqo+8=8?Se~T{BOziMjxqbm07#8 z5knc|z^Rbl(XB~%ln8TXxccPH<%md=6OA}+)XDw=AUC(kJ@Mt}mhUXWV;(0qxuDza z92+#|L|>~>u4y{VO#vsu`>$(dluw(h>-e?pDPvT@^Cx#w+gE;pO6^YPb7{)#`FWMw zEb2bBNa_A+r^Y?5O+NfZt8gjWxi4?X&hivz%By}{`#M$Su5>4x<+GfPG<yXb4%wbN zdF0S@hfbY3dg#m{HHiASHp5pN=(8MXGS!-G>Xb)JK9h}R)El4AvIQNO$fxDN-nFWR z2fz0y@IuvuDXp8Md$6Mpd=CQ=4Lf!6^ofr}X`Jx$X5Orof@9uNH%o5*t({qUayEDJ z>p-f!H{Z@Mn`yT@AXC=SouAmbi&uX{8{JK{A7?MO(+Ouf2?E%q1^f_|r~Ap?fe3%k zclEy-_`qU|PcsLK)$`a}?X&6q1FBJyxZtbgaQZ8+WX6zJUJ0mKw=V|XW)E&ak*8ko zz<R^i{oXdgS^eIt4I4;4;Z={L9b<UzYs#UV>X=|GUjYerAA+ZO!V673YRCg~QIE~F z8;dn>dC%@6)6qDoq)Q|V&4o<m_T*!s0})kQ%y(_4m0svcV~%mQhkJS)qsF<QF<b5q zVrs+t7J8EE49&2<OXp-kNB4)gVKdds4Mrvo5Ap|2p0?9zsG~ovR{V^DdkMlEe_4-` z5*9(x@~+Z$t7maG%4^@2xr+~_`l<xN12iyM%T$_ux|{mf_sbm2K~8=B2!dgLn+bJP zBFpz0YY74Uj_}J~Aqf2lmY+wg_`t>aC*1>fj?m`>(x(){)DaX22l4MXs1_H^0hjfb ziJY&)MmeBO9+vqfFl+g?iRMUb;=xC<v(*KzfM+qN)WbRg=fzaDafdxb)!?c*^AhP* zr!UTemXkBe0;9?f4EqcB?JM{4HXZr-$}2k$?0n@F)nf|ft_Uj4AZK4*(IKgwd-v`o zUr-eF9HQ*3+=*ELsM&Ail~>>&?0ZsWH!a^=oX_s_X!+Z?clv&eMm_3J9|b0v#)7YU z_R4>nZ$z1JAL*=Jm;}6YtFG3^y8ZjeoxVa42rCsPG@3V+#&3BH4qiCcpjO(mIl4l6 ztLbWNHypknjNDYHCBjPSbVvAk298?7OdUJ}1@TLimQn(d_`h&Yn^4bGE_e=`t;7?< z9I;F9_$^b{#d7ndGjIHQpL(rPmD08<XmEfhjk|j+F2m$tASjKV(ogAHFDrr}rbBO{ zMi#or?fHj1PmXB%LBV-4W6viulLQlIhjcZaFf~%!h2mtyvGhs48mhOjFjia+l4b=u z>>MeNhOY#rjg6~F(GkyVIILSgUPd_I?zZR@d<2kAC7EKM!u<kv%+W&wmWA=IQjNTw z3$6_GG6})&0?mMG?>tc}$vLh~ttV^1N3`gv#)4e90^1}WmKh3?2|j!)%PMZ!enFu? zIXnbJC_*{?-20Cap}QashzEOL<cK*>e<8S|6FbcJjcm+K!7CP5VC(W|_UYuO@?|PG zJjHcZ(-}#~aBL}Tq&E2+;yV`Yo~|{TXo=dGkpk^Fh%01ol}Do-pQGg*D(k7)S>;-0 zYS!Sh@`^7ndIWpDxmgcE@TdU1j#oP4OuHa79b1J#2s;8@d8xYhwTJdTUYU4s^d;_w z(__V<6L(|B*xSjo&-cVxFWWn}G<vRnZr@Yq>QC*ei6d$ZJA<YL8s<n0mqO3Vz*0s` zv$c*)W?;R>7_aiR!I!*v5%L*%ZV4aD8E>$WfYAsh(fTE6UQtpJGhjH%mdmU!^3FaW z3R!xLcgS~T2UlVd@|XM}t}_L#Fo@WaQI7vq&o+<=9z+-Bf63o;Uo`*RqMe)aFbOkF z)V8IhMi$M^<DOx5>)B#&6wTL!aoH6DD*?xJczdmFHKKD6_?~hcchxx<Tvrs9V;_fg z?9t{d+l}%AvUY_!k<a|}{<?}-0o7I~9og+KGKU114)?|};2Oen=Y0s**r+xXhMK!s zF-dM~bf-Rk<~XM@=cjw8k5NndgL=7wz~?-t=k=({S`8oaY;}}FYpZh&-&NGUgLkLW zlV5l2$eGI6q34fPxErUaF_w+Qx#h}YHZBnb!_XlH;nFH{^Y`YK=#{M_?#FT-yDTnl zb;pj{YWERQ-FA|b!7zS^>eiyyZuebABOFyaVoKau!aW%}ENqzE(O53-XgoKX8yo59 zlP|q|F55N1g^9cFH<RQ8UAb)WX9=7mB~lc9WK=^DQaZN|2Jv7a5!Ty4h6vsorb4in zRB=ic-tn}^4<`NvK4hdhRMw?pxEGY!i!(V}4^<XbSlb1SlA7CVv0Yo+b94=ElxxCI z3xyl|F77K=%csIvknKH+A%Yte*vX#fI-rgEGv&Dh<wKDkDmD7`OnK*p+1c{w!}}iE zwbN}n5Z)UH%2Kl5)dpYe-~;vZdFTD~<ph_fsV>xT71&=iI9ht3#|kJA^ER+jo&v_# z;%xi$Se#-mWKTaRQm`rSlRSoo`=(y#i&k@&QSge0fhp>TI$U9tii7M~E6mm0AtC4n zkkZUt^xR?QL-Y*^3~qoiL_o2*O)|{F&qEgh*XDK>Db@nXBfapnGKXGB<`TF?){|5N z9xnc*ULKwJp~6NTR=lgiK*R)WQ$^;-tu2PC$jt6n^az4(3ocG|(k*}XItP4vBMZ}E z%~VP|ICGIoAqpD;OY^0?-n{tl^%Up4RDD;)Z)it2YzZ`R7WVG+43G)-xslX`CWq#+ z?+wKAQJAtn#Kh<)d21h%)Go_odi<(_!&KmvSSuYmvz_I2_O}o5lI;LfUZ99+Jvo!O z2X>)(rOJhJ%jqbhRT!yq?q}8%7Ck_cmTR@rG{RI~e@F1WTWkC7M&cW=_-@3lxu&j2 z0t%Ez_+>vpfPozyZ)rZqFvcMG6Qd@~vvL>OgI-za!p1a#fYGJJ0FuoLV5xb(^gN8Z zVf$q)RSZ|6a1JeOzh|2dV4}sYjEVO9lM+iI-tvi&HdKN*`pvdkxtdAI8S|b}Oat0z zzxRwTAC`K>e0h2*?5q2AE~3p;FLZCs)YeN<*=C6#{<_mA$C%K2xNW8qD17dv;rKKo z4;JODRYIOQ&9pCWaB&uSg<F!1sZhmU?^Z||lyGP^dTj#Iv19E!l<PYce3ybhLlAmy z=T>D6NcyaT9eOG1SCeghn)Hc_ndLew7=nV%7Gxi$hH^PKf=K7}0YL?jDl!yu1+bQh z`2$nyACU8g&Y<1Ux2a!;g>NZkJ9($OoU;S__g}ekWgkSlw~j4yA0Bl3=a%NCxTDib zN4CGFK2l*<+CI)hNL33@vqo5%4-oX4fhH)Rt<6phi{b@3=i5zuv)hhrKmYO%?Gw^K z1TX}_KIU%NU|Ok&t-Xan<Yr88Cv8=$a0^E|OAABf94A+I5SLNph$8a2o>e!E%J*ti zq}(N?I~j#s)CjWb@DYC5V+1#WEC56m-z@P1e66+!xI6+}Q+5H?O;nJB)jReZdv|0v zKsKEdRS2l*ykgfw&-k9J1cu~$0f^BRkNTe%5Ji9qhg0LKZXT*7oSM?~N9cN(U$%>& zQTQO~lr?)F>HL^Jxgp61so#+mg~w6$TNKH4JtSGiKJOWBBho^OJkWEq<_(up_;iCN zCn||wP1{%*mP_gI`8h<c(~4ilS>a^m*7O#aW@+K+j1ESKuU$c5vj=x*kMN)T;tOiV zzoNmCO`O;?)pm_6qsE4E8&%I^|HNY2(!M$Qsc}7$R81LCuS_-?(|LNRf>v{+x&hC? zy;q5#-5_tIeVAm?;FVHPuw74iM)>%(rhBF2AmG%cQXee@PGrv)>!L!|`XW;7OMoB1 zF)D1G(K#F%#B71Uy^^=W3C@heNTj1DFg_P&;O7dmGUQ6KR@g%My?(7tJqBLtdrjC; z&L#_3c@?m*>#C}$r}(ltkB@NbF0J^qr+iT*zp{ADON~A5v0lzNB0BoV)RO)e1z%Ml z)y9Tjo8@%Szl^LY#?oG&X+M&*JO<G89lrc|Fd$65tF))~ZY@3tF^b<2;(pH%#<=G$ z=ThT31C}opU^hpu2imfTsjE3|x>%4K_dPa&kQ#|F(;WwLJ#OVQd}bM$kZb|b5gEua zjsLHLmw=NDbVQ>VlHv4Mh%hriljB(5z<JF8%%hJ^d^Vp!Kv5zhzYza6FJBtZi4C#} zrk=fAq_EuXDq2maVDIr`saX(cXR~<gPe`$eBL^Tdk?dJ)fCIQ}O2_*tEyFX4+IJIG z@bY7FWG68n*X{J7JFe4sb9CvbXRHL6AcV3|U6>sEVeVB-oHYIC3jUS?lZnVYcGXD# z@?~ftw!g@ueM(urEH<%N*}AZtRt+_`rtbeWjkqR}$$$)qIuGD}C`IR($$ul}IA7v* z`ilgXpp{B}wpJX(ct!AeO<1iuy1}hpl}s0C!{^kQRkUMp#bDpinxR22RvqIOl=kye zi&M>-+NeK5@x%NwEkE2;jy8~>h*I2nZTFK*#jS+n*N8Cj;OsRbcIOp+aE?<)xT0Wi zBB6yV2O6G-&rj~p7S8L$L7Wfb?7m!1(PWEsHOC|-yn|aye4s4J_OC2s4!ww8>D1K9 zf};q(mJ#gl@cFL@?CL{OstphdA|yqZ&JhtefN@y1GKbTwo=YIS8pJjc$xFX_0-u_Q z*^Ldk`>b8iLMar%$C2KJVkoDxSRKh;0ZtvdK2*nhfx{egm~&VS(=tRYn?;(vCrjmW z*2z6qCU)g_GmCZWPoB41X%y%_OBBfKq%J3!QCZ96WJVlmZJnvpyr}TH&`r=nZjLaG z`mQcF%0C^8wg<{*C*x>Lz86Wd{=&sM!2~r;>Oi;S%G3N>AGUXebibYg+N)x4siGWS zMN7wGIS&4x$R-&~&J-5ym~LEX2fq+bT6=X3&eHvcd86l`N;50W=9dwJWw!ZMVelGt zYFOu@Z0?h*!n(eiuvi$~!RC+fkYlq|K@3*HW{k068tXl}jduthUFegGBN$4|WwOue zO9foLqZ7>O9fw<pvH8ZzF1~sGIyT$W9GN6q#pN{`{=Z54E&Ku{G~Vea_2Q2y_<Dk6 z98d}6-_?Lh5+o}%pgn4zhVuwNAG;y7FO+vr3*aZ{EAXS7t9(8AdWOk645hL&Q?GLH zY==;~$Q`%(eNFb!!)k)$A<(dL_d;9sc84P%DGW5x`0@bL;H1DTwwrd~zkE>l`QWk& z^uXdjYY^1HWQDbEnV}>bPV&p%B9J!8eOc9<q(TEfI&n(Iye00JMp?9wfReriBg-IO zm-nOYVHZZ-`<T5hvEwr7wGb&W<t2{|dS0*7VF)raa~C6QCN@oVDwHj81!il_(S#G( z%Yd^p*r!5pm#e`9;iC0opsGx8VUkFRxSt_Uhto4j<!qHs9X*hE_vG$on2<C7?$8&U zpW^^R+{|&JjJ!NC7;;7c%h*khVg!fe459x!TzhA?83mj1|JSvtc$0r7&K-ykamkaM zEB*(+Qtrj(Zg;$B*0~&}T<88(q)!ln`yM9NY(K-1!va(20W~7Fzw9YT8@(4syL;sX z>4&kn@B)1;44^SjmHj@}I=4|}DwApC>ky1dO7+|D8MVi%zd70GD7K6=C4$KT(GQM> zo_?EdN9^Y(EBtVNl*o;{KVDbQ-%+OzDe%&SCo6`~TLJ{>J;5#4*CE8@%VH3+bPx8k z@1uWYBU>p~+ID?9_i$*{)J**mA34k~n<VI{>~Erl_gKIFJGFKk7gTU4X<(%Bp~>)x z@!S09qm%VGBFotjAFI*Q>(%t_By`mDJYwVJ8=<?yk-EA&0~d~)x=xY{AH)ISlC@eE zC;a-k$uTGI9fkgVv^h6KdWW81U;K^`_jxv<25I3f=f2%8D{uN~z-Gkj$|zHty4pp) zTa9<NSm~l2HRC?@Q;lWf0xDjAp`$K}m9+5OMGKAF^LV$*7$8vXT0^Cd<5F(@ure5` z#L<b(xu=WDb?k@p+&0uL#XcL)fY1<oN`)E40G71Uj)d1J^_b8}&BD^+jWS^C(TQ#L zmhvUa$i3`G@*K#}kIer_!oRaR3LpydxvyF9H(U_OtAf9g@b4_$G(HPNW8I;P(`G%) zW-VR`{U(jNG?Vn36}(S@wA~)Q`^QO(*+Kmx=Z?L}Tf0}KKcv_(W#$*bEk}>r_;P5( z#*hbuA$O`dT4Q2TupPq)zrO9nZznd`J?L5BF?F0F5_$%<W3*|s%>1m2us?fk;|-RU zP)a=P44}`9VO*?-vh>k?9i}V~0Dxlv#4zGeBLO>RSDkxi%u|BjYXEv|Q1nE`zPMjf z{Ac-~?Djn-(5f#w$z@xBQD!Oq48}i8<lSIg;z~}d>`>m;a3KqzX%k#r$H<%v{qVH) zL;H!7weXQ)Cyr`>bgWz&@}VpSoX<9QqG3i2f2OFxGdP-}RX|EGm{Kx5B>gmUERz@2 zj+S>QRMCBEI@E>vfh`GKY>1i@2kG84%Z~6u=?<w$$BgRP#!~DJ=uWr<o>2I|jqy$Y zq)<R<AzT!*Y+1&^6*Ks-2G?dq23I=(Zs)hL6RQ={ME`rRA0*PtZRd6uk3K!2`)H?+ z!Y(H0r)D|kHsVD$NE=)(=9Ui@wwKy(voUvEAmInTbCH=kF7-}5FaUmyNXQz%0Fr5a z>fJU4&6qe_g%HO}FgC1eU~>o-_{idCgx#&bXB@W?lgeUOC_+SX%-cZuh!(bfSprO? zV5bRt(oj=8%>Q!2RrVBO=5(|7YVAs&gBh-oSo+CGTUZFoXI{@R^TJ8fq!rVwu}mEH zh34hv?3Jd>3aC#7!`GYiJB8Iocgqti?hU=LjIkoykulb#v~b?6n_TkaVCr3AW71#) zS#`SW`p}-`pb8BHH&Zs#KdtY5yAX$zWfD5lGCg+&S+nPaC)?GST;%9%C7pfAvO2dn zaz+K$;>k9jd)xG4Qno}fX2V!jzsYFwO)I3RepA0g(us#wK_p4u;$JCwt1rQ+;;n(? ztrf{zgUJQV+kMHW$S{~J?o8g6AJ;am`hYTThq)_F-e#mj?VC>%{+)eW^JpP+T$We^ zpyuRaNZMJI9VF##tLj_dwpR5-@dUypN&W;~=$haU_CN79!q5}}`j(c~s2yb6N;}Rr zw{(mEuZTs99D*e;PODi*C+fL_QQqD^=k^AJhiXVwRr-(5A%!F1iTOz-@L^HOr0A>2 zNrP|9N#?UXuc=S_RG)BTIFbcVcF1d6N!>tqGuetZ=tZ=H|7e8D{C09`{<jnUodsLT zBYGW30H`ukmi}L-ftg~a1mI8wOd|IB5&UPSnla}S(HQ;hB<XeN)T-C8hNF;CaS?3i z(MR=g+f5UnT;2Z78IAZAvx844+Icd4x$cYH$U5m5TR5S_)ns#wqHKf4i)a-oTqW+q z<bwt+quTgAI5)1Dv(1b7CryL5TIWkY2Q24Ab^B;*!fDuRSOHtz-_QTCb!`ND@cT+5 z{oDIDmRMNAposrlvZ^$~o@Po|UU%h=q3oUnANm3Eq(7+OFDUpS1v^yihZWPuZ*`B` za;*x$Gfp0Cj7k}^=Uiy_$AR;>H}?(o-Md}hez*6TrlqjycSJRO8$oaz=x_09Av8F9 zbmGG%KR<|WkX4I2gxN<Y?#Wkym<vJXU^nk`t*SJ?m*w0I%u}|zA{{ce#gYrHne3KJ z_TQX8=OtYw26?a?*Aak)BcFsxeaiS*ey04o#ZDP>QhD!_gdfg?g?j!lQWomW6b{=G z7z%}{%9ERWdDC6jh@q3(WvP)`3lm+%h?Do$52xrJnf6^8KMidHj)KAb-Nyeq+AG}t zzr?Hb7Ztpt;4|vPmlgX~#kxi!%i!-N&D4t%o3DFJe?+-{jG)`q<sn!ENODinS;XTC zY)9(|S95O2*0qoLLf(B`R<iHnYhDC!{QPV0xB8`rh`cs6m#2`A>XLo!^LgaT<aA9b z;+6Ve5YB#!&xXhZWx;!7B#b&dA((@_ZLev>Dx5!$gQ4VstCJsQ&jyoUFm9tTaWOkC z&*MU2G`jgt`X;9@$}UBEeU+4|?%U0N`=^sSw;}U(<odUqIY6C%QMY&LEoTq7ENT)L zenFhY<b`W;2c+xqZ3&<|O6aM)rU1fF%|&#Lm(cley?BETtV|Z~()k-lC)W9RV91si z$ff!J0?Ce-nuiO=3?vq+-wl<-KAf*z$&r#w40(I_^k4NR9BwbW9c5sBa+w+VUo9;j zk`fxn03MxqNJogU=AiRK)+Oxo<eOX|9FLc{ziflr$75w(GXJR(|NIFm*pQD+=`15c zjjdmIM;Q(jE}9Y3I=N(y)fjKvy@UZ)VgQoHoB!Y%`sBSHP9SMzD0VP0{D^#%>O3;2 zFH(g3v<Xg$ih|-CC^Etsq*AO{C{*@1jAc>a6o2epPNcboC!}~+cog4F%)6F#<pk$5 za0o$$KcA0+kait6C(tfV;#1qjy76Sk_SNI(^{aY)uYxfJuPBfP9wM!x$2W^da|C@v z?n2h0aUu*)mRl~xM4Z08#YfKlI2{aMFEr)#rF%>Fm2Mz&h#DA!{LuYM{x4XBAhWN1 z@io8Xe-~>VxH<DUpJ#(pXc$@tdihG!P;I3RP$!eaYChA^lHLr*`f6P_pYwP>mh13P z8rbh{a3tTXwee<E(T{F3&c7CCH@?iP@LKW!pV#9-1t(}+OtCid=n>WC5iM(Z!U}_w zf2VKL@LT34%8+$$G`H1><eA3Ic{T;bPRiq|T)<3!f-g7=DxtQ&;R)e8RE&<Cfr3jt z$LQcs+Syc<{-lZsJp)qdzfwIvr9^c;&z|-xL2!@u=!->@b!E^f&pFzvzV!11w;U~{ zDlc%ghdcPA!b&wW>07^2yC-x60_S$|)4Z-H?Aw5OBsPvozud^lUdk)e$+i_6Y$Lm! zWfC(bDL4Ae5q{Z^5rhyDuMQ__iy~wI2niDrcjESyPs(brxRCFs5J!r+(mB>mkwUf| zFQ($)M<>2cTp#*o?hmh$qK3s7z8*(0^|40>{@Z!Yj6Ys8**6!{NlhH;B$M?iM8tvQ z>{<BPM?Xemau<l*v>HMzS9{JW@!{7~O?j=9bw+%4;$%54IZpo#*~j8gCQW#!W<BhA zChts4h0Nw^W=mJ9)0caE_CC+cIE6`YgLlPw+t%iszYZH?#z&(rq&3yFT?o{tz*r`{ zzOXPI9HiBlPNzu-d?Rw}u}o9}{KSTTT{x!RC+x!ERv)y!ID2UmvzAnQC9LB<>+pGp z&p15e@RVtsJ$n~fP|ehL|LG?@%r8UD=`Og%Y8zvTKK^E(Z!8U`I80696o+mT%WG&I zaUto-q`?`&orN`)-FWoPq#)opOK@>HDeG^fb0?`0ll3<}`essPTdn0dO)ow0FN{4q zcJgf48m8)`di_RC*6#>EpBmlKyRgs_2m3CsNQl#KS>#K}08|iHm9kw<Ie4Teme&<} zLMBqUg24(>g$79q3r*tNvF>`1=P=)XANXP+z*!ysf2O+V273oB#&-={W4b!WNg-Cf z1NWF?kE-G67YWP-na1N@5Yg%)(d9$6^c@=YhXa6AOSQ6I>eThl!l2qMfEeh~G=SJ8 zLST&*b5j9p5<wa(!P(<_t85r^$-}x-F&+VbI6Ugp8*np^h&(q!d!8!B2saNj+T!gU zDu&sry8^k2cBC4N7?!`Q*g>WJ9SsnDNp#a;`uCLnD+D({pV1Ta)ivyt%LjUoKWEEv zSb?l*`H>QvaM6_!0)t>*O`z9LZS@d{u>xLDSGa!t>Qlg+x4LjJ?u$~{9G6u^!0R6g zE&`QNJ+M+h!-W=KH~u(S7Rjn6c-P9X0HQ`|{isG;uV14VKU8-k3|l47#ma%Yow}RC zk}%_Zk+kLOUHT#oS<~&*x|?)Lo-xrWaGet`@-^w81G7!<V}X?we5~lNbf&aR2JZPG zrG5E5(tQ(U)}EbPFAzu(4Ey)HNA@0Gb%DT~8c#9v5}nM$co$tZI(NEk&btun4)2BG zc6*QxQ!@)QThwJ?WPWV0TCU#_e%Uxdbgad^))UC)QK#6tAfv)=O%~DontN;}0}93f zW}$a%RMB9zJZ+L$z(%*tF%K<nBN2K${Ln+#!xSq&^;CJsMI!w9_(2cGjz{X{9XrB` zER^ZNCGiRK+Ab5dTD9Cu`NOmx!<FtP<__Jv1miX85ymko-b1Y6bA5uqE?A3`7~U@s z$@wS76zm>GD$yHPV&b6AW6&FGAs9~{Gwj**epjwnqZon9S~D}#k<v{5;>d+ywYEw< z_0$3X^TUqg2X;JvU`HGuax>tj{{S#sQ^Rn3LDI{@;o^-~_O7D&c-Gkh;9*!kj%J_G zn9fy-COx2GP#crd-qO$jXCl$9>j&UxNyriYt{mY5iGgGDjU3fu7-Cdfj|=Vf7F&wZ zJq%lrjvm2xLLU%~I~lK(^TSfJqLO%f2NE#`s<+G?2O<sKR!Rnxw2=f9Tn1OqsD-xb z$c7zbH)ck56phZp>DZY=<*EP5pDFd(t2RMT@~O_kg~s$GE#zk7?%D2z>Dg*K{Y|p; z(AW$WrXM3%#t|0f(8c{4Rd33MxR|vvPt_dvUYz<ich3b-X8lZNlSBkTuoX>3R>*>h z`J}a+XY~cxlVlV8Y7sYkEh3aXP;fse5DUz6arX|-1IYoh%|Di$WxO;(vAB>g33vo@ zuEtRO3z`y72fy`T&>$=>JG?)ORR9l2hqrkcUKl%ZCZ?}eiMo@=1-5i9<0yz{bFgru zepurm^Gd>f219*Ym<Q@Mo;9VoC+bVQ2>bs(5w^XfM{5HASdY>_(qB{X;|l(%f?ro4 zyi5Ouf`3KO?Wbe6S_w>li8lN`+}iFXTA^CIYG@e4|G?0SwF7H!8yZ@>!HYfTULSqw z<!cih)_u*s{x7|}|J=DfuTPxYeQx(v1(9%VBD)<py!_J3uTShgckSxA*Ig<O;wglK zF;;>&>@46d+@dv_b0^FO!4A6ib?`JWSou!nn0>Q+W=>?vts;l`#xXlI;7@*WdiFe* z#9l04SZH#wHwW){KX$e-r`svA^6uUCOMjg^=pNof@O}l4T-%p@kXrIv=UfRU#{+mv zGpot8hg<cQx9{G)y*#6{V%fFiJ=Rr@n{N1A=XaHznaZ$UV$jlVAx;FEskSb&8GGmJ zJGJ>}=e3<y4B9eyR*vW%J<iKM@<Mw0#EZu&&pdbXa2zKko3a;}^E}U=IQ{&gGe?eB zP9HmCVOE(^(>&+!g0qiqR8sn{DcVK6TaI&}Tyj>l6$(V0rxRgK?_`gY%39->Y0<EQ zConf@0AZE0LLhd>IcDGE!ww>aX)tREETY(22R4LpLUuXI+B&!RNJ*A8Gd(gKop@9R zyG6FqVXp9MgJ#2Uy#XDkKn`bOl?YKan7qge2xd6lru465rvZVrZRr=1#b3?kV3D17 zE0q0b$@&E|Xg+B}2;DemT?WG--wF}i`n~)tI95(D0p^KAC9Pg@p(IupJcLO1a*+zg zqb`&3veJZ98aWJEiXNSKE>WjBSB`ZrAN<a4Uyjude<IQ)0$6hM*>8w+(!=mrG#~rp zu$td4ot^(+=`8xeY1^E~EO~8m_wnwwidp5}y*u5>fTiaZOlbTxpyzx5i;*xr0frih z-{M7>8mo%^j!N81%-OgmD$qCGu9r5xzoQ&pKY5i{Y_I<}#C+gdYpOQsg^P+Y+|t}G zPslWN5)y7VW?bBJg;td#=5wP2M!zskE~#F!MsUmNLLfLVy4bBYFb`jkb!aVn6S$cV zTO?;ral^Qd1m@STV_LS6V|&R;jQ6u1KXc~P>ErCKnZ{K_#AP;9nVikM;^3u%BfOfr zp!0Vcc80WC>4I#`m!k@tQH19|G$^c=nk6=H@&|pf9`+|VH)tzwlDtXcpp1!P?ltA7 z177GgmzOB)P;W=mN57M@VlQkFvq^}GVOwvoVtFDL02rZ^&8w!KiG#z~H$iUb+h<~d z%&i$EvP&J}ZaM=Opb=LhH>ieU$<ihjt@C`&#HP2m=d?>DZ}j(*f$uec!UeJOID_a4 zF4CV2u+pidjmgQr%7(nQ*6-UszbSvzC%opXwxS-f3ZNvKc--gN`?j_U(`z`-7HhqJ z`vy)|K!DmI^Be-l?Z6C_U`MNxC+3f<N|lQq4J0@lM1%7$e8mOsNLpVhEj^U9xBAO) zhdX8WQyv4Y)V?dZbhoU<-K4YgUnvc=@3E8bmvR4cMU=#>OR;TYEk#mUm6g6BNhqRA z=DYkLc2l<(K%i-(8@+*9oPG|R(pBW9=^B{Fp8ff(Ee4-u)5Y0po`=<{6=jGW9kr^K z%uJ|UAX_;-cEV`NiM8wp@8GjljpHD<j?x3C8+FeD?xprr$1C{2;yB2>$1%suKqTRa zWWT?oIUvivseJyrw&ZLU$EuYiRiblo>1{s=v_JhX!fsj7j~q+SAf!L~!in_QQFqoU zV<*RsxwBVr?5e1)M%$fbLzvg<x^QuS*HRTHKAt&w<m7V|p!e$gA4&g{zM&TAZd}}o zT;Iu4m9dkN!+>EzgL|3a%cYDg`3S&<$x_^2E>*&L^2FkPgUkaLtG@Nw8H%QVpzo<X z>yaqIO!!;v*#D&sU+Ev}^(tOxlM8LG8ECo-r;oot|Bs$cV_i}#Aawdc*h2cBi!R_D zC2UAPMZ)s&Swk~-)cUm8?UOV&VS2@tr=`_>Yvq#0&)4#n*857JAr5oU0;8DldVZS- z`$^N3U<1E=!(4Ypa8M8sdW84jMuA}~LATeA-EtB0A8FF3)Mx2eI&X8ZKm8A+)p+zD z+87-F0U`}^{01BoMsL0klNQH^Eyc-5J`hRd&{;831xNV#s(=pbHx~(>1y?isfA{Tc zmQRN{r>9qr#k|U(6cl@A?A<gzw@f1Y9lrci1w0clA-{obfOLW7BtK6efJ988zXib% z_C)3~kC+hym;R&@k_yleN0gc0hw(MLi;fQ$`%Cq|PlD26P;n>%OT77g4b^gv*qYyT z4nyKNTl^)ar<cl0vkN=x*Hz`suGbZd6Q-!MK3l<8t+}V{D<im)gL_VN<p?ea3$D$K zLtYry)ktMJ5i2hG@ckKF>VRUAm3c!sT@}G0{23QWFahEqt1As=O_NpTQqE0E^|}h_ z5>~o}nl_1F@!?F$yhr7_hc%si);F_oFA7^=Tg64T<xJantL^LRqug%I)po~D-%fk4 zG<Hr;cOcm;ztGI87XlfNbabQW-1YTMqI^c%na(jPoH2HpV_n2gwU78|&M^0F2R>xV zr-k`;6K_5?n69g?HaR;>{wuDPNo4Pq<a|iFyMToaK@%eFU^%7}VPNp!Z`2F1+~qc4 zN~%~8S9EPh>*qu_(i4(lnYXk8R}=RT-S8^7i1dB#43fSQiVS4pN#N<T%|ke@GudNz z(l`fF;vFFs658@cFgT7J&pE^#Jr%0LOKh-k*_(eU`3BY^uitgFl`l!y<;rpB6iej` zK4H=-dG~gd5Ti`qrH_<*OW7qU3zu$5?R>yek#H)nHyTK{+bvJgIUAC*3@udCesc71 zx6@=xX=0DaxYg3aN}SJrG#~hq#%m4DN|1e97%kmMvaT<jdAp+TkQ)Au0{3~Fx}`$h z;8yp;67KT_m&TyFVrZRZjpfYA=JZlNXR4{4`UBWQ3d)$(h<Q)Ub^0{d(QBhBee2p_ zH}U|R2MIy8+<1lH%pDvu!KLSvQ+*pNk`Fd5!>q5srFz&|739Lg#G!N@&ST|PpEe$K z*OF7A%JM<i3ZSsWNb(N_X7L^!C>rS8MU8vk1GrG84PQ|sHFkrgDg8GkZOGFBjY<a# zM5%}Qaa&0b7QjrT1=(8%Tu>(4Kdb?%=Tx3N%P;!?fowZrk>@ftyI@GN!_7M4o`{A1 zXKb{&xf{VjY6_bk0%l>(6PunXO~nE?4DDYet9eN}K-ZR8)ixjaEkRolPHeo$4?gN* z#X+_B9fB?nJ9f+2#C8Don_blKB86GRdlVzm`!vG$6TDZ4{&)WWGW0tD;&1m1z1$kl zw5m-`qHeW2!%wDQ2tDR7GyFH196{(YC+e4o5L@sPS!ZITlq3AIGJ)m-C__*+dI|c9 zX9VzpH>AaMoi4;q(iIwIIg6zaDE1Dq9z8*CJ&R}6LFe8!WXR}J(k&+<HShNYNwr<a zoLf+e{FPt;Fa;_UI$PGy^;qVC2kXIF!F(b=znFDN@k^QEOBm^!V}2Y+MzW9RV8oD! zseG$;;9k@8Nsz^)XnSJsnzGUdJhP%c%5*Mx&DWZ{vcNF+@Y&LBS=)W<b!OXrw9Qne zBwvnaK`5J+pHguX*JEo+54W~uHV%ZZ<mZK_QjMK1e$$<7^lX&s*Emc1Ponc8jwUUy z7C-RN<IAnq%W5TszNd@-Q3&9bQ_LvbS=x6Gh;SFv<6u->-Y;xPAEHBDj9nhyFVgzG z0&P(d2Ry!~ng6}_*ucZI^=51!-FY1#mxc5Pq4al?K7b9<|8XLsW^+KMXuYJ5v76K8 z!*JeJlAzO4@&q`avxOJ(bv?Kw1yGvA6VABO74U>s!4sJE<vihg3Z7s;6Rdx61a7B- zSdD;V<R7KvjhrF)0niOq@oRI2A>p&wMR4t1ib=MFyX<bo9#kNDPc>t|fx^?hdb>}- zdtk<H${f~+#uWi!5|tOkCR4O_2EB)AT6D6az(>=xz<%13b{zB<mufuvkNE0geqK>% zeC_$3hF4<D>irK8k*&cR0N8}=&K=-m&4?s9m40(~A^IHH>a8IvW*aKPjbd6>whWWp z<0xnLj<6JkpFB&qUgbrop<H;~wlqLt5cCOc9^oG{jl9SPul(vbXVVs$ppDQa00H-U zTa6HhF!oxx_1xZKi+x3*>%_7uAjnbHrL@Em#}JwISPgkpIBKor{fdc^hx`5)mH9;l z#$Z?QQ9XWKff``R)virv%j|FEM&Bg_(bPRDZSB`~4{a+N>Ko+dg^_nnVBJgQ?TV{g z&SeGeJJo3ZX98>Ws-I{FFOTwo9YWp>?1KbvF5}i!7GDJ0KFE4&bE9};jz;pn1EE%$ z$M)jRX{$N;rVxF=+Q<3W0VC5^v!Qbc8kv~8H{GSbODt5=MPlinQt<COX<A)R`xPwn z`j4o%Qp;Yo!D7EaX)B~wa{7k*hqZqfadrAdEk)Fb`i~%Rm|yk`L9hrMAR2(q?n{9B zF+F$^51jqr{q)f4W4cNrw(&sbv5m(oC#$H-9uy|RI-3S(bRwxCz1?Z^3$yJ8i+U|P zQVd&16x7MZrWT!>S`+gsen-?oVFDvrcy9Cbo^Z(z{kVbyF)DK9P=UfpIIRks)eC{w zY?vOvTEXHscma@$?kHpWZ3@1hpvMgMB*mAHF1;vPL9L%^S1L!lox9OIdJpY)UX}o= z9JraKPm+>8MbK@$W4D~MJWd-9sO4hoTnB_~UtL<)Kh*D$gCJ60Wz-=F4cB3Q*WaJ= zCgKx9c-Ivw;WCm>jg7P-Dg7)>zkvva;8HT%KW}yg`;sR|@G_lcgNrJA%nxa1$b=9k zh6)MyA|#*GH-uzN@-|C~ishloL3#+;c!5aOl#nXJJ7ZPXmBKhC(jPN=SxnxrtvK9| zv>iEQU6;*$JLS^vP+-*j5TI<UZ?KtkhWzP4QhKKCmW|5V9rRm1-tX}F6B_R|L}Z*B z<}@VcYkix$n`Jb{NBF&GnaU~}SE-0=Rw`$@WM>2uBh=3wKne<#H1xJQgcqUEs4FEe zCX4tDf*H<nbmHN{NsnC!pcA1{i8FPH%M(vl3FQXyo|xaC@b9e9P#&oIaF6utipek^ z=rwnqwF5i4h;&NGa*dbWz2807y&ZaSR>8j)5)z5vmgCM*(D`h^D`IbvF3i2>#yc*o zW2HyPovKLACDrjtrQ3YRZh0RL(V*k%gK!A<j@yR%hgKE5?ktzk<NYEC>yPN*Fh3t( z8REZQtO#{@9n6g?V`-?Lh<;{n4-*mYStZMP5$37F@Ru(JblkeYNy$6aHRiqAu~SG) zCD_YhVxVG@TyZOJWG>dUmRHI0xStnrh3MW?sP5=NKU3rak({}ANwDhk__)3L34zO= zxjvjv#OKLU>lqUtij;|uxmGZKIj}mVG+*XKBW6`-x<T*3^G(yCNvH{5n>M=#GxQMR zf24>nTS%V~@P#q~e0H>|y7Y?#X8EnzD?YJexk>am?Yy872t%CCTU`x_uIC7Zp_?1x zRARY_@@d*oE${}S9I$a4ljw!1i`s~V!V94NN91*wpHGAcnnVR}z?rQW$V&-Toe%>O zIsm%)o7m}z^e1nkq}ah)5%!_SX8R#o?xg|PWXs-InKUuzwmq&qzuTC<U%B~*2(Se} zKCXdiVBp*iVT4*^Jk%EWt{yA$^(>qn2;5!xb@V%ZhqQ2Z{!5CX|Mut%CU_bIAmR;g zmx=qUolC_aC3q-%7HYMTHyW4hUO47kJ`oZ78YA#2pOFY`WG^XHHi6CY>?s}EBj6RU zLX0Z2xgktbR+T8ukg}oO#uV%(t#6aaz6gj1;1}y<5PX{lAG`T7he2i54{i8YCNY&! znOr2%5$CvJeU~CCLvsc>!_a5bs_1vg{sP?P7LSgJxrG*@9;`~fg|%GVXjyW&N9R?C zI>0a=o!D-jVK}*Vo45prCgDS`y74jwG5R^f<M%>I7=pzM3F2g=0b(ooZ4mH&iXe0q zAcU9zgmkxcMCc?u^VyR`++EH)a??pwn|HXWsKb|vD!@Mqf1lNBY*MJ#bA~qkcU|bt z^FMCGD{S{sB_5r)Q{Yy;{Ns{q>Q>kL(Q>ZQ`n4_(T#E9%Ec_h6<79MK9M)$&=6%v= zzMmlMK3oIq2>$nNdtn4h<LgkV;gmHyQ}}0!@XT609i9!f#|qF7=@a@+nu=<^s7HRc z{MZnG{u82ujru$eG5cV!7?Cg^tuEcgt}z>FMt6BrgyS!Pd;E#%13W899}#%=DmbV| z0V);8PEV<CpCx91u<&1Pw_9<Qt$Lh}>HRnAz3@io%4Mm2y-w?eVC2$WLvlKyx{vW9 z+Ca7*2;Oq_>!W-hGSmqo{3)$pW6;^-7T1x|2LPlt1#LyCtf{GDE25Gk{IU}SU?2Pe zqV+7%7z(Wj*N++3v3!B+$D9wkF=vs5HVQq_nKIshx%x%`*XZkEP+NOuZ{MseI|u@h zL~c3m#j2ui^wq|eO67Y5$yI8JP_KZQ`XU}<m{o~{zSWUZY{AY`%vdxjhDjB=6NnW% zui@YDY$;rQrElc~ekSF`G76jlPH~pGIOh@d!v%zlc9%OE1`c^JiIj1alXIMWAd#fp zCR_$(+q1RV>3yLt{jLhCw2g^zJW&WkIRP5Ur?Tq#%)5jv0prGISs1%FHg}b=^mBUg z2MU&VsM2S_o<FDY8KyA_9_4rOcN1RYdQQKj;1?Ab)wG;yzUT{a3JpZZf*n+zcN7R6 z(-#$}>MjyGcFPG_s*9A9up7bkhWkbahPH8Gp!#xp;XDJaGu*GgHBjVyn4d4GX%uTN zn2u23z$Q@cO?<3SnZm20M{Pq%Gm;6Z?K$g;ja@Capm<wl=c5h0iMej5R-NO*DZK&# zr#MW0p*^<{ZowU;j&1~@=%{t+0$3J^Aoqws0bSiqIn9+p?DIJ5dOAQaedbdSpP)BM z`Vv8Rh;I4l2w{Fwqa$8mhYUfU1T$2@F#A4&;EU3+Y#?EsYVmcc9<6T`DCB+tw?<>& z6r6`+i#WrCJ&qMFjCB;_otbZGo()kf<z5iU!aigs35~e9wVOnCmSIB?goS7al=8Bb zkv39;ZW(1UOHX_ytSQ+K)6R~ow2YBl9>oGg+<{!xHAy+9v60r}TgK70QJpacG^QAN z?)JkqT^`j{u^*3Dr^doLy*xT~q0A2On)ej#(xzNb^*SYBU~v$GcM)^9+fufV9gB@t z&qZS)@_X3XZ8YAvkQyrv@o2Q6fpv8w$XkXWEBaAi`gxW53FNl<--YRgY%=WL8bE74 zVG+2az_h4+7jKsl=VbBx8R48S`&bd@Tj{jE0fhQGw4)7uTXo{P=tvz|$<Kz8e@Y|- z65|irDDG92h=5_ADfNM*F|7hKgst!h<Q5Yxc!X8=H<CVWzGEY=FJ>v-Jh#zLnl-tN z*m-W%6nLl_0tbbzd5jO<CSD-S|AN2IBTcYnu++TUNvo3<dx6&o$JrCel8<m)QySs& zDmpn<46^o|O=$4cb?a}Ifpr}J_gPQYE&{txI%#-xoj@eP(M5OT#wqR9aEVhVP93uu zt34^?g6a8VXZ#fQMs}FwM-=GWE_J0k)eg}rh85UoOto!Nc-Zw-0HBz;X6m6^zNr>b zCTTw$|Gj_tP|s=+QUJL*GXvxQ--U&D(>7`6YdPv`*uP=^ALe-jrjQK?Vhu_9B?T75 zuY<qd1Q=j=M=xx}2N`?l%H6!>4E^J@;YZaiHClIltsNNJRHMZ<Qi{tT;aA+q7|Xyg zS}29tCmnc0a!do5?IDP*K~t|a%5X$(SHTs1j??5h<EN}sK}nsimQNi!RsO(3j~ESK z+FRK-@nCv}4~C>WOUwuXLZ+Xj$~X|}xMKVwxYbbdLaFXj=W6)Z8WnZrD}tHOH0k&3 z^tw}P1<U`TgRO%o?x1-3i^7_}so?)m@V6BFZ30hKd)x;<rOe+>U}QxBo{nwTSxQ>a zHafF*N={FmPi^bfsCr{N)p19*YW{fz->CxPp3}1zFGA>{FAwRJhQ-@p(^YiZpE|+) z1Fd%4fpbt5Re2NE&cCGGKdrPss{nk_fzViA7G`FaDji1RbCc`>pqY0_DqUp2c{;+V zShJAOO96J0s%5D_n+_?kx@$RT#}T`gtkDa7DJH$QE4E&N3?Xp}=_bXblcie-%-NXs zJV%eQn|(>?UsZ6Mx}aS=>0t#=DR@Z12NgW3;FN;0g2xq{Q-EaQ&TR#sP~gG&v|>M^ zz?K-bF&`0l3Z&6We@-v|vV#9j!CzDG1qHvX;O{8#oPHmT@&LVfEIoYk^s)2<YUOw9 z{nLsaSMYTTo>y>EK}uko$BFdgdVWE{%L-mmP*uR4BuP4}U|vB>fy(&i?iAsfq!`o^ z-%W5RJ#t)UhaCIZnPX$8Pn;Y(9lKJ$pj>}L!M{|XqhQkCRq(GB{I-JMQJ@W?>77Cq zZ4QpzO7dMxwU;8iJnZPUU5`5yJfOh7LUs=F!i83sQ!TlqPb<)*Ar&i2rwO`@!m(S< zErg>_%*@sorW;RsZt)LEKvh9qDMH2KZ@;et816ie^hFA}`_`4-9$Y)9!x?)1_78o0 zXldw94%S(>cHPj>(Egzf>sPHGhI0>XUNdyp=D#$wcJtkX{p>v6HnMBz_Mt(RqE?Wb zFRbk!*}ArWXzkF}p^aQ0F*r21dC%tKn?KF=n!dG<4c$K2zj?x6>Zi<IgQdGyZQZ?j n*WE*_IWS`D%E8jMm0Q=5x@qgCq1!gE*}Qf0hRq+`yzl=7d2=Qm diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/version.py b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/version.py deleted file mode 100644 index 3eebe18..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/version.py +++ /dev/null @@ -1,736 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2012-2017 The Python Software Foundation. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -""" -Implementation of a flexible versioning scheme providing support for PEP-440, -setuptools-compatible and semantic versioning. -""" - -import logging -import re - -from .compat import string_types -from .util import parse_requirement - -__all__ = ['NormalizedVersion', 'NormalizedMatcher', - 'LegacyVersion', 'LegacyMatcher', - 'SemanticVersion', 'SemanticMatcher', - 'UnsupportedVersionError', 'get_scheme'] - -logger = logging.getLogger(__name__) - - -class UnsupportedVersionError(ValueError): - """This is an unsupported version.""" - pass - - -class Version(object): - def __init__(self, s): - self._string = s = s.strip() - self._parts = parts = self.parse(s) - assert isinstance(parts, tuple) - assert len(parts) > 0 - - def parse(self, s): - raise NotImplementedError('please implement in a subclass') - - def _check_compatible(self, other): - if type(self) != type(other): - raise TypeError('cannot compare %r and %r' % (self, other)) - - def __eq__(self, other): - self._check_compatible(other) - return self._parts == other._parts - - def __ne__(self, other): - return not self.__eq__(other) - - def __lt__(self, other): - self._check_compatible(other) - return self._parts < other._parts - - def __gt__(self, other): - return not (self.__lt__(other) or self.__eq__(other)) - - def __le__(self, other): - return self.__lt__(other) or self.__eq__(other) - - def __ge__(self, other): - return self.__gt__(other) or self.__eq__(other) - - # See http://docs.python.org/reference/datamodel#object.__hash__ - def __hash__(self): - return hash(self._parts) - - def __repr__(self): - return "%s('%s')" % (self.__class__.__name__, self._string) - - def __str__(self): - return self._string - - @property - def is_prerelease(self): - raise NotImplementedError('Please implement in subclasses.') - - -class Matcher(object): - version_class = None - - # value is either a callable or the name of a method - _operators = { - '<': lambda v, c, p: v < c, - '>': lambda v, c, p: v > c, - '<=': lambda v, c, p: v == c or v < c, - '>=': lambda v, c, p: v == c or v > c, - '==': lambda v, c, p: v == c, - '===': lambda v, c, p: v == c, - # by default, compatible => >=. - '~=': lambda v, c, p: v == c or v > c, - '!=': lambda v, c, p: v != c, - } - - # this is a method only to support alternative implementations - # via overriding - def parse_requirement(self, s): - return parse_requirement(s) - - def __init__(self, s): - if self.version_class is None: - raise ValueError('Please specify a version class') - self._string = s = s.strip() - r = self.parse_requirement(s) - if not r: - raise ValueError('Not valid: %r' % s) - self.name = r.name - self.key = self.name.lower() # for case-insensitive comparisons - clist = [] - if r.constraints: - # import pdb; pdb.set_trace() - for op, s in r.constraints: - if s.endswith('.*'): - if op not in ('==', '!='): - raise ValueError('\'.*\' not allowed for ' - '%r constraints' % op) - # Could be a partial version (e.g. for '2.*') which - # won't parse as a version, so keep it as a string - vn, prefix = s[:-2], True - # Just to check that vn is a valid version - self.version_class(vn) - else: - # Should parse as a version, so we can create an - # instance for the comparison - vn, prefix = self.version_class(s), False - clist.append((op, vn, prefix)) - self._parts = tuple(clist) - - def match(self, version): - """ - Check if the provided version matches the constraints. - - :param version: The version to match against this instance. - :type version: String or :class:`Version` instance. - """ - if isinstance(version, string_types): - version = self.version_class(version) - for operator, constraint, prefix in self._parts: - f = self._operators.get(operator) - if isinstance(f, string_types): - f = getattr(self, f) - if not f: - msg = ('%r not implemented ' - 'for %s' % (operator, self.__class__.__name__)) - raise NotImplementedError(msg) - if not f(version, constraint, prefix): - return False - return True - - @property - def exact_version(self): - result = None - if len(self._parts) == 1 and self._parts[0][0] in ('==', '==='): - result = self._parts[0][1] - return result - - def _check_compatible(self, other): - if type(self) != type(other) or self.name != other.name: - raise TypeError('cannot compare %s and %s' % (self, other)) - - def __eq__(self, other): - self._check_compatible(other) - return self.key == other.key and self._parts == other._parts - - def __ne__(self, other): - return not self.__eq__(other) - - # See http://docs.python.org/reference/datamodel#object.__hash__ - def __hash__(self): - return hash(self.key) + hash(self._parts) - - def __repr__(self): - return "%s(%r)" % (self.__class__.__name__, self._string) - - def __str__(self): - return self._string - - -PEP440_VERSION_RE = re.compile(r'^v?(\d+!)?(\d+(\.\d+)*)((a|b|c|rc)(\d+))?' - r'(\.(post)(\d+))?(\.(dev)(\d+))?' - r'(\+([a-zA-Z\d]+(\.[a-zA-Z\d]+)?))?$') - - -def _pep_440_key(s): - s = s.strip() - m = PEP440_VERSION_RE.match(s) - if not m: - raise UnsupportedVersionError('Not a valid version: %s' % s) - groups = m.groups() - nums = tuple(int(v) for v in groups[1].split('.')) - while len(nums) > 1 and nums[-1] == 0: - nums = nums[:-1] - - if not groups[0]: - epoch = 0 - else: - epoch = int(groups[0]) - pre = groups[4:6] - post = groups[7:9] - dev = groups[10:12] - local = groups[13] - if pre == (None, None): - pre = () - else: - pre = pre[0], int(pre[1]) - if post == (None, None): - post = () - else: - post = post[0], int(post[1]) - if dev == (None, None): - dev = () - else: - dev = dev[0], int(dev[1]) - if local is None: - local = () - else: - parts = [] - for part in local.split('.'): - # to ensure that numeric compares as > lexicographic, avoid - # comparing them directly, but encode a tuple which ensures - # correct sorting - if part.isdigit(): - part = (1, int(part)) - else: - part = (0, part) - parts.append(part) - local = tuple(parts) - if not pre: - # either before pre-release, or final release and after - if not post and dev: - # before pre-release - pre = ('a', -1) # to sort before a0 - else: - pre = ('z',) # to sort after all pre-releases - # now look at the state of post and dev. - if not post: - post = ('_',) # sort before 'a' - if not dev: - dev = ('final',) - - #print('%s -> %s' % (s, m.groups())) - return epoch, nums, pre, post, dev, local - - -_normalized_key = _pep_440_key - - -class NormalizedVersion(Version): - """A rational version. - - Good: - 1.2 # equivalent to "1.2.0" - 1.2.0 - 1.2a1 - 1.2.3a2 - 1.2.3b1 - 1.2.3c1 - 1.2.3.4 - TODO: fill this out - - Bad: - 1 # minimum two numbers - 1.2a # release level must have a release serial - 1.2.3b - """ - def parse(self, s): - result = _normalized_key(s) - # _normalized_key loses trailing zeroes in the release - # clause, since that's needed to ensure that X.Y == X.Y.0 == X.Y.0.0 - # However, PEP 440 prefix matching needs it: for example, - # (~= 1.4.5.0) matches differently to (~= 1.4.5.0.0). - m = PEP440_VERSION_RE.match(s) # must succeed - groups = m.groups() - self._release_clause = tuple(int(v) for v in groups[1].split('.')) - return result - - PREREL_TAGS = set(['a', 'b', 'c', 'rc', 'dev']) - - @property - def is_prerelease(self): - return any(t[0] in self.PREREL_TAGS for t in self._parts if t) - - -def _match_prefix(x, y): - x = str(x) - y = str(y) - if x == y: - return True - if not x.startswith(y): - return False - n = len(y) - return x[n] == '.' - - -class NormalizedMatcher(Matcher): - version_class = NormalizedVersion - - # value is either a callable or the name of a method - _operators = { - '~=': '_match_compatible', - '<': '_match_lt', - '>': '_match_gt', - '<=': '_match_le', - '>=': '_match_ge', - '==': '_match_eq', - '===': '_match_arbitrary', - '!=': '_match_ne', - } - - def _adjust_local(self, version, constraint, prefix): - if prefix: - strip_local = '+' not in constraint and version._parts[-1] - else: - # both constraint and version are - # NormalizedVersion instances. - # If constraint does not have a local component, - # ensure the version doesn't, either. - strip_local = not constraint._parts[-1] and version._parts[-1] - if strip_local: - s = version._string.split('+', 1)[0] - version = self.version_class(s) - return version, constraint - - def _match_lt(self, version, constraint, prefix): - version, constraint = self._adjust_local(version, constraint, prefix) - if version >= constraint: - return False - release_clause = constraint._release_clause - pfx = '.'.join([str(i) for i in release_clause]) - return not _match_prefix(version, pfx) - - def _match_gt(self, version, constraint, prefix): - version, constraint = self._adjust_local(version, constraint, prefix) - if version <= constraint: - return False - release_clause = constraint._release_clause - pfx = '.'.join([str(i) for i in release_clause]) - return not _match_prefix(version, pfx) - - def _match_le(self, version, constraint, prefix): - version, constraint = self._adjust_local(version, constraint, prefix) - return version <= constraint - - def _match_ge(self, version, constraint, prefix): - version, constraint = self._adjust_local(version, constraint, prefix) - return version >= constraint - - def _match_eq(self, version, constraint, prefix): - version, constraint = self._adjust_local(version, constraint, prefix) - if not prefix: - result = (version == constraint) - else: - result = _match_prefix(version, constraint) - return result - - def _match_arbitrary(self, version, constraint, prefix): - return str(version) == str(constraint) - - def _match_ne(self, version, constraint, prefix): - version, constraint = self._adjust_local(version, constraint, prefix) - if not prefix: - result = (version != constraint) - else: - result = not _match_prefix(version, constraint) - return result - - def _match_compatible(self, version, constraint, prefix): - version, constraint = self._adjust_local(version, constraint, prefix) - if version == constraint: - return True - if version < constraint: - return False -# if not prefix: -# return True - release_clause = constraint._release_clause - if len(release_clause) > 1: - release_clause = release_clause[:-1] - pfx = '.'.join([str(i) for i in release_clause]) - return _match_prefix(version, pfx) - -_REPLACEMENTS = ( - (re.compile('[.+-]$'), ''), # remove trailing puncts - (re.compile(r'^[.](\d)'), r'0.\1'), # .N -> 0.N at start - (re.compile('^[.-]'), ''), # remove leading puncts - (re.compile(r'^\((.*)\)$'), r'\1'), # remove parentheses - (re.compile(r'^v(ersion)?\s*(\d+)'), r'\2'), # remove leading v(ersion) - (re.compile(r'^r(ev)?\s*(\d+)'), r'\2'), # remove leading v(ersion) - (re.compile('[.]{2,}'), '.'), # multiple runs of '.' - (re.compile(r'\b(alfa|apha)\b'), 'alpha'), # misspelt alpha - (re.compile(r'\b(pre-alpha|prealpha)\b'), - 'pre.alpha'), # standardise - (re.compile(r'\(beta\)$'), 'beta'), # remove parentheses -) - -_SUFFIX_REPLACEMENTS = ( - (re.compile('^[:~._+-]+'), ''), # remove leading puncts - (re.compile('[,*")([\\]]'), ''), # remove unwanted chars - (re.compile('[~:+_ -]'), '.'), # replace illegal chars - (re.compile('[.]{2,}'), '.'), # multiple runs of '.' - (re.compile(r'\.$'), ''), # trailing '.' -) - -_NUMERIC_PREFIX = re.compile(r'(\d+(\.\d+)*)') - - -def _suggest_semantic_version(s): - """ - Try to suggest a semantic form for a version for which - _suggest_normalized_version couldn't come up with anything. - """ - result = s.strip().lower() - for pat, repl in _REPLACEMENTS: - result = pat.sub(repl, result) - if not result: - result = '0.0.0' - - # Now look for numeric prefix, and separate it out from - # the rest. - #import pdb; pdb.set_trace() - m = _NUMERIC_PREFIX.match(result) - if not m: - prefix = '0.0.0' - suffix = result - else: - prefix = m.groups()[0].split('.') - prefix = [int(i) for i in prefix] - while len(prefix) < 3: - prefix.append(0) - if len(prefix) == 3: - suffix = result[m.end():] - else: - suffix = '.'.join([str(i) for i in prefix[3:]]) + result[m.end():] - prefix = prefix[:3] - prefix = '.'.join([str(i) for i in prefix]) - suffix = suffix.strip() - if suffix: - #import pdb; pdb.set_trace() - # massage the suffix. - for pat, repl in _SUFFIX_REPLACEMENTS: - suffix = pat.sub(repl, suffix) - - if not suffix: - result = prefix - else: - sep = '-' if 'dev' in suffix else '+' - result = prefix + sep + suffix - if not is_semver(result): - result = None - return result - - -def _suggest_normalized_version(s): - """Suggest a normalized version close to the given version string. - - If you have a version string that isn't rational (i.e. NormalizedVersion - doesn't like it) then you might be able to get an equivalent (or close) - rational version from this function. - - This does a number of simple normalizations to the given string, based - on observation of versions currently in use on PyPI. Given a dump of - those version during PyCon 2009, 4287 of them: - - 2312 (53.93%) match NormalizedVersion without change - with the automatic suggestion - - 3474 (81.04%) match when using this suggestion method - - @param s {str} An irrational version string. - @returns A rational version string, or None, if couldn't determine one. - """ - try: - _normalized_key(s) - return s # already rational - except UnsupportedVersionError: - pass - - rs = s.lower() - - # part of this could use maketrans - for orig, repl in (('-alpha', 'a'), ('-beta', 'b'), ('alpha', 'a'), - ('beta', 'b'), ('rc', 'c'), ('-final', ''), - ('-pre', 'c'), - ('-release', ''), ('.release', ''), ('-stable', ''), - ('+', '.'), ('_', '.'), (' ', ''), ('.final', ''), - ('final', '')): - rs = rs.replace(orig, repl) - - # if something ends with dev or pre, we add a 0 - rs = re.sub(r"pre$", r"pre0", rs) - rs = re.sub(r"dev$", r"dev0", rs) - - # if we have something like "b-2" or "a.2" at the end of the - # version, that is probably beta, alpha, etc - # let's remove the dash or dot - rs = re.sub(r"([abc]|rc)[\-\.](\d+)$", r"\1\2", rs) - - # 1.0-dev-r371 -> 1.0.dev371 - # 0.1-dev-r79 -> 0.1.dev79 - rs = re.sub(r"[\-\.](dev)[\-\.]?r?(\d+)$", r".\1\2", rs) - - # Clean: 2.0.a.3, 2.0.b1, 0.9.0~c1 - rs = re.sub(r"[.~]?([abc])\.?", r"\1", rs) - - # Clean: v0.3, v1.0 - if rs.startswith('v'): - rs = rs[1:] - - # Clean leading '0's on numbers. - #TODO: unintended side-effect on, e.g., "2003.05.09" - # PyPI stats: 77 (~2%) better - rs = re.sub(r"\b0+(\d+)(?!\d)", r"\1", rs) - - # Clean a/b/c with no version. E.g. "1.0a" -> "1.0a0". Setuptools infers - # zero. - # PyPI stats: 245 (7.56%) better - rs = re.sub(r"(\d+[abc])$", r"\g<1>0", rs) - - # the 'dev-rNNN' tag is a dev tag - rs = re.sub(r"\.?(dev-r|dev\.r)\.?(\d+)$", r".dev\2", rs) - - # clean the - when used as a pre delimiter - rs = re.sub(r"-(a|b|c)(\d+)$", r"\1\2", rs) - - # a terminal "dev" or "devel" can be changed into ".dev0" - rs = re.sub(r"[\.\-](dev|devel)$", r".dev0", rs) - - # a terminal "dev" can be changed into ".dev0" - rs = re.sub(r"(?![\.\-])dev$", r".dev0", rs) - - # a terminal "final" or "stable" can be removed - rs = re.sub(r"(final|stable)$", "", rs) - - # The 'r' and the '-' tags are post release tags - # 0.4a1.r10 -> 0.4a1.post10 - # 0.9.33-17222 -> 0.9.33.post17222 - # 0.9.33-r17222 -> 0.9.33.post17222 - rs = re.sub(r"\.?(r|-|-r)\.?(\d+)$", r".post\2", rs) - - # Clean 'r' instead of 'dev' usage: - # 0.9.33+r17222 -> 0.9.33.dev17222 - # 1.0dev123 -> 1.0.dev123 - # 1.0.git123 -> 1.0.dev123 - # 1.0.bzr123 -> 1.0.dev123 - # 0.1a0dev.123 -> 0.1a0.dev123 - # PyPI stats: ~150 (~4%) better - rs = re.sub(r"\.?(dev|git|bzr)\.?(\d+)$", r".dev\2", rs) - - # Clean '.pre' (normalized from '-pre' above) instead of 'c' usage: - # 0.2.pre1 -> 0.2c1 - # 0.2-c1 -> 0.2c1 - # 1.0preview123 -> 1.0c123 - # PyPI stats: ~21 (0.62%) better - rs = re.sub(r"\.?(pre|preview|-c)(\d+)$", r"c\g<2>", rs) - - # Tcl/Tk uses "px" for their post release markers - rs = re.sub(r"p(\d+)$", r".post\1", rs) - - try: - _normalized_key(rs) - except UnsupportedVersionError: - rs = None - return rs - -# -# Legacy version processing (distribute-compatible) -# - -_VERSION_PART = re.compile(r'([a-z]+|\d+|[\.-])', re.I) -_VERSION_REPLACE = { - 'pre': 'c', - 'preview': 'c', - '-': 'final-', - 'rc': 'c', - 'dev': '@', - '': None, - '.': None, -} - - -def _legacy_key(s): - def get_parts(s): - result = [] - for p in _VERSION_PART.split(s.lower()): - p = _VERSION_REPLACE.get(p, p) - if p: - if '0' <= p[:1] <= '9': - p = p.zfill(8) - else: - p = '*' + p - result.append(p) - result.append('*final') - return result - - result = [] - for p in get_parts(s): - if p.startswith('*'): - if p < '*final': - while result and result[-1] == '*final-': - result.pop() - while result and result[-1] == '00000000': - result.pop() - result.append(p) - return tuple(result) - - -class LegacyVersion(Version): - def parse(self, s): - return _legacy_key(s) - - @property - def is_prerelease(self): - result = False - for x in self._parts: - if (isinstance(x, string_types) and x.startswith('*') and - x < '*final'): - result = True - break - return result - - -class LegacyMatcher(Matcher): - version_class = LegacyVersion - - _operators = dict(Matcher._operators) - _operators['~='] = '_match_compatible' - - numeric_re = re.compile(r'^(\d+(\.\d+)*)') - - def _match_compatible(self, version, constraint, prefix): - if version < constraint: - return False - m = self.numeric_re.match(str(constraint)) - if not m: - logger.warning('Cannot compute compatible match for version %s ' - ' and constraint %s', version, constraint) - return True - s = m.groups()[0] - if '.' in s: - s = s.rsplit('.', 1)[0] - return _match_prefix(version, s) - -# -# Semantic versioning -# - -_SEMVER_RE = re.compile(r'^(\d+)\.(\d+)\.(\d+)' - r'(-[a-z0-9]+(\.[a-z0-9-]+)*)?' - r'(\+[a-z0-9]+(\.[a-z0-9-]+)*)?$', re.I) - - -def is_semver(s): - return _SEMVER_RE.match(s) - - -def _semantic_key(s): - def make_tuple(s, absent): - if s is None: - result = (absent,) - else: - parts = s[1:].split('.') - # We can't compare ints and strings on Python 3, so fudge it - # by zero-filling numeric values so simulate a numeric comparison - result = tuple([p.zfill(8) if p.isdigit() else p for p in parts]) - return result - - m = is_semver(s) - if not m: - raise UnsupportedVersionError(s) - groups = m.groups() - major, minor, patch = [int(i) for i in groups[:3]] - # choose the '|' and '*' so that versions sort correctly - pre, build = make_tuple(groups[3], '|'), make_tuple(groups[5], '*') - return (major, minor, patch), pre, build - - -class SemanticVersion(Version): - def parse(self, s): - return _semantic_key(s) - - @property - def is_prerelease(self): - return self._parts[1][0] != '|' - - -class SemanticMatcher(Matcher): - version_class = SemanticVersion - - -class VersionScheme(object): - def __init__(self, key, matcher, suggester=None): - self.key = key - self.matcher = matcher - self.suggester = suggester - - def is_valid_version(self, s): - try: - self.matcher.version_class(s) - result = True - except UnsupportedVersionError: - result = False - return result - - def is_valid_matcher(self, s): - try: - self.matcher(s) - result = True - except UnsupportedVersionError: - result = False - return result - - def is_valid_constraint_list(self, s): - """ - Used for processing some metadata fields - """ - return self.is_valid_matcher('dummy_name (%s)' % s) - - def suggest(self, s): - if self.suggester is None: - result = None - else: - result = self.suggester(s) - return result - -_SCHEMES = { - 'normalized': VersionScheme(_normalized_key, NormalizedMatcher, - _suggest_normalized_version), - 'legacy': VersionScheme(_legacy_key, LegacyMatcher, lambda self, s: s), - 'semantic': VersionScheme(_semantic_key, SemanticMatcher, - _suggest_semantic_version), -} - -_SCHEMES['default'] = _SCHEMES['normalized'] - - -def get_scheme(name): - if name not in _SCHEMES: - raise ValueError('unknown scheme name: %r' % name) - return _SCHEMES[name] diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/version.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/version.pyc deleted file mode 100644 index 08b02bb84e997a084927ef810538be1dfb41548b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29804 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 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/w32.exe b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/w32.exe deleted file mode 100644 index 732215a9d34ccb7b417d637a7646d9b843ecafa8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 89088 zcmeFae|S?>wm*FGqitH!CO`{C3REl(SahnPNDYM`O{q#T7)Xdvz$<hz5gjb&0FD$| zPs=nt#$jgk-tk`NUb*PJIy$3wMg@OiORy=5PEkZ0P^;6cyPm2=Y8#~Xyq~pC(iU~@ z_dd`2ywCg3TS)e=wSTX@_S$Q$y;FJf9>F9Cf*Bu86NCeB>CeT#|L3nblC!40kR?2m z{>H@z3`^g*ct!B1Tk<#8{Ol(+x7?n8>n(TO@iQ_1pEl;#NO$D_^p5<p8@>6r|7^p? zD>5@P3KB)%InlPUc<U{5lb_$uJ2!U@!dIxT&CTYnHuoCtzCL#`-1%8w%`JjkymkHD zpYr&>Cg9H}+(GW%^wV2|ROUbGfyXTfOART)i?<!WISJD#7!6|#8G`TvV*Xu^z32+K zc6>T0?9%;4K}Zn{6fx`yPa}*$9C+R!7zI~72c&$InY+UdMGBkF3c`HyxD3K09`bzW z?_q;rO&5ec#{?noJ4vI19bbHBt~vx^h2FH$V8i|^#EsiUg#JboP3@w-(&Uf&%NK<8 zSJZ5{MZ852W)~s>WeT(LIf&1wKNqULLI)GN_(-E-D)X~ZK=1;t<%*guHMhdg`-(mb zHzDv1KBN9zR9?--O+N$ReOXAr81V9z!X5SJ5`=3<1^<8V|AP@&sr2}Qvp;hQT24iW zOHg|EiZd1ojV;oo#(r^ba2`^8T22{~_UQ@YMZp7O1R*2@?SerFE~TuJB_wDaYC0h8 zfONF1t%{=H`W`bdYp+>YBsg9Ty9ec3iy+O3xa}TIvPK#Q&udyx1MvwG0(#iaGC|N| zJ#3?<Y4YLRkU`54s9BYRjyISA>){9$tW;Y34lPnX=&>D4X~|k7c$TwEfOzs@Yh#Nz z`FV;`(w!E`sKg@`2E}bDY>ku^4XS@tV(WO*<eu67;0Clk;vRHp!Qf<+5w0B!*Y>g? zYH=KK#%%Yu1~&m>IlB^#2^syGG|2AB1(}4aOcaC%!)}%`I7AIC2(Ro3yW`GSttng^ z_xb=ECor!L{-PNO>_ulJ3%fm=O0X!s%)$GZ?~I94l-^KEAX0n$?4wGpr7&i4#~)OB zQD%2NrWUKtZuYT1Vnu}AeF`cSgx>Rkk@}Lg{WltgT76VeA2aic`cTnpXrt2WXmJkM z9%u<Rp-*9{$HQ)>Xm?McyDyZ28Ux7mpxy?mnmvzMMr-85vkRrJLaDRx>|I7je+cM+ zj{RJ(3Vrgke;W@#D!y%U%fQLtlPKTAzWtVuOQdXpwsy6eRjt^cZ%0D4bF7$F;f!th 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ð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 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/w64.exe b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/w64.exe deleted file mode 100644 index c41bd0a011fd760ce20ba795d9e535e0d2c39876..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 99328 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 B=L-M; diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/wheel.py b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/wheel.py deleted file mode 100644 index b04bfae..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/wheel.py +++ /dev/null @@ -1,988 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2013-2017 Vinay Sajip. -# Licensed to the Python Software Foundation under a contributor agreement. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -from __future__ import unicode_literals - -import base64 -import codecs -import datetime -import distutils.util -from email import message_from_file -import hashlib -import imp -import json -import logging -import os -import posixpath -import re -import shutil -import sys -import tempfile -import zipfile - -from . import __version__, DistlibException -from .compat import sysconfig, ZipFile, fsdecode, text_type, filter -from .database import InstalledDistribution -from .metadata import Metadata, METADATA_FILENAME, WHEEL_METADATA_FILENAME -from .util import (FileOperator, convert_path, CSVReader, CSVWriter, Cache, - cached_property, get_cache_base, read_exports, tempdir) -from .version import NormalizedVersion, UnsupportedVersionError - -logger = logging.getLogger(__name__) - -cache = None # created when needed - -if hasattr(sys, 'pypy_version_info'): # pragma: no cover - IMP_PREFIX = 'pp' -elif sys.platform.startswith('java'): # pragma: no cover - IMP_PREFIX = 'jy' -elif sys.platform == 'cli': # pragma: no cover - IMP_PREFIX = 'ip' -else: - IMP_PREFIX = 'cp' - -VER_SUFFIX = sysconfig.get_config_var('py_version_nodot') -if not VER_SUFFIX: # pragma: no cover - VER_SUFFIX = '%s%s' % sys.version_info[:2] -PYVER = 'py' + VER_SUFFIX -IMPVER = IMP_PREFIX + VER_SUFFIX - -ARCH = distutils.util.get_platform().replace('-', '_').replace('.', '_') - -ABI = sysconfig.get_config_var('SOABI') -if ABI and ABI.startswith('cpython-'): - ABI = ABI.replace('cpython-', 'cp') -else: - def _derive_abi(): - parts = ['cp', VER_SUFFIX] - if sysconfig.get_config_var('Py_DEBUG'): - parts.append('d') - if sysconfig.get_config_var('WITH_PYMALLOC'): - parts.append('m') - if sysconfig.get_config_var('Py_UNICODE_SIZE') == 4: - parts.append('u') - return ''.join(parts) - ABI = _derive_abi() - del _derive_abi - -FILENAME_RE = re.compile(r''' -(?P<nm>[^-]+) --(?P<vn>\d+[^-]*) -(-(?P<bn>\d+[^-]*))? --(?P<py>\w+\d+(\.\w+\d+)*) --(?P<bi>\w+) --(?P<ar>\w+(\.\w+)*) -\.whl$ -''', re.IGNORECASE | re.VERBOSE) - -NAME_VERSION_RE = re.compile(r''' -(?P<nm>[^-]+) --(?P<vn>\d+[^-]*) -(-(?P<bn>\d+[^-]*))?$ -''', re.IGNORECASE | re.VERBOSE) - -SHEBANG_RE = re.compile(br'\s*#![^\r\n]*') -SHEBANG_DETAIL_RE = re.compile(br'^(\s*#!("[^"]+"|\S+))\s+(.*)$') -SHEBANG_PYTHON = b'#!python' -SHEBANG_PYTHONW = b'#!pythonw' - -if os.sep == '/': - to_posix = lambda o: o -else: - to_posix = lambda o: o.replace(os.sep, '/') - - -class Mounter(object): - def __init__(self): - self.impure_wheels = {} - self.libs = {} - - def add(self, pathname, extensions): - self.impure_wheels[pathname] = extensions - self.libs.update(extensions) - - def remove(self, pathname): - extensions = self.impure_wheels.pop(pathname) - for k, v in extensions: - if k in self.libs: - del self.libs[k] - - def find_module(self, fullname, path=None): - if fullname in self.libs: - result = self - else: - result = None - return result - - def load_module(self, fullname): - if fullname in sys.modules: - result = sys.modules[fullname] - else: - if fullname not in self.libs: - raise ImportError('unable to find extension for %s' % fullname) - result = imp.load_dynamic(fullname, self.libs[fullname]) - result.__loader__ = self - parts = fullname.rsplit('.', 1) - if len(parts) > 1: - result.__package__ = parts[0] - return result - -_hook = Mounter() - - -class Wheel(object): - """ - Class to build and install from Wheel files (PEP 427). - """ - - wheel_version = (1, 1) - hash_kind = 'sha256' - - def __init__(self, filename=None, sign=False, verify=False): - """ - Initialise an instance using a (valid) filename. - """ - self.sign = sign - self.should_verify = verify - self.buildver = '' - self.pyver = [PYVER] - self.abi = ['none'] - self.arch = ['any'] - self.dirname = os.getcwd() - if filename is None: - self.name = 'dummy' - self.version = '0.1' - self._filename = self.filename - else: - m = NAME_VERSION_RE.match(filename) - if m: - info = m.groupdict('') - self.name = info['nm'] - # Reinstate the local version separator - self.version = info['vn'].replace('_', '-') - self.buildver = info['bn'] - self._filename = self.filename - else: - dirname, filename = os.path.split(filename) - m = FILENAME_RE.match(filename) - if not m: - raise DistlibException('Invalid name or ' - 'filename: %r' % filename) - if dirname: - self.dirname = os.path.abspath(dirname) - self._filename = filename - info = m.groupdict('') - self.name = info['nm'] - self.version = info['vn'] - self.buildver = info['bn'] - self.pyver = info['py'].split('.') - self.abi = info['bi'].split('.') - self.arch = info['ar'].split('.') - - @property - def filename(self): - """ - Build and return a filename from the various components. - """ - if self.buildver: - buildver = '-' + self.buildver - else: - buildver = '' - pyver = '.'.join(self.pyver) - abi = '.'.join(self.abi) - arch = '.'.join(self.arch) - # replace - with _ as a local version separator - version = self.version.replace('-', '_') - return '%s-%s%s-%s-%s-%s.whl' % (self.name, version, buildver, - pyver, abi, arch) - - @property - def exists(self): - path = os.path.join(self.dirname, self.filename) - return os.path.isfile(path) - - @property - def tags(self): - for pyver in self.pyver: - for abi in self.abi: - for arch in self.arch: - yield pyver, abi, arch - - @cached_property - def metadata(self): - pathname = os.path.join(self.dirname, self.filename) - name_ver = '%s-%s' % (self.name, self.version) - info_dir = '%s.dist-info' % name_ver - wrapper = codecs.getreader('utf-8') - with ZipFile(pathname, 'r') as zf: - wheel_metadata = self.get_wheel_metadata(zf) - wv = wheel_metadata['Wheel-Version'].split('.', 1) - file_version = tuple([int(i) for i in wv]) - if file_version < (1, 1): - fns = [WHEEL_METADATA_FILENAME, METADATA_FILENAME, 'METADATA'] - else: - fns = [WHEEL_METADATA_FILENAME, METADATA_FILENAME] - result = None - for fn in fns: - try: - metadata_filename = posixpath.join(info_dir, fn) - with zf.open(metadata_filename) as bf: - wf = wrapper(bf) - result = Metadata(fileobj=wf) - if result: - break - except KeyError: - pass - if not result: - raise ValueError('Invalid wheel, because metadata is ' - 'missing: looked in %s' % ', '.join(fns)) - return result - - def get_wheel_metadata(self, zf): - name_ver = '%s-%s' % (self.name, self.version) - info_dir = '%s.dist-info' % name_ver - metadata_filename = posixpath.join(info_dir, 'WHEEL') - with zf.open(metadata_filename) as bf: - wf = codecs.getreader('utf-8')(bf) - message = message_from_file(wf) - return dict(message) - - @cached_property - def info(self): - pathname = os.path.join(self.dirname, self.filename) - with ZipFile(pathname, 'r') as zf: - result = self.get_wheel_metadata(zf) - return result - - def process_shebang(self, data): - m = SHEBANG_RE.match(data) - if m: - end = m.end() - shebang, data_after_shebang = data[:end], data[end:] - # Preserve any arguments after the interpreter - if b'pythonw' in shebang.lower(): - shebang_python = SHEBANG_PYTHONW - else: - shebang_python = SHEBANG_PYTHON - m = SHEBANG_DETAIL_RE.match(shebang) - if m: - args = b' ' + m.groups()[-1] - else: - args = b'' - shebang = shebang_python + args - data = shebang + data_after_shebang - else: - cr = data.find(b'\r') - lf = data.find(b'\n') - if cr < 0 or cr > lf: - term = b'\n' - else: - if data[cr:cr + 2] == b'\r\n': - term = b'\r\n' - else: - term = b'\r' - data = SHEBANG_PYTHON + term + data - return data - - def get_hash(self, data, hash_kind=None): - if hash_kind is None: - hash_kind = self.hash_kind - try: - hasher = getattr(hashlib, hash_kind) - except AttributeError: - raise DistlibException('Unsupported hash algorithm: %r' % hash_kind) - result = hasher(data).digest() - result = base64.urlsafe_b64encode(result).rstrip(b'=').decode('ascii') - return hash_kind, result - - def write_record(self, records, record_path, base): - records = list(records) # make a copy for sorting - p = to_posix(os.path.relpath(record_path, base)) - records.append((p, '', '')) - records.sort() - with CSVWriter(record_path) as writer: - for row in records: - writer.writerow(row) - - def write_records(self, info, libdir, archive_paths): - records = [] - distinfo, info_dir = info - hasher = getattr(hashlib, self.hash_kind) - for ap, p in archive_paths: - with open(p, 'rb') as f: - data = f.read() - digest = '%s=%s' % self.get_hash(data) - size = os.path.getsize(p) - records.append((ap, digest, size)) - - p = os.path.join(distinfo, 'RECORD') - self.write_record(records, p, libdir) - ap = to_posix(os.path.join(info_dir, 'RECORD')) - archive_paths.append((ap, p)) - - def build_zip(self, pathname, archive_paths): - with ZipFile(pathname, 'w', zipfile.ZIP_DEFLATED) as zf: - for ap, p in archive_paths: - logger.debug('Wrote %s to %s in wheel', p, ap) - zf.write(p, ap) - - def build(self, paths, tags=None, wheel_version=None): - """ - Build a wheel from files in specified paths, and use any specified tags - when determining the name of the wheel. - """ - if tags is None: - tags = {} - - libkey = list(filter(lambda o: o in paths, ('purelib', 'platlib')))[0] - if libkey == 'platlib': - is_pure = 'false' - default_pyver = [IMPVER] - default_abi = [ABI] - default_arch = [ARCH] - else: - is_pure = 'true' - default_pyver = [PYVER] - default_abi = ['none'] - default_arch = ['any'] - - self.pyver = tags.get('pyver', default_pyver) - self.abi = tags.get('abi', default_abi) - self.arch = tags.get('arch', default_arch) - - libdir = paths[libkey] - - name_ver = '%s-%s' % (self.name, self.version) - data_dir = '%s.data' % name_ver - info_dir = '%s.dist-info' % name_ver - - archive_paths = [] - - # First, stuff which is not in site-packages - for key in ('data', 'headers', 'scripts'): - if key not in paths: - continue - path = paths[key] - if os.path.isdir(path): - for root, dirs, files in os.walk(path): - for fn in files: - p = fsdecode(os.path.join(root, fn)) - rp = os.path.relpath(p, path) - ap = to_posix(os.path.join(data_dir, key, rp)) - archive_paths.append((ap, p)) - if key == 'scripts' and not p.endswith('.exe'): - with open(p, 'rb') as f: - data = f.read() - data = self.process_shebang(data) - with open(p, 'wb') as f: - f.write(data) - - # Now, stuff which is in site-packages, other than the - # distinfo stuff. - path = libdir - distinfo = None - for root, dirs, files in os.walk(path): - if root == path: - # At the top level only, save distinfo for later - # and skip it for now - for i, dn in enumerate(dirs): - dn = fsdecode(dn) - if dn.endswith('.dist-info'): - distinfo = os.path.join(root, dn) - del dirs[i] - break - assert distinfo, '.dist-info directory expected, not found' - - for fn in files: - # comment out next suite to leave .pyc files in - if fsdecode(fn).endswith(('.pyc', '.pyo')): - continue - p = os.path.join(root, fn) - rp = to_posix(os.path.relpath(p, path)) - archive_paths.append((rp, p)) - - # Now distinfo. Assumed to be flat, i.e. os.listdir is enough. - files = os.listdir(distinfo) - for fn in files: - if fn not in ('RECORD', 'INSTALLER', 'SHARED', 'WHEEL'): - p = fsdecode(os.path.join(distinfo, fn)) - ap = to_posix(os.path.join(info_dir, fn)) - archive_paths.append((ap, p)) - - wheel_metadata = [ - 'Wheel-Version: %d.%d' % (wheel_version or self.wheel_version), - 'Generator: distlib %s' % __version__, - 'Root-Is-Purelib: %s' % is_pure, - ] - for pyver, abi, arch in self.tags: - wheel_metadata.append('Tag: %s-%s-%s' % (pyver, abi, arch)) - p = os.path.join(distinfo, 'WHEEL') - with open(p, 'w') as f: - f.write('\n'.join(wheel_metadata)) - ap = to_posix(os.path.join(info_dir, 'WHEEL')) - archive_paths.append((ap, p)) - - # Now, at last, RECORD. - # Paths in here are archive paths - nothing else makes sense. - self.write_records((distinfo, info_dir), libdir, archive_paths) - # Now, ready to build the zip file - pathname = os.path.join(self.dirname, self.filename) - self.build_zip(pathname, archive_paths) - return pathname - - def install(self, paths, maker, **kwargs): - """ - Install a wheel to the specified paths. If kwarg ``warner`` is - specified, it should be a callable, which will be called with two - tuples indicating the wheel version of this software and the wheel - version in the file, if there is a discrepancy in the versions. - This can be used to issue any warnings to raise any exceptions. - If kwarg ``lib_only`` is True, only the purelib/platlib files are - installed, and the headers, scripts, data and dist-info metadata are - not written. If kwarg ``bytecode_hashed_invalidation`` is True, written - bytecode will try to use file-hash based invalidation (PEP-552) on - supported interpreter versions (CPython 2.7+). - - The return value is a :class:`InstalledDistribution` instance unless - ``options.lib_only`` is True, in which case the return value is ``None``. - """ - - dry_run = maker.dry_run - warner = kwargs.get('warner') - lib_only = kwargs.get('lib_only', False) - bc_hashed_invalidation = kwargs.get('bytecode_hashed_invalidation', False) - - pathname = os.path.join(self.dirname, self.filename) - name_ver = '%s-%s' % (self.name, self.version) - data_dir = '%s.data' % name_ver - info_dir = '%s.dist-info' % name_ver - - metadata_name = posixpath.join(info_dir, METADATA_FILENAME) - wheel_metadata_name = posixpath.join(info_dir, 'WHEEL') - record_name = posixpath.join(info_dir, 'RECORD') - - wrapper = codecs.getreader('utf-8') - - with ZipFile(pathname, 'r') as zf: - with zf.open(wheel_metadata_name) as bwf: - wf = wrapper(bwf) - message = message_from_file(wf) - wv = message['Wheel-Version'].split('.', 1) - file_version = tuple([int(i) for i in wv]) - if (file_version != self.wheel_version) and warner: - warner(self.wheel_version, file_version) - - if message['Root-Is-Purelib'] == 'true': - libdir = paths['purelib'] - else: - libdir = paths['platlib'] - - records = {} - with zf.open(record_name) as bf: - with CSVReader(stream=bf) as reader: - for row in reader: - p = row[0] - records[p] = row - - data_pfx = posixpath.join(data_dir, '') - info_pfx = posixpath.join(info_dir, '') - script_pfx = posixpath.join(data_dir, 'scripts', '') - - # make a new instance rather than a copy of maker's, - # as we mutate it - fileop = FileOperator(dry_run=dry_run) - fileop.record = True # so we can rollback if needed - - bc = not sys.dont_write_bytecode # Double negatives. Lovely! - - outfiles = [] # for RECORD writing - - # for script copying/shebang processing - workdir = tempfile.mkdtemp() - # set target dir later - # we default add_launchers to False, as the - # Python Launcher should be used instead - maker.source_dir = workdir - maker.target_dir = None - try: - for zinfo in zf.infolist(): - arcname = zinfo.filename - if isinstance(arcname, text_type): - u_arcname = arcname - else: - u_arcname = arcname.decode('utf-8') - # The signature file won't be in RECORD, - # and we don't currently don't do anything with it - if u_arcname.endswith('/RECORD.jws'): - continue - row = records[u_arcname] - if row[2] and str(zinfo.file_size) != row[2]: - raise DistlibException('size mismatch for ' - '%s' % u_arcname) - if row[1]: - kind, value = row[1].split('=', 1) - with zf.open(arcname) as bf: - data = bf.read() - _, digest = self.get_hash(data, kind) - if digest != value: - raise DistlibException('digest mismatch for ' - '%s' % arcname) - - if lib_only and u_arcname.startswith((info_pfx, data_pfx)): - logger.debug('lib_only: skipping %s', u_arcname) - continue - is_script = (u_arcname.startswith(script_pfx) - and not u_arcname.endswith('.exe')) - - if u_arcname.startswith(data_pfx): - _, where, rp = u_arcname.split('/', 2) - outfile = os.path.join(paths[where], convert_path(rp)) - else: - # meant for site-packages. - if u_arcname in (wheel_metadata_name, record_name): - continue - outfile = os.path.join(libdir, convert_path(u_arcname)) - if not is_script: - with zf.open(arcname) as bf: - fileop.copy_stream(bf, outfile) - outfiles.append(outfile) - # Double check the digest of the written file - if not dry_run and row[1]: - with open(outfile, 'rb') as bf: - data = bf.read() - _, newdigest = self.get_hash(data, kind) - if newdigest != digest: - raise DistlibException('digest mismatch ' - 'on write for ' - '%s' % outfile) - if bc and outfile.endswith('.py'): - try: - pyc = fileop.byte_compile(outfile, - hashed_invalidation=bc_hashed_invalidation) - outfiles.append(pyc) - except Exception: - # Don't give up if byte-compilation fails, - # but log it and perhaps warn the user - logger.warning('Byte-compilation failed', - exc_info=True) - else: - fn = os.path.basename(convert_path(arcname)) - workname = os.path.join(workdir, fn) - with zf.open(arcname) as bf: - fileop.copy_stream(bf, workname) - - dn, fn = os.path.split(outfile) - maker.target_dir = dn - filenames = maker.make(fn) - fileop.set_executable_mode(filenames) - outfiles.extend(filenames) - - if lib_only: - logger.debug('lib_only: returning None') - dist = None - else: - # Generate scripts - - # Try to get pydist.json so we can see if there are - # any commands to generate. If this fails (e.g. because - # of a legacy wheel), log a warning but don't give up. - commands = None - file_version = self.info['Wheel-Version'] - if file_version == '1.0': - # Use legacy info - ep = posixpath.join(info_dir, 'entry_points.txt') - try: - with zf.open(ep) as bwf: - epdata = read_exports(bwf) - commands = {} - for key in ('console', 'gui'): - k = '%s_scripts' % key - if k in epdata: - commands['wrap_%s' % key] = d = {} - for v in epdata[k].values(): - s = '%s:%s' % (v.prefix, v.suffix) - if v.flags: - s += ' %s' % v.flags - d[v.name] = s - except Exception: - logger.warning('Unable to read legacy script ' - 'metadata, so cannot generate ' - 'scripts') - else: - try: - with zf.open(metadata_name) as bwf: - wf = wrapper(bwf) - commands = json.load(wf).get('extensions') - if commands: - commands = commands.get('python.commands') - except Exception: - logger.warning('Unable to read JSON metadata, so ' - 'cannot generate scripts') - if commands: - console_scripts = commands.get('wrap_console', {}) - gui_scripts = commands.get('wrap_gui', {}) - if console_scripts or gui_scripts: - script_dir = paths.get('scripts', '') - if not os.path.isdir(script_dir): - raise ValueError('Valid script path not ' - 'specified') - maker.target_dir = script_dir - for k, v in console_scripts.items(): - script = '%s = %s' % (k, v) - filenames = maker.make(script) - fileop.set_executable_mode(filenames) - - if gui_scripts: - options = {'gui': True } - for k, v in gui_scripts.items(): - script = '%s = %s' % (k, v) - filenames = maker.make(script, options) - fileop.set_executable_mode(filenames) - - p = os.path.join(libdir, info_dir) - dist = InstalledDistribution(p) - - # Write SHARED - paths = dict(paths) # don't change passed in dict - del paths['purelib'] - del paths['platlib'] - paths['lib'] = libdir - p = dist.write_shared_locations(paths, dry_run) - if p: - outfiles.append(p) - - # Write RECORD - dist.write_installed_files(outfiles, paths['prefix'], - dry_run) - return dist - except Exception: # pragma: no cover - logger.exception('installation failed.') - fileop.rollback() - raise - finally: - shutil.rmtree(workdir) - - def _get_dylib_cache(self): - global cache - if cache is None: - # Use native string to avoid issues on 2.x: see Python #20140. - base = os.path.join(get_cache_base(), str('dylib-cache'), - sys.version[:3]) - cache = Cache(base) - return cache - - def _get_extensions(self): - pathname = os.path.join(self.dirname, self.filename) - name_ver = '%s-%s' % (self.name, self.version) - info_dir = '%s.dist-info' % name_ver - arcname = posixpath.join(info_dir, 'EXTENSIONS') - wrapper = codecs.getreader('utf-8') - result = [] - with ZipFile(pathname, 'r') as zf: - try: - with zf.open(arcname) as bf: - wf = wrapper(bf) - extensions = json.load(wf) - cache = self._get_dylib_cache() - prefix = cache.prefix_to_dir(pathname) - cache_base = os.path.join(cache.base, prefix) - if not os.path.isdir(cache_base): - os.makedirs(cache_base) - for name, relpath in extensions.items(): - dest = os.path.join(cache_base, convert_path(relpath)) - if not os.path.exists(dest): - extract = True - else: - file_time = os.stat(dest).st_mtime - file_time = datetime.datetime.fromtimestamp(file_time) - info = zf.getinfo(relpath) - wheel_time = datetime.datetime(*info.date_time) - extract = wheel_time > file_time - if extract: - zf.extract(relpath, cache_base) - result.append((name, dest)) - except KeyError: - pass - return result - - def is_compatible(self): - """ - Determine if a wheel is compatible with the running system. - """ - return is_compatible(self) - - def is_mountable(self): - """ - Determine if a wheel is asserted as mountable by its metadata. - """ - return True # for now - metadata details TBD - - def mount(self, append=False): - pathname = os.path.abspath(os.path.join(self.dirname, self.filename)) - if not self.is_compatible(): - msg = 'Wheel %s not compatible with this Python.' % pathname - raise DistlibException(msg) - if not self.is_mountable(): - msg = 'Wheel %s is marked as not mountable.' % pathname - raise DistlibException(msg) - if pathname in sys.path: - logger.debug('%s already in path', pathname) - else: - if append: - sys.path.append(pathname) - else: - sys.path.insert(0, pathname) - extensions = self._get_extensions() - if extensions: - if _hook not in sys.meta_path: - sys.meta_path.append(_hook) - _hook.add(pathname, extensions) - - def unmount(self): - pathname = os.path.abspath(os.path.join(self.dirname, self.filename)) - if pathname not in sys.path: - logger.debug('%s not in path', pathname) - else: - sys.path.remove(pathname) - if pathname in _hook.impure_wheels: - _hook.remove(pathname) - if not _hook.impure_wheels: - if _hook in sys.meta_path: - sys.meta_path.remove(_hook) - - def verify(self): - pathname = os.path.join(self.dirname, self.filename) - name_ver = '%s-%s' % (self.name, self.version) - data_dir = '%s.data' % name_ver - info_dir = '%s.dist-info' % name_ver - - metadata_name = posixpath.join(info_dir, METADATA_FILENAME) - wheel_metadata_name = posixpath.join(info_dir, 'WHEEL') - record_name = posixpath.join(info_dir, 'RECORD') - - wrapper = codecs.getreader('utf-8') - - with ZipFile(pathname, 'r') as zf: - with zf.open(wheel_metadata_name) as bwf: - wf = wrapper(bwf) - message = message_from_file(wf) - wv = message['Wheel-Version'].split('.', 1) - file_version = tuple([int(i) for i in wv]) - # TODO version verification - - records = {} - with zf.open(record_name) as bf: - with CSVReader(stream=bf) as reader: - for row in reader: - p = row[0] - records[p] = row - - for zinfo in zf.infolist(): - arcname = zinfo.filename - if isinstance(arcname, text_type): - u_arcname = arcname - else: - u_arcname = arcname.decode('utf-8') - if '..' in u_arcname: - raise DistlibException('invalid entry in ' - 'wheel: %r' % u_arcname) - - # The signature file won't be in RECORD, - # and we don't currently don't do anything with it - if u_arcname.endswith('/RECORD.jws'): - continue - row = records[u_arcname] - if row[2] and str(zinfo.file_size) != row[2]: - raise DistlibException('size mismatch for ' - '%s' % u_arcname) - if row[1]: - kind, value = row[1].split('=', 1) - with zf.open(arcname) as bf: - data = bf.read() - _, digest = self.get_hash(data, kind) - if digest != value: - raise DistlibException('digest mismatch for ' - '%s' % arcname) - - def update(self, modifier, dest_dir=None, **kwargs): - """ - Update the contents of a wheel in a generic way. The modifier should - be a callable which expects a dictionary argument: its keys are - archive-entry paths, and its values are absolute filesystem paths - where the contents the corresponding archive entries can be found. The - modifier is free to change the contents of the files pointed to, add - new entries and remove entries, before returning. This method will - extract the entire contents of the wheel to a temporary location, call - the modifier, and then use the passed (and possibly updated) - dictionary to write a new wheel. If ``dest_dir`` is specified, the new - wheel is written there -- otherwise, the original wheel is overwritten. - - The modifier should return True if it updated the wheel, else False. - This method returns the same value the modifier returns. - """ - - def get_version(path_map, info_dir): - version = path = None - key = '%s/%s' % (info_dir, METADATA_FILENAME) - if key not in path_map: - key = '%s/PKG-INFO' % info_dir - if key in path_map: - path = path_map[key] - version = Metadata(path=path).version - return version, path - - def update_version(version, path): - updated = None - try: - v = NormalizedVersion(version) - i = version.find('-') - if i < 0: - updated = '%s+1' % version - else: - parts = [int(s) for s in version[i + 1:].split('.')] - parts[-1] += 1 - updated = '%s+%s' % (version[:i], - '.'.join(str(i) for i in parts)) - except UnsupportedVersionError: - logger.debug('Cannot update non-compliant (PEP-440) ' - 'version %r', version) - if updated: - md = Metadata(path=path) - md.version = updated - legacy = not path.endswith(METADATA_FILENAME) - md.write(path=path, legacy=legacy) - logger.debug('Version updated from %r to %r', version, - updated) - - pathname = os.path.join(self.dirname, self.filename) - name_ver = '%s-%s' % (self.name, self.version) - info_dir = '%s.dist-info' % name_ver - record_name = posixpath.join(info_dir, 'RECORD') - with tempdir() as workdir: - with ZipFile(pathname, 'r') as zf: - path_map = {} - for zinfo in zf.infolist(): - arcname = zinfo.filename - if isinstance(arcname, text_type): - u_arcname = arcname - else: - u_arcname = arcname.decode('utf-8') - if u_arcname == record_name: - continue - if '..' in u_arcname: - raise DistlibException('invalid entry in ' - 'wheel: %r' % u_arcname) - zf.extract(zinfo, workdir) - path = os.path.join(workdir, convert_path(u_arcname)) - path_map[u_arcname] = path - - # Remember the version. - original_version, _ = get_version(path_map, info_dir) - # Files extracted. Call the modifier. - modified = modifier(path_map, **kwargs) - if modified: - # Something changed - need to build a new wheel. - current_version, path = get_version(path_map, info_dir) - if current_version and (current_version == original_version): - # Add or update local version to signify changes. - update_version(current_version, path) - # Decide where the new wheel goes. - if dest_dir is None: - fd, newpath = tempfile.mkstemp(suffix='.whl', - prefix='wheel-update-', - dir=workdir) - os.close(fd) - else: - if not os.path.isdir(dest_dir): - raise DistlibException('Not a directory: %r' % dest_dir) - newpath = os.path.join(dest_dir, self.filename) - archive_paths = list(path_map.items()) - distinfo = os.path.join(workdir, info_dir) - info = distinfo, info_dir - self.write_records(info, workdir, archive_paths) - self.build_zip(newpath, archive_paths) - if dest_dir is None: - shutil.copyfile(newpath, pathname) - return modified - -def compatible_tags(): - """ - Return (pyver, abi, arch) tuples compatible with this Python. - """ - versions = [VER_SUFFIX] - major = VER_SUFFIX[0] - for minor in range(sys.version_info[1] - 1, - 1, -1): - versions.append(''.join([major, str(minor)])) - - abis = [] - for suffix, _, _ in imp.get_suffixes(): - if suffix.startswith('.abi'): - abis.append(suffix.split('.', 2)[1]) - abis.sort() - if ABI != 'none': - abis.insert(0, ABI) - abis.append('none') - result = [] - - arches = [ARCH] - if sys.platform == 'darwin': - m = re.match(r'(\w+)_(\d+)_(\d+)_(\w+)$', ARCH) - if m: - name, major, minor, arch = m.groups() - minor = int(minor) - matches = [arch] - if arch in ('i386', 'ppc'): - matches.append('fat') - if arch in ('i386', 'ppc', 'x86_64'): - matches.append('fat3') - if arch in ('ppc64', 'x86_64'): - matches.append('fat64') - if arch in ('i386', 'x86_64'): - matches.append('intel') - if arch in ('i386', 'x86_64', 'intel', 'ppc', 'ppc64'): - matches.append('universal') - while minor >= 0: - for match in matches: - s = '%s_%s_%s_%s' % (name, major, minor, match) - if s != ARCH: # already there - arches.append(s) - minor -= 1 - - # Most specific - our Python version, ABI and arch - for abi in abis: - for arch in arches: - result.append((''.join((IMP_PREFIX, versions[0])), abi, arch)) - - # where no ABI / arch dependency, but IMP_PREFIX dependency - for i, version in enumerate(versions): - result.append((''.join((IMP_PREFIX, version)), 'none', 'any')) - if i == 0: - result.append((''.join((IMP_PREFIX, version[0])), 'none', 'any')) - - # no IMP_PREFIX, ABI or arch dependency - for i, version in enumerate(versions): - result.append((''.join(('py', version)), 'none', 'any')) - if i == 0: - result.append((''.join(('py', version[0])), 'none', 'any')) - return set(result) - - -COMPATIBLE_TAGS = compatible_tags() - -del compatible_tags - - -def is_compatible(wheel, tags=None): - if not isinstance(wheel, Wheel): - wheel = Wheel(wheel) # assume it's a filename - result = False - if tags is None: - tags = COMPATIBLE_TAGS - for ver, abi, arch in tags: - if ver in wheel.pyver and abi in wheel.abi and arch in wheel.arch: - result = True - break - return result diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/wheel.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/wheel.pyc deleted file mode 100644 index f125d708694a4114f9b9c33514a76f2d908dfaf7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33453 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%0AM)#C<p9FtNLf4aZdYsL({%8S2o` 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 HDxLnn6y+)O diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distro.py b/venv/lib/python2.7/site-packages/pip/_vendor/distro.py deleted file mode 100644 index 3306163..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/distro.py +++ /dev/null @@ -1,1216 +0,0 @@ -# Copyright 2015,2016,2017 Nir Cohen -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -""" -The ``distro`` package (``distro`` stands for Linux Distribution) provides -information about the Linux distribution it runs on, such as a reliable -machine-readable distro ID, or version information. - -It is the recommended replacement for Python's original -:py:func:`platform.linux_distribution` function, but it provides much more -functionality. An alternative implementation became necessary because Python -3.5 deprecated this function, and Python 3.8 will remove it altogether. -Its predecessor function :py:func:`platform.dist` was already -deprecated since Python 2.6 and will also be removed in Python 3.8. -Still, there are many cases in which access to OS distribution information -is needed. See `Python issue 1322 <https://bugs.python.org/issue1322>`_ for -more information. -""" - -import os -import re -import sys -import json -import shlex -import logging -import argparse -import subprocess - - -_UNIXCONFDIR = os.environ.get('UNIXCONFDIR', '/etc') -_OS_RELEASE_BASENAME = 'os-release' - -#: Translation table for normalizing the "ID" attribute defined in os-release -#: files, for use by the :func:`distro.id` method. -#: -#: * Key: Value as defined in the os-release file, translated to lower case, -#: with blanks translated to underscores. -#: -#: * Value: Normalized value. -NORMALIZED_OS_ID = { - 'ol': 'oracle', # Oracle Enterprise Linux -} - -#: Translation table for normalizing the "Distributor ID" attribute returned by -#: the lsb_release command, for use by the :func:`distro.id` method. -#: -#: * Key: Value as returned by the lsb_release command, translated to lower -#: case, with blanks translated to underscores. -#: -#: * Value: Normalized value. -NORMALIZED_LSB_ID = { - 'enterpriseenterprise': 'oracle', # Oracle Enterprise Linux - 'redhatenterpriseworkstation': 'rhel', # RHEL 6, 7 Workstation - 'redhatenterpriseserver': 'rhel', # RHEL 6, 7 Server -} - -#: Translation table for normalizing the distro ID derived from the file name -#: of distro release files, for use by the :func:`distro.id` method. -#: -#: * Key: Value as derived from the file name of a distro release file, -#: translated to lower case, with blanks translated to underscores. -#: -#: * Value: Normalized value. -NORMALIZED_DISTRO_ID = { - 'redhat': 'rhel', # RHEL 6.x, 7.x -} - -# Pattern for content of distro release file (reversed) -_DISTRO_RELEASE_CONTENT_REVERSED_PATTERN = re.compile( - r'(?:[^)]*\)(.*)\()? *(?:STL )?([\d.+\-a-z]*\d) *(?:esaeler *)?(.+)') - -# Pattern for base file name of distro release file -_DISTRO_RELEASE_BASENAME_PATTERN = re.compile( - r'(\w+)[-_](release|version)$') - -# Base file names to be ignored when searching for distro release file -_DISTRO_RELEASE_IGNORE_BASENAMES = ( - 'debian_version', - 'lsb-release', - 'oem-release', - _OS_RELEASE_BASENAME, - 'system-release' -) - - -def linux_distribution(full_distribution_name=True): - """ - Return information about the current OS distribution as a tuple - ``(id_name, version, codename)`` with items as follows: - - * ``id_name``: If *full_distribution_name* is false, the result of - :func:`distro.id`. Otherwise, the result of :func:`distro.name`. - - * ``version``: The result of :func:`distro.version`. - - * ``codename``: The result of :func:`distro.codename`. - - The interface of this function is compatible with the original - :py:func:`platform.linux_distribution` function, supporting a subset of - its parameters. - - The data it returns may not exactly be the same, because it uses more data - sources than the original function, and that may lead to different data if - the OS distribution is not consistent across multiple data sources it - provides (there are indeed such distributions ...). - - Another reason for differences is the fact that the :func:`distro.id` - method normalizes the distro ID string to a reliable machine-readable value - for a number of popular OS distributions. - """ - return _distro.linux_distribution(full_distribution_name) - - -def id(): - """ - Return the distro ID of the current distribution, as a - machine-readable string. - - For a number of OS distributions, the returned distro ID value is - *reliable*, in the sense that it is documented and that it does not change - across releases of the distribution. - - This package maintains the following reliable distro ID values: - - ============== ========================================= - Distro ID Distribution - ============== ========================================= - "ubuntu" Ubuntu - "debian" Debian - "rhel" RedHat Enterprise Linux - "centos" CentOS - "fedora" Fedora - "sles" SUSE Linux Enterprise Server - "opensuse" openSUSE - "amazon" Amazon Linux - "arch" Arch Linux - "cloudlinux" CloudLinux OS - "exherbo" Exherbo Linux - "gentoo" GenToo Linux - "ibm_powerkvm" IBM PowerKVM - "kvmibm" KVM for IBM z Systems - "linuxmint" Linux Mint - "mageia" Mageia - "mandriva" Mandriva Linux - "parallels" Parallels - "pidora" Pidora - "raspbian" Raspbian - "oracle" Oracle Linux (and Oracle Enterprise Linux) - "scientific" Scientific Linux - "slackware" Slackware - "xenserver" XenServer - "openbsd" OpenBSD - "netbsd" NetBSD - "freebsd" FreeBSD - ============== ========================================= - - If you have a need to get distros for reliable IDs added into this set, - or if you find that the :func:`distro.id` function returns a different - distro ID for one of the listed distros, please create an issue in the - `distro issue tracker`_. - - **Lookup hierarchy and transformations:** - - First, the ID is obtained from the following sources, in the specified - order. The first available and non-empty value is used: - - * the value of the "ID" attribute of the os-release file, - - * the value of the "Distributor ID" attribute returned by the lsb_release - command, - - * the first part of the file name of the distro release file, - - The so determined ID value then passes the following transformations, - before it is returned by this method: - - * it is translated to lower case, - - * blanks (which should not be there anyway) are translated to underscores, - - * a normalization of the ID is performed, based upon - `normalization tables`_. The purpose of this normalization is to ensure - that the ID is as reliable as possible, even across incompatible changes - in the OS distributions. A common reason for an incompatible change is - the addition of an os-release file, or the addition of the lsb_release - command, with ID values that differ from what was previously determined - from the distro release file name. - """ - return _distro.id() - - -def name(pretty=False): - """ - Return the name of the current OS distribution, as a human-readable - string. - - If *pretty* is false, the name is returned without version or codename. - (e.g. "CentOS Linux") - - If *pretty* is true, the version and codename are appended. - (e.g. "CentOS Linux 7.1.1503 (Core)") - - **Lookup hierarchy:** - - The name is obtained from the following sources, in the specified order. - The first available and non-empty value is used: - - * If *pretty* is false: - - - the value of the "NAME" attribute of the os-release file, - - - the value of the "Distributor ID" attribute returned by the lsb_release - command, - - - the value of the "<name>" field of the distro release file. - - * If *pretty* is true: - - - the value of the "PRETTY_NAME" attribute of the os-release file, - - - the value of the "Description" attribute returned by the lsb_release - command, - - - the value of the "<name>" field of the distro release file, appended - with the value of the pretty version ("<version_id>" and "<codename>" - fields) of the distro release file, if available. - """ - return _distro.name(pretty) - - -def version(pretty=False, best=False): - """ - Return the version of the current OS distribution, as a human-readable - string. - - If *pretty* is false, the version is returned without codename (e.g. - "7.0"). - - If *pretty* is true, the codename in parenthesis is appended, if the - codename is non-empty (e.g. "7.0 (Maipo)"). - - Some distributions provide version numbers with different precisions in - the different sources of distribution information. Examining the different - sources in a fixed priority order does not always yield the most precise - version (e.g. for Debian 8.2, or CentOS 7.1). - - The *best* parameter can be used to control the approach for the returned - version: - - If *best* is false, the first non-empty version number in priority order of - the examined sources is returned. - - If *best* is true, the most precise version number out of all examined - sources is returned. - - **Lookup hierarchy:** - - In all cases, the version number is obtained from the following sources. - If *best* is false, this order represents the priority order: - - * the value of the "VERSION_ID" attribute of the os-release file, - * the value of the "Release" attribute returned by the lsb_release - command, - * the version number parsed from the "<version_id>" field of the first line - of the distro release file, - * the version number parsed from the "PRETTY_NAME" attribute of the - os-release file, if it follows the format of the distro release files. - * the version number parsed from the "Description" attribute returned by - the lsb_release command, if it follows the format of the distro release - files. - """ - return _distro.version(pretty, best) - - -def version_parts(best=False): - """ - Return the version of the current OS distribution as a tuple - ``(major, minor, build_number)`` with items as follows: - - * ``major``: The result of :func:`distro.major_version`. - - * ``minor``: The result of :func:`distro.minor_version`. - - * ``build_number``: The result of :func:`distro.build_number`. - - For a description of the *best* parameter, see the :func:`distro.version` - method. - """ - return _distro.version_parts(best) - - -def major_version(best=False): - """ - Return the major version of the current OS distribution, as a string, - if provided. - Otherwise, the empty string is returned. The major version is the first - part of the dot-separated version string. - - For a description of the *best* parameter, see the :func:`distro.version` - method. - """ - return _distro.major_version(best) - - -def minor_version(best=False): - """ - Return the minor version of the current OS distribution, as a string, - if provided. - Otherwise, the empty string is returned. The minor version is the second - part of the dot-separated version string. - - For a description of the *best* parameter, see the :func:`distro.version` - method. - """ - return _distro.minor_version(best) - - -def build_number(best=False): - """ - Return the build number of the current OS distribution, as a string, - if provided. - Otherwise, the empty string is returned. The build number is the third part - of the dot-separated version string. - - For a description of the *best* parameter, see the :func:`distro.version` - method. - """ - return _distro.build_number(best) - - -def like(): - """ - Return a space-separated list of distro IDs of distributions that are - closely related to the current OS distribution in regards to packaging - and programming interfaces, for example distributions the current - distribution is a derivative from. - - **Lookup hierarchy:** - - This information item is only provided by the os-release file. - For details, see the description of the "ID_LIKE" attribute in the - `os-release man page - <http://www.freedesktop.org/software/systemd/man/os-release.html>`_. - """ - return _distro.like() - - -def codename(): - """ - Return the codename for the release of the current OS distribution, - as a string. - - If the distribution does not have a codename, an empty string is returned. - - Note that the returned codename is not always really a codename. For - example, openSUSE returns "x86_64". This function does not handle such - cases in any special way and just returns the string it finds, if any. - - **Lookup hierarchy:** - - * the codename within the "VERSION" attribute of the os-release file, if - provided, - - * the value of the "Codename" attribute returned by the lsb_release - command, - - * the value of the "<codename>" field of the distro release file. - """ - return _distro.codename() - - -def info(pretty=False, best=False): - """ - Return certain machine-readable information items about the current OS - distribution in a dictionary, as shown in the following example: - - .. sourcecode:: python - - { - 'id': 'rhel', - 'version': '7.0', - 'version_parts': { - 'major': '7', - 'minor': '0', - 'build_number': '' - }, - 'like': 'fedora', - 'codename': 'Maipo' - } - - The dictionary structure and keys are always the same, regardless of which - information items are available in the underlying data sources. The values - for the various keys are as follows: - - * ``id``: The result of :func:`distro.id`. - - * ``version``: The result of :func:`distro.version`. - - * ``version_parts -> major``: The result of :func:`distro.major_version`. - - * ``version_parts -> minor``: The result of :func:`distro.minor_version`. - - * ``version_parts -> build_number``: The result of - :func:`distro.build_number`. - - * ``like``: The result of :func:`distro.like`. - - * ``codename``: The result of :func:`distro.codename`. - - For a description of the *pretty* and *best* parameters, see the - :func:`distro.version` method. - """ - return _distro.info(pretty, best) - - -def os_release_info(): - """ - Return a dictionary containing key-value pairs for the information items - from the os-release file data source of the current OS distribution. - - See `os-release file`_ for details about these information items. - """ - return _distro.os_release_info() - - -def lsb_release_info(): - """ - Return a dictionary containing key-value pairs for the information items - from the lsb_release command data source of the current OS distribution. - - See `lsb_release command output`_ for details about these information - items. - """ - return _distro.lsb_release_info() - - -def distro_release_info(): - """ - Return a dictionary containing key-value pairs for the information items - from the distro release file data source of the current OS distribution. - - See `distro release file`_ for details about these information items. - """ - return _distro.distro_release_info() - - -def uname_info(): - """ - Return a dictionary containing key-value pairs for the information items - from the distro release file data source of the current OS distribution. - """ - return _distro.uname_info() - - -def os_release_attr(attribute): - """ - Return a single named information item from the os-release file data source - of the current OS distribution. - - Parameters: - - * ``attribute`` (string): Key of the information item. - - Returns: - - * (string): Value of the information item, if the item exists. - The empty string, if the item does not exist. - - See `os-release file`_ for details about these information items. - """ - return _distro.os_release_attr(attribute) - - -def lsb_release_attr(attribute): - """ - Return a single named information item from the lsb_release command output - data source of the current OS distribution. - - Parameters: - - * ``attribute`` (string): Key of the information item. - - Returns: - - * (string): Value of the information item, if the item exists. - The empty string, if the item does not exist. - - See `lsb_release command output`_ for details about these information - items. - """ - return _distro.lsb_release_attr(attribute) - - -def distro_release_attr(attribute): - """ - Return a single named information item from the distro release file - data source of the current OS distribution. - - Parameters: - - * ``attribute`` (string): Key of the information item. - - Returns: - - * (string): Value of the information item, if the item exists. - The empty string, if the item does not exist. - - See `distro release file`_ for details about these information items. - """ - return _distro.distro_release_attr(attribute) - - -def uname_attr(attribute): - """ - Return a single named information item from the distro release file - data source of the current OS distribution. - - Parameters: - - * ``attribute`` (string): Key of the information item. - - Returns: - - * (string): Value of the information item, if the item exists. - The empty string, if the item does not exist. - """ - return _distro.uname_attr(attribute) - - -class cached_property(object): - """A version of @property which caches the value. On access, it calls the - underlying function and sets the value in `__dict__` so future accesses - will not re-call the property. - """ - def __init__(self, f): - self._fname = f.__name__ - self._f = f - - def __get__(self, obj, owner): - assert obj is not None, 'call {} on an instance'.format(self._fname) - ret = obj.__dict__[self._fname] = self._f(obj) - return ret - - -class LinuxDistribution(object): - """ - Provides information about a OS distribution. - - This package creates a private module-global instance of this class with - default initialization arguments, that is used by the - `consolidated accessor functions`_ and `single source accessor functions`_. - By using default initialization arguments, that module-global instance - returns data about the current OS distribution (i.e. the distro this - package runs on). - - Normally, it is not necessary to create additional instances of this class. - However, in situations where control is needed over the exact data sources - that are used, instances of this class can be created with a specific - distro release file, or a specific os-release file, or without invoking the - lsb_release command. - """ - - def __init__(self, - include_lsb=True, - os_release_file='', - distro_release_file='', - include_uname=True): - """ - The initialization method of this class gathers information from the - available data sources, and stores that in private instance attributes. - Subsequent access to the information items uses these private instance - attributes, so that the data sources are read only once. - - Parameters: - - * ``include_lsb`` (bool): Controls whether the - `lsb_release command output`_ is included as a data source. - - If the lsb_release command is not available in the program execution - path, the data source for the lsb_release command will be empty. - - * ``os_release_file`` (string): The path name of the - `os-release file`_ that is to be used as a data source. - - An empty string (the default) will cause the default path name to - be used (see `os-release file`_ for details). - - If the specified or defaulted os-release file does not exist, the - data source for the os-release file will be empty. - - * ``distro_release_file`` (string): The path name of the - `distro release file`_ that is to be used as a data source. - - An empty string (the default) will cause a default search algorithm - to be used (see `distro release file`_ for details). - - If the specified distro release file does not exist, or if no default - distro release file can be found, the data source for the distro - release file will be empty. - - * ``include_name`` (bool): Controls whether uname command output is - included as a data source. If the uname command is not available in - the program execution path the data source for the uname command will - be empty. - - Public instance attributes: - - * ``os_release_file`` (string): The path name of the - `os-release file`_ that is actually used as a data source. The - empty string if no distro release file is used as a data source. - - * ``distro_release_file`` (string): The path name of the - `distro release file`_ that is actually used as a data source. The - empty string if no distro release file is used as a data source. - - * ``include_lsb`` (bool): The result of the ``include_lsb`` parameter. - This controls whether the lsb information will be loaded. - - * ``include_uname`` (bool): The result of the ``include_uname`` - parameter. This controls whether the uname information will - be loaded. - - Raises: - - * :py:exc:`IOError`: Some I/O issue with an os-release file or distro - release file. - - * :py:exc:`subprocess.CalledProcessError`: The lsb_release command had - some issue (other than not being available in the program execution - path). - - * :py:exc:`UnicodeError`: A data source has unexpected characters or - uses an unexpected encoding. - """ - self.os_release_file = os_release_file or \ - os.path.join(_UNIXCONFDIR, _OS_RELEASE_BASENAME) - self.distro_release_file = distro_release_file or '' # updated later - self.include_lsb = include_lsb - self.include_uname = include_uname - - def __repr__(self): - """Return repr of all info - """ - return \ - "LinuxDistribution(" \ - "os_release_file={self.os_release_file!r}, " \ - "distro_release_file={self.distro_release_file!r}, " \ - "include_lsb={self.include_lsb!r}, " \ - "include_uname={self.include_uname!r}, " \ - "_os_release_info={self._os_release_info!r}, " \ - "_lsb_release_info={self._lsb_release_info!r}, " \ - "_distro_release_info={self._distro_release_info!r}, " \ - "_uname_info={self._uname_info!r})".format( - self=self) - - def linux_distribution(self, full_distribution_name=True): - """ - Return information about the OS distribution that is compatible - with Python's :func:`platform.linux_distribution`, supporting a subset - of its parameters. - - For details, see :func:`distro.linux_distribution`. - """ - return ( - self.name() if full_distribution_name else self.id(), - self.version(), - self.codename() - ) - - def id(self): - """Return the distro ID of the OS distribution, as a string. - - For details, see :func:`distro.id`. - """ - def normalize(distro_id, table): - distro_id = distro_id.lower().replace(' ', '_') - return table.get(distro_id, distro_id) - - distro_id = self.os_release_attr('id') - if distro_id: - return normalize(distro_id, NORMALIZED_OS_ID) - - distro_id = self.lsb_release_attr('distributor_id') - if distro_id: - return normalize(distro_id, NORMALIZED_LSB_ID) - - distro_id = self.distro_release_attr('id') - if distro_id: - return normalize(distro_id, NORMALIZED_DISTRO_ID) - - distro_id = self.uname_attr('id') - if distro_id: - return normalize(distro_id, NORMALIZED_DISTRO_ID) - - return '' - - def name(self, pretty=False): - """ - Return the name of the OS distribution, as a string. - - For details, see :func:`distro.name`. - """ - name = self.os_release_attr('name') \ - or self.lsb_release_attr('distributor_id') \ - or self.distro_release_attr('name') \ - or self.uname_attr('name') - if pretty: - name = self.os_release_attr('pretty_name') \ - or self.lsb_release_attr('description') - if not name: - name = self.distro_release_attr('name') \ - or self.uname_attr('name') - version = self.version(pretty=True) - if version: - name = name + ' ' + version - return name or '' - - def version(self, pretty=False, best=False): - """ - Return the version of the OS distribution, as a string. - - For details, see :func:`distro.version`. - """ - versions = [ - self.os_release_attr('version_id'), - self.lsb_release_attr('release'), - self.distro_release_attr('version_id'), - self._parse_distro_release_content( - self.os_release_attr('pretty_name')).get('version_id', ''), - self._parse_distro_release_content( - self.lsb_release_attr('description')).get('version_id', ''), - self.uname_attr('release') - ] - version = '' - if best: - # This algorithm uses the last version in priority order that has - # the best precision. If the versions are not in conflict, that - # does not matter; otherwise, using the last one instead of the - # first one might be considered a surprise. - for v in versions: - if v.count(".") > version.count(".") or version == '': - version = v - else: - for v in versions: - if v != '': - version = v - break - if pretty and version and self.codename(): - version = u'{0} ({1})'.format(version, self.codename()) - return version - - def version_parts(self, best=False): - """ - Return the version of the OS distribution, as a tuple of version - numbers. - - For details, see :func:`distro.version_parts`. - """ - version_str = self.version(best=best) - if version_str: - version_regex = re.compile(r'(\d+)\.?(\d+)?\.?(\d+)?') - matches = version_regex.match(version_str) - if matches: - major, minor, build_number = matches.groups() - return major, minor or '', build_number or '' - return '', '', '' - - def major_version(self, best=False): - """ - Return the major version number of the current distribution. - - For details, see :func:`distro.major_version`. - """ - return self.version_parts(best)[0] - - def minor_version(self, best=False): - """ - Return the minor version number of the current distribution. - - For details, see :func:`distro.minor_version`. - """ - return self.version_parts(best)[1] - - def build_number(self, best=False): - """ - Return the build number of the current distribution. - - For details, see :func:`distro.build_number`. - """ - return self.version_parts(best)[2] - - def like(self): - """ - Return the IDs of distributions that are like the OS distribution. - - For details, see :func:`distro.like`. - """ - return self.os_release_attr('id_like') or '' - - def codename(self): - """ - Return the codename of the OS distribution. - - For details, see :func:`distro.codename`. - """ - try: - # Handle os_release specially since distros might purposefully set - # this to empty string to have no codename - return self._os_release_info['codename'] - except KeyError: - return self.lsb_release_attr('codename') \ - or self.distro_release_attr('codename') \ - or '' - - def info(self, pretty=False, best=False): - """ - Return certain machine-readable information about the OS - distribution. - - For details, see :func:`distro.info`. - """ - return dict( - id=self.id(), - version=self.version(pretty, best), - version_parts=dict( - major=self.major_version(best), - minor=self.minor_version(best), - build_number=self.build_number(best) - ), - like=self.like(), - codename=self.codename(), - ) - - def os_release_info(self): - """ - Return a dictionary containing key-value pairs for the information - items from the os-release file data source of the OS distribution. - - For details, see :func:`distro.os_release_info`. - """ - return self._os_release_info - - def lsb_release_info(self): - """ - Return a dictionary containing key-value pairs for the information - items from the lsb_release command data source of the OS - distribution. - - For details, see :func:`distro.lsb_release_info`. - """ - return self._lsb_release_info - - def distro_release_info(self): - """ - Return a dictionary containing key-value pairs for the information - items from the distro release file data source of the OS - distribution. - - For details, see :func:`distro.distro_release_info`. - """ - return self._distro_release_info - - def uname_info(self): - """ - Return a dictionary containing key-value pairs for the information - items from the uname command data source of the OS distribution. - - For details, see :func:`distro.uname_info`. - """ - return self._uname_info - - def os_release_attr(self, attribute): - """ - Return a single named information item from the os-release file data - source of the OS distribution. - - For details, see :func:`distro.os_release_attr`. - """ - return self._os_release_info.get(attribute, '') - - def lsb_release_attr(self, attribute): - """ - Return a single named information item from the lsb_release command - output data source of the OS distribution. - - For details, see :func:`distro.lsb_release_attr`. - """ - return self._lsb_release_info.get(attribute, '') - - def distro_release_attr(self, attribute): - """ - Return a single named information item from the distro release file - data source of the OS distribution. - - For details, see :func:`distro.distro_release_attr`. - """ - return self._distro_release_info.get(attribute, '') - - def uname_attr(self, attribute): - """ - Return a single named information item from the uname command - output data source of the OS distribution. - - For details, see :func:`distro.uname_release_attr`. - """ - return self._uname_info.get(attribute, '') - - @cached_property - def _os_release_info(self): - """ - Get the information items from the specified os-release file. - - Returns: - A dictionary containing all information items. - """ - if os.path.isfile(self.os_release_file): - with open(self.os_release_file) as release_file: - return self._parse_os_release_content(release_file) - return {} - - @staticmethod - def _parse_os_release_content(lines): - """ - Parse the lines of an os-release file. - - Parameters: - - * lines: Iterable through the lines in the os-release file. - Each line must be a unicode string or a UTF-8 encoded byte - string. - - Returns: - A dictionary containing all information items. - """ - props = {} - lexer = shlex.shlex(lines, posix=True) - lexer.whitespace_split = True - - # The shlex module defines its `wordchars` variable using literals, - # making it dependent on the encoding of the Python source file. - # In Python 2.6 and 2.7, the shlex source file is encoded in - # 'iso-8859-1', and the `wordchars` variable is defined as a byte - # string. This causes a UnicodeDecodeError to be raised when the - # parsed content is a unicode object. The following fix resolves that - # (... but it should be fixed in shlex...): - if sys.version_info[0] == 2 and isinstance(lexer.wordchars, bytes): - lexer.wordchars = lexer.wordchars.decode('iso-8859-1') - - tokens = list(lexer) - for token in tokens: - # At this point, all shell-like parsing has been done (i.e. - # comments processed, quotes and backslash escape sequences - # processed, multi-line values assembled, trailing newlines - # stripped, etc.), so the tokens are now either: - # * variable assignments: var=value - # * commands or their arguments (not allowed in os-release) - if '=' in token: - k, v = token.split('=', 1) - if isinstance(v, bytes): - v = v.decode('utf-8') - props[k.lower()] = v - else: - # Ignore any tokens that are not variable assignments - pass - - if 'version_codename' in props: - # os-release added a version_codename field. Use that in - # preference to anything else Note that some distros purposefully - # do not have code names. They should be setting - # version_codename="" - props['codename'] = props['version_codename'] - elif 'ubuntu_codename' in props: - # Same as above but a non-standard field name used on older Ubuntus - props['codename'] = props['ubuntu_codename'] - elif 'version' in props: - # If there is no version_codename, parse it from the version - codename = re.search(r'(\(\D+\))|,(\s+)?\D+', props['version']) - if codename: - codename = codename.group() - codename = codename.strip('()') - codename = codename.strip(',') - codename = codename.strip() - # codename appears within paranthese. - props['codename'] = codename - - return props - - @cached_property - def _lsb_release_info(self): - """ - Get the information items from the lsb_release command output. - - Returns: - A dictionary containing all information items. - """ - if not self.include_lsb: - return {} - with open(os.devnull, 'w') as devnull: - try: - cmd = ('lsb_release', '-a') - stdout = subprocess.check_output(cmd, stderr=devnull) - except OSError: # Command not found - return {} - content = stdout.decode(sys.getfilesystemencoding()).splitlines() - return self._parse_lsb_release_content(content) - - @staticmethod - def _parse_lsb_release_content(lines): - """ - Parse the output of the lsb_release command. - - Parameters: - - * lines: Iterable through the lines of the lsb_release output. - Each line must be a unicode string or a UTF-8 encoded byte - string. - - Returns: - A dictionary containing all information items. - """ - props = {} - for line in lines: - kv = line.strip('\n').split(':', 1) - if len(kv) != 2: - # Ignore lines without colon. - continue - k, v = kv - props.update({k.replace(' ', '_').lower(): v.strip()}) - return props - - @cached_property - def _uname_info(self): - with open(os.devnull, 'w') as devnull: - try: - cmd = ('uname', '-rs') - stdout = subprocess.check_output(cmd, stderr=devnull) - except OSError: - return {} - content = stdout.decode(sys.getfilesystemencoding()).splitlines() - return self._parse_uname_content(content) - - @staticmethod - def _parse_uname_content(lines): - props = {} - match = re.search(r'^([^\s]+)\s+([\d\.]+)', lines[0].strip()) - if match: - name, version = match.groups() - - # This is to prevent the Linux kernel version from - # appearing as the 'best' version on otherwise - # identifiable distributions. - if name == 'Linux': - return {} - props['id'] = name.lower() - props['name'] = name - props['release'] = version - return props - - @cached_property - def _distro_release_info(self): - """ - Get the information items from the specified distro release file. - - Returns: - A dictionary containing all information items. - """ - if self.distro_release_file: - # If it was specified, we use it and parse what we can, even if - # its file name or content does not match the expected pattern. - distro_info = self._parse_distro_release_file( - self.distro_release_file) - basename = os.path.basename(self.distro_release_file) - # The file name pattern for user-specified distro release files - # is somewhat more tolerant (compared to when searching for the - # file), because we want to use what was specified as best as - # possible. - match = _DISTRO_RELEASE_BASENAME_PATTERN.match(basename) - if 'name' in distro_info \ - and 'cloudlinux' in distro_info['name'].lower(): - distro_info['id'] = 'cloudlinux' - elif match: - distro_info['id'] = match.group(1) - return distro_info - else: - try: - basenames = os.listdir(_UNIXCONFDIR) - # We sort for repeatability in cases where there are multiple - # distro specific files; e.g. CentOS, Oracle, Enterprise all - # containing `redhat-release` on top of their own. - basenames.sort() - except OSError: - # This may occur when /etc is not readable but we can't be - # sure about the *-release files. Check common entries of - # /etc for information. If they turn out to not be there the - # error is handled in `_parse_distro_release_file()`. - basenames = ['SuSE-release', - 'arch-release', - 'base-release', - 'centos-release', - 'fedora-release', - 'gentoo-release', - 'mageia-release', - 'mandrake-release', - 'mandriva-release', - 'mandrivalinux-release', - 'manjaro-release', - 'oracle-release', - 'redhat-release', - 'sl-release', - 'slackware-version'] - for basename in basenames: - if basename in _DISTRO_RELEASE_IGNORE_BASENAMES: - continue - match = _DISTRO_RELEASE_BASENAME_PATTERN.match(basename) - if match: - filepath = os.path.join(_UNIXCONFDIR, basename) - distro_info = self._parse_distro_release_file(filepath) - if 'name' in distro_info: - # The name is always present if the pattern matches - self.distro_release_file = filepath - distro_info['id'] = match.group(1) - if 'cloudlinux' in distro_info['name'].lower(): - distro_info['id'] = 'cloudlinux' - return distro_info - return {} - - def _parse_distro_release_file(self, filepath): - """ - Parse a distro release file. - - Parameters: - - * filepath: Path name of the distro release file. - - Returns: - A dictionary containing all information items. - """ - try: - with open(filepath) as fp: - # Only parse the first line. For instance, on SLES there - # are multiple lines. We don't want them... - return self._parse_distro_release_content(fp.readline()) - except (OSError, IOError): - # Ignore not being able to read a specific, seemingly version - # related file. - # See https://github.com/nir0s/distro/issues/162 - return {} - - @staticmethod - def _parse_distro_release_content(line): - """ - Parse a line from a distro release file. - - Parameters: - * line: Line from the distro release file. Must be a unicode string - or a UTF-8 encoded byte string. - - Returns: - A dictionary containing all information items. - """ - if isinstance(line, bytes): - line = line.decode('utf-8') - matches = _DISTRO_RELEASE_CONTENT_REVERSED_PATTERN.match( - line.strip()[::-1]) - distro_info = {} - if matches: - # regexp ensures non-None - distro_info['name'] = matches.group(3)[::-1] - if matches.group(2): - distro_info['version_id'] = matches.group(2)[::-1] - if matches.group(1): - distro_info['codename'] = matches.group(1)[::-1] - elif line: - distro_info['name'] = line.strip() - return distro_info - - -_distro = LinuxDistribution() - - -def main(): - logger = logging.getLogger(__name__) - logger.setLevel(logging.DEBUG) - logger.addHandler(logging.StreamHandler(sys.stdout)) - - parser = argparse.ArgumentParser(description="OS distro info tool") - parser.add_argument( - '--json', - '-j', - help="Output in machine readable format", - action="store_true") - args = parser.parse_args() - - if args.json: - logger.info(json.dumps(info(), indent=4, sort_keys=True)) - else: - logger.info('Name: %s', name(pretty=True)) - distribution_version = version(pretty=True) - logger.info('Version: %s', distribution_version) - distribution_codename = codename() - logger.info('Codename: %s', distribution_codename) - - -if __name__ == '__main__': - main() diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distro.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/distro.pyc deleted file mode 100644 index e44515689831661f2893f92647347ac37ac9cf2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42880 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 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/__init__.py deleted file mode 100644 index 0491234..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/__init__.py +++ /dev/null @@ -1,35 +0,0 @@ -""" -HTML parsing library based on the `WHATWG HTML specification -<https://whatwg.org/html>`_. The parser is designed to be compatible with -existing HTML found in the wild and implements well-defined error recovery that -is largely compatible with modern desktop web browsers. - -Example usage:: - - from pip._vendor import html5lib - with open("my_document.html", "rb") as f: - tree = html5lib.parse(f) - -For convenience, this module re-exports the following names: - -* :func:`~.html5parser.parse` -* :func:`~.html5parser.parseFragment` -* :class:`~.html5parser.HTMLParser` -* :func:`~.treebuilders.getTreeBuilder` -* :func:`~.treewalkers.getTreeWalker` -* :func:`~.serializer.serialize` -""" - -from __future__ import absolute_import, division, unicode_literals - -from .html5parser import HTMLParser, parse, parseFragment -from .treebuilders import getTreeBuilder -from .treewalkers import getTreeWalker -from .serializer import serialize - -__all__ = ["HTMLParser", "parse", "parseFragment", "getTreeBuilder", - "getTreeWalker", "serialize"] - -# this has to be at the top level, see how setup.py parses this -#: Distribution version number. -__version__ = "1.0.1" diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/__init__.pyc deleted file mode 100644 index dcdda3c4b86ea986bcc530ea0543888893d902fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1495 zcmaJ>TW{Mo6h6MhNfhVOhrRWI$dg+%Qi83)W^~0iU|k>9q3{d@5HQe`NXtYhQY9&0 z@-SfkU_WI4Zhv5hlIzwDFa<g0IXXPwcW&zadm26e>+Fvlw$A{6f0%W_{f!3>kfQ7W z?}F+;*@d(VWe?IGlzmA1(BVDceNYEb4j>&sc?jttlt+*rweJo<9YYyG8nyZW)CrVB zNQbR{2<jBdGf2-+KLUOXJOX|Kd<gs$3JiJ<9A94mKZoB(7f7o9rwb6hoxb~(RLnZ5 z3!-FZnca|#Il+n1#4iMy-M#&BdiM)yJY6MnIhQ%}(&*^b!u!gNlVr7EepSTA7Rkbw z>h+AqWQun~U}1@LgbODNjZwWJnIO3-D~ypTK~~Z)BC(dv2MP_!+|-&A+2XIH;)Dgg ztduB)_KvKCQdeBeWr!%OHI`VBo25YV9=Sw_sF*E;+I$H`O2dWKfzZ7-6^6=4X3YwD zx;Tn{Ub6s0YR3vO9!C+uXKqbNDp|#JDKtkgq++ZmA=j5!w8kmqK};p|=(5~UZt^;C zjf2nS3vy|*%V&f+G9NeIA*{DTkneX<;-*@o`Lif`gBZEdh$e;3#S2UdGeYJyQnTVp ztOLGl`ZG65nN_HrW~FdQ`8gTSYn_j0e>UhZ+b*=>XaD>5jb%k(-FW4SIrn9d(4Y5B zSN9@?RI(a76{=VWKSlkgR)6HTV(R`gx4TB&^TJ+8rsRXL@$NW_WLT|H4~0KR!7^u5 z?FDU{;g8V9<x)DFOy3N+mO1vCD(Qt~%E`{|euSq_nfL=#n<DwskEf577==sz48?v{ ztv$GJ?QI&Z`54VR;`KgQy#uQsfz^+38mB#odOvyycN1U7H@}UZ;L#tVpke$d^#PgE zdF^W}D4n1NlaS8@Hy`{7ie`e_`Iv;tPWnNFn0^?<XKkH?Pg-*+Shr1_1h@ugm#>|K zPHcHFrI1HJqPRQwl`)#q5vuS>xC+&zvU171NS4edIMQK|l81G&`PycBb$@gFL0{k6 zZ*KE%-TFKJV6X8hs$`nrT3$)*JR)8Bn|B3$A56{vc3YcIQdrZ3QmLh<G_E$yxV&mN Z>h)Jhz=e?+bf0#gb}qtSci0*B{{zE1t(^b> diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_ihatexml.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_ihatexml.py deleted file mode 100644 index 4c77717..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_ihatexml.py +++ /dev/null @@ -1,288 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -import re -import warnings - -from .constants import DataLossWarning - -baseChar = """ -[#x0041-#x005A] | [#x0061-#x007A] | [#x00C0-#x00D6] | [#x00D8-#x00F6] | -[#x00F8-#x00FF] | [#x0100-#x0131] | [#x0134-#x013E] | [#x0141-#x0148] | -[#x014A-#x017E] | [#x0180-#x01C3] | [#x01CD-#x01F0] | [#x01F4-#x01F5] | -[#x01FA-#x0217] | [#x0250-#x02A8] | [#x02BB-#x02C1] | #x0386 | -[#x0388-#x038A] | #x038C | [#x038E-#x03A1] | [#x03A3-#x03CE] | -[#x03D0-#x03D6] | #x03DA | #x03DC | #x03DE | #x03E0 | [#x03E2-#x03F3] | -[#x0401-#x040C] | [#x040E-#x044F] | [#x0451-#x045C] | [#x045E-#x0481] | -[#x0490-#x04C4] | [#x04C7-#x04C8] | [#x04CB-#x04CC] | [#x04D0-#x04EB] | -[#x04EE-#x04F5] | [#x04F8-#x04F9] | [#x0531-#x0556] | #x0559 | -[#x0561-#x0586] | [#x05D0-#x05EA] | [#x05F0-#x05F2] | [#x0621-#x063A] | -[#x0641-#x064A] | [#x0671-#x06B7] | [#x06BA-#x06BE] | [#x06C0-#x06CE] | -[#x06D0-#x06D3] | #x06D5 | [#x06E5-#x06E6] | [#x0905-#x0939] | #x093D | -[#x0958-#x0961] | [#x0985-#x098C] | [#x098F-#x0990] | [#x0993-#x09A8] | -[#x09AA-#x09B0] | #x09B2 | [#x09B6-#x09B9] | [#x09DC-#x09DD] | -[#x09DF-#x09E1] | [#x09F0-#x09F1] | [#x0A05-#x0A0A] | [#x0A0F-#x0A10] | -[#x0A13-#x0A28] | [#x0A2A-#x0A30] | [#x0A32-#x0A33] | [#x0A35-#x0A36] | -[#x0A38-#x0A39] | [#x0A59-#x0A5C] | #x0A5E | [#x0A72-#x0A74] | -[#x0A85-#x0A8B] | #x0A8D | [#x0A8F-#x0A91] | [#x0A93-#x0AA8] | -[#x0AAA-#x0AB0] | [#x0AB2-#x0AB3] | [#x0AB5-#x0AB9] | #x0ABD | #x0AE0 | -[#x0B05-#x0B0C] | [#x0B0F-#x0B10] | [#x0B13-#x0B28] | [#x0B2A-#x0B30] | -[#x0B32-#x0B33] | [#x0B36-#x0B39] | #x0B3D | [#x0B5C-#x0B5D] | -[#x0B5F-#x0B61] | [#x0B85-#x0B8A] | [#x0B8E-#x0B90] | [#x0B92-#x0B95] | -[#x0B99-#x0B9A] | #x0B9C | [#x0B9E-#x0B9F] | [#x0BA3-#x0BA4] | -[#x0BA8-#x0BAA] | [#x0BAE-#x0BB5] | [#x0BB7-#x0BB9] | [#x0C05-#x0C0C] | -[#x0C0E-#x0C10] | [#x0C12-#x0C28] | [#x0C2A-#x0C33] | [#x0C35-#x0C39] | -[#x0C60-#x0C61] | [#x0C85-#x0C8C] | [#x0C8E-#x0C90] | [#x0C92-#x0CA8] | -[#x0CAA-#x0CB3] | [#x0CB5-#x0CB9] | #x0CDE | [#x0CE0-#x0CE1] | -[#x0D05-#x0D0C] | [#x0D0E-#x0D10] | [#x0D12-#x0D28] | [#x0D2A-#x0D39] | -[#x0D60-#x0D61] | [#x0E01-#x0E2E] | #x0E30 | [#x0E32-#x0E33] | -[#x0E40-#x0E45] | [#x0E81-#x0E82] | #x0E84 | [#x0E87-#x0E88] | #x0E8A | -#x0E8D | [#x0E94-#x0E97] | [#x0E99-#x0E9F] | [#x0EA1-#x0EA3] | #x0EA5 | -#x0EA7 | [#x0EAA-#x0EAB] | [#x0EAD-#x0EAE] | #x0EB0 | [#x0EB2-#x0EB3] | -#x0EBD | [#x0EC0-#x0EC4] | [#x0F40-#x0F47] | [#x0F49-#x0F69] | -[#x10A0-#x10C5] | [#x10D0-#x10F6] | #x1100 | [#x1102-#x1103] | -[#x1105-#x1107] | #x1109 | [#x110B-#x110C] | [#x110E-#x1112] | #x113C | -#x113E | #x1140 | #x114C | #x114E | #x1150 | [#x1154-#x1155] | #x1159 | -[#x115F-#x1161] | #x1163 | #x1165 | #x1167 | #x1169 | [#x116D-#x116E] | -[#x1172-#x1173] | #x1175 | #x119E | #x11A8 | #x11AB | [#x11AE-#x11AF] | -[#x11B7-#x11B8] | #x11BA | [#x11BC-#x11C2] | #x11EB | #x11F0 | #x11F9 | -[#x1E00-#x1E9B] | [#x1EA0-#x1EF9] | [#x1F00-#x1F15] | [#x1F18-#x1F1D] | -[#x1F20-#x1F45] | [#x1F48-#x1F4D] | [#x1F50-#x1F57] | #x1F59 | #x1F5B | -#x1F5D | [#x1F5F-#x1F7D] | [#x1F80-#x1FB4] | [#x1FB6-#x1FBC] | #x1FBE | -[#x1FC2-#x1FC4] | [#x1FC6-#x1FCC] | [#x1FD0-#x1FD3] | [#x1FD6-#x1FDB] | -[#x1FE0-#x1FEC] | [#x1FF2-#x1FF4] | [#x1FF6-#x1FFC] | #x2126 | -[#x212A-#x212B] | #x212E | [#x2180-#x2182] | [#x3041-#x3094] | -[#x30A1-#x30FA] | [#x3105-#x312C] | [#xAC00-#xD7A3]""" - -ideographic = """[#x4E00-#x9FA5] | #x3007 | [#x3021-#x3029]""" - -combiningCharacter = """ -[#x0300-#x0345] | [#x0360-#x0361] | [#x0483-#x0486] | [#x0591-#x05A1] | -[#x05A3-#x05B9] | [#x05BB-#x05BD] | #x05BF | [#x05C1-#x05C2] | #x05C4 | -[#x064B-#x0652] | #x0670 | [#x06D6-#x06DC] | [#x06DD-#x06DF] | -[#x06E0-#x06E4] | [#x06E7-#x06E8] | [#x06EA-#x06ED] | [#x0901-#x0903] | -#x093C | [#x093E-#x094C] | #x094D | [#x0951-#x0954] | [#x0962-#x0963] | -[#x0981-#x0983] | #x09BC | #x09BE | #x09BF | [#x09C0-#x09C4] | -[#x09C7-#x09C8] | [#x09CB-#x09CD] | #x09D7 | [#x09E2-#x09E3] | #x0A02 | -#x0A3C | #x0A3E | #x0A3F | [#x0A40-#x0A42] | [#x0A47-#x0A48] | -[#x0A4B-#x0A4D] | [#x0A70-#x0A71] | [#x0A81-#x0A83] | #x0ABC | -[#x0ABE-#x0AC5] | [#x0AC7-#x0AC9] | [#x0ACB-#x0ACD] | [#x0B01-#x0B03] | -#x0B3C | [#x0B3E-#x0B43] | [#x0B47-#x0B48] | [#x0B4B-#x0B4D] | -[#x0B56-#x0B57] | [#x0B82-#x0B83] | [#x0BBE-#x0BC2] | [#x0BC6-#x0BC8] | -[#x0BCA-#x0BCD] | #x0BD7 | [#x0C01-#x0C03] | [#x0C3E-#x0C44] | -[#x0C46-#x0C48] | [#x0C4A-#x0C4D] | [#x0C55-#x0C56] | [#x0C82-#x0C83] | -[#x0CBE-#x0CC4] | [#x0CC6-#x0CC8] | [#x0CCA-#x0CCD] | [#x0CD5-#x0CD6] | -[#x0D02-#x0D03] | [#x0D3E-#x0D43] | [#x0D46-#x0D48] | [#x0D4A-#x0D4D] | -#x0D57 | #x0E31 | [#x0E34-#x0E3A] | [#x0E47-#x0E4E] | #x0EB1 | -[#x0EB4-#x0EB9] | [#x0EBB-#x0EBC] | [#x0EC8-#x0ECD] | [#x0F18-#x0F19] | -#x0F35 | #x0F37 | #x0F39 | #x0F3E | #x0F3F | [#x0F71-#x0F84] | -[#x0F86-#x0F8B] | [#x0F90-#x0F95] | #x0F97 | [#x0F99-#x0FAD] | -[#x0FB1-#x0FB7] | #x0FB9 | [#x20D0-#x20DC] | #x20E1 | [#x302A-#x302F] | -#x3099 | #x309A""" - -digit = """ -[#x0030-#x0039] | [#x0660-#x0669] | [#x06F0-#x06F9] | [#x0966-#x096F] | -[#x09E6-#x09EF] | [#x0A66-#x0A6F] | [#x0AE6-#x0AEF] | [#x0B66-#x0B6F] | -[#x0BE7-#x0BEF] | [#x0C66-#x0C6F] | [#x0CE6-#x0CEF] | [#x0D66-#x0D6F] | -[#x0E50-#x0E59] | [#x0ED0-#x0ED9] | [#x0F20-#x0F29]""" - -extender = """ -#x00B7 | #x02D0 | #x02D1 | #x0387 | #x0640 | #x0E46 | #x0EC6 | #x3005 | -#[#x3031-#x3035] | [#x309D-#x309E] | [#x30FC-#x30FE]""" - -letter = " | ".join([baseChar, ideographic]) - -# Without the -name = " | ".join([letter, digit, ".", "-", "_", combiningCharacter, - extender]) -nameFirst = " | ".join([letter, "_"]) - -reChar = re.compile(r"#x([\d|A-F]{4,4})") -reCharRange = re.compile(r"\[#x([\d|A-F]{4,4})-#x([\d|A-F]{4,4})\]") - - -def charStringToList(chars): - charRanges = [item.strip() for item in chars.split(" | ")] - rv = [] - for item in charRanges: - foundMatch = False - for regexp in (reChar, reCharRange): - match = regexp.match(item) - if match is not None: - rv.append([hexToInt(item) for item in match.groups()]) - if len(rv[-1]) == 1: - rv[-1] = rv[-1] * 2 - foundMatch = True - break - if not foundMatch: - assert len(item) == 1 - - rv.append([ord(item)] * 2) - rv = normaliseCharList(rv) - return rv - - -def normaliseCharList(charList): - charList = sorted(charList) - for item in charList: - assert item[1] >= item[0] - rv = [] - i = 0 - while i < len(charList): - j = 1 - rv.append(charList[i]) - while i + j < len(charList) and charList[i + j][0] <= rv[-1][1] + 1: - rv[-1][1] = charList[i + j][1] - j += 1 - i += j - return rv - -# We don't really support characters above the BMP :( -max_unicode = int("FFFF", 16) - - -def missingRanges(charList): - rv = [] - if charList[0] != 0: - rv.append([0, charList[0][0] - 1]) - for i, item in enumerate(charList[:-1]): - rv.append([item[1] + 1, charList[i + 1][0] - 1]) - if charList[-1][1] != max_unicode: - rv.append([charList[-1][1] + 1, max_unicode]) - return rv - - -def listToRegexpStr(charList): - rv = [] - for item in charList: - if item[0] == item[1]: - rv.append(escapeRegexp(chr(item[0]))) - else: - rv.append(escapeRegexp(chr(item[0])) + "-" + - escapeRegexp(chr(item[1]))) - return "[%s]" % "".join(rv) - - -def hexToInt(hex_str): - return int(hex_str, 16) - - -def escapeRegexp(string): - specialCharacters = (".", "^", "$", "*", "+", "?", "{", "}", - "[", "]", "|", "(", ")", "-") - for char in specialCharacters: - string = string.replace(char, "\\" + char) - - return string - -# output from the above -nonXmlNameBMPRegexp = re.compile('[\x00-,/:-@\\[-\\^`\\{-\xb6\xb8-\xbf\xd7\xf7\u0132-\u0133\u013f-\u0140\u0149\u017f\u01c4-\u01cc\u01f1-\u01f3\u01f6-\u01f9\u0218-\u024f\u02a9-\u02ba\u02c2-\u02cf\u02d2-\u02ff\u0346-\u035f\u0362-\u0385\u038b\u038d\u03a2\u03cf\u03d7-\u03d9\u03db\u03dd\u03df\u03e1\u03f4-\u0400\u040d\u0450\u045d\u0482\u0487-\u048f\u04c5-\u04c6\u04c9-\u04ca\u04cd-\u04cf\u04ec-\u04ed\u04f6-\u04f7\u04fa-\u0530\u0557-\u0558\u055a-\u0560\u0587-\u0590\u05a2\u05ba\u05be\u05c0\u05c3\u05c5-\u05cf\u05eb-\u05ef\u05f3-\u0620\u063b-\u063f\u0653-\u065f\u066a-\u066f\u06b8-\u06b9\u06bf\u06cf\u06d4\u06e9\u06ee-\u06ef\u06fa-\u0900\u0904\u093a-\u093b\u094e-\u0950\u0955-\u0957\u0964-\u0965\u0970-\u0980\u0984\u098d-\u098e\u0991-\u0992\u09a9\u09b1\u09b3-\u09b5\u09ba-\u09bb\u09bd\u09c5-\u09c6\u09c9-\u09ca\u09ce-\u09d6\u09d8-\u09db\u09de\u09e4-\u09e5\u09f2-\u0a01\u0a03-\u0a04\u0a0b-\u0a0e\u0a11-\u0a12\u0a29\u0a31\u0a34\u0a37\u0a3a-\u0a3b\u0a3d\u0a43-\u0a46\u0a49-\u0a4a\u0a4e-\u0a58\u0a5d\u0a5f-\u0a65\u0a75-\u0a80\u0a84\u0a8c\u0a8e\u0a92\u0aa9\u0ab1\u0ab4\u0aba-\u0abb\u0ac6\u0aca\u0ace-\u0adf\u0ae1-\u0ae5\u0af0-\u0b00\u0b04\u0b0d-\u0b0e\u0b11-\u0b12\u0b29\u0b31\u0b34-\u0b35\u0b3a-\u0b3b\u0b44-\u0b46\u0b49-\u0b4a\u0b4e-\u0b55\u0b58-\u0b5b\u0b5e\u0b62-\u0b65\u0b70-\u0b81\u0b84\u0b8b-\u0b8d\u0b91\u0b96-\u0b98\u0b9b\u0b9d\u0ba0-\u0ba2\u0ba5-\u0ba7\u0bab-\u0bad\u0bb6\u0bba-\u0bbd\u0bc3-\u0bc5\u0bc9\u0bce-\u0bd6\u0bd8-\u0be6\u0bf0-\u0c00\u0c04\u0c0d\u0c11\u0c29\u0c34\u0c3a-\u0c3d\u0c45\u0c49\u0c4e-\u0c54\u0c57-\u0c5f\u0c62-\u0c65\u0c70-\u0c81\u0c84\u0c8d\u0c91\u0ca9\u0cb4\u0cba-\u0cbd\u0cc5\u0cc9\u0cce-\u0cd4\u0cd7-\u0cdd\u0cdf\u0ce2-\u0ce5\u0cf0-\u0d01\u0d04\u0d0d\u0d11\u0d29\u0d3a-\u0d3d\u0d44-\u0d45\u0d49\u0d4e-\u0d56\u0d58-\u0d5f\u0d62-\u0d65\u0d70-\u0e00\u0e2f\u0e3b-\u0e3f\u0e4f\u0e5a-\u0e80\u0e83\u0e85-\u0e86\u0e89\u0e8b-\u0e8c\u0e8e-\u0e93\u0e98\u0ea0\u0ea4\u0ea6\u0ea8-\u0ea9\u0eac\u0eaf\u0eba\u0ebe-\u0ebf\u0ec5\u0ec7\u0ece-\u0ecf\u0eda-\u0f17\u0f1a-\u0f1f\u0f2a-\u0f34\u0f36\u0f38\u0f3a-\u0f3d\u0f48\u0f6a-\u0f70\u0f85\u0f8c-\u0f8f\u0f96\u0f98\u0fae-\u0fb0\u0fb8\u0fba-\u109f\u10c6-\u10cf\u10f7-\u10ff\u1101\u1104\u1108\u110a\u110d\u1113-\u113b\u113d\u113f\u1141-\u114b\u114d\u114f\u1151-\u1153\u1156-\u1158\u115a-\u115e\u1162\u1164\u1166\u1168\u116a-\u116c\u116f-\u1171\u1174\u1176-\u119d\u119f-\u11a7\u11a9-\u11aa\u11ac-\u11ad\u11b0-\u11b6\u11b9\u11bb\u11c3-\u11ea\u11ec-\u11ef\u11f1-\u11f8\u11fa-\u1dff\u1e9c-\u1e9f\u1efa-\u1eff\u1f16-\u1f17\u1f1e-\u1f1f\u1f46-\u1f47\u1f4e-\u1f4f\u1f58\u1f5a\u1f5c\u1f5e\u1f7e-\u1f7f\u1fb5\u1fbd\u1fbf-\u1fc1\u1fc5\u1fcd-\u1fcf\u1fd4-\u1fd5\u1fdc-\u1fdf\u1fed-\u1ff1\u1ff5\u1ffd-\u20cf\u20dd-\u20e0\u20e2-\u2125\u2127-\u2129\u212c-\u212d\u212f-\u217f\u2183-\u3004\u3006\u3008-\u3020\u3030\u3036-\u3040\u3095-\u3098\u309b-\u309c\u309f-\u30a0\u30fb\u30ff-\u3104\u312d-\u4dff\u9fa6-\uabff\ud7a4-\uffff]') # noqa - -nonXmlNameFirstBMPRegexp = re.compile('[\x00-@\\[-\\^`\\{-\xbf\xd7\xf7\u0132-\u0133\u013f-\u0140\u0149\u017f\u01c4-\u01cc\u01f1-\u01f3\u01f6-\u01f9\u0218-\u024f\u02a9-\u02ba\u02c2-\u0385\u0387\u038b\u038d\u03a2\u03cf\u03d7-\u03d9\u03db\u03dd\u03df\u03e1\u03f4-\u0400\u040d\u0450\u045d\u0482-\u048f\u04c5-\u04c6\u04c9-\u04ca\u04cd-\u04cf\u04ec-\u04ed\u04f6-\u04f7\u04fa-\u0530\u0557-\u0558\u055a-\u0560\u0587-\u05cf\u05eb-\u05ef\u05f3-\u0620\u063b-\u0640\u064b-\u0670\u06b8-\u06b9\u06bf\u06cf\u06d4\u06d6-\u06e4\u06e7-\u0904\u093a-\u093c\u093e-\u0957\u0962-\u0984\u098d-\u098e\u0991-\u0992\u09a9\u09b1\u09b3-\u09b5\u09ba-\u09db\u09de\u09e2-\u09ef\u09f2-\u0a04\u0a0b-\u0a0e\u0a11-\u0a12\u0a29\u0a31\u0a34\u0a37\u0a3a-\u0a58\u0a5d\u0a5f-\u0a71\u0a75-\u0a84\u0a8c\u0a8e\u0a92\u0aa9\u0ab1\u0ab4\u0aba-\u0abc\u0abe-\u0adf\u0ae1-\u0b04\u0b0d-\u0b0e\u0b11-\u0b12\u0b29\u0b31\u0b34-\u0b35\u0b3a-\u0b3c\u0b3e-\u0b5b\u0b5e\u0b62-\u0b84\u0b8b-\u0b8d\u0b91\u0b96-\u0b98\u0b9b\u0b9d\u0ba0-\u0ba2\u0ba5-\u0ba7\u0bab-\u0bad\u0bb6\u0bba-\u0c04\u0c0d\u0c11\u0c29\u0c34\u0c3a-\u0c5f\u0c62-\u0c84\u0c8d\u0c91\u0ca9\u0cb4\u0cba-\u0cdd\u0cdf\u0ce2-\u0d04\u0d0d\u0d11\u0d29\u0d3a-\u0d5f\u0d62-\u0e00\u0e2f\u0e31\u0e34-\u0e3f\u0e46-\u0e80\u0e83\u0e85-\u0e86\u0e89\u0e8b-\u0e8c\u0e8e-\u0e93\u0e98\u0ea0\u0ea4\u0ea6\u0ea8-\u0ea9\u0eac\u0eaf\u0eb1\u0eb4-\u0ebc\u0ebe-\u0ebf\u0ec5-\u0f3f\u0f48\u0f6a-\u109f\u10c6-\u10cf\u10f7-\u10ff\u1101\u1104\u1108\u110a\u110d\u1113-\u113b\u113d\u113f\u1141-\u114b\u114d\u114f\u1151-\u1153\u1156-\u1158\u115a-\u115e\u1162\u1164\u1166\u1168\u116a-\u116c\u116f-\u1171\u1174\u1176-\u119d\u119f-\u11a7\u11a9-\u11aa\u11ac-\u11ad\u11b0-\u11b6\u11b9\u11bb\u11c3-\u11ea\u11ec-\u11ef\u11f1-\u11f8\u11fa-\u1dff\u1e9c-\u1e9f\u1efa-\u1eff\u1f16-\u1f17\u1f1e-\u1f1f\u1f46-\u1f47\u1f4e-\u1f4f\u1f58\u1f5a\u1f5c\u1f5e\u1f7e-\u1f7f\u1fb5\u1fbd\u1fbf-\u1fc1\u1fc5\u1fcd-\u1fcf\u1fd4-\u1fd5\u1fdc-\u1fdf\u1fed-\u1ff1\u1ff5\u1ffd-\u2125\u2127-\u2129\u212c-\u212d\u212f-\u217f\u2183-\u3006\u3008-\u3020\u302a-\u3040\u3095-\u30a0\u30fb-\u3104\u312d-\u4dff\u9fa6-\uabff\ud7a4-\uffff]') # noqa - -# Simpler things -nonPubidCharRegexp = re.compile("[^\x20\x0D\x0Aa-zA-Z0-9\\-'()+,./:=?;!*#@$_%]") - - -class InfosetFilter(object): - replacementRegexp = re.compile(r"U[\dA-F]{5,5}") - - def __init__(self, - dropXmlnsLocalName=False, - dropXmlnsAttrNs=False, - preventDoubleDashComments=False, - preventDashAtCommentEnd=False, - replaceFormFeedCharacters=True, - preventSingleQuotePubid=False): - - self.dropXmlnsLocalName = dropXmlnsLocalName - self.dropXmlnsAttrNs = dropXmlnsAttrNs - - self.preventDoubleDashComments = preventDoubleDashComments - self.preventDashAtCommentEnd = preventDashAtCommentEnd - - self.replaceFormFeedCharacters = replaceFormFeedCharacters - - self.preventSingleQuotePubid = preventSingleQuotePubid - - self.replaceCache = {} - - def coerceAttribute(self, name, namespace=None): - if self.dropXmlnsLocalName and name.startswith("xmlns:"): - warnings.warn("Attributes cannot begin with xmlns", DataLossWarning) - return None - elif (self.dropXmlnsAttrNs and - namespace == "http://www.w3.org/2000/xmlns/"): - warnings.warn("Attributes cannot be in the xml namespace", DataLossWarning) - return None - else: - return self.toXmlName(name) - - def coerceElement(self, name): - return self.toXmlName(name) - - def coerceComment(self, data): - if self.preventDoubleDashComments: - while "--" in data: - warnings.warn("Comments cannot contain adjacent dashes", DataLossWarning) - data = data.replace("--", "- -") - if data.endswith("-"): - warnings.warn("Comments cannot end in a dash", DataLossWarning) - data += " " - return data - - def coerceCharacters(self, data): - if self.replaceFormFeedCharacters: - for _ in range(data.count("\x0C")): - warnings.warn("Text cannot contain U+000C", DataLossWarning) - data = data.replace("\x0C", " ") - # Other non-xml characters - return data - - def coercePubid(self, data): - dataOutput = data - for char in nonPubidCharRegexp.findall(data): - warnings.warn("Coercing non-XML pubid", DataLossWarning) - replacement = self.getReplacementCharacter(char) - dataOutput = dataOutput.replace(char, replacement) - if self.preventSingleQuotePubid and dataOutput.find("'") >= 0: - warnings.warn("Pubid cannot contain single quote", DataLossWarning) - dataOutput = dataOutput.replace("'", self.getReplacementCharacter("'")) - return dataOutput - - def toXmlName(self, name): - nameFirst = name[0] - nameRest = name[1:] - m = nonXmlNameFirstBMPRegexp.match(nameFirst) - if m: - warnings.warn("Coercing non-XML name", DataLossWarning) - nameFirstOutput = self.getReplacementCharacter(nameFirst) - else: - nameFirstOutput = nameFirst - - nameRestOutput = nameRest - replaceChars = set(nonXmlNameBMPRegexp.findall(nameRest)) - for char in replaceChars: - warnings.warn("Coercing non-XML name", DataLossWarning) - replacement = self.getReplacementCharacter(char) - nameRestOutput = nameRestOutput.replace(char, replacement) - return nameFirstOutput + nameRestOutput - - def getReplacementCharacter(self, char): - if char in self.replaceCache: - replacement = self.replaceCache[char] - else: - replacement = self.escapeChar(char) - return replacement - - def fromXmlName(self, name): - for item in set(self.replacementRegexp.findall(name)): - name = name.replace(item, self.unescapeChar(item)) - return name - - def escapeChar(self, char): - replacement = "U%05X" % ord(char) - self.replaceCache[char] = replacement - return replacement - - def unescapeChar(self, charcode): - return chr(int(charcode[1:], 16)) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_ihatexml.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_ihatexml.pyc deleted file mode 100644 index 64f66b4ea343acb30ee8cbe60dfe9ea5aaf74636..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16440 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 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_inputstream.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_inputstream.py deleted file mode 100644 index a65e55f..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_inputstream.py +++ /dev/null @@ -1,923 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from pip._vendor.six import text_type, binary_type -from pip._vendor.six.moves import http_client, urllib - -import codecs -import re - -from pip._vendor import webencodings - -from .constants import EOF, spaceCharacters, asciiLetters, asciiUppercase -from .constants import _ReparseException -from . import _utils - -from io import StringIO - -try: - from io import BytesIO -except ImportError: - BytesIO = StringIO - -# Non-unicode versions of constants for use in the pre-parser -spaceCharactersBytes = frozenset([item.encode("ascii") for item in spaceCharacters]) -asciiLettersBytes = frozenset([item.encode("ascii") for item in asciiLetters]) -asciiUppercaseBytes = frozenset([item.encode("ascii") for item in asciiUppercase]) -spacesAngleBrackets = spaceCharactersBytes | frozenset([b">", b"<"]) - - -invalid_unicode_no_surrogate = "[\u0001-\u0008\u000B\u000E-\u001F\u007F-\u009F\uFDD0-\uFDEF\uFFFE\uFFFF\U0001FFFE\U0001FFFF\U0002FFFE\U0002FFFF\U0003FFFE\U0003FFFF\U0004FFFE\U0004FFFF\U0005FFFE\U0005FFFF\U0006FFFE\U0006FFFF\U0007FFFE\U0007FFFF\U0008FFFE\U0008FFFF\U0009FFFE\U0009FFFF\U000AFFFE\U000AFFFF\U000BFFFE\U000BFFFF\U000CFFFE\U000CFFFF\U000DFFFE\U000DFFFF\U000EFFFE\U000EFFFF\U000FFFFE\U000FFFFF\U0010FFFE\U0010FFFF]" # noqa - -if _utils.supports_lone_surrogates: - # Use one extra step of indirection and create surrogates with - # eval. Not using this indirection would introduce an illegal - # unicode literal on platforms not supporting such lone - # surrogates. - assert invalid_unicode_no_surrogate[-1] == "]" and invalid_unicode_no_surrogate.count("]") == 1 - invalid_unicode_re = re.compile(invalid_unicode_no_surrogate[:-1] + - eval('"\\uD800-\\uDFFF"') + # pylint:disable=eval-used - "]") -else: - invalid_unicode_re = re.compile(invalid_unicode_no_surrogate) - -non_bmp_invalid_codepoints = set([0x1FFFE, 0x1FFFF, 0x2FFFE, 0x2FFFF, 0x3FFFE, - 0x3FFFF, 0x4FFFE, 0x4FFFF, 0x5FFFE, 0x5FFFF, - 0x6FFFE, 0x6FFFF, 0x7FFFE, 0x7FFFF, 0x8FFFE, - 0x8FFFF, 0x9FFFE, 0x9FFFF, 0xAFFFE, 0xAFFFF, - 0xBFFFE, 0xBFFFF, 0xCFFFE, 0xCFFFF, 0xDFFFE, - 0xDFFFF, 0xEFFFE, 0xEFFFF, 0xFFFFE, 0xFFFFF, - 0x10FFFE, 0x10FFFF]) - -ascii_punctuation_re = re.compile("[\u0009-\u000D\u0020-\u002F\u003A-\u0040\u005C\u005B-\u0060\u007B-\u007E]") - -# Cache for charsUntil() -charsUntilRegEx = {} - - -class BufferedStream(object): - """Buffering for streams that do not have buffering of their own - - The buffer is implemented as a list of chunks on the assumption that - joining many strings will be slow since it is O(n**2) - """ - - def __init__(self, stream): - self.stream = stream - self.buffer = [] - self.position = [-1, 0] # chunk number, offset - - def tell(self): - pos = 0 - for chunk in self.buffer[:self.position[0]]: - pos += len(chunk) - pos += self.position[1] - return pos - - def seek(self, pos): - assert pos <= self._bufferedBytes() - offset = pos - i = 0 - while len(self.buffer[i]) < offset: - offset -= len(self.buffer[i]) - i += 1 - self.position = [i, offset] - - def read(self, bytes): - if not self.buffer: - return self._readStream(bytes) - elif (self.position[0] == len(self.buffer) and - self.position[1] == len(self.buffer[-1])): - return self._readStream(bytes) - else: - return self._readFromBuffer(bytes) - - def _bufferedBytes(self): - return sum([len(item) for item in self.buffer]) - - def _readStream(self, bytes): - data = self.stream.read(bytes) - self.buffer.append(data) - self.position[0] += 1 - self.position[1] = len(data) - return data - - def _readFromBuffer(self, bytes): - remainingBytes = bytes - rv = [] - bufferIndex = self.position[0] - bufferOffset = self.position[1] - while bufferIndex < len(self.buffer) and remainingBytes != 0: - assert remainingBytes > 0 - bufferedData = self.buffer[bufferIndex] - - if remainingBytes <= len(bufferedData) - bufferOffset: - bytesToRead = remainingBytes - self.position = [bufferIndex, bufferOffset + bytesToRead] - else: - bytesToRead = len(bufferedData) - bufferOffset - self.position = [bufferIndex, len(bufferedData)] - bufferIndex += 1 - rv.append(bufferedData[bufferOffset:bufferOffset + bytesToRead]) - remainingBytes -= bytesToRead - - bufferOffset = 0 - - if remainingBytes: - rv.append(self._readStream(remainingBytes)) - - return b"".join(rv) - - -def HTMLInputStream(source, **kwargs): - # Work around Python bug #20007: read(0) closes the connection. - # http://bugs.python.org/issue20007 - if (isinstance(source, http_client.HTTPResponse) or - # Also check for addinfourl wrapping HTTPResponse - (isinstance(source, urllib.response.addbase) and - isinstance(source.fp, http_client.HTTPResponse))): - isUnicode = False - elif hasattr(source, "read"): - isUnicode = isinstance(source.read(0), text_type) - else: - isUnicode = isinstance(source, text_type) - - if isUnicode: - encodings = [x for x in kwargs if x.endswith("_encoding")] - if encodings: - raise TypeError("Cannot set an encoding with a unicode input, set %r" % encodings) - - return HTMLUnicodeInputStream(source, **kwargs) - else: - return HTMLBinaryInputStream(source, **kwargs) - - -class HTMLUnicodeInputStream(object): - """Provides a unicode stream of characters to the HTMLTokenizer. - - This class takes care of character encoding and removing or replacing - incorrect byte-sequences and also provides column and line tracking. - - """ - - _defaultChunkSize = 10240 - - def __init__(self, source): - """Initialises the HTMLInputStream. - - HTMLInputStream(source, [encoding]) -> Normalized stream from source - for use by html5lib. - - source can be either a file-object, local filename or a string. - - The optional encoding parameter must be a string that indicates - the encoding. If specified, that encoding will be used, - regardless of any BOM or later declaration (such as in a meta - element) - - """ - - if not _utils.supports_lone_surrogates: - # Such platforms will have already checked for such - # surrogate errors, so no need to do this checking. - self.reportCharacterErrors = None - elif len("\U0010FFFF") == 1: - self.reportCharacterErrors = self.characterErrorsUCS4 - else: - self.reportCharacterErrors = self.characterErrorsUCS2 - - # List of where new lines occur - self.newLines = [0] - - self.charEncoding = (lookupEncoding("utf-8"), "certain") - self.dataStream = self.openStream(source) - - self.reset() - - def reset(self): - self.chunk = "" - self.chunkSize = 0 - self.chunkOffset = 0 - self.errors = [] - - # number of (complete) lines in previous chunks - self.prevNumLines = 0 - # number of columns in the last line of the previous chunk - self.prevNumCols = 0 - - # Deal with CR LF and surrogates split over chunk boundaries - self._bufferedCharacter = None - - def openStream(self, source): - """Produces a file object from source. - - source can be either a file object, local filename or a string. - - """ - # Already a file object - if hasattr(source, 'read'): - stream = source - else: - stream = StringIO(source) - - return stream - - def _position(self, offset): - chunk = self.chunk - nLines = chunk.count('\n', 0, offset) - positionLine = self.prevNumLines + nLines - lastLinePos = chunk.rfind('\n', 0, offset) - if lastLinePos == -1: - positionColumn = self.prevNumCols + offset - else: - positionColumn = offset - (lastLinePos + 1) - return (positionLine, positionColumn) - - def position(self): - """Returns (line, col) of the current position in the stream.""" - line, col = self._position(self.chunkOffset) - return (line + 1, col) - - def char(self): - """ Read one character from the stream or queue if available. Return - EOF when EOF is reached. - """ - # Read a new chunk from the input stream if necessary - if self.chunkOffset >= self.chunkSize: - if not self.readChunk(): - return EOF - - chunkOffset = self.chunkOffset - char = self.chunk[chunkOffset] - self.chunkOffset = chunkOffset + 1 - - return char - - def readChunk(self, chunkSize=None): - if chunkSize is None: - chunkSize = self._defaultChunkSize - - self.prevNumLines, self.prevNumCols = self._position(self.chunkSize) - - self.chunk = "" - self.chunkSize = 0 - self.chunkOffset = 0 - - data = self.dataStream.read(chunkSize) - - # Deal with CR LF and surrogates broken across chunks - if self._bufferedCharacter: - data = self._bufferedCharacter + data - self._bufferedCharacter = None - elif not data: - # We have no more data, bye-bye stream - return False - - if len(data) > 1: - lastv = ord(data[-1]) - if lastv == 0x0D or 0xD800 <= lastv <= 0xDBFF: - self._bufferedCharacter = data[-1] - data = data[:-1] - - if self.reportCharacterErrors: - self.reportCharacterErrors(data) - - # Replace invalid characters - data = data.replace("\r\n", "\n") - data = data.replace("\r", "\n") - - self.chunk = data - self.chunkSize = len(data) - - return True - - def characterErrorsUCS4(self, data): - for _ in range(len(invalid_unicode_re.findall(data))): - self.errors.append("invalid-codepoint") - - def characterErrorsUCS2(self, data): - # Someone picked the wrong compile option - # You lose - skip = False - for match in invalid_unicode_re.finditer(data): - if skip: - continue - codepoint = ord(match.group()) - pos = match.start() - # Pretty sure there should be endianness issues here - if _utils.isSurrogatePair(data[pos:pos + 2]): - # We have a surrogate pair! - char_val = _utils.surrogatePairToCodepoint(data[pos:pos + 2]) - if char_val in non_bmp_invalid_codepoints: - self.errors.append("invalid-codepoint") - skip = True - elif (codepoint >= 0xD800 and codepoint <= 0xDFFF and - pos == len(data) - 1): - self.errors.append("invalid-codepoint") - else: - skip = False - self.errors.append("invalid-codepoint") - - def charsUntil(self, characters, opposite=False): - """ Returns a string of characters from the stream up to but not - including any character in 'characters' or EOF. 'characters' must be - a container that supports the 'in' method and iteration over its - characters. - """ - - # Use a cache of regexps to find the required characters - try: - chars = charsUntilRegEx[(characters, opposite)] - except KeyError: - if __debug__: - for c in characters: - assert(ord(c) < 128) - regex = "".join(["\\x%02x" % ord(c) for c in characters]) - if not opposite: - regex = "^%s" % regex - chars = charsUntilRegEx[(characters, opposite)] = re.compile("[%s]+" % regex) - - rv = [] - - while True: - # Find the longest matching prefix - m = chars.match(self.chunk, self.chunkOffset) - if m is None: - # If nothing matched, and it wasn't because we ran out of chunk, - # then stop - if self.chunkOffset != self.chunkSize: - break - else: - end = m.end() - # If not the whole chunk matched, return everything - # up to the part that didn't match - if end != self.chunkSize: - rv.append(self.chunk[self.chunkOffset:end]) - self.chunkOffset = end - break - # If the whole remainder of the chunk matched, - # use it all and read the next chunk - rv.append(self.chunk[self.chunkOffset:]) - if not self.readChunk(): - # Reached EOF - break - - r = "".join(rv) - return r - - def unget(self, char): - # Only one character is allowed to be ungotten at once - it must - # be consumed again before any further call to unget - if char is not None: - if self.chunkOffset == 0: - # unget is called quite rarely, so it's a good idea to do - # more work here if it saves a bit of work in the frequently - # called char and charsUntil. - # So, just prepend the ungotten character onto the current - # chunk: - self.chunk = char + self.chunk - self.chunkSize += 1 - else: - self.chunkOffset -= 1 - assert self.chunk[self.chunkOffset] == char - - -class HTMLBinaryInputStream(HTMLUnicodeInputStream): - """Provides a unicode stream of characters to the HTMLTokenizer. - - This class takes care of character encoding and removing or replacing - incorrect byte-sequences and also provides column and line tracking. - - """ - - def __init__(self, source, override_encoding=None, transport_encoding=None, - same_origin_parent_encoding=None, likely_encoding=None, - default_encoding="windows-1252", useChardet=True): - """Initialises the HTMLInputStream. - - HTMLInputStream(source, [encoding]) -> Normalized stream from source - for use by html5lib. - - source can be either a file-object, local filename or a string. - - The optional encoding parameter must be a string that indicates - the encoding. If specified, that encoding will be used, - regardless of any BOM or later declaration (such as in a meta - element) - - """ - # Raw Stream - for unicode objects this will encode to utf-8 and set - # self.charEncoding as appropriate - self.rawStream = self.openStream(source) - - HTMLUnicodeInputStream.__init__(self, self.rawStream) - - # Encoding Information - # Number of bytes to use when looking for a meta element with - # encoding information - self.numBytesMeta = 1024 - # Number of bytes to use when using detecting encoding using chardet - self.numBytesChardet = 100 - # Things from args - self.override_encoding = override_encoding - self.transport_encoding = transport_encoding - self.same_origin_parent_encoding = same_origin_parent_encoding - self.likely_encoding = likely_encoding - self.default_encoding = default_encoding - - # Determine encoding - self.charEncoding = self.determineEncoding(useChardet) - assert self.charEncoding[0] is not None - - # Call superclass - self.reset() - - def reset(self): - self.dataStream = self.charEncoding[0].codec_info.streamreader(self.rawStream, 'replace') - HTMLUnicodeInputStream.reset(self) - - def openStream(self, source): - """Produces a file object from source. - - source can be either a file object, local filename or a string. - - """ - # Already a file object - if hasattr(source, 'read'): - stream = source - else: - stream = BytesIO(source) - - try: - stream.seek(stream.tell()) - except: # pylint:disable=bare-except - stream = BufferedStream(stream) - - return stream - - def determineEncoding(self, chardet=True): - # BOMs take precedence over everything - # This will also read past the BOM if present - charEncoding = self.detectBOM(), "certain" - if charEncoding[0] is not None: - return charEncoding - - # If we've been overriden, we've been overriden - charEncoding = lookupEncoding(self.override_encoding), "certain" - if charEncoding[0] is not None: - return charEncoding - - # Now check the transport layer - charEncoding = lookupEncoding(self.transport_encoding), "certain" - if charEncoding[0] is not None: - return charEncoding - - # Look for meta elements with encoding information - charEncoding = self.detectEncodingMeta(), "tentative" - if charEncoding[0] is not None: - return charEncoding - - # Parent document encoding - charEncoding = lookupEncoding(self.same_origin_parent_encoding), "tentative" - if charEncoding[0] is not None and not charEncoding[0].name.startswith("utf-16"): - return charEncoding - - # "likely" encoding - charEncoding = lookupEncoding(self.likely_encoding), "tentative" - if charEncoding[0] is not None: - return charEncoding - - # Guess with chardet, if available - if chardet: - try: - from pip._vendor.chardet.universaldetector import UniversalDetector - except ImportError: - pass - else: - buffers = [] - detector = UniversalDetector() - while not detector.done: - buffer = self.rawStream.read(self.numBytesChardet) - assert isinstance(buffer, bytes) - if not buffer: - break - buffers.append(buffer) - detector.feed(buffer) - detector.close() - encoding = lookupEncoding(detector.result['encoding']) - self.rawStream.seek(0) - if encoding is not None: - return encoding, "tentative" - - # Try the default encoding - charEncoding = lookupEncoding(self.default_encoding), "tentative" - if charEncoding[0] is not None: - return charEncoding - - # Fallback to html5lib's default if even that hasn't worked - return lookupEncoding("windows-1252"), "tentative" - - def changeEncoding(self, newEncoding): - assert self.charEncoding[1] != "certain" - newEncoding = lookupEncoding(newEncoding) - if newEncoding is None: - return - if newEncoding.name in ("utf-16be", "utf-16le"): - newEncoding = lookupEncoding("utf-8") - assert newEncoding is not None - elif newEncoding == self.charEncoding[0]: - self.charEncoding = (self.charEncoding[0], "certain") - else: - self.rawStream.seek(0) - self.charEncoding = (newEncoding, "certain") - self.reset() - raise _ReparseException("Encoding changed from %s to %s" % (self.charEncoding[0], newEncoding)) - - def detectBOM(self): - """Attempts to detect at BOM at the start of the stream. If - an encoding can be determined from the BOM return the name of the - encoding otherwise return None""" - bomDict = { - codecs.BOM_UTF8: 'utf-8', - codecs.BOM_UTF16_LE: 'utf-16le', codecs.BOM_UTF16_BE: 'utf-16be', - codecs.BOM_UTF32_LE: 'utf-32le', codecs.BOM_UTF32_BE: 'utf-32be' - } - - # Go to beginning of file and read in 4 bytes - string = self.rawStream.read(4) - assert isinstance(string, bytes) - - # Try detecting the BOM using bytes from the string - encoding = bomDict.get(string[:3]) # UTF-8 - seek = 3 - if not encoding: - # Need to detect UTF-32 before UTF-16 - encoding = bomDict.get(string) # UTF-32 - seek = 4 - if not encoding: - encoding = bomDict.get(string[:2]) # UTF-16 - seek = 2 - - # Set the read position past the BOM if one was found, otherwise - # set it to the start of the stream - if encoding: - self.rawStream.seek(seek) - return lookupEncoding(encoding) - else: - self.rawStream.seek(0) - return None - - def detectEncodingMeta(self): - """Report the encoding declared by the meta element - """ - buffer = self.rawStream.read(self.numBytesMeta) - assert isinstance(buffer, bytes) - parser = EncodingParser(buffer) - self.rawStream.seek(0) - encoding = parser.getEncoding() - - if encoding is not None and encoding.name in ("utf-16be", "utf-16le"): - encoding = lookupEncoding("utf-8") - - return encoding - - -class EncodingBytes(bytes): - """String-like object with an associated position and various extra methods - If the position is ever greater than the string length then an exception is - raised""" - def __new__(self, value): - assert isinstance(value, bytes) - return bytes.__new__(self, value.lower()) - - def __init__(self, value): - # pylint:disable=unused-argument - self._position = -1 - - def __iter__(self): - return self - - def __next__(self): - p = self._position = self._position + 1 - if p >= len(self): - raise StopIteration - elif p < 0: - raise TypeError - return self[p:p + 1] - - def next(self): - # Py2 compat - return self.__next__() - - def previous(self): - p = self._position - if p >= len(self): - raise StopIteration - elif p < 0: - raise TypeError - self._position = p = p - 1 - return self[p:p + 1] - - def setPosition(self, position): - if self._position >= len(self): - raise StopIteration - self._position = position - - def getPosition(self): - if self._position >= len(self): - raise StopIteration - if self._position >= 0: - return self._position - else: - return None - - position = property(getPosition, setPosition) - - def getCurrentByte(self): - return self[self.position:self.position + 1] - - currentByte = property(getCurrentByte) - - def skip(self, chars=spaceCharactersBytes): - """Skip past a list of characters""" - p = self.position # use property for the error-checking - while p < len(self): - c = self[p:p + 1] - if c not in chars: - self._position = p - return c - p += 1 - self._position = p - return None - - def skipUntil(self, chars): - p = self.position - while p < len(self): - c = self[p:p + 1] - if c in chars: - self._position = p - return c - p += 1 - self._position = p - return None - - def matchBytes(self, bytes): - """Look for a sequence of bytes at the start of a string. If the bytes - are found return True and advance the position to the byte after the - match. Otherwise return False and leave the position alone""" - p = self.position - data = self[p:p + len(bytes)] - rv = data.startswith(bytes) - if rv: - self.position += len(bytes) - return rv - - def jumpTo(self, bytes): - """Look for the next sequence of bytes matching a given sequence. If - a match is found advance the position to the last byte of the match""" - newPosition = self[self.position:].find(bytes) - if newPosition > -1: - # XXX: This is ugly, but I can't see a nicer way to fix this. - if self._position == -1: - self._position = 0 - self._position += (newPosition + len(bytes) - 1) - return True - else: - raise StopIteration - - -class EncodingParser(object): - """Mini parser for detecting character encoding from meta elements""" - - def __init__(self, data): - """string - the data to work on for encoding detection""" - self.data = EncodingBytes(data) - self.encoding = None - - def getEncoding(self): - methodDispatch = ( - (b"<!--", self.handleComment), - (b"<meta", self.handleMeta), - (b"</", self.handlePossibleEndTag), - (b"<!", self.handleOther), - (b"<?", self.handleOther), - (b"<", self.handlePossibleStartTag)) - for _ in self.data: - keepParsing = True - for key, method in methodDispatch: - if self.data.matchBytes(key): - try: - keepParsing = method() - break - except StopIteration: - keepParsing = False - break - if not keepParsing: - break - - return self.encoding - - def handleComment(self): - """Skip over comments""" - return self.data.jumpTo(b"-->") - - def handleMeta(self): - if self.data.currentByte not in spaceCharactersBytes: - # if we have <meta not followed by a space so just keep going - return True - # We have a valid meta element we want to search for attributes - hasPragma = False - pendingEncoding = None - while True: - # Try to find the next attribute after the current position - attr = self.getAttribute() - if attr is None: - return True - else: - if attr[0] == b"http-equiv": - hasPragma = attr[1] == b"content-type" - if hasPragma and pendingEncoding is not None: - self.encoding = pendingEncoding - return False - elif attr[0] == b"charset": - tentativeEncoding = attr[1] - codec = lookupEncoding(tentativeEncoding) - if codec is not None: - self.encoding = codec - return False - elif attr[0] == b"content": - contentParser = ContentAttrParser(EncodingBytes(attr[1])) - tentativeEncoding = contentParser.parse() - if tentativeEncoding is not None: - codec = lookupEncoding(tentativeEncoding) - if codec is not None: - if hasPragma: - self.encoding = codec - return False - else: - pendingEncoding = codec - - def handlePossibleStartTag(self): - return self.handlePossibleTag(False) - - def handlePossibleEndTag(self): - next(self.data) - return self.handlePossibleTag(True) - - def handlePossibleTag(self, endTag): - data = self.data - if data.currentByte not in asciiLettersBytes: - # If the next byte is not an ascii letter either ignore this - # fragment (possible start tag case) or treat it according to - # handleOther - if endTag: - data.previous() - self.handleOther() - return True - - c = data.skipUntil(spacesAngleBrackets) - if c == b"<": - # return to the first step in the overall "two step" algorithm - # reprocessing the < byte - data.previous() - else: - # Read all attributes - attr = self.getAttribute() - while attr is not None: - attr = self.getAttribute() - return True - - def handleOther(self): - return self.data.jumpTo(b">") - - def getAttribute(self): - """Return a name,value pair for the next attribute in the stream, - if one is found, or None""" - data = self.data - # Step 1 (skip chars) - c = data.skip(spaceCharactersBytes | frozenset([b"/"])) - assert c is None or len(c) == 1 - # Step 2 - if c in (b">", None): - return None - # Step 3 - attrName = [] - attrValue = [] - # Step 4 attribute name - while True: - if c == b"=" and attrName: - break - elif c in spaceCharactersBytes: - # Step 6! - c = data.skip() - break - elif c in (b"/", b">"): - return b"".join(attrName), b"" - elif c in asciiUppercaseBytes: - attrName.append(c.lower()) - elif c is None: - return None - else: - attrName.append(c) - # Step 5 - c = next(data) - # Step 7 - if c != b"=": - data.previous() - return b"".join(attrName), b"" - # Step 8 - next(data) - # Step 9 - c = data.skip() - # Step 10 - if c in (b"'", b'"'): - # 10.1 - quoteChar = c - while True: - # 10.2 - c = next(data) - # 10.3 - if c == quoteChar: - next(data) - return b"".join(attrName), b"".join(attrValue) - # 10.4 - elif c in asciiUppercaseBytes: - attrValue.append(c.lower()) - # 10.5 - else: - attrValue.append(c) - elif c == b">": - return b"".join(attrName), b"" - elif c in asciiUppercaseBytes: - attrValue.append(c.lower()) - elif c is None: - return None - else: - attrValue.append(c) - # Step 11 - while True: - c = next(data) - if c in spacesAngleBrackets: - return b"".join(attrName), b"".join(attrValue) - elif c in asciiUppercaseBytes: - attrValue.append(c.lower()) - elif c is None: - return None - else: - attrValue.append(c) - - -class ContentAttrParser(object): - def __init__(self, data): - assert isinstance(data, bytes) - self.data = data - - def parse(self): - try: - # Check if the attr name is charset - # otherwise return - self.data.jumpTo(b"charset") - self.data.position += 1 - self.data.skip() - if not self.data.currentByte == b"=": - # If there is no = sign keep looking for attrs - return None - self.data.position += 1 - self.data.skip() - # Look for an encoding between matching quote marks - if self.data.currentByte in (b'"', b"'"): - quoteMark = self.data.currentByte - self.data.position += 1 - oldPosition = self.data.position - if self.data.jumpTo(quoteMark): - return self.data[oldPosition:self.data.position] - else: - return None - else: - # Unquoted value - oldPosition = self.data.position - try: - self.data.skipUntil(spaceCharactersBytes) - return self.data[oldPosition:self.data.position] - except StopIteration: - # Return the whole remaining value - return self.data[oldPosition:] - except StopIteration: - return None - - -def lookupEncoding(encoding): - """Return the python codec name corresponding to an encoding or None if the - string doesn't correspond to a valid encoding.""" - if isinstance(encoding, binary_type): - try: - encoding = encoding.decode("ascii") - except UnicodeDecodeError: - return None - - if encoding is not None: - try: - return webencodings.lookup(encoding) - except AttributeError: - return None - else: - return None diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_inputstream.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_inputstream.pyc deleted file mode 100644 index 9f79993f7eec5ba9e26207f92998bffb5f755aac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30522 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 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_tokenizer.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_tokenizer.py deleted file mode 100644 index 178f6e7..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_tokenizer.py +++ /dev/null @@ -1,1721 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from pip._vendor.six import unichr as chr - -from collections import deque - -from .constants import spaceCharacters -from .constants import entities -from .constants import asciiLetters, asciiUpper2Lower -from .constants import digits, hexDigits, EOF -from .constants import tokenTypes, tagTokenTypes -from .constants import replacementCharacters - -from ._inputstream import HTMLInputStream - -from ._trie import Trie - -entitiesTrie = Trie(entities) - - -class HTMLTokenizer(object): - """ This class takes care of tokenizing HTML. - - * self.currentToken - Holds the token that is currently being processed. - - * self.state - Holds a reference to the method to be invoked... XXX - - * self.stream - Points to HTMLInputStream object. - """ - - def __init__(self, stream, parser=None, **kwargs): - - self.stream = HTMLInputStream(stream, **kwargs) - self.parser = parser - - # Setup the initial tokenizer state - self.escapeFlag = False - self.lastFourChars = [] - self.state = self.dataState - self.escape = False - - # The current token being created - self.currentToken = None - super(HTMLTokenizer, self).__init__() - - def __iter__(self): - """ This is where the magic happens. - - We do our usually processing through the states and when we have a token - to return we yield the token which pauses processing until the next token - is requested. - """ - self.tokenQueue = deque([]) - # Start processing. When EOF is reached self.state will return False - # instead of True and the loop will terminate. - while self.state(): - while self.stream.errors: - yield {"type": tokenTypes["ParseError"], "data": self.stream.errors.pop(0)} - while self.tokenQueue: - yield self.tokenQueue.popleft() - - def consumeNumberEntity(self, isHex): - """This function returns either U+FFFD or the character based on the - decimal or hexadecimal representation. It also discards ";" if present. - If not present self.tokenQueue.append({"type": tokenTypes["ParseError"]}) is invoked. - """ - - allowed = digits - radix = 10 - if isHex: - allowed = hexDigits - radix = 16 - - charStack = [] - - # Consume all the characters that are in range while making sure we - # don't hit an EOF. - c = self.stream.char() - while c in allowed and c is not EOF: - charStack.append(c) - c = self.stream.char() - - # Convert the set of characters consumed to an int. - charAsInt = int("".join(charStack), radix) - - # Certain characters get replaced with others - if charAsInt in replacementCharacters: - char = replacementCharacters[charAsInt] - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "illegal-codepoint-for-numeric-entity", - "datavars": {"charAsInt": charAsInt}}) - elif ((0xD800 <= charAsInt <= 0xDFFF) or - (charAsInt > 0x10FFFF)): - char = "\uFFFD" - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "illegal-codepoint-for-numeric-entity", - "datavars": {"charAsInt": charAsInt}}) - else: - # Should speed up this check somehow (e.g. move the set to a constant) - if ((0x0001 <= charAsInt <= 0x0008) or - (0x000E <= charAsInt <= 0x001F) or - (0x007F <= charAsInt <= 0x009F) or - (0xFDD0 <= charAsInt <= 0xFDEF) or - charAsInt in frozenset([0x000B, 0xFFFE, 0xFFFF, 0x1FFFE, - 0x1FFFF, 0x2FFFE, 0x2FFFF, 0x3FFFE, - 0x3FFFF, 0x4FFFE, 0x4FFFF, 0x5FFFE, - 0x5FFFF, 0x6FFFE, 0x6FFFF, 0x7FFFE, - 0x7FFFF, 0x8FFFE, 0x8FFFF, 0x9FFFE, - 0x9FFFF, 0xAFFFE, 0xAFFFF, 0xBFFFE, - 0xBFFFF, 0xCFFFE, 0xCFFFF, 0xDFFFE, - 0xDFFFF, 0xEFFFE, 0xEFFFF, 0xFFFFE, - 0xFFFFF, 0x10FFFE, 0x10FFFF])): - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": - "illegal-codepoint-for-numeric-entity", - "datavars": {"charAsInt": charAsInt}}) - try: - # Try/except needed as UCS-2 Python builds' unichar only works - # within the BMP. - char = chr(charAsInt) - except ValueError: - v = charAsInt - 0x10000 - char = chr(0xD800 | (v >> 10)) + chr(0xDC00 | (v & 0x3FF)) - - # Discard the ; if present. Otherwise, put it back on the queue and - # invoke parseError on parser. - if c != ";": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "numeric-entity-without-semicolon"}) - self.stream.unget(c) - - return char - - def consumeEntity(self, allowedChar=None, fromAttribute=False): - # Initialise to the default output for when no entity is matched - output = "&" - - charStack = [self.stream.char()] - if (charStack[0] in spaceCharacters or charStack[0] in (EOF, "<", "&") or - (allowedChar is not None and allowedChar == charStack[0])): - self.stream.unget(charStack[0]) - - elif charStack[0] == "#": - # Read the next character to see if it's hex or decimal - hex = False - charStack.append(self.stream.char()) - if charStack[-1] in ("x", "X"): - hex = True - charStack.append(self.stream.char()) - - # charStack[-1] should be the first digit - if (hex and charStack[-1] in hexDigits) \ - or (not hex and charStack[-1] in digits): - # At least one digit found, so consume the whole number - self.stream.unget(charStack[-1]) - output = self.consumeNumberEntity(hex) - else: - # No digits found - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "expected-numeric-entity"}) - self.stream.unget(charStack.pop()) - output = "&" + "".join(charStack) - - else: - # At this point in the process might have named entity. Entities - # are stored in the global variable "entities". - # - # Consume characters and compare to these to a substring of the - # entity names in the list until the substring no longer matches. - while (charStack[-1] is not EOF): - if not entitiesTrie.has_keys_with_prefix("".join(charStack)): - break - charStack.append(self.stream.char()) - - # At this point we have a string that starts with some characters - # that may match an entity - # Try to find the longest entity the string will match to take care - # of ¬i for instance. - try: - entityName = entitiesTrie.longest_prefix("".join(charStack[:-1])) - entityLength = len(entityName) - except KeyError: - entityName = None - - if entityName is not None: - if entityName[-1] != ";": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "named-entity-without-semicolon"}) - if (entityName[-1] != ";" and fromAttribute and - (charStack[entityLength] in asciiLetters or - charStack[entityLength] in digits or - charStack[entityLength] == "=")): - self.stream.unget(charStack.pop()) - output = "&" + "".join(charStack) - else: - output = entities[entityName] - self.stream.unget(charStack.pop()) - output += "".join(charStack[entityLength:]) - else: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-named-entity"}) - self.stream.unget(charStack.pop()) - output = "&" + "".join(charStack) - - if fromAttribute: - self.currentToken["data"][-1][1] += output - else: - if output in spaceCharacters: - tokenType = "SpaceCharacters" - else: - tokenType = "Characters" - self.tokenQueue.append({"type": tokenTypes[tokenType], "data": output}) - - def processEntityInAttribute(self, allowedChar): - """This method replaces the need for "entityInAttributeValueState". - """ - self.consumeEntity(allowedChar=allowedChar, fromAttribute=True) - - def emitCurrentToken(self): - """This method is a generic handler for emitting the tags. It also sets - the state to "data" because that's what's needed after a token has been - emitted. - """ - token = self.currentToken - # Add token to the queue to be yielded - if (token["type"] in tagTokenTypes): - token["name"] = token["name"].translate(asciiUpper2Lower) - if token["type"] == tokenTypes["EndTag"]: - if token["data"]: - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "attributes-in-end-tag"}) - if token["selfClosing"]: - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "self-closing-flag-on-end-tag"}) - self.tokenQueue.append(token) - self.state = self.dataState - - # Below are the various tokenizer states worked out. - def dataState(self): - data = self.stream.char() - if data == "&": - self.state = self.entityDataState - elif data == "<": - self.state = self.tagOpenState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": "\u0000"}) - elif data is EOF: - # Tokenization ends. - return False - elif data in spaceCharacters: - # Directly after emitting a token you switch back to the "data - # state". At that point spaceCharacters are important so they are - # emitted separately. - self.tokenQueue.append({"type": tokenTypes["SpaceCharacters"], "data": - data + self.stream.charsUntil(spaceCharacters, True)}) - # No need to update lastFourChars here, since the first space will - # have already been appended to lastFourChars and will have broken - # any <!-- or --> sequences - else: - chars = self.stream.charsUntil(("&", "<", "\u0000")) - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": - data + chars}) - return True - - def entityDataState(self): - self.consumeEntity() - self.state = self.dataState - return True - - def rcdataState(self): - data = self.stream.char() - if data == "&": - self.state = self.characterReferenceInRcdata - elif data == "<": - self.state = self.rcdataLessThanSignState - elif data == EOF: - # Tokenization ends. - return False - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": "\uFFFD"}) - elif data in spaceCharacters: - # Directly after emitting a token you switch back to the "data - # state". At that point spaceCharacters are important so they are - # emitted separately. - self.tokenQueue.append({"type": tokenTypes["SpaceCharacters"], "data": - data + self.stream.charsUntil(spaceCharacters, True)}) - # No need to update lastFourChars here, since the first space will - # have already been appended to lastFourChars and will have broken - # any <!-- or --> sequences - else: - chars = self.stream.charsUntil(("&", "<", "\u0000")) - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": - data + chars}) - return True - - def characterReferenceInRcdata(self): - self.consumeEntity() - self.state = self.rcdataState - return True - - def rawtextState(self): - data = self.stream.char() - if data == "<": - self.state = self.rawtextLessThanSignState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": "\uFFFD"}) - elif data == EOF: - # Tokenization ends. - return False - else: - chars = self.stream.charsUntil(("<", "\u0000")) - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": - data + chars}) - return True - - def scriptDataState(self): - data = self.stream.char() - if data == "<": - self.state = self.scriptDataLessThanSignState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": "\uFFFD"}) - elif data == EOF: - # Tokenization ends. - return False - else: - chars = self.stream.charsUntil(("<", "\u0000")) - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": - data + chars}) - return True - - def plaintextState(self): - data = self.stream.char() - if data == EOF: - # Tokenization ends. - return False - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": "\uFFFD"}) - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": - data + self.stream.charsUntil("\u0000")}) - return True - - def tagOpenState(self): - data = self.stream.char() - if data == "!": - self.state = self.markupDeclarationOpenState - elif data == "/": - self.state = self.closeTagOpenState - elif data in asciiLetters: - self.currentToken = {"type": tokenTypes["StartTag"], - "name": data, "data": [], - "selfClosing": False, - "selfClosingAcknowledged": False} - self.state = self.tagNameState - elif data == ">": - # XXX In theory it could be something besides a tag name. But - # do we really care? - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-tag-name-but-got-right-bracket"}) - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<>"}) - self.state = self.dataState - elif data == "?": - # XXX In theory it could be something besides a tag name. But - # do we really care? - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-tag-name-but-got-question-mark"}) - self.stream.unget(data) - self.state = self.bogusCommentState - else: - # XXX - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-tag-name"}) - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) - self.stream.unget(data) - self.state = self.dataState - return True - - def closeTagOpenState(self): - data = self.stream.char() - if data in asciiLetters: - self.currentToken = {"type": tokenTypes["EndTag"], "name": data, - "data": [], "selfClosing": False} - self.state = self.tagNameState - elif data == ">": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-closing-tag-but-got-right-bracket"}) - self.state = self.dataState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-closing-tag-but-got-eof"}) - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"}) - self.state = self.dataState - else: - # XXX data can be _'_... - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-closing-tag-but-got-char", - "datavars": {"data": data}}) - self.stream.unget(data) - self.state = self.bogusCommentState - return True - - def tagNameState(self): - data = self.stream.char() - if data in spaceCharacters: - self.state = self.beforeAttributeNameState - elif data == ">": - self.emitCurrentToken() - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-tag-name"}) - self.state = self.dataState - elif data == "/": - self.state = self.selfClosingStartTagState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["name"] += "\uFFFD" - else: - self.currentToken["name"] += data - # (Don't use charsUntil here, because tag names are - # very short and it's faster to not do anything fancy) - return True - - def rcdataLessThanSignState(self): - data = self.stream.char() - if data == "/": - self.temporaryBuffer = "" - self.state = self.rcdataEndTagOpenState - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) - self.stream.unget(data) - self.state = self.rcdataState - return True - - def rcdataEndTagOpenState(self): - data = self.stream.char() - if data in asciiLetters: - self.temporaryBuffer += data - self.state = self.rcdataEndTagNameState - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"}) - self.stream.unget(data) - self.state = self.rcdataState - return True - - def rcdataEndTagNameState(self): - appropriate = self.currentToken and self.currentToken["name"].lower() == self.temporaryBuffer.lower() - data = self.stream.char() - if data in spaceCharacters and appropriate: - self.currentToken = {"type": tokenTypes["EndTag"], - "name": self.temporaryBuffer, - "data": [], "selfClosing": False} - self.state = self.beforeAttributeNameState - elif data == "/" and appropriate: - self.currentToken = {"type": tokenTypes["EndTag"], - "name": self.temporaryBuffer, - "data": [], "selfClosing": False} - self.state = self.selfClosingStartTagState - elif data == ">" and appropriate: - self.currentToken = {"type": tokenTypes["EndTag"], - "name": self.temporaryBuffer, - "data": [], "selfClosing": False} - self.emitCurrentToken() - self.state = self.dataState - elif data in asciiLetters: - self.temporaryBuffer += data - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": "</" + self.temporaryBuffer}) - self.stream.unget(data) - self.state = self.rcdataState - return True - - def rawtextLessThanSignState(self): - data = self.stream.char() - if data == "/": - self.temporaryBuffer = "" - self.state = self.rawtextEndTagOpenState - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) - self.stream.unget(data) - self.state = self.rawtextState - return True - - def rawtextEndTagOpenState(self): - data = self.stream.char() - if data in asciiLetters: - self.temporaryBuffer += data - self.state = self.rawtextEndTagNameState - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"}) - self.stream.unget(data) - self.state = self.rawtextState - return True - - def rawtextEndTagNameState(self): - appropriate = self.currentToken and self.currentToken["name"].lower() == self.temporaryBuffer.lower() - data = self.stream.char() - if data in spaceCharacters and appropriate: - self.currentToken = {"type": tokenTypes["EndTag"], - "name": self.temporaryBuffer, - "data": [], "selfClosing": False} - self.state = self.beforeAttributeNameState - elif data == "/" and appropriate: - self.currentToken = {"type": tokenTypes["EndTag"], - "name": self.temporaryBuffer, - "data": [], "selfClosing": False} - self.state = self.selfClosingStartTagState - elif data == ">" and appropriate: - self.currentToken = {"type": tokenTypes["EndTag"], - "name": self.temporaryBuffer, - "data": [], "selfClosing": False} - self.emitCurrentToken() - self.state = self.dataState - elif data in asciiLetters: - self.temporaryBuffer += data - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": "</" + self.temporaryBuffer}) - self.stream.unget(data) - self.state = self.rawtextState - return True - - def scriptDataLessThanSignState(self): - data = self.stream.char() - if data == "/": - self.temporaryBuffer = "" - self.state = self.scriptDataEndTagOpenState - elif data == "!": - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<!"}) - self.state = self.scriptDataEscapeStartState - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) - self.stream.unget(data) - self.state = self.scriptDataState - return True - - def scriptDataEndTagOpenState(self): - data = self.stream.char() - if data in asciiLetters: - self.temporaryBuffer += data - self.state = self.scriptDataEndTagNameState - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"}) - self.stream.unget(data) - self.state = self.scriptDataState - return True - - def scriptDataEndTagNameState(self): - appropriate = self.currentToken and self.currentToken["name"].lower() == self.temporaryBuffer.lower() - data = self.stream.char() - if data in spaceCharacters and appropriate: - self.currentToken = {"type": tokenTypes["EndTag"], - "name": self.temporaryBuffer, - "data": [], "selfClosing": False} - self.state = self.beforeAttributeNameState - elif data == "/" and appropriate: - self.currentToken = {"type": tokenTypes["EndTag"], - "name": self.temporaryBuffer, - "data": [], "selfClosing": False} - self.state = self.selfClosingStartTagState - elif data == ">" and appropriate: - self.currentToken = {"type": tokenTypes["EndTag"], - "name": self.temporaryBuffer, - "data": [], "selfClosing": False} - self.emitCurrentToken() - self.state = self.dataState - elif data in asciiLetters: - self.temporaryBuffer += data - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": "</" + self.temporaryBuffer}) - self.stream.unget(data) - self.state = self.scriptDataState - return True - - def scriptDataEscapeStartState(self): - data = self.stream.char() - if data == "-": - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) - self.state = self.scriptDataEscapeStartDashState - else: - self.stream.unget(data) - self.state = self.scriptDataState - return True - - def scriptDataEscapeStartDashState(self): - data = self.stream.char() - if data == "-": - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) - self.state = self.scriptDataEscapedDashDashState - else: - self.stream.unget(data) - self.state = self.scriptDataState - return True - - def scriptDataEscapedState(self): - data = self.stream.char() - if data == "-": - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) - self.state = self.scriptDataEscapedDashState - elif data == "<": - self.state = self.scriptDataEscapedLessThanSignState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": "\uFFFD"}) - elif data == EOF: - self.state = self.dataState - else: - chars = self.stream.charsUntil(("<", "-", "\u0000")) - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": - data + chars}) - return True - - def scriptDataEscapedDashState(self): - data = self.stream.char() - if data == "-": - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) - self.state = self.scriptDataEscapedDashDashState - elif data == "<": - self.state = self.scriptDataEscapedLessThanSignState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": "\uFFFD"}) - self.state = self.scriptDataEscapedState - elif data == EOF: - self.state = self.dataState - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) - self.state = self.scriptDataEscapedState - return True - - def scriptDataEscapedDashDashState(self): - data = self.stream.char() - if data == "-": - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) - elif data == "<": - self.state = self.scriptDataEscapedLessThanSignState - elif data == ">": - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": ">"}) - self.state = self.scriptDataState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": "\uFFFD"}) - self.state = self.scriptDataEscapedState - elif data == EOF: - self.state = self.dataState - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) - self.state = self.scriptDataEscapedState - return True - - def scriptDataEscapedLessThanSignState(self): - data = self.stream.char() - if data == "/": - self.temporaryBuffer = "" - self.state = self.scriptDataEscapedEndTagOpenState - elif data in asciiLetters: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<" + data}) - self.temporaryBuffer = data - self.state = self.scriptDataDoubleEscapeStartState - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) - self.stream.unget(data) - self.state = self.scriptDataEscapedState - return True - - def scriptDataEscapedEndTagOpenState(self): - data = self.stream.char() - if data in asciiLetters: - self.temporaryBuffer = data - self.state = self.scriptDataEscapedEndTagNameState - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"}) - self.stream.unget(data) - self.state = self.scriptDataEscapedState - return True - - def scriptDataEscapedEndTagNameState(self): - appropriate = self.currentToken and self.currentToken["name"].lower() == self.temporaryBuffer.lower() - data = self.stream.char() - if data in spaceCharacters and appropriate: - self.currentToken = {"type": tokenTypes["EndTag"], - "name": self.temporaryBuffer, - "data": [], "selfClosing": False} - self.state = self.beforeAttributeNameState - elif data == "/" and appropriate: - self.currentToken = {"type": tokenTypes["EndTag"], - "name": self.temporaryBuffer, - "data": [], "selfClosing": False} - self.state = self.selfClosingStartTagState - elif data == ">" and appropriate: - self.currentToken = {"type": tokenTypes["EndTag"], - "name": self.temporaryBuffer, - "data": [], "selfClosing": False} - self.emitCurrentToken() - self.state = self.dataState - elif data in asciiLetters: - self.temporaryBuffer += data - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": "</" + self.temporaryBuffer}) - self.stream.unget(data) - self.state = self.scriptDataEscapedState - return True - - def scriptDataDoubleEscapeStartState(self): - data = self.stream.char() - if data in (spaceCharacters | frozenset(("/", ">"))): - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) - if self.temporaryBuffer.lower() == "script": - self.state = self.scriptDataDoubleEscapedState - else: - self.state = self.scriptDataEscapedState - elif data in asciiLetters: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) - self.temporaryBuffer += data - else: - self.stream.unget(data) - self.state = self.scriptDataEscapedState - return True - - def scriptDataDoubleEscapedState(self): - data = self.stream.char() - if data == "-": - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) - self.state = self.scriptDataDoubleEscapedDashState - elif data == "<": - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) - self.state = self.scriptDataDoubleEscapedLessThanSignState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": "\uFFFD"}) - elif data == EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-script-in-script"}) - self.state = self.dataState - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) - return True - - def scriptDataDoubleEscapedDashState(self): - data = self.stream.char() - if data == "-": - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) - self.state = self.scriptDataDoubleEscapedDashDashState - elif data == "<": - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) - self.state = self.scriptDataDoubleEscapedLessThanSignState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": "\uFFFD"}) - self.state = self.scriptDataDoubleEscapedState - elif data == EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-script-in-script"}) - self.state = self.dataState - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) - self.state = self.scriptDataDoubleEscapedState - return True - - def scriptDataDoubleEscapedDashDashState(self): - data = self.stream.char() - if data == "-": - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) - elif data == "<": - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) - self.state = self.scriptDataDoubleEscapedLessThanSignState - elif data == ">": - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": ">"}) - self.state = self.scriptDataState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": "\uFFFD"}) - self.state = self.scriptDataDoubleEscapedState - elif data == EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-script-in-script"}) - self.state = self.dataState - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) - self.state = self.scriptDataDoubleEscapedState - return True - - def scriptDataDoubleEscapedLessThanSignState(self): - data = self.stream.char() - if data == "/": - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "/"}) - self.temporaryBuffer = "" - self.state = self.scriptDataDoubleEscapeEndState - else: - self.stream.unget(data) - self.state = self.scriptDataDoubleEscapedState - return True - - def scriptDataDoubleEscapeEndState(self): - data = self.stream.char() - if data in (spaceCharacters | frozenset(("/", ">"))): - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) - if self.temporaryBuffer.lower() == "script": - self.state = self.scriptDataEscapedState - else: - self.state = self.scriptDataDoubleEscapedState - elif data in asciiLetters: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) - self.temporaryBuffer += data - else: - self.stream.unget(data) - self.state = self.scriptDataDoubleEscapedState - return True - - def beforeAttributeNameState(self): - data = self.stream.char() - if data in spaceCharacters: - self.stream.charsUntil(spaceCharacters, True) - elif data in asciiLetters: - self.currentToken["data"].append([data, ""]) - self.state = self.attributeNameState - elif data == ">": - self.emitCurrentToken() - elif data == "/": - self.state = self.selfClosingStartTagState - elif data in ("'", '"', "=", "<"): - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "invalid-character-in-attribute-name"}) - self.currentToken["data"].append([data, ""]) - self.state = self.attributeNameState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["data"].append(["\uFFFD", ""]) - self.state = self.attributeNameState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-attribute-name-but-got-eof"}) - self.state = self.dataState - else: - self.currentToken["data"].append([data, ""]) - self.state = self.attributeNameState - return True - - def attributeNameState(self): - data = self.stream.char() - leavingThisState = True - emitToken = False - if data == "=": - self.state = self.beforeAttributeValueState - elif data in asciiLetters: - self.currentToken["data"][-1][0] += data +\ - self.stream.charsUntil(asciiLetters, True) - leavingThisState = False - elif data == ">": - # XXX If we emit here the attributes are converted to a dict - # without being checked and when the code below runs we error - # because data is a dict not a list - emitToken = True - elif data in spaceCharacters: - self.state = self.afterAttributeNameState - elif data == "/": - self.state = self.selfClosingStartTagState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["data"][-1][0] += "\uFFFD" - leavingThisState = False - elif data in ("'", '"', "<"): - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": - "invalid-character-in-attribute-name"}) - self.currentToken["data"][-1][0] += data - leavingThisState = False - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "eof-in-attribute-name"}) - self.state = self.dataState - else: - self.currentToken["data"][-1][0] += data - leavingThisState = False - - if leavingThisState: - # Attributes are not dropped at this stage. That happens when the - # start tag token is emitted so values can still be safely appended - # to attributes, but we do want to report the parse error in time. - self.currentToken["data"][-1][0] = ( - self.currentToken["data"][-1][0].translate(asciiUpper2Lower)) - for name, _ in self.currentToken["data"][:-1]: - if self.currentToken["data"][-1][0] == name: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "duplicate-attribute"}) - break - # XXX Fix for above XXX - if emitToken: - self.emitCurrentToken() - return True - - def afterAttributeNameState(self): - data = self.stream.char() - if data in spaceCharacters: - self.stream.charsUntil(spaceCharacters, True) - elif data == "=": - self.state = self.beforeAttributeValueState - elif data == ">": - self.emitCurrentToken() - elif data in asciiLetters: - self.currentToken["data"].append([data, ""]) - self.state = self.attributeNameState - elif data == "/": - self.state = self.selfClosingStartTagState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["data"].append(["\uFFFD", ""]) - self.state = self.attributeNameState - elif data in ("'", '"', "<"): - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "invalid-character-after-attribute-name"}) - self.currentToken["data"].append([data, ""]) - self.state = self.attributeNameState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-end-of-tag-but-got-eof"}) - self.state = self.dataState - else: - self.currentToken["data"].append([data, ""]) - self.state = self.attributeNameState - return True - - def beforeAttributeValueState(self): - data = self.stream.char() - if data in spaceCharacters: - self.stream.charsUntil(spaceCharacters, True) - elif data == "\"": - self.state = self.attributeValueDoubleQuotedState - elif data == "&": - self.state = self.attributeValueUnQuotedState - self.stream.unget(data) - elif data == "'": - self.state = self.attributeValueSingleQuotedState - elif data == ">": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-attribute-value-but-got-right-bracket"}) - self.emitCurrentToken() - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["data"][-1][1] += "\uFFFD" - self.state = self.attributeValueUnQuotedState - elif data in ("=", "<", "`"): - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "equals-in-unquoted-attribute-value"}) - self.currentToken["data"][-1][1] += data - self.state = self.attributeValueUnQuotedState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-attribute-value-but-got-eof"}) - self.state = self.dataState - else: - self.currentToken["data"][-1][1] += data - self.state = self.attributeValueUnQuotedState - return True - - def attributeValueDoubleQuotedState(self): - data = self.stream.char() - if data == "\"": - self.state = self.afterAttributeValueState - elif data == "&": - self.processEntityInAttribute('"') - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["data"][-1][1] += "\uFFFD" - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-attribute-value-double-quote"}) - self.state = self.dataState - else: - self.currentToken["data"][-1][1] += data +\ - self.stream.charsUntil(("\"", "&", "\u0000")) - return True - - def attributeValueSingleQuotedState(self): - data = self.stream.char() - if data == "'": - self.state = self.afterAttributeValueState - elif data == "&": - self.processEntityInAttribute("'") - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["data"][-1][1] += "\uFFFD" - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-attribute-value-single-quote"}) - self.state = self.dataState - else: - self.currentToken["data"][-1][1] += data +\ - self.stream.charsUntil(("'", "&", "\u0000")) - return True - - def attributeValueUnQuotedState(self): - data = self.stream.char() - if data in spaceCharacters: - self.state = self.beforeAttributeNameState - elif data == "&": - self.processEntityInAttribute(">") - elif data == ">": - self.emitCurrentToken() - elif data in ('"', "'", "=", "<", "`"): - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-character-in-unquoted-attribute-value"}) - self.currentToken["data"][-1][1] += data - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["data"][-1][1] += "\uFFFD" - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-attribute-value-no-quotes"}) - self.state = self.dataState - else: - self.currentToken["data"][-1][1] += data + self.stream.charsUntil( - frozenset(("&", ">", '"', "'", "=", "<", "`", "\u0000")) | spaceCharacters) - return True - - def afterAttributeValueState(self): - data = self.stream.char() - if data in spaceCharacters: - self.state = self.beforeAttributeNameState - elif data == ">": - self.emitCurrentToken() - elif data == "/": - self.state = self.selfClosingStartTagState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-EOF-after-attribute-value"}) - self.stream.unget(data) - self.state = self.dataState - else: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-character-after-attribute-value"}) - self.stream.unget(data) - self.state = self.beforeAttributeNameState - return True - - def selfClosingStartTagState(self): - data = self.stream.char() - if data == ">": - self.currentToken["selfClosing"] = True - self.emitCurrentToken() - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": - "unexpected-EOF-after-solidus-in-tag"}) - self.stream.unget(data) - self.state = self.dataState - else: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-character-after-solidus-in-tag"}) - self.stream.unget(data) - self.state = self.beforeAttributeNameState - return True - - def bogusCommentState(self): - # Make a new comment token and give it as value all the characters - # until the first > or EOF (charsUntil checks for EOF automatically) - # and emit it. - data = self.stream.charsUntil(">") - data = data.replace("\u0000", "\uFFFD") - self.tokenQueue.append( - {"type": tokenTypes["Comment"], "data": data}) - - # Eat the character directly after the bogus comment which is either a - # ">" or an EOF. - self.stream.char() - self.state = self.dataState - return True - - def markupDeclarationOpenState(self): - charStack = [self.stream.char()] - if charStack[-1] == "-": - charStack.append(self.stream.char()) - if charStack[-1] == "-": - self.currentToken = {"type": tokenTypes["Comment"], "data": ""} - self.state = self.commentStartState - return True - elif charStack[-1] in ('d', 'D'): - matched = True - for expected in (('o', 'O'), ('c', 'C'), ('t', 'T'), - ('y', 'Y'), ('p', 'P'), ('e', 'E')): - charStack.append(self.stream.char()) - if charStack[-1] not in expected: - matched = False - break - if matched: - self.currentToken = {"type": tokenTypes["Doctype"], - "name": "", - "publicId": None, "systemId": None, - "correct": True} - self.state = self.doctypeState - return True - elif (charStack[-1] == "[" and - self.parser is not None and - self.parser.tree.openElements and - self.parser.tree.openElements[-1].namespace != self.parser.tree.defaultNamespace): - matched = True - for expected in ["C", "D", "A", "T", "A", "["]: - charStack.append(self.stream.char()) - if charStack[-1] != expected: - matched = False - break - if matched: - self.state = self.cdataSectionState - return True - - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-dashes-or-doctype"}) - - while charStack: - self.stream.unget(charStack.pop()) - self.state = self.bogusCommentState - return True - - def commentStartState(self): - data = self.stream.char() - if data == "-": - self.state = self.commentStartDashState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["data"] += "\uFFFD" - elif data == ">": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "incorrect-comment"}) - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-comment"}) - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.currentToken["data"] += data - self.state = self.commentState - return True - - def commentStartDashState(self): - data = self.stream.char() - if data == "-": - self.state = self.commentEndState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["data"] += "-\uFFFD" - elif data == ">": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "incorrect-comment"}) - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-comment"}) - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.currentToken["data"] += "-" + data - self.state = self.commentState - return True - - def commentState(self): - data = self.stream.char() - if data == "-": - self.state = self.commentEndDashState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["data"] += "\uFFFD" - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "eof-in-comment"}) - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.currentToken["data"] += data + \ - self.stream.charsUntil(("-", "\u0000")) - return True - - def commentEndDashState(self): - data = self.stream.char() - if data == "-": - self.state = self.commentEndState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["data"] += "-\uFFFD" - self.state = self.commentState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-comment-end-dash"}) - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.currentToken["data"] += "-" + data - self.state = self.commentState - return True - - def commentEndState(self): - data = self.stream.char() - if data == ">": - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["data"] += "--\uFFFD" - self.state = self.commentState - elif data == "!": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-bang-after-double-dash-in-comment"}) - self.state = self.commentEndBangState - elif data == "-": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-dash-after-double-dash-in-comment"}) - self.currentToken["data"] += data - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-comment-double-dash"}) - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - # XXX - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-char-in-comment"}) - self.currentToken["data"] += "--" + data - self.state = self.commentState - return True - - def commentEndBangState(self): - data = self.stream.char() - if data == ">": - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data == "-": - self.currentToken["data"] += "--!" - self.state = self.commentEndDashState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["data"] += "--!\uFFFD" - self.state = self.commentState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-comment-end-bang-state"}) - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.currentToken["data"] += "--!" + data - self.state = self.commentState - return True - - def doctypeState(self): - data = self.stream.char() - if data in spaceCharacters: - self.state = self.beforeDoctypeNameState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-doctype-name-but-got-eof"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "need-space-after-doctype"}) - self.stream.unget(data) - self.state = self.beforeDoctypeNameState - return True - - def beforeDoctypeNameState(self): - data = self.stream.char() - if data in spaceCharacters: - pass - elif data == ">": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-doctype-name-but-got-right-bracket"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["name"] = "\uFFFD" - self.state = self.doctypeNameState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-doctype-name-but-got-eof"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.currentToken["name"] = data - self.state = self.doctypeNameState - return True - - def doctypeNameState(self): - data = self.stream.char() - if data in spaceCharacters: - self.currentToken["name"] = self.currentToken["name"].translate(asciiUpper2Lower) - self.state = self.afterDoctypeNameState - elif data == ">": - self.currentToken["name"] = self.currentToken["name"].translate(asciiUpper2Lower) - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["name"] += "\uFFFD" - self.state = self.doctypeNameState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-doctype-name"}) - self.currentToken["correct"] = False - self.currentToken["name"] = self.currentToken["name"].translate(asciiUpper2Lower) - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.currentToken["name"] += data - return True - - def afterDoctypeNameState(self): - data = self.stream.char() - if data in spaceCharacters: - pass - elif data == ">": - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data is EOF: - self.currentToken["correct"] = False - self.stream.unget(data) - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-doctype"}) - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - if data in ("p", "P"): - matched = True - for expected in (("u", "U"), ("b", "B"), ("l", "L"), - ("i", "I"), ("c", "C")): - data = self.stream.char() - if data not in expected: - matched = False - break - if matched: - self.state = self.afterDoctypePublicKeywordState - return True - elif data in ("s", "S"): - matched = True - for expected in (("y", "Y"), ("s", "S"), ("t", "T"), - ("e", "E"), ("m", "M")): - data = self.stream.char() - if data not in expected: - matched = False - break - if matched: - self.state = self.afterDoctypeSystemKeywordState - return True - - # All the characters read before the current 'data' will be - # [a-zA-Z], so they're garbage in the bogus doctype and can be - # discarded; only the latest character might be '>' or EOF - # and needs to be ungetted - self.stream.unget(data) - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-space-or-right-bracket-in-doctype", "datavars": - {"data": data}}) - self.currentToken["correct"] = False - self.state = self.bogusDoctypeState - - return True - - def afterDoctypePublicKeywordState(self): - data = self.stream.char() - if data in spaceCharacters: - self.state = self.beforeDoctypePublicIdentifierState - elif data in ("'", '"'): - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-char-in-doctype"}) - self.stream.unget(data) - self.state = self.beforeDoctypePublicIdentifierState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.stream.unget(data) - self.state = self.beforeDoctypePublicIdentifierState - return True - - def beforeDoctypePublicIdentifierState(self): - data = self.stream.char() - if data in spaceCharacters: - pass - elif data == "\"": - self.currentToken["publicId"] = "" - self.state = self.doctypePublicIdentifierDoubleQuotedState - elif data == "'": - self.currentToken["publicId"] = "" - self.state = self.doctypePublicIdentifierSingleQuotedState - elif data == ">": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-end-of-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-char-in-doctype"}) - self.currentToken["correct"] = False - self.state = self.bogusDoctypeState - return True - - def doctypePublicIdentifierDoubleQuotedState(self): - data = self.stream.char() - if data == "\"": - self.state = self.afterDoctypePublicIdentifierState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["publicId"] += "\uFFFD" - elif data == ">": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-end-of-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.currentToken["publicId"] += data - return True - - def doctypePublicIdentifierSingleQuotedState(self): - data = self.stream.char() - if data == "'": - self.state = self.afterDoctypePublicIdentifierState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["publicId"] += "\uFFFD" - elif data == ">": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-end-of-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.currentToken["publicId"] += data - return True - - def afterDoctypePublicIdentifierState(self): - data = self.stream.char() - if data in spaceCharacters: - self.state = self.betweenDoctypePublicAndSystemIdentifiersState - elif data == ">": - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data == '"': - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-char-in-doctype"}) - self.currentToken["systemId"] = "" - self.state = self.doctypeSystemIdentifierDoubleQuotedState - elif data == "'": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-char-in-doctype"}) - self.currentToken["systemId"] = "" - self.state = self.doctypeSystemIdentifierSingleQuotedState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-char-in-doctype"}) - self.currentToken["correct"] = False - self.state = self.bogusDoctypeState - return True - - def betweenDoctypePublicAndSystemIdentifiersState(self): - data = self.stream.char() - if data in spaceCharacters: - pass - elif data == ">": - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data == '"': - self.currentToken["systemId"] = "" - self.state = self.doctypeSystemIdentifierDoubleQuotedState - elif data == "'": - self.currentToken["systemId"] = "" - self.state = self.doctypeSystemIdentifierSingleQuotedState - elif data == EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-char-in-doctype"}) - self.currentToken["correct"] = False - self.state = self.bogusDoctypeState - return True - - def afterDoctypeSystemKeywordState(self): - data = self.stream.char() - if data in spaceCharacters: - self.state = self.beforeDoctypeSystemIdentifierState - elif data in ("'", '"'): - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-char-in-doctype"}) - self.stream.unget(data) - self.state = self.beforeDoctypeSystemIdentifierState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.stream.unget(data) - self.state = self.beforeDoctypeSystemIdentifierState - return True - - def beforeDoctypeSystemIdentifierState(self): - data = self.stream.char() - if data in spaceCharacters: - pass - elif data == "\"": - self.currentToken["systemId"] = "" - self.state = self.doctypeSystemIdentifierDoubleQuotedState - elif data == "'": - self.currentToken["systemId"] = "" - self.state = self.doctypeSystemIdentifierSingleQuotedState - elif data == ">": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-char-in-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-char-in-doctype"}) - self.currentToken["correct"] = False - self.state = self.bogusDoctypeState - return True - - def doctypeSystemIdentifierDoubleQuotedState(self): - data = self.stream.char() - if data == "\"": - self.state = self.afterDoctypeSystemIdentifierState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["systemId"] += "\uFFFD" - elif data == ">": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-end-of-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.currentToken["systemId"] += data - return True - - def doctypeSystemIdentifierSingleQuotedState(self): - data = self.stream.char() - if data == "'": - self.state = self.afterDoctypeSystemIdentifierState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["systemId"] += "\uFFFD" - elif data == ">": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-end-of-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.currentToken["systemId"] += data - return True - - def afterDoctypeSystemIdentifierState(self): - data = self.stream.char() - if data in spaceCharacters: - pass - elif data == ">": - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-char-in-doctype"}) - self.state = self.bogusDoctypeState - return True - - def bogusDoctypeState(self): - data = self.stream.char() - if data == ">": - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data is EOF: - # XXX EMIT - self.stream.unget(data) - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - pass - return True - - def cdataSectionState(self): - data = [] - while True: - data.append(self.stream.charsUntil("]")) - data.append(self.stream.charsUntil(">")) - char = self.stream.char() - if char == EOF: - break - else: - assert char == ">" - if data[-1][-2:] == "]]": - data[-1] = data[-1][:-2] - break - else: - data.append(char) - - data = "".join(data) # pylint:disable=redefined-variable-type - # Deal with null here rather than in the parser - nullCount = data.count("\u0000") - if nullCount > 0: - for _ in range(nullCount): - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - data = data.replace("\u0000", "\uFFFD") - if data: - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": data}) - self.state = self.dataState - return True diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_tokenizer.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_tokenizer.pyc deleted file mode 100644 index fa5cd97b63ba12800d6a474299e725632c07af86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57395 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 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/__init__.py deleted file mode 100644 index a5ba4bf..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/__init__.py +++ /dev/null @@ -1,14 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from .py import Trie as PyTrie - -Trie = PyTrie - -# pylint:disable=wrong-import-position -try: - from .datrie import Trie as DATrie -except ImportError: - pass -else: - Trie = DATrie -# pylint:enable=wrong-import-position diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/__init__.pyc deleted file mode 100644 index 317ffdaafedf7eaca0d7b2efb3e10b16119f6208..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 489 zcmYL_QA@)x5XUcVH|NATVUK=*BFrf2P!Lhj2Okuv1GONrTcU=gX-(2<_vUBz3wSAt z2l?gx|4X<_!teF|_SfKP4!_aC{p>ja%Q3;l2`GS^KuRDFAPpc7Aq|1>0C)&0g1iH1 z7l`OW+JR;SzlD{y&;xR>Hz5+Mu;_z%1VV^jfd|p^r+EZ-vF|8-_c%nj4MaAxg{quj zGA|3`Tn{}iYiVVn-4I2k<-Fj6Dd~jCl$8X{*uzDLsgdF)?tAIM*h}RqBN$6iLE_IP z0m6BdP0}{*Vt(8BtInr9bARc@dF!sBd({qfX-r{al<*H*qok#gb>;-EGechr#f7nS z`AM67Gt(c7y~(@YotT5k{K$SD^QGCvcrEFama-g6ZC$3+*zH}vvRiMpi`7E&!q7LD rt3xGcl=;CZV^T}U*iPBB|8tTTyi(%SKh6#iTfs2sh9Mb|brJ<XvkPpT diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/_base.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/_base.py deleted file mode 100644 index a1158bb..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/_base.py +++ /dev/null @@ -1,37 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from collections import Mapping - - -class Trie(Mapping): - """Abstract base class for tries""" - - def keys(self, prefix=None): - # pylint:disable=arguments-differ - keys = super(Trie, self).keys() - - if prefix is None: - return set(keys) - - return {x for x in keys if x.startswith(prefix)} - - def has_keys_with_prefix(self, prefix): - for key in self.keys(): - if key.startswith(prefix): - return True - - return False - - def longest_prefix(self, prefix): - if prefix in self: - return prefix - - for i in range(1, len(prefix) + 1): - if prefix[:-i] in self: - return prefix[:-i] - - raise KeyError(prefix) - - def longest_prefix_item(self, prefix): - lprefix = self.longest_prefix(prefix) - return (lprefix, self[lprefix]) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/_base.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/_base.pyc deleted file mode 100644 index 7f273858bbd1edb0855864cbe2e87208e85b5f7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2266 zcmd5-ZEqVz5S~51Bu?WtB@~DN$r7rtf|^SOjf$vBfzU6g7CJ{lSPIMeZk=qh_mbUp z>QwCqprU-{ukr_YX3rwDe;~Ead$Z%++2?s?X5IRyzqb9`^}~#opBCPaevQaIhLPhD zWQYnu6G25plZc8IO<E-Qw}?!eiVjUWn72rEXeKCc(@Ua1h<=`QDeusD*hMJK@rNAU z-@uSgU1jE8NnO;H^?nt;T%T*FtI}^^GB0&j<w_dul}(Ks3f{Vc;YnK8x;*l2*audt z|DZ>3e9O@9!BE7A0TPG-0yJKNLz^)J9RLF_8-N(_PF5&skj_8G_HU-n+cfioY3kG< zGpTcfS!D+v2fB<;Vk+UwCw`5I$0O)Ds7G`Xu>db3`YVWdx=Qvl0^;ZJ3mU(oAe5j# ziCz2b8*<Q5#x&VtcAFgfHjHB|BRc$$Uf=*hC&Y2F$#!}AcSL7h1i(USWLksed}_UW zs{L_@>^bPpE)WtenpK>Z+NzmegsskD9@kc%r(VV9sf}lq$(42SvqgOIxt*3zPw(!X zmAiZPi@of=TYQ;6v%B~l)$u`G>-vr^ai}qO{M{!<@<(=suRK>}UfKBA7v`SP(^#^K zv1Dm?>I>JyxeuK3Syj{zIromS_Gs9_%k$vowXz9I60&}(E?h81RjE8D0lS;p;x$g0 zS+WWvVI3}I3BIdh8L%)@$H*wU6|IZ4=(S4vj?=w^9~Yl;x{+nn(Ei~T*Ac4ZB;=m6 z-X~;peAcI*Kz<yOIT|waa7Yql<LQB&tDxUwG>{4cC4FAT5Q1({ve5?)x+-b>yEyzf zb&~TcxngBgmhUjAAeYz_H^l0tT+A-W^$QHN0OUIDlHFi?y!eWH5gpI%D7a5xzmKlm zKO6)t;g0CqV7X~K1YpPbY#Wk7?6B$gaD6QMQgh!lCC2jFv^;7m&!{q7UO%Xd@2#!u zn=11@{T66^9XLz{)Xp!}-GaxhV<53E+R;GV6#YwuxvPT0d>b~^*vQfpBRtS>Ylb>p z)*lm1-ox;w0(@ti|J^e|j4P|PO-A#Y4if(`#V2q(t|~&IjfPxwA+1uDX`!U_e3eL9 zRQcTSlu1dMSDBQ_HP}t(-DHb3NIt-Dne{8B9PUlN>m76Gif**t>#g+GMnfjCBsQD- uxdpKVE=oc!`4aZbEvt-Cna4k~OSmjTz_)~4NYaBQEe{!XNa9D)M(bZD)Cdaz diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/datrie.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/datrie.py deleted file mode 100644 index e2e5f86..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/datrie.py +++ /dev/null @@ -1,44 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from datrie import Trie as DATrie -from pip._vendor.six import text_type - -from ._base import Trie as ABCTrie - - -class Trie(ABCTrie): - def __init__(self, data): - chars = set() - for key in data.keys(): - if not isinstance(key, text_type): - raise TypeError("All keys must be strings") - for char in key: - chars.add(char) - - self._data = DATrie("".join(chars)) - for key, value in data.items(): - self._data[key] = value - - def __contains__(self, key): - return key in self._data - - def __len__(self): - return len(self._data) - - def __iter__(self): - raise NotImplementedError() - - def __getitem__(self, key): - return self._data[key] - - def keys(self, prefix=None): - return self._data.keys(prefix) - - def has_keys_with_prefix(self, prefix): - return self._data.has_keys_with_prefix(prefix) - - def longest_prefix(self, prefix): - return self._data.longest_prefix(prefix) - - def longest_prefix_item(self, prefix): - return self._data.longest_prefix_item(prefix) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/datrie.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/datrie.pyc deleted file mode 100644 index cc97a6a6e115c836e5640cc0b73cd507180ee607..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3296 zcmd5;ZEqVz5T3pBdy_U0S{hm)LPE7bjavZ`pbC++eBc9Cb&V8ZHQJtiYv+=Cac<YH zQzait`b+qW`~jYsvl|r&gwzl5-R<1$+s!;PvvcGBwc7gX_4R`R%`YGCpI>-nhhQQ+ ziV~t!QBP6oQO~2)r=CxW=R8U(lvb%%EBihrbxIr5YoK3|`KHXb(65qd(NIxTqc=ns zM8Ef{6xHcjy8%%#%Wt!EcLOBs+dP>#qvLd(7tZmLD4xbP&NH`$&LoQmd1Q1FJ5z*- zZ7bed0of~JQ}&uXWM)pg)3J$pLBIkAXmWX=yNvZY7()yZsGuBB0yi^0gJ1?|d|{w- zMVJ~zO#-SnuuWr*s)v!f%(f_M2y=~sXYCdQ3|L$Zt%CNL#r_G#i7C!Knmwg6MMsJ) z^W<Qc&V6zooq_svfyF;EI%svF=nq91(d-V-J~>#Y^9r4LbX29Y3Qwz(9oj#+Mf(ma zV!Y0?7{_x)q#HE5C!(6As117Vv9xpS$3t|~;154Kc}@Ef!98rV?&LP;PLgaMn^U`) zPORJPn@#JAI2+js=14$7St4tkc!HNYh7Px7)`i)?1PtD>WA@;aUy1_G<t<?pL0cf- zVfV@Iqdd-B6=OOIT__xUo!U09lNHt^Lt)-77#xO$l@CI;O!0{9orcN8w6T?hSQwr< z<077h&UB_>(HZ7RWD47PHS3&yQ}nZ!#}BtpvIpD6x7&m7?d*r>Rq+7VXx!QBjN|cr zfs`co-NWBT`Y8`d(^Hd0dC@s^Y4TkX_d6OkG99Rh*Vgz{LRsrLi=EbN9Qz?FrJ8D8 z-N3!7ZhE)XhLUjMkl`lbvI+(v!X6?zuE8@L(p{m!3fML;4X!i!fV*f{4VKl?dVoV4 z!d_b6Lf^8Qqz0@#w|4--EeueibpenUh*J}jl|bbzGtgzgSce{3LpQBA!2S~+>-yGz z<#ERWmXpO(rT^SIv$^{<9VaF=nKO|bj?%fyg0ul85xU5@THgh~fXWV9G=X{z17(~d zU^f<i6t695pt8nVkBs9SqxI+ig^vF}B|5|@03xw2AhH!CL<7!Jmj_ak+qf{pc(w!~ zE6RQGz7X9<_`+dmHRpN#GIoc0j!>*1dFT#X0qu(OP{7gpCECA6?EmqpV@OG!jf{26 z3-!~vwciga=c9L_^0`khBRW_X*M0^~zebzm?Y23?%>S}km>R962GKgrqe+5pz;PSg zWb!c+PTIjIAW|@N^UTQkkeCVBngNTrjAG%gtbULZmJ2AU8)~Y#()7!FMc&;ur?NTZ z;lxb}hKwN!B>(c+lx$R1B=Wg{>kz5CQN?V{E0`@C&&qO5im-l&vW|asJG+m$Mq3tp Wh^HTwzWs?2+6Ks7Z%wUvYyRJP5BvZC diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/py.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/py.py deleted file mode 100644 index c178b21..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/py.py +++ /dev/null @@ -1,67 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals -from pip._vendor.six import text_type - -from bisect import bisect_left - -from ._base import Trie as ABCTrie - - -class Trie(ABCTrie): - def __init__(self, data): - if not all(isinstance(x, text_type) for x in data.keys()): - raise TypeError("All keys must be strings") - - self._data = data - self._keys = sorted(data.keys()) - self._cachestr = "" - self._cachepoints = (0, len(data)) - - def __contains__(self, key): - return key in self._data - - def __len__(self): - return len(self._data) - - def __iter__(self): - return iter(self._data) - - def __getitem__(self, key): - return self._data[key] - - def keys(self, prefix=None): - if prefix is None or prefix == "" or not self._keys: - return set(self._keys) - - if prefix.startswith(self._cachestr): - lo, hi = self._cachepoints - start = i = bisect_left(self._keys, prefix, lo, hi) - else: - start = i = bisect_left(self._keys, prefix) - - keys = set() - if start == len(self._keys): - return keys - - while self._keys[i].startswith(prefix): - keys.add(self._keys[i]) - i += 1 - - self._cachestr = prefix - self._cachepoints = (start, i) - - return keys - - def has_keys_with_prefix(self, prefix): - if prefix in self._data: - return True - - if prefix.startswith(self._cachestr): - lo, hi = self._cachepoints - i = bisect_left(self._keys, prefix, lo, hi) - else: - i = bisect_left(self._keys, prefix) - - if i == len(self._keys): - return False - - return self._keys[i].startswith(prefix) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/py.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/py.pyc deleted file mode 100644 index 66ff303c6f577ff92b25e7ed249f6e514afe2449..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3489 zcmd5<-)|d55T3m|J9bE#k|rskfrcU>3)DCj5Q<b)&;k!g7<7q1SX9f|w@xlOpD(xT z)QOS@NT2yPkod3o8+b>2GiN&~;)xeG_O0jk=X^8Y&P@Ej7U$pp<;JrvjsJZ7e)h9R zwg(}`S5ZpTSJYP2_o(er->0@uipM-k1L{|(T`AvvN~_eLqxKx$1Bxq@)~H{n_B`IJ zWag=-D4wGiM3+QAw(AtvXtz<vQ3;>l;M3g_ny6z3>ChRS^z%XCTn&A3a+26&khz<9 z8D>d$5F4E)&J<B<8;Y0mPR@*+cBi>1yIw<AC$XmMbZUAo;d$jq0BNsCOjv<1HGqeg zCv1SPAsAxZfC`NP9mZh6XXGpZqAx;);y{Ed!vpRYFj$R%nWxn$+-)#|E^p2c<9y18 z96@kmWlTI*bg0-eUtHoxk^O)i4)s|6RZ%80&WW^7F1VVFQSO8ez6j7EAUDSoFx2y; z6Uq=w%}`riwgIaV;IXX6+YqqFvlY5ftPhqttoG=8bqut;lGn5vyvog^fhRKSqO5B| z22&33=+-t?5{(*YNE(|%YUV|95;@a6iHc@#kjAF4&9hPS^uwZ)JwJM|bDVAO6d&z$ zAKKBU@maBrzx}+q*UXdrz8saN_uYeU_Vst%C67KaSv)A32d<xfoF<*7c5r7iKi$et zEmPsqzRAoeFCH@qENfS#;T!n*JWV%`%&Fb%53Sqmm`#h7*}ffOY)nO=5<`p96xJr< z`9iQgaO=yW04>>?I*wfAs*o&tOk8$OC+lw1Juukb@m{IP+yXC>-h7Z`&X%SVSD3UX zNAZ?3wx8TMt&=QqTC>9~>rHAyEqQgds_JS=X11%4c@YAb10o&5T-7OQm=7T@7pUPf zB(VmJG;5UN4BbUgi9j-~Z$UR93MsiIlbbTd$Cm^6<Z4~N6d?zt5~RRokh2Ci2OTt` zUZ(Zh|HUPI<QV&kVXFx?R!r;lYv7oSlSiD!SHEN=sJT9I*?&+nT*b^;yNtEfdfzx8 z>ubG%*9jdN6?>F}jv)IR0x%&uAJxd-6Isy_!Z~E&=t9xt401(SOh1$)aTsuJC<ZcC zp`Sduz!!O?I-bq<7%P3c3@Eq==%PZ|+DpU84&wnFfuwbTrDfik+z+Ty{7&Zx1fz$O zZ7a0S8p!=A{^Y^K+O;t#rOuJbJo*GD9{)i<up+Pt@*TdFNjj^@wo)&&%An02l}bVw z+Ztphyn!wWG}bstT1Z%hv(FQE5OR?bzRnFtUb($8HHzZ~Te*x<9M<!~^pX)UB76_z z=OB?FFS|*yOG1v2Gv<!ya2I+=HYasYEqcppN!|6<Bw`2Nx>`{;ATN0myO~H+GW~{^ z($r<_E^cuJu#2w4l0aYr2=lG@D!4`%cmn>0@2?RCe94vxMw$+REa<%AN0oPDew-09 z&F*+!0CM28mx3$jVTnEB*S%tB!ne5VUk+qnmtJH@U!fv2QtXHyLpDpe$;~_5yo+YW z-f}C@;UKb_D+SGz)Fsh&&~G_=5PTPi2k&^x-YVo)gK0L-%vsboS_`eU?hoQ&ir0{L z4LR6{x4GfS7{1BP9d3Ae_#T=o@FLBmLX)zay=&QbRaLLo{qnPLyVc-8I0n}nx?#cK z&_$s{ZoZ82e*#Lut#KK+Ws{NAqEd{NCBIzmvLfq5wyg9~8KVGv@{~*eSHTYA&qt*P QA2T{zL$jf7diePN0GIyy)Bpeg diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_utils.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_utils.py deleted file mode 100644 index 0703afb..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_utils.py +++ /dev/null @@ -1,124 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from types import ModuleType - -from pip._vendor.six import text_type - -try: - import xml.etree.cElementTree as default_etree -except ImportError: - import xml.etree.ElementTree as default_etree - - -__all__ = ["default_etree", "MethodDispatcher", "isSurrogatePair", - "surrogatePairToCodepoint", "moduleFactoryFactory", - "supports_lone_surrogates"] - - -# Platforms not supporting lone surrogates (\uD800-\uDFFF) should be -# caught by the below test. In general this would be any platform -# using UTF-16 as its encoding of unicode strings, such as -# Jython. This is because UTF-16 itself is based on the use of such -# surrogates, and there is no mechanism to further escape such -# escapes. -try: - _x = eval('"\\uD800"') # pylint:disable=eval-used - if not isinstance(_x, text_type): - # We need this with u"" because of http://bugs.jython.org/issue2039 - _x = eval('u"\\uD800"') # pylint:disable=eval-used - assert isinstance(_x, text_type) -except: # pylint:disable=bare-except - supports_lone_surrogates = False -else: - supports_lone_surrogates = True - - -class MethodDispatcher(dict): - """Dict with 2 special properties: - - On initiation, keys that are lists, sets or tuples are converted to - multiple keys so accessing any one of the items in the original - list-like object returns the matching value - - md = MethodDispatcher({("foo", "bar"):"baz"}) - md["foo"] == "baz" - - A default value which can be set through the default attribute. - """ - - def __init__(self, items=()): - # Using _dictEntries instead of directly assigning to self is about - # twice as fast. Please do careful performance testing before changing - # anything here. - _dictEntries = [] - for name, value in items: - if isinstance(name, (list, tuple, frozenset, set)): - for item in name: - _dictEntries.append((item, value)) - else: - _dictEntries.append((name, value)) - dict.__init__(self, _dictEntries) - assert len(self) == len(_dictEntries) - self.default = None - - def __getitem__(self, key): - return dict.get(self, key, self.default) - - -# Some utility functions to deal with weirdness around UCS2 vs UCS4 -# python builds - -def isSurrogatePair(data): - return (len(data) == 2 and - ord(data[0]) >= 0xD800 and ord(data[0]) <= 0xDBFF and - ord(data[1]) >= 0xDC00 and ord(data[1]) <= 0xDFFF) - - -def surrogatePairToCodepoint(data): - char_val = (0x10000 + (ord(data[0]) - 0xD800) * 0x400 + - (ord(data[1]) - 0xDC00)) - return char_val - -# Module Factory Factory (no, this isn't Java, I know) -# Here to stop this being duplicated all over the place. - - -def moduleFactoryFactory(factory): - moduleCache = {} - - def moduleFactory(baseModule, *args, **kwargs): - if isinstance(ModuleType.__name__, type("")): - name = "_%s_factory" % baseModule.__name__ - else: - name = b"_%s_factory" % baseModule.__name__ - - kwargs_tuple = tuple(kwargs.items()) - - try: - return moduleCache[name][args][kwargs_tuple] - except KeyError: - mod = ModuleType(name) - objs = factory(baseModule, *args, **kwargs) - mod.__dict__.update(objs) - if "name" not in moduleCache: - moduleCache[name] = {} - if "args" not in moduleCache[name]: - moduleCache[name][args] = {} - if "kwargs" not in moduleCache[name][args]: - moduleCache[name][args][kwargs_tuple] = {} - moduleCache[name][args][kwargs_tuple] = mod - return mod - - return moduleFactory - - -def memoize(func): - cache = {} - - def wrapped(*args, **kwargs): - key = (tuple(args), tuple(kwargs.items())) - if key not in cache: - cache[key] = func(*args, **kwargs) - return cache[key] - - return wrapped diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_utils.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_utils.pyc deleted file mode 100644 index 85c175f4b274c9b36f707678269d697d67ee4206..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4808 zcmc&&UvC@75uZI$lqiXoEX(?1JIO&#QM!;tIZ53#wF{?~(-wu*;3U)z6XSZiTT&+- z@95h-NmQ+e)<NUG<TLaO<fTBrNc&Qt0rDaGTA=;S9QDr$@+w+f&hF05&d&Vi&$;rS z#`ur^c<EV4!%q#r4}R~E`Jp0;@TVvt>M3d~>N(VQs8^wOg%s~OlvJrVLhX@qUZJE$ zy-{k9k{Zm(<5fz=Xs1p)<J6v@C+SV9>Pgxir+lB35-DJ52+JjANfkYfMkuOLG)mDJ zMRkhCsavD=6b&Ado~CGmUP7PCq-RKD9Hp1g_aCw~`Q2Og3jIk@N>HG|$Ld*XU!`=E zp6WTKq6X=C>L`jX(dR@ji9TsBP&CDp_98{oLR_QhvJlrPni1j#MOE5pUV+hKHej=Y z!A@ZawoH~3R{L?UpXJt$VJ(XHViRYnoyMd{<1mY~pTt(@L1LP)H`#FvkF%&q^yZ+i z%e6Xh=mYCpEUgy}Oe5V1ip2Wb=2{ml?y<JpS+o|Leqh6GofoV`Y&MEK&$@xt9|v(> zEMU!?UD?bYLWh19r?!~IW>1d(C<twq4~9R(r}}&i<0o0F{Sz6c;Cn57R;<0hy1G=b zrp570Zuz=eCpdG!`U}R{O%NJZhV3yr6jc~=pTof*9I<khyp3j+W%psEwK%lyer&hh zcU;rgVH_lGKhOF)x3M-KjE}qc{5EytG`4YIVee&kR}YM9w*%`2xptG-ShMUJZH=4d zt}XhBHnJ0D=^o_h$hDcs>A}h|wo3^nbAvF{#>8pY4bp)NW4KudlC=vr_6!b{NtVam zI1Lh!!N=WB;$5(A?Pw^UYg^<gE2P~XyNku`1xcYx<$IBP-+kS3%|A4kI$5@~>@IBu z`O>Wq@N>9ybgNV|`cyWbx%cn${^3$7=|gvjlv2FAza59$ZWyHQmgf6Ig*+>|+oH-b zYhZ02Zvne2B0FSPaatI~_aVFND-d0xBZm%RdZB3TSwNpTbX1|EDp{fz6|#z~Ll#7p zI#mwP{8Kvk32&`ETco2Adg0IxM*M-p;jmTDe@0K9H;#8IXLlO(#MWqMlwLqQxE)dm zDNOJj6Cz+2y8V@Gonswf!mdBT#D>JtdUFzbON1c`Q)7cP)KHIz9b`v%laYYui8^_9 zs8d)7S3u0*mn{(V`#O!}nFuJ9p!R(Rn(qr^qEmYbj2{}qaLm$22)|q&SO-=tn{a66 zCJU4uqmzytFA%b<rO)CYrSO9`!jlF)Ej$7fSz_)ccu59><VLN29`7O8TYEv?>SRfz zbJIFJXbs-Yx6=LHJ9nR_t9SGF?uPH1gP%r+`6@o$ervPUkNda9BuR4H-g(^hKjtO* z`g^!?mbbQTFZpp2Z?*iw#)(<!4?NC9cknec7^qrPSJZXYP}iJ!HLc!M0vrYp+gN}z z2LkxmQQ}4!ci_3oiHF$Op16sruD0G~{5DyL$A^fK5zH5QZ#w}^d>`7e3w-|priN7{ zRq7>B8pGW8*>AuGr*+>ivn!?y1K*Fb(D%iN-Zd<o-btv7a40MOHok_jS(~UilT#s= zCH}HQ#EIJ=ILIaTkg5@NS(gJID@fRjh)Cq{-H~svR%utASsf{PYv*}~tE0@j(PS&G z$821wuQB}#)c^jCfpv=MYo2~{3=s}Jfk>7|W$k3>MS%@Yje7xhm4@K8TKr2WCT1oz zqn4GJnXh>gEAO!8NN!^3Q@bvp;h3EtuAW$MVg3mAXM-`c)?q7k)?h64)L>#6?@ch4 zf%O(BNoC=7ko!n57i+BVYf>IV)uGiE)zwq0vE?dUnr?u=?f;_a3!*O+R~8uY&nQ+y z`!MIaSeq@yfPaghn+Kd=RG=6M2@t|Vz%iGtCW9K##`+v89QsF~`*e;}TvoD|5)UYV zgIRio!z#20hb*GHEp9wX|4vm@5N>;C(0(e8mI|MMLikEN3|`3j5-T+>il}ruC~GyT zi*Pw4?v7IaH@;jc{T>oN`sCqJy!p@5O+H!}YR3$$3p4%qJQM53j5zYV()X~k@igM% zDUd2)DJmrM{lNI0vO_el%?m~^r#vBoylV>1B)j`eHtQfgo_mt!uY;08#%-;~f$ni1 zElB*09+Z`nmysz^4Usna*`kkd)}oVS)vdtjvSAike30;!XL?szA{Uf$?w1vw&qp$r zC(x4_i37>X!;49ZFVpqI0PVCy#6@HdF0rK^!*2W&ESR@3kXlgFPQ#gTDry#0cM^GI z8e;?FWvpDqT+}Xu{5GEOS{PnmTfy2z+-w%-p1axbg1=*Z*wdtH&dmHtV*FN!Bfh^c z#90FSnZFX^zXDO_O~f4&h;@Xxge}qpx>*F^D<B0?@<5_Nc)moyfp8>DN^0@Ap=6y- zkt;8MUX#~u@vw-YL>8x+kZ~l4>lA6oTo+<?4(9!w8`)@&RTyJM(5y|WxwCNL>f^nO zK@=?^#I2sk8y5i=*1M;BS$wDst8jvlTJsIehaFa@z?&5sE)PrOaf{%wkILpAX~szE zk$Q~&c4gSxu9*11<J4ujK|SatEAn2w5<W_F4;}p`Ub01mEK52$x5Ytv?u}g1$FJqZ zzf5DChEC<470Vg)?40lE`$3W*-?2&>^%!qbSUf0mC%@N=G9TeT4YVz*<#)fFi-66% z(9%+Sj6%=lVTp%T9^S)Hx)?-BU4(ZTh4;#A@N@Q>S;la~nZ~~gfZ0%UmAa~_dc6Xm XPC1k6hN`G>r&gJ}S+CXW^*8<xPL*jd diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/constants.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/constants.py deleted file mode 100644 index 1ff8041..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/constants.py +++ /dev/null @@ -1,2947 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -import string - -EOF = None - -E = { - "null-character": - "Null character in input stream, replaced with U+FFFD.", - "invalid-codepoint": - "Invalid codepoint in stream.", - "incorrectly-placed-solidus": - "Solidus (/) incorrectly placed in tag.", - "incorrect-cr-newline-entity": - "Incorrect CR newline entity, replaced with LF.", - "illegal-windows-1252-entity": - "Entity used with illegal number (windows-1252 reference).", - "cant-convert-numeric-entity": - "Numeric entity couldn't be converted to character " - "(codepoint U+%(charAsInt)08x).", - "illegal-codepoint-for-numeric-entity": - "Numeric entity represents an illegal codepoint: " - "U+%(charAsInt)08x.", - "numeric-entity-without-semicolon": - "Numeric entity didn't end with ';'.", - "expected-numeric-entity-but-got-eof": - "Numeric entity expected. Got end of file instead.", - "expected-numeric-entity": - "Numeric entity expected but none found.", - "named-entity-without-semicolon": - "Named entity didn't end with ';'.", - "expected-named-entity": - "Named entity expected. Got none.", - "attributes-in-end-tag": - "End tag contains unexpected attributes.", - 'self-closing-flag-on-end-tag': - "End tag contains unexpected self-closing flag.", - "expected-tag-name-but-got-right-bracket": - "Expected tag name. Got '>' instead.", - "expected-tag-name-but-got-question-mark": - "Expected tag name. Got '?' instead. (HTML doesn't " - "support processing instructions.)", - "expected-tag-name": - "Expected tag name. Got something else instead", - "expected-closing-tag-but-got-right-bracket": - "Expected closing tag. Got '>' instead. Ignoring '</>'.", - "expected-closing-tag-but-got-eof": - "Expected closing tag. Unexpected end of file.", - "expected-closing-tag-but-got-char": - "Expected closing tag. Unexpected character '%(data)s' found.", - "eof-in-tag-name": - "Unexpected end of file in the tag name.", - "expected-attribute-name-but-got-eof": - "Unexpected end of file. Expected attribute name instead.", - "eof-in-attribute-name": - "Unexpected end of file in attribute name.", - "invalid-character-in-attribute-name": - "Invalid character in attribute name", - "duplicate-attribute": - "Dropped duplicate attribute on tag.", - "expected-end-of-tag-name-but-got-eof": - "Unexpected end of file. Expected = or end of tag.", - "expected-attribute-value-but-got-eof": - "Unexpected end of file. Expected attribute value.", - "expected-attribute-value-but-got-right-bracket": - "Expected attribute value. Got '>' instead.", - 'equals-in-unquoted-attribute-value': - "Unexpected = in unquoted attribute", - 'unexpected-character-in-unquoted-attribute-value': - "Unexpected character in unquoted attribute", - "invalid-character-after-attribute-name": - "Unexpected character after attribute name.", - "unexpected-character-after-attribute-value": - "Unexpected character after attribute value.", - "eof-in-attribute-value-double-quote": - "Unexpected end of file in attribute value (\").", - "eof-in-attribute-value-single-quote": - "Unexpected end of file in attribute value (').", - "eof-in-attribute-value-no-quotes": - "Unexpected end of file in attribute value.", - "unexpected-EOF-after-solidus-in-tag": - "Unexpected end of file in tag. Expected >", - "unexpected-character-after-solidus-in-tag": - "Unexpected character after / in tag. Expected >", - "expected-dashes-or-doctype": - "Expected '--' or 'DOCTYPE'. Not found.", - "unexpected-bang-after-double-dash-in-comment": - "Unexpected ! after -- in comment", - "unexpected-space-after-double-dash-in-comment": - "Unexpected space after -- in comment", - "incorrect-comment": - "Incorrect comment.", - "eof-in-comment": - "Unexpected end of file in comment.", - "eof-in-comment-end-dash": - "Unexpected end of file in comment (-)", - "unexpected-dash-after-double-dash-in-comment": - "Unexpected '-' after '--' found in comment.", - "eof-in-comment-double-dash": - "Unexpected end of file in comment (--).", - "eof-in-comment-end-space-state": - "Unexpected end of file in comment.", - "eof-in-comment-end-bang-state": - "Unexpected end of file in comment.", - "unexpected-char-in-comment": - "Unexpected character in comment found.", - "need-space-after-doctype": - "No space after literal string 'DOCTYPE'.", - "expected-doctype-name-but-got-right-bracket": - "Unexpected > character. Expected DOCTYPE name.", - "expected-doctype-name-but-got-eof": - "Unexpected end of file. Expected DOCTYPE name.", - "eof-in-doctype-name": - "Unexpected end of file in DOCTYPE name.", - "eof-in-doctype": - "Unexpected end of file in DOCTYPE.", - "expected-space-or-right-bracket-in-doctype": - "Expected space or '>'. Got '%(data)s'", - "unexpected-end-of-doctype": - "Unexpected end of DOCTYPE.", - "unexpected-char-in-doctype": - "Unexpected character in DOCTYPE.", - "eof-in-innerhtml": - "XXX innerHTML EOF", - "unexpected-doctype": - "Unexpected DOCTYPE. Ignored.", - "non-html-root": - "html needs to be the first start tag.", - "expected-doctype-but-got-eof": - "Unexpected End of file. Expected DOCTYPE.", - "unknown-doctype": - "Erroneous DOCTYPE.", - "expected-doctype-but-got-chars": - "Unexpected non-space characters. Expected DOCTYPE.", - "expected-doctype-but-got-start-tag": - "Unexpected start tag (%(name)s). Expected DOCTYPE.", - "expected-doctype-but-got-end-tag": - "Unexpected end tag (%(name)s). Expected DOCTYPE.", - "end-tag-after-implied-root": - "Unexpected end tag (%(name)s) after the (implied) root element.", - "expected-named-closing-tag-but-got-eof": - "Unexpected end of file. Expected end tag (%(name)s).", - "two-heads-are-not-better-than-one": - "Unexpected start tag head in existing head. Ignored.", - "unexpected-end-tag": - "Unexpected end tag (%(name)s). Ignored.", - "unexpected-start-tag-out-of-my-head": - "Unexpected start tag (%(name)s) that can be in head. Moved.", - "unexpected-start-tag": - "Unexpected start tag (%(name)s).", - "missing-end-tag": - "Missing end tag (%(name)s).", - "missing-end-tags": - "Missing end tags (%(name)s).", - "unexpected-start-tag-implies-end-tag": - "Unexpected start tag (%(startName)s) " - "implies end tag (%(endName)s).", - "unexpected-start-tag-treated-as": - "Unexpected start tag (%(originalName)s). Treated as %(newName)s.", - "deprecated-tag": - "Unexpected start tag %(name)s. Don't use it!", - "unexpected-start-tag-ignored": - "Unexpected start tag %(name)s. Ignored.", - "expected-one-end-tag-but-got-another": - "Unexpected end tag (%(gotName)s). " - "Missing end tag (%(expectedName)s).", - "end-tag-too-early": - "End tag (%(name)s) seen too early. Expected other end tag.", - "end-tag-too-early-named": - "Unexpected end tag (%(gotName)s). Expected end tag (%(expectedName)s).", - "end-tag-too-early-ignored": - "End tag (%(name)s) seen too early. Ignored.", - "adoption-agency-1.1": - "End tag (%(name)s) violates step 1, " - "paragraph 1 of the adoption agency algorithm.", - "adoption-agency-1.2": - "End tag (%(name)s) violates step 1, " - "paragraph 2 of the adoption agency algorithm.", - "adoption-agency-1.3": - "End tag (%(name)s) violates step 1, " - "paragraph 3 of the adoption agency algorithm.", - "adoption-agency-4.4": - "End tag (%(name)s) violates step 4, " - "paragraph 4 of the adoption agency algorithm.", - "unexpected-end-tag-treated-as": - "Unexpected end tag (%(originalName)s). Treated as %(newName)s.", - "no-end-tag": - "This element (%(name)s) has no end tag.", - "unexpected-implied-end-tag-in-table": - "Unexpected implied end tag (%(name)s) in the table phase.", - "unexpected-implied-end-tag-in-table-body": - "Unexpected implied end tag (%(name)s) in the table body phase.", - "unexpected-char-implies-table-voodoo": - "Unexpected non-space characters in " - "table context caused voodoo mode.", - "unexpected-hidden-input-in-table": - "Unexpected input with type hidden in table context.", - "unexpected-form-in-table": - "Unexpected form in table context.", - "unexpected-start-tag-implies-table-voodoo": - "Unexpected start tag (%(name)s) in " - "table context caused voodoo mode.", - "unexpected-end-tag-implies-table-voodoo": - "Unexpected end tag (%(name)s) in " - "table context caused voodoo mode.", - "unexpected-cell-in-table-body": - "Unexpected table cell start tag (%(name)s) " - "in the table body phase.", - "unexpected-cell-end-tag": - "Got table cell end tag (%(name)s) " - "while required end tags are missing.", - "unexpected-end-tag-in-table-body": - "Unexpected end tag (%(name)s) in the table body phase. Ignored.", - "unexpected-implied-end-tag-in-table-row": - "Unexpected implied end tag (%(name)s) in the table row phase.", - "unexpected-end-tag-in-table-row": - "Unexpected end tag (%(name)s) in the table row phase. Ignored.", - "unexpected-select-in-select": - "Unexpected select start tag in the select phase " - "treated as select end tag.", - "unexpected-input-in-select": - "Unexpected input start tag in the select phase.", - "unexpected-start-tag-in-select": - "Unexpected start tag token (%(name)s in the select phase. " - "Ignored.", - "unexpected-end-tag-in-select": - "Unexpected end tag (%(name)s) in the select phase. Ignored.", - "unexpected-table-element-start-tag-in-select-in-table": - "Unexpected table element start tag (%(name)s) in the select in table phase.", - "unexpected-table-element-end-tag-in-select-in-table": - "Unexpected table element end tag (%(name)s) in the select in table phase.", - "unexpected-char-after-body": - "Unexpected non-space characters in the after body phase.", - "unexpected-start-tag-after-body": - "Unexpected start tag token (%(name)s)" - " in the after body phase.", - "unexpected-end-tag-after-body": - "Unexpected end tag token (%(name)s)" - " in the after body phase.", - "unexpected-char-in-frameset": - "Unexpected characters in the frameset phase. Characters ignored.", - "unexpected-start-tag-in-frameset": - "Unexpected start tag token (%(name)s)" - " in the frameset phase. Ignored.", - "unexpected-frameset-in-frameset-innerhtml": - "Unexpected end tag token (frameset) " - "in the frameset phase (innerHTML).", - "unexpected-end-tag-in-frameset": - "Unexpected end tag token (%(name)s)" - " in the frameset phase. Ignored.", - "unexpected-char-after-frameset": - "Unexpected non-space characters in the " - "after frameset phase. Ignored.", - "unexpected-start-tag-after-frameset": - "Unexpected start tag (%(name)s)" - " in the after frameset phase. Ignored.", - "unexpected-end-tag-after-frameset": - "Unexpected end tag (%(name)s)" - " in the after frameset phase. Ignored.", - "unexpected-end-tag-after-body-innerhtml": - "Unexpected end tag after body(innerHtml)", - "expected-eof-but-got-char": - "Unexpected non-space characters. Expected end of file.", - "expected-eof-but-got-start-tag": - "Unexpected start tag (%(name)s)" - ". Expected end of file.", - "expected-eof-but-got-end-tag": - "Unexpected end tag (%(name)s)" - ". Expected end of file.", - "eof-in-table": - "Unexpected end of file. Expected table content.", - "eof-in-select": - "Unexpected end of file. Expected select content.", - "eof-in-frameset": - "Unexpected end of file. Expected frameset content.", - "eof-in-script-in-script": - "Unexpected end of file. Expected script content.", - "eof-in-foreign-lands": - "Unexpected end of file. Expected foreign content", - "non-void-element-with-trailing-solidus": - "Trailing solidus not allowed on element %(name)s", - "unexpected-html-element-in-foreign-content": - "Element %(name)s not allowed in a non-html context", - "unexpected-end-tag-before-html": - "Unexpected end tag (%(name)s) before html.", - "unexpected-inhead-noscript-tag": - "Element %(name)s not allowed in a inhead-noscript context", - "eof-in-head-noscript": - "Unexpected end of file. Expected inhead-noscript content", - "char-in-head-noscript": - "Unexpected non-space character. Expected inhead-noscript content", - "XXX-undefined-error": - "Undefined error (this sucks and should be fixed)", -} - -namespaces = { - "html": "http://www.w3.org/1999/xhtml", - "mathml": "http://www.w3.org/1998/Math/MathML", - "svg": "http://www.w3.org/2000/svg", - "xlink": "http://www.w3.org/1999/xlink", - "xml": "http://www.w3.org/XML/1998/namespace", - "xmlns": "http://www.w3.org/2000/xmlns/" -} - -scopingElements = frozenset([ - (namespaces["html"], "applet"), - (namespaces["html"], "caption"), - (namespaces["html"], "html"), - (namespaces["html"], "marquee"), - (namespaces["html"], "object"), - (namespaces["html"], "table"), - (namespaces["html"], "td"), - (namespaces["html"], "th"), - (namespaces["mathml"], "mi"), - (namespaces["mathml"], "mo"), - (namespaces["mathml"], "mn"), - (namespaces["mathml"], "ms"), - (namespaces["mathml"], "mtext"), - (namespaces["mathml"], "annotation-xml"), - (namespaces["svg"], "foreignObject"), - (namespaces["svg"], "desc"), - (namespaces["svg"], "title"), -]) - -formattingElements = frozenset([ - (namespaces["html"], "a"), - (namespaces["html"], "b"), - (namespaces["html"], "big"), - (namespaces["html"], "code"), - (namespaces["html"], "em"), - (namespaces["html"], "font"), - (namespaces["html"], "i"), - (namespaces["html"], "nobr"), - (namespaces["html"], "s"), - (namespaces["html"], "small"), - (namespaces["html"], "strike"), - (namespaces["html"], "strong"), - (namespaces["html"], "tt"), - (namespaces["html"], "u") -]) - -specialElements = frozenset([ - (namespaces["html"], "address"), - (namespaces["html"], "applet"), - (namespaces["html"], "area"), - (namespaces["html"], "article"), - (namespaces["html"], "aside"), - (namespaces["html"], "base"), - (namespaces["html"], "basefont"), - (namespaces["html"], "bgsound"), - (namespaces["html"], "blockquote"), - (namespaces["html"], "body"), - (namespaces["html"], "br"), - (namespaces["html"], "button"), - (namespaces["html"], "caption"), - (namespaces["html"], "center"), - (namespaces["html"], "col"), - (namespaces["html"], "colgroup"), - (namespaces["html"], "command"), - (namespaces["html"], "dd"), - (namespaces["html"], "details"), - (namespaces["html"], "dir"), - (namespaces["html"], "div"), - (namespaces["html"], "dl"), - (namespaces["html"], "dt"), - (namespaces["html"], "embed"), - (namespaces["html"], "fieldset"), - (namespaces["html"], "figure"), - (namespaces["html"], "footer"), - (namespaces["html"], "form"), - (namespaces["html"], "frame"), - (namespaces["html"], "frameset"), - (namespaces["html"], "h1"), - (namespaces["html"], "h2"), - (namespaces["html"], "h3"), - (namespaces["html"], "h4"), - (namespaces["html"], "h5"), - (namespaces["html"], "h6"), - (namespaces["html"], "head"), - (namespaces["html"], "header"), - (namespaces["html"], "hr"), - (namespaces["html"], "html"), - (namespaces["html"], "iframe"), - # Note that image is commented out in the spec as "this isn't an - # element that can end up on the stack, so it doesn't matter," - (namespaces["html"], "image"), - (namespaces["html"], "img"), - (namespaces["html"], "input"), - (namespaces["html"], "isindex"), - (namespaces["html"], "li"), - (namespaces["html"], "link"), - (namespaces["html"], "listing"), - (namespaces["html"], "marquee"), - (namespaces["html"], "menu"), - (namespaces["html"], "meta"), - (namespaces["html"], "nav"), - (namespaces["html"], "noembed"), - (namespaces["html"], "noframes"), - (namespaces["html"], "noscript"), - (namespaces["html"], "object"), - (namespaces["html"], "ol"), - (namespaces["html"], "p"), - (namespaces["html"], "param"), - (namespaces["html"], "plaintext"), - (namespaces["html"], "pre"), - (namespaces["html"], "script"), - (namespaces["html"], "section"), - (namespaces["html"], "select"), - (namespaces["html"], "style"), - (namespaces["html"], "table"), - (namespaces["html"], "tbody"), - (namespaces["html"], "td"), - (namespaces["html"], "textarea"), - (namespaces["html"], "tfoot"), - (namespaces["html"], "th"), - (namespaces["html"], "thead"), - (namespaces["html"], "title"), - (namespaces["html"], "tr"), - (namespaces["html"], "ul"), - (namespaces["html"], "wbr"), - (namespaces["html"], "xmp"), - (namespaces["svg"], "foreignObject") -]) - -htmlIntegrationPointElements = frozenset([ - (namespaces["mathml"], "annotation-xml"), - (namespaces["svg"], "foreignObject"), - (namespaces["svg"], "desc"), - (namespaces["svg"], "title") -]) - -mathmlTextIntegrationPointElements = frozenset([ - (namespaces["mathml"], "mi"), - (namespaces["mathml"], "mo"), - (namespaces["mathml"], "mn"), - (namespaces["mathml"], "ms"), - (namespaces["mathml"], "mtext") -]) - -adjustSVGAttributes = { - "attributename": "attributeName", - "attributetype": "attributeType", - "basefrequency": "baseFrequency", - "baseprofile": "baseProfile", - "calcmode": "calcMode", - "clippathunits": "clipPathUnits", - "contentscripttype": "contentScriptType", - "contentstyletype": "contentStyleType", - "diffuseconstant": "diffuseConstant", - "edgemode": "edgeMode", - "externalresourcesrequired": "externalResourcesRequired", - "filterres": "filterRes", - "filterunits": "filterUnits", - "glyphref": "glyphRef", - "gradienttransform": "gradientTransform", - "gradientunits": "gradientUnits", - "kernelmatrix": "kernelMatrix", - "kernelunitlength": "kernelUnitLength", - "keypoints": "keyPoints", - "keysplines": "keySplines", - "keytimes": "keyTimes", - "lengthadjust": "lengthAdjust", - "limitingconeangle": "limitingConeAngle", - "markerheight": "markerHeight", - "markerunits": "markerUnits", - "markerwidth": "markerWidth", - "maskcontentunits": "maskContentUnits", - "maskunits": "maskUnits", - "numoctaves": "numOctaves", - "pathlength": "pathLength", - "patterncontentunits": "patternContentUnits", - "patterntransform": "patternTransform", - "patternunits": "patternUnits", - "pointsatx": "pointsAtX", - "pointsaty": "pointsAtY", - "pointsatz": "pointsAtZ", - "preservealpha": "preserveAlpha", - "preserveaspectratio": "preserveAspectRatio", - "primitiveunits": "primitiveUnits", - "refx": "refX", - "refy": "refY", - "repeatcount": "repeatCount", - "repeatdur": "repeatDur", - "requiredextensions": "requiredExtensions", - "requiredfeatures": "requiredFeatures", - "specularconstant": "specularConstant", - "specularexponent": "specularExponent", - "spreadmethod": "spreadMethod", - "startoffset": "startOffset", - "stddeviation": "stdDeviation", - "stitchtiles": "stitchTiles", - "surfacescale": "surfaceScale", - "systemlanguage": "systemLanguage", - "tablevalues": "tableValues", - "targetx": "targetX", - "targety": "targetY", - "textlength": "textLength", - "viewbox": "viewBox", - "viewtarget": "viewTarget", - "xchannelselector": "xChannelSelector", - "ychannelselector": "yChannelSelector", - "zoomandpan": "zoomAndPan" -} - -adjustMathMLAttributes = {"definitionurl": "definitionURL"} - -adjustForeignAttributes = { - "xlink:actuate": ("xlink", "actuate", namespaces["xlink"]), - "xlink:arcrole": ("xlink", "arcrole", namespaces["xlink"]), - "xlink:href": ("xlink", "href", namespaces["xlink"]), - "xlink:role": ("xlink", "role", namespaces["xlink"]), - "xlink:show": ("xlink", "show", namespaces["xlink"]), - "xlink:title": ("xlink", "title", namespaces["xlink"]), - "xlink:type": ("xlink", "type", namespaces["xlink"]), - "xml:base": ("xml", "base", namespaces["xml"]), - "xml:lang": ("xml", "lang", namespaces["xml"]), - "xml:space": ("xml", "space", namespaces["xml"]), - "xmlns": (None, "xmlns", namespaces["xmlns"]), - "xmlns:xlink": ("xmlns", "xlink", namespaces["xmlns"]) -} - -unadjustForeignAttributes = dict([((ns, local), qname) for qname, (prefix, local, ns) in - adjustForeignAttributes.items()]) - -spaceCharacters = frozenset([ - "\t", - "\n", - "\u000C", - " ", - "\r" -]) - -tableInsertModeElements = frozenset([ - "table", - "tbody", - "tfoot", - "thead", - "tr" -]) - -asciiLowercase = frozenset(string.ascii_lowercase) -asciiUppercase = frozenset(string.ascii_uppercase) -asciiLetters = frozenset(string.ascii_letters) -digits = frozenset(string.digits) -hexDigits = frozenset(string.hexdigits) - -asciiUpper2Lower = dict([(ord(c), ord(c.lower())) - for c in string.ascii_uppercase]) - -# Heading elements need to be ordered -headingElements = ( - "h1", - "h2", - "h3", - "h4", - "h5", - "h6" -) - -voidElements = frozenset([ - "base", - "command", - "event-source", - "link", - "meta", - "hr", - "br", - "img", - "embed", - "param", - "area", - "col", - "input", - "source", - "track" -]) - -cdataElements = frozenset(['title', 'textarea']) - -rcdataElements = frozenset([ - 'style', - 'script', - 'xmp', - 'iframe', - 'noembed', - 'noframes', - 'noscript' -]) - -booleanAttributes = { - "": frozenset(["irrelevant", "itemscope"]), - "style": frozenset(["scoped"]), - "img": frozenset(["ismap"]), - "audio": frozenset(["autoplay", "controls"]), - "video": frozenset(["autoplay", "controls"]), - "script": frozenset(["defer", "async"]), - "details": frozenset(["open"]), - "datagrid": frozenset(["multiple", "disabled"]), - "command": frozenset(["hidden", "disabled", "checked", "default"]), - "hr": frozenset(["noshade"]), - "menu": frozenset(["autosubmit"]), - "fieldset": frozenset(["disabled", "readonly"]), - "option": frozenset(["disabled", "readonly", "selected"]), - "optgroup": frozenset(["disabled", "readonly"]), - "button": frozenset(["disabled", "autofocus"]), - "input": frozenset(["disabled", "readonly", "required", "autofocus", "checked", "ismap"]), - "select": frozenset(["disabled", "readonly", "autofocus", "multiple"]), - "output": frozenset(["disabled", "readonly"]), - "iframe": frozenset(["seamless"]), -} - -# entitiesWindows1252 has to be _ordered_ and needs to have an index. It -# therefore can't be a frozenset. -entitiesWindows1252 = ( - 8364, # 0x80 0x20AC EURO SIGN - 65533, # 0x81 UNDEFINED - 8218, # 0x82 0x201A SINGLE LOW-9 QUOTATION MARK - 402, # 0x83 0x0192 LATIN SMALL LETTER F WITH HOOK - 8222, # 0x84 0x201E DOUBLE LOW-9 QUOTATION MARK - 8230, # 0x85 0x2026 HORIZONTAL ELLIPSIS - 8224, # 0x86 0x2020 DAGGER - 8225, # 0x87 0x2021 DOUBLE DAGGER - 710, # 0x88 0x02C6 MODIFIER LETTER CIRCUMFLEX ACCENT - 8240, # 0x89 0x2030 PER MILLE SIGN - 352, # 0x8A 0x0160 LATIN CAPITAL LETTER S WITH CARON - 8249, # 0x8B 0x2039 SINGLE LEFT-POINTING ANGLE QUOTATION MARK - 338, # 0x8C 0x0152 LATIN CAPITAL LIGATURE OE - 65533, # 0x8D UNDEFINED - 381, # 0x8E 0x017D LATIN CAPITAL LETTER Z WITH CARON - 65533, # 0x8F UNDEFINED - 65533, # 0x90 UNDEFINED - 8216, # 0x91 0x2018 LEFT SINGLE QUOTATION MARK - 8217, # 0x92 0x2019 RIGHT SINGLE QUOTATION MARK - 8220, # 0x93 0x201C LEFT DOUBLE QUOTATION MARK - 8221, # 0x94 0x201D RIGHT DOUBLE QUOTATION MARK - 8226, # 0x95 0x2022 BULLET - 8211, # 0x96 0x2013 EN DASH - 8212, # 0x97 0x2014 EM DASH - 732, # 0x98 0x02DC SMALL TILDE - 8482, # 0x99 0x2122 TRADE MARK SIGN - 353, # 0x9A 0x0161 LATIN SMALL LETTER S WITH CARON - 8250, # 0x9B 0x203A SINGLE RIGHT-POINTING ANGLE QUOTATION MARK - 339, # 0x9C 0x0153 LATIN SMALL LIGATURE OE - 65533, # 0x9D UNDEFINED - 382, # 0x9E 0x017E LATIN SMALL LETTER Z WITH CARON - 376 # 0x9F 0x0178 LATIN CAPITAL LETTER Y WITH DIAERESIS -) - -xmlEntities = frozenset(['lt;', 'gt;', 'amp;', 'apos;', 'quot;']) - -entities = { - "AElig": "\xc6", - "AElig;": "\xc6", - "AMP": "&", - "AMP;": "&", - "Aacute": "\xc1", - "Aacute;": "\xc1", - "Abreve;": "\u0102", - "Acirc": "\xc2", - "Acirc;": "\xc2", - "Acy;": "\u0410", - "Afr;": "\U0001d504", - "Agrave": "\xc0", - "Agrave;": "\xc0", - "Alpha;": "\u0391", - "Amacr;": "\u0100", - "And;": "\u2a53", - "Aogon;": "\u0104", - "Aopf;": "\U0001d538", - "ApplyFunction;": "\u2061", - "Aring": "\xc5", - "Aring;": "\xc5", - "Ascr;": "\U0001d49c", - "Assign;": "\u2254", - "Atilde": "\xc3", - "Atilde;": "\xc3", - "Auml": "\xc4", - "Auml;": "\xc4", - "Backslash;": "\u2216", - "Barv;": "\u2ae7", - "Barwed;": "\u2306", - "Bcy;": "\u0411", - "Because;": "\u2235", - "Bernoullis;": "\u212c", - "Beta;": "\u0392", - "Bfr;": "\U0001d505", - "Bopf;": "\U0001d539", - "Breve;": "\u02d8", - "Bscr;": "\u212c", - "Bumpeq;": "\u224e", - "CHcy;": "\u0427", - "COPY": "\xa9", - "COPY;": "\xa9", - "Cacute;": "\u0106", - "Cap;": "\u22d2", - "CapitalDifferentialD;": "\u2145", - "Cayleys;": "\u212d", - "Ccaron;": "\u010c", - "Ccedil": "\xc7", - "Ccedil;": "\xc7", - "Ccirc;": "\u0108", - "Cconint;": "\u2230", - "Cdot;": "\u010a", - "Cedilla;": "\xb8", - "CenterDot;": "\xb7", - "Cfr;": "\u212d", - "Chi;": "\u03a7", - "CircleDot;": "\u2299", - "CircleMinus;": "\u2296", - "CirclePlus;": "\u2295", - "CircleTimes;": "\u2297", - "ClockwiseContourIntegral;": "\u2232", - "CloseCurlyDoubleQuote;": "\u201d", - "CloseCurlyQuote;": "\u2019", - "Colon;": "\u2237", - "Colone;": "\u2a74", - "Congruent;": "\u2261", - "Conint;": "\u222f", - "ContourIntegral;": "\u222e", - "Copf;": "\u2102", - "Coproduct;": "\u2210", - "CounterClockwiseContourIntegral;": "\u2233", - "Cross;": "\u2a2f", - "Cscr;": "\U0001d49e", - "Cup;": "\u22d3", - "CupCap;": "\u224d", - "DD;": "\u2145", - "DDotrahd;": "\u2911", - "DJcy;": "\u0402", - "DScy;": "\u0405", - "DZcy;": "\u040f", - "Dagger;": "\u2021", - "Darr;": "\u21a1", - "Dashv;": "\u2ae4", - "Dcaron;": "\u010e", - "Dcy;": "\u0414", - "Del;": "\u2207", - "Delta;": "\u0394", - "Dfr;": "\U0001d507", - "DiacriticalAcute;": "\xb4", - "DiacriticalDot;": "\u02d9", - "DiacriticalDoubleAcute;": "\u02dd", - "DiacriticalGrave;": "`", - "DiacriticalTilde;": "\u02dc", - "Diamond;": "\u22c4", - "DifferentialD;": "\u2146", - "Dopf;": "\U0001d53b", - "Dot;": "\xa8", - "DotDot;": "\u20dc", - "DotEqual;": "\u2250", - "DoubleContourIntegral;": "\u222f", - "DoubleDot;": "\xa8", - "DoubleDownArrow;": "\u21d3", - "DoubleLeftArrow;": "\u21d0", - "DoubleLeftRightArrow;": "\u21d4", - "DoubleLeftTee;": "\u2ae4", - "DoubleLongLeftArrow;": "\u27f8", - "DoubleLongLeftRightArrow;": "\u27fa", - "DoubleLongRightArrow;": "\u27f9", - "DoubleRightArrow;": "\u21d2", - "DoubleRightTee;": "\u22a8", - "DoubleUpArrow;": "\u21d1", - "DoubleUpDownArrow;": "\u21d5", - "DoubleVerticalBar;": "\u2225", - "DownArrow;": "\u2193", - "DownArrowBar;": "\u2913", - "DownArrowUpArrow;": "\u21f5", - "DownBreve;": "\u0311", - "DownLeftRightVector;": "\u2950", - "DownLeftTeeVector;": "\u295e", - "DownLeftVector;": "\u21bd", - "DownLeftVectorBar;": "\u2956", - "DownRightTeeVector;": "\u295f", - "DownRightVector;": "\u21c1", - "DownRightVectorBar;": "\u2957", - "DownTee;": "\u22a4", - "DownTeeArrow;": "\u21a7", - "Downarrow;": "\u21d3", - "Dscr;": "\U0001d49f", - "Dstrok;": "\u0110", - "ENG;": "\u014a", - "ETH": "\xd0", - "ETH;": "\xd0", - "Eacute": "\xc9", - "Eacute;": "\xc9", - "Ecaron;": "\u011a", - "Ecirc": "\xca", - "Ecirc;": "\xca", - "Ecy;": "\u042d", - "Edot;": "\u0116", - "Efr;": "\U0001d508", - "Egrave": "\xc8", - "Egrave;": "\xc8", - "Element;": "\u2208", - "Emacr;": "\u0112", - "EmptySmallSquare;": "\u25fb", - "EmptyVerySmallSquare;": "\u25ab", - "Eogon;": "\u0118", - "Eopf;": "\U0001d53c", - "Epsilon;": "\u0395", - "Equal;": "\u2a75", - "EqualTilde;": "\u2242", - "Equilibrium;": "\u21cc", - "Escr;": "\u2130", - "Esim;": "\u2a73", - "Eta;": "\u0397", - "Euml": "\xcb", - "Euml;": "\xcb", - "Exists;": "\u2203", - "ExponentialE;": "\u2147", - "Fcy;": "\u0424", - "Ffr;": "\U0001d509", - "FilledSmallSquare;": "\u25fc", - "FilledVerySmallSquare;": "\u25aa", - "Fopf;": "\U0001d53d", - "ForAll;": "\u2200", - "Fouriertrf;": "\u2131", - "Fscr;": "\u2131", - "GJcy;": "\u0403", - "GT": ">", - "GT;": ">", - "Gamma;": "\u0393", - "Gammad;": "\u03dc", - "Gbreve;": "\u011e", - "Gcedil;": "\u0122", - "Gcirc;": "\u011c", - "Gcy;": "\u0413", - "Gdot;": "\u0120", - "Gfr;": "\U0001d50a", - "Gg;": "\u22d9", - "Gopf;": "\U0001d53e", - "GreaterEqual;": "\u2265", - "GreaterEqualLess;": "\u22db", - "GreaterFullEqual;": "\u2267", - "GreaterGreater;": "\u2aa2", - "GreaterLess;": "\u2277", - "GreaterSlantEqual;": "\u2a7e", - "GreaterTilde;": "\u2273", - "Gscr;": "\U0001d4a2", - "Gt;": "\u226b", - "HARDcy;": "\u042a", - "Hacek;": "\u02c7", - "Hat;": "^", - "Hcirc;": "\u0124", - "Hfr;": "\u210c", - "HilbertSpace;": "\u210b", - "Hopf;": "\u210d", - "HorizontalLine;": "\u2500", - "Hscr;": "\u210b", - "Hstrok;": "\u0126", - "HumpDownHump;": "\u224e", - "HumpEqual;": "\u224f", - "IEcy;": "\u0415", - "IJlig;": "\u0132", - "IOcy;": "\u0401", - "Iacute": "\xcd", - "Iacute;": "\xcd", - "Icirc": "\xce", - "Icirc;": "\xce", - "Icy;": "\u0418", - "Idot;": "\u0130", - "Ifr;": "\u2111", - "Igrave": "\xcc", - "Igrave;": "\xcc", - "Im;": "\u2111", - "Imacr;": "\u012a", - "ImaginaryI;": "\u2148", - "Implies;": "\u21d2", - "Int;": "\u222c", - "Integral;": "\u222b", - "Intersection;": "\u22c2", - "InvisibleComma;": "\u2063", - "InvisibleTimes;": "\u2062", - "Iogon;": "\u012e", - "Iopf;": "\U0001d540", - "Iota;": "\u0399", - "Iscr;": "\u2110", - "Itilde;": "\u0128", - "Iukcy;": "\u0406", - "Iuml": "\xcf", - "Iuml;": "\xcf", - "Jcirc;": "\u0134", - "Jcy;": "\u0419", - "Jfr;": "\U0001d50d", - "Jopf;": "\U0001d541", - "Jscr;": "\U0001d4a5", - "Jsercy;": "\u0408", - "Jukcy;": "\u0404", - "KHcy;": "\u0425", - "KJcy;": "\u040c", - "Kappa;": "\u039a", - "Kcedil;": "\u0136", - "Kcy;": "\u041a", - "Kfr;": "\U0001d50e", - "Kopf;": "\U0001d542", - "Kscr;": "\U0001d4a6", - "LJcy;": "\u0409", - "LT": "<", - "LT;": "<", - "Lacute;": "\u0139", - "Lambda;": "\u039b", - "Lang;": "\u27ea", - "Laplacetrf;": "\u2112", - "Larr;": "\u219e", - "Lcaron;": "\u013d", - "Lcedil;": "\u013b", - "Lcy;": "\u041b", - "LeftAngleBracket;": "\u27e8", - "LeftArrow;": "\u2190", - "LeftArrowBar;": "\u21e4", - "LeftArrowRightArrow;": "\u21c6", - "LeftCeiling;": "\u2308", - "LeftDoubleBracket;": "\u27e6", - "LeftDownTeeVector;": "\u2961", - "LeftDownVector;": "\u21c3", - "LeftDownVectorBar;": "\u2959", - "LeftFloor;": "\u230a", - "LeftRightArrow;": "\u2194", - "LeftRightVector;": "\u294e", - "LeftTee;": "\u22a3", - "LeftTeeArrow;": "\u21a4", - "LeftTeeVector;": "\u295a", - "LeftTriangle;": "\u22b2", - "LeftTriangleBar;": "\u29cf", - "LeftTriangleEqual;": "\u22b4", - "LeftUpDownVector;": "\u2951", - "LeftUpTeeVector;": "\u2960", - "LeftUpVector;": "\u21bf", - "LeftUpVectorBar;": "\u2958", - "LeftVector;": "\u21bc", - "LeftVectorBar;": "\u2952", - "Leftarrow;": "\u21d0", - "Leftrightarrow;": "\u21d4", - "LessEqualGreater;": "\u22da", - "LessFullEqual;": "\u2266", - "LessGreater;": "\u2276", - "LessLess;": "\u2aa1", - "LessSlantEqual;": "\u2a7d", - "LessTilde;": "\u2272", - "Lfr;": "\U0001d50f", - "Ll;": "\u22d8", - "Lleftarrow;": "\u21da", - "Lmidot;": "\u013f", - "LongLeftArrow;": "\u27f5", - "LongLeftRightArrow;": "\u27f7", - "LongRightArrow;": "\u27f6", - "Longleftarrow;": "\u27f8", - "Longleftrightarrow;": "\u27fa", - "Longrightarrow;": "\u27f9", - "Lopf;": "\U0001d543", - "LowerLeftArrow;": "\u2199", - "LowerRightArrow;": "\u2198", - "Lscr;": "\u2112", - "Lsh;": "\u21b0", - "Lstrok;": "\u0141", - "Lt;": "\u226a", - "Map;": "\u2905", - "Mcy;": "\u041c", - "MediumSpace;": "\u205f", - "Mellintrf;": "\u2133", - "Mfr;": "\U0001d510", - "MinusPlus;": "\u2213", - "Mopf;": "\U0001d544", - "Mscr;": "\u2133", - "Mu;": "\u039c", - "NJcy;": "\u040a", - "Nacute;": "\u0143", - "Ncaron;": "\u0147", - "Ncedil;": "\u0145", - "Ncy;": "\u041d", - "NegativeMediumSpace;": "\u200b", - "NegativeThickSpace;": "\u200b", - "NegativeThinSpace;": "\u200b", - "NegativeVeryThinSpace;": "\u200b", - "NestedGreaterGreater;": "\u226b", - "NestedLessLess;": "\u226a", - "NewLine;": "\n", - "Nfr;": "\U0001d511", - "NoBreak;": "\u2060", - "NonBreakingSpace;": "\xa0", - "Nopf;": "\u2115", - "Not;": "\u2aec", - "NotCongruent;": "\u2262", - "NotCupCap;": "\u226d", - "NotDoubleVerticalBar;": "\u2226", - "NotElement;": "\u2209", - "NotEqual;": "\u2260", - "NotEqualTilde;": "\u2242\u0338", - "NotExists;": "\u2204", - "NotGreater;": "\u226f", - "NotGreaterEqual;": "\u2271", - "NotGreaterFullEqual;": "\u2267\u0338", - "NotGreaterGreater;": "\u226b\u0338", - "NotGreaterLess;": "\u2279", - "NotGreaterSlantEqual;": "\u2a7e\u0338", - "NotGreaterTilde;": "\u2275", - "NotHumpDownHump;": "\u224e\u0338", - "NotHumpEqual;": "\u224f\u0338", - "NotLeftTriangle;": "\u22ea", - "NotLeftTriangleBar;": "\u29cf\u0338", - "NotLeftTriangleEqual;": "\u22ec", - "NotLess;": "\u226e", - "NotLessEqual;": "\u2270", - "NotLessGreater;": "\u2278", - "NotLessLess;": "\u226a\u0338", - "NotLessSlantEqual;": "\u2a7d\u0338", - "NotLessTilde;": "\u2274", - "NotNestedGreaterGreater;": "\u2aa2\u0338", - "NotNestedLessLess;": "\u2aa1\u0338", - "NotPrecedes;": "\u2280", - "NotPrecedesEqual;": "\u2aaf\u0338", - "NotPrecedesSlantEqual;": "\u22e0", - "NotReverseElement;": "\u220c", - "NotRightTriangle;": "\u22eb", - "NotRightTriangleBar;": "\u29d0\u0338", - "NotRightTriangleEqual;": "\u22ed", - "NotSquareSubset;": "\u228f\u0338", - "NotSquareSubsetEqual;": "\u22e2", - "NotSquareSuperset;": "\u2290\u0338", - "NotSquareSupersetEqual;": "\u22e3", - "NotSubset;": "\u2282\u20d2", - "NotSubsetEqual;": "\u2288", - "NotSucceeds;": "\u2281", - "NotSucceedsEqual;": "\u2ab0\u0338", - "NotSucceedsSlantEqual;": "\u22e1", - "NotSucceedsTilde;": "\u227f\u0338", - "NotSuperset;": "\u2283\u20d2", - "NotSupersetEqual;": "\u2289", - "NotTilde;": "\u2241", - "NotTildeEqual;": "\u2244", - "NotTildeFullEqual;": "\u2247", - "NotTildeTilde;": "\u2249", - "NotVerticalBar;": "\u2224", - "Nscr;": "\U0001d4a9", - "Ntilde": "\xd1", - "Ntilde;": "\xd1", - "Nu;": "\u039d", - "OElig;": "\u0152", - "Oacute": "\xd3", - "Oacute;": "\xd3", - "Ocirc": "\xd4", - "Ocirc;": "\xd4", - "Ocy;": "\u041e", - "Odblac;": "\u0150", - "Ofr;": "\U0001d512", - "Ograve": "\xd2", - "Ograve;": "\xd2", - "Omacr;": "\u014c", - "Omega;": "\u03a9", - "Omicron;": "\u039f", - "Oopf;": "\U0001d546", - "OpenCurlyDoubleQuote;": "\u201c", - "OpenCurlyQuote;": "\u2018", - "Or;": "\u2a54", - "Oscr;": "\U0001d4aa", - "Oslash": "\xd8", - "Oslash;": "\xd8", - "Otilde": "\xd5", - "Otilde;": "\xd5", - "Otimes;": "\u2a37", - "Ouml": "\xd6", - "Ouml;": "\xd6", - "OverBar;": "\u203e", - "OverBrace;": "\u23de", - "OverBracket;": "\u23b4", - "OverParenthesis;": "\u23dc", - "PartialD;": "\u2202", - "Pcy;": "\u041f", - "Pfr;": "\U0001d513", - "Phi;": "\u03a6", - "Pi;": "\u03a0", - "PlusMinus;": "\xb1", - "Poincareplane;": "\u210c", - "Popf;": "\u2119", - "Pr;": "\u2abb", - "Precedes;": "\u227a", - "PrecedesEqual;": "\u2aaf", - "PrecedesSlantEqual;": "\u227c", - "PrecedesTilde;": "\u227e", - "Prime;": "\u2033", - "Product;": "\u220f", - "Proportion;": "\u2237", - "Proportional;": "\u221d", - "Pscr;": "\U0001d4ab", - "Psi;": "\u03a8", - "QUOT": "\"", - "QUOT;": "\"", - "Qfr;": "\U0001d514", - "Qopf;": "\u211a", - "Qscr;": "\U0001d4ac", - "RBarr;": "\u2910", - "REG": "\xae", - "REG;": "\xae", - "Racute;": "\u0154", - "Rang;": "\u27eb", - "Rarr;": "\u21a0", - "Rarrtl;": "\u2916", - "Rcaron;": "\u0158", - "Rcedil;": "\u0156", - "Rcy;": "\u0420", - "Re;": "\u211c", - "ReverseElement;": "\u220b", - "ReverseEquilibrium;": "\u21cb", - "ReverseUpEquilibrium;": "\u296f", - "Rfr;": "\u211c", - "Rho;": "\u03a1", - "RightAngleBracket;": "\u27e9", - "RightArrow;": "\u2192", - "RightArrowBar;": "\u21e5", - "RightArrowLeftArrow;": "\u21c4", - "RightCeiling;": "\u2309", - "RightDoubleBracket;": "\u27e7", - "RightDownTeeVector;": "\u295d", - "RightDownVector;": "\u21c2", - "RightDownVectorBar;": "\u2955", - "RightFloor;": "\u230b", - "RightTee;": "\u22a2", - "RightTeeArrow;": "\u21a6", - "RightTeeVector;": "\u295b", - "RightTriangle;": "\u22b3", - "RightTriangleBar;": "\u29d0", - "RightTriangleEqual;": "\u22b5", - "RightUpDownVector;": "\u294f", - "RightUpTeeVector;": "\u295c", - "RightUpVector;": "\u21be", - "RightUpVectorBar;": "\u2954", - "RightVector;": "\u21c0", - "RightVectorBar;": "\u2953", - "Rightarrow;": "\u21d2", - "Ropf;": "\u211d", - "RoundImplies;": "\u2970", - "Rrightarrow;": "\u21db", - "Rscr;": "\u211b", - "Rsh;": "\u21b1", - "RuleDelayed;": "\u29f4", - "SHCHcy;": "\u0429", - "SHcy;": "\u0428", - "SOFTcy;": "\u042c", - "Sacute;": "\u015a", - "Sc;": "\u2abc", - "Scaron;": "\u0160", - "Scedil;": "\u015e", - "Scirc;": "\u015c", - "Scy;": "\u0421", - "Sfr;": "\U0001d516", - "ShortDownArrow;": "\u2193", - "ShortLeftArrow;": "\u2190", - "ShortRightArrow;": "\u2192", - "ShortUpArrow;": "\u2191", - "Sigma;": "\u03a3", - "SmallCircle;": "\u2218", - "Sopf;": "\U0001d54a", - "Sqrt;": "\u221a", - "Square;": "\u25a1", - "SquareIntersection;": "\u2293", - "SquareSubset;": "\u228f", - "SquareSubsetEqual;": "\u2291", - "SquareSuperset;": "\u2290", - "SquareSupersetEqual;": "\u2292", - "SquareUnion;": "\u2294", - "Sscr;": "\U0001d4ae", - "Star;": "\u22c6", - "Sub;": "\u22d0", - "Subset;": "\u22d0", - "SubsetEqual;": "\u2286", - "Succeeds;": "\u227b", - "SucceedsEqual;": "\u2ab0", - "SucceedsSlantEqual;": "\u227d", - "SucceedsTilde;": "\u227f", - "SuchThat;": "\u220b", - "Sum;": "\u2211", - "Sup;": "\u22d1", - "Superset;": "\u2283", - "SupersetEqual;": "\u2287", - "Supset;": "\u22d1", - "THORN": "\xde", - "THORN;": "\xde", - "TRADE;": "\u2122", - "TSHcy;": "\u040b", - "TScy;": "\u0426", - "Tab;": "\t", - "Tau;": "\u03a4", - "Tcaron;": "\u0164", - "Tcedil;": "\u0162", - "Tcy;": "\u0422", - "Tfr;": "\U0001d517", - "Therefore;": "\u2234", - "Theta;": "\u0398", - "ThickSpace;": "\u205f\u200a", - "ThinSpace;": "\u2009", - "Tilde;": "\u223c", - "TildeEqual;": "\u2243", - "TildeFullEqual;": "\u2245", - "TildeTilde;": "\u2248", - "Topf;": "\U0001d54b", - "TripleDot;": "\u20db", - "Tscr;": "\U0001d4af", - "Tstrok;": "\u0166", - "Uacute": "\xda", - "Uacute;": "\xda", - "Uarr;": "\u219f", - "Uarrocir;": "\u2949", - "Ubrcy;": "\u040e", - "Ubreve;": "\u016c", - "Ucirc": "\xdb", - "Ucirc;": "\xdb", - "Ucy;": "\u0423", - "Udblac;": "\u0170", - "Ufr;": "\U0001d518", - "Ugrave": "\xd9", - "Ugrave;": "\xd9", - "Umacr;": "\u016a", - "UnderBar;": "_", - "UnderBrace;": "\u23df", - "UnderBracket;": "\u23b5", - "UnderParenthesis;": "\u23dd", - "Union;": "\u22c3", - "UnionPlus;": "\u228e", - "Uogon;": "\u0172", - "Uopf;": "\U0001d54c", - "UpArrow;": "\u2191", - "UpArrowBar;": "\u2912", - "UpArrowDownArrow;": "\u21c5", - "UpDownArrow;": "\u2195", - "UpEquilibrium;": "\u296e", - "UpTee;": "\u22a5", - "UpTeeArrow;": "\u21a5", - "Uparrow;": "\u21d1", - "Updownarrow;": "\u21d5", - "UpperLeftArrow;": "\u2196", - "UpperRightArrow;": "\u2197", - "Upsi;": "\u03d2", - "Upsilon;": "\u03a5", - "Uring;": "\u016e", - "Uscr;": "\U0001d4b0", - "Utilde;": "\u0168", - "Uuml": "\xdc", - "Uuml;": "\xdc", - "VDash;": "\u22ab", - "Vbar;": "\u2aeb", - "Vcy;": "\u0412", - "Vdash;": "\u22a9", - "Vdashl;": "\u2ae6", - "Vee;": "\u22c1", - "Verbar;": "\u2016", - "Vert;": "\u2016", - "VerticalBar;": "\u2223", - "VerticalLine;": "|", - "VerticalSeparator;": "\u2758", - "VerticalTilde;": "\u2240", - "VeryThinSpace;": "\u200a", - "Vfr;": "\U0001d519", - "Vopf;": "\U0001d54d", - "Vscr;": "\U0001d4b1", - "Vvdash;": "\u22aa", - "Wcirc;": "\u0174", - "Wedge;": "\u22c0", - "Wfr;": "\U0001d51a", - "Wopf;": "\U0001d54e", - "Wscr;": "\U0001d4b2", - "Xfr;": "\U0001d51b", - "Xi;": "\u039e", - "Xopf;": "\U0001d54f", - "Xscr;": "\U0001d4b3", - "YAcy;": "\u042f", - "YIcy;": "\u0407", - "YUcy;": "\u042e", - "Yacute": "\xdd", - "Yacute;": "\xdd", - "Ycirc;": "\u0176", - "Ycy;": "\u042b", - "Yfr;": "\U0001d51c", - "Yopf;": "\U0001d550", - "Yscr;": "\U0001d4b4", - "Yuml;": "\u0178", - "ZHcy;": "\u0416", - "Zacute;": "\u0179", - "Zcaron;": "\u017d", - "Zcy;": "\u0417", - "Zdot;": "\u017b", - "ZeroWidthSpace;": "\u200b", - "Zeta;": "\u0396", - "Zfr;": "\u2128", - "Zopf;": "\u2124", - "Zscr;": "\U0001d4b5", - "aacute": "\xe1", - "aacute;": "\xe1", - "abreve;": "\u0103", - "ac;": "\u223e", - "acE;": "\u223e\u0333", - "acd;": "\u223f", - "acirc": "\xe2", - "acirc;": "\xe2", - "acute": "\xb4", - "acute;": "\xb4", - "acy;": "\u0430", - "aelig": "\xe6", - "aelig;": "\xe6", - "af;": "\u2061", - "afr;": "\U0001d51e", - "agrave": "\xe0", - "agrave;": "\xe0", - "alefsym;": "\u2135", - "aleph;": "\u2135", - "alpha;": "\u03b1", - "amacr;": "\u0101", - "amalg;": "\u2a3f", - "amp": "&", - "amp;": "&", - "and;": "\u2227", - "andand;": "\u2a55", - "andd;": "\u2a5c", - "andslope;": "\u2a58", - "andv;": "\u2a5a", - "ang;": "\u2220", - "ange;": "\u29a4", - "angle;": "\u2220", - "angmsd;": "\u2221", - "angmsdaa;": "\u29a8", - "angmsdab;": "\u29a9", - "angmsdac;": "\u29aa", - "angmsdad;": "\u29ab", - "angmsdae;": "\u29ac", - "angmsdaf;": "\u29ad", - "angmsdag;": "\u29ae", - "angmsdah;": "\u29af", - "angrt;": "\u221f", - "angrtvb;": "\u22be", - "angrtvbd;": "\u299d", - "angsph;": "\u2222", - "angst;": "\xc5", - "angzarr;": "\u237c", - "aogon;": "\u0105", - "aopf;": "\U0001d552", - "ap;": "\u2248", - "apE;": "\u2a70", - "apacir;": "\u2a6f", - "ape;": "\u224a", - "apid;": "\u224b", - "apos;": "'", - "approx;": "\u2248", - "approxeq;": "\u224a", - "aring": "\xe5", - "aring;": "\xe5", - "ascr;": "\U0001d4b6", - "ast;": "*", - "asymp;": "\u2248", - "asympeq;": "\u224d", - "atilde": "\xe3", - "atilde;": "\xe3", - "auml": "\xe4", - "auml;": "\xe4", - "awconint;": "\u2233", - "awint;": "\u2a11", - "bNot;": "\u2aed", - "backcong;": "\u224c", - "backepsilon;": "\u03f6", - "backprime;": "\u2035", - "backsim;": "\u223d", - "backsimeq;": "\u22cd", - "barvee;": "\u22bd", - "barwed;": "\u2305", - "barwedge;": "\u2305", - "bbrk;": "\u23b5", - "bbrktbrk;": "\u23b6", - "bcong;": "\u224c", - "bcy;": "\u0431", - "bdquo;": "\u201e", - "becaus;": "\u2235", - "because;": "\u2235", - "bemptyv;": "\u29b0", - "bepsi;": "\u03f6", - "bernou;": "\u212c", - "beta;": "\u03b2", - "beth;": "\u2136", - "between;": "\u226c", - "bfr;": "\U0001d51f", - "bigcap;": "\u22c2", - "bigcirc;": "\u25ef", - "bigcup;": "\u22c3", - "bigodot;": "\u2a00", - "bigoplus;": "\u2a01", - "bigotimes;": "\u2a02", - "bigsqcup;": "\u2a06", - "bigstar;": "\u2605", - "bigtriangledown;": "\u25bd", - "bigtriangleup;": "\u25b3", - "biguplus;": "\u2a04", - "bigvee;": "\u22c1", - "bigwedge;": "\u22c0", - "bkarow;": "\u290d", - "blacklozenge;": "\u29eb", - "blacksquare;": "\u25aa", - "blacktriangle;": "\u25b4", - "blacktriangledown;": "\u25be", - "blacktriangleleft;": "\u25c2", - "blacktriangleright;": "\u25b8", - "blank;": "\u2423", - "blk12;": "\u2592", - "blk14;": "\u2591", - "blk34;": "\u2593", - "block;": "\u2588", - "bne;": "=\u20e5", - "bnequiv;": "\u2261\u20e5", - "bnot;": "\u2310", - "bopf;": "\U0001d553", - "bot;": "\u22a5", - "bottom;": "\u22a5", - "bowtie;": "\u22c8", - "boxDL;": "\u2557", - "boxDR;": "\u2554", - "boxDl;": "\u2556", - "boxDr;": "\u2553", - "boxH;": "\u2550", - "boxHD;": "\u2566", - "boxHU;": "\u2569", - "boxHd;": "\u2564", - "boxHu;": "\u2567", - "boxUL;": "\u255d", - "boxUR;": "\u255a", - "boxUl;": "\u255c", - "boxUr;": "\u2559", - "boxV;": "\u2551", - "boxVH;": "\u256c", - "boxVL;": "\u2563", - "boxVR;": "\u2560", - "boxVh;": "\u256b", - "boxVl;": "\u2562", - "boxVr;": "\u255f", - "boxbox;": "\u29c9", - "boxdL;": "\u2555", - "boxdR;": "\u2552", - "boxdl;": "\u2510", - "boxdr;": "\u250c", - "boxh;": "\u2500", - "boxhD;": "\u2565", - "boxhU;": "\u2568", - "boxhd;": "\u252c", - "boxhu;": "\u2534", - "boxminus;": "\u229f", - "boxplus;": "\u229e", - "boxtimes;": "\u22a0", - "boxuL;": "\u255b", - "boxuR;": "\u2558", - "boxul;": "\u2518", - "boxur;": "\u2514", - "boxv;": "\u2502", - "boxvH;": "\u256a", - "boxvL;": "\u2561", - "boxvR;": "\u255e", - "boxvh;": "\u253c", - "boxvl;": "\u2524", - "boxvr;": "\u251c", - "bprime;": "\u2035", - "breve;": "\u02d8", - "brvbar": "\xa6", - "brvbar;": "\xa6", - "bscr;": "\U0001d4b7", - "bsemi;": "\u204f", - "bsim;": "\u223d", - "bsime;": "\u22cd", - "bsol;": "\\", - "bsolb;": "\u29c5", - "bsolhsub;": "\u27c8", - "bull;": "\u2022", - "bullet;": "\u2022", - "bump;": "\u224e", - "bumpE;": "\u2aae", - "bumpe;": "\u224f", - "bumpeq;": "\u224f", - "cacute;": "\u0107", - "cap;": "\u2229", - "capand;": "\u2a44", - "capbrcup;": "\u2a49", - "capcap;": "\u2a4b", - "capcup;": "\u2a47", - "capdot;": "\u2a40", - "caps;": "\u2229\ufe00", - "caret;": "\u2041", - "caron;": "\u02c7", - "ccaps;": "\u2a4d", - "ccaron;": "\u010d", - "ccedil": "\xe7", - "ccedil;": "\xe7", - "ccirc;": "\u0109", - "ccups;": "\u2a4c", - "ccupssm;": "\u2a50", - "cdot;": "\u010b", - "cedil": "\xb8", - "cedil;": "\xb8", - "cemptyv;": "\u29b2", - "cent": "\xa2", - "cent;": "\xa2", - "centerdot;": "\xb7", - "cfr;": "\U0001d520", - "chcy;": "\u0447", - "check;": "\u2713", - "checkmark;": "\u2713", - "chi;": "\u03c7", - "cir;": "\u25cb", - "cirE;": "\u29c3", - "circ;": "\u02c6", - "circeq;": "\u2257", - "circlearrowleft;": "\u21ba", - "circlearrowright;": "\u21bb", - "circledR;": "\xae", - "circledS;": "\u24c8", - "circledast;": "\u229b", - "circledcirc;": "\u229a", - "circleddash;": "\u229d", - "cire;": "\u2257", - "cirfnint;": "\u2a10", - "cirmid;": "\u2aef", - "cirscir;": "\u29c2", - "clubs;": "\u2663", - "clubsuit;": "\u2663", - "colon;": ":", - "colone;": "\u2254", - "coloneq;": "\u2254", - "comma;": ",", - "commat;": "@", - "comp;": "\u2201", - "compfn;": "\u2218", - "complement;": "\u2201", - "complexes;": "\u2102", - "cong;": "\u2245", - "congdot;": "\u2a6d", - "conint;": "\u222e", - "copf;": "\U0001d554", - "coprod;": "\u2210", - "copy": "\xa9", - "copy;": "\xa9", - "copysr;": "\u2117", - "crarr;": "\u21b5", - "cross;": "\u2717", - "cscr;": "\U0001d4b8", - "csub;": "\u2acf", - "csube;": "\u2ad1", - "csup;": "\u2ad0", - "csupe;": "\u2ad2", - "ctdot;": "\u22ef", - "cudarrl;": "\u2938", - "cudarrr;": "\u2935", - "cuepr;": "\u22de", - "cuesc;": "\u22df", - "cularr;": "\u21b6", - "cularrp;": "\u293d", - "cup;": "\u222a", - "cupbrcap;": "\u2a48", - "cupcap;": "\u2a46", - "cupcup;": "\u2a4a", - "cupdot;": "\u228d", - "cupor;": "\u2a45", - "cups;": "\u222a\ufe00", - "curarr;": "\u21b7", - "curarrm;": "\u293c", - "curlyeqprec;": "\u22de", - "curlyeqsucc;": "\u22df", - "curlyvee;": "\u22ce", - "curlywedge;": "\u22cf", - "curren": "\xa4", - "curren;": "\xa4", - "curvearrowleft;": "\u21b6", - "curvearrowright;": "\u21b7", - "cuvee;": "\u22ce", - "cuwed;": "\u22cf", - "cwconint;": "\u2232", - "cwint;": "\u2231", - "cylcty;": "\u232d", - "dArr;": "\u21d3", - "dHar;": "\u2965", - "dagger;": "\u2020", - "daleth;": "\u2138", - "darr;": "\u2193", - "dash;": "\u2010", - "dashv;": "\u22a3", - "dbkarow;": "\u290f", - "dblac;": "\u02dd", - "dcaron;": "\u010f", - "dcy;": "\u0434", - "dd;": "\u2146", - "ddagger;": "\u2021", - "ddarr;": "\u21ca", - "ddotseq;": "\u2a77", - "deg": "\xb0", - "deg;": "\xb0", - "delta;": "\u03b4", - "demptyv;": "\u29b1", - "dfisht;": "\u297f", - "dfr;": "\U0001d521", - "dharl;": "\u21c3", - "dharr;": "\u21c2", - "diam;": "\u22c4", - "diamond;": "\u22c4", - "diamondsuit;": "\u2666", - "diams;": "\u2666", - "die;": "\xa8", - "digamma;": "\u03dd", - "disin;": "\u22f2", - "div;": "\xf7", - "divide": "\xf7", - "divide;": "\xf7", - "divideontimes;": "\u22c7", - "divonx;": "\u22c7", - "djcy;": "\u0452", - "dlcorn;": "\u231e", - "dlcrop;": "\u230d", - "dollar;": "$", - "dopf;": "\U0001d555", - "dot;": "\u02d9", - "doteq;": "\u2250", - "doteqdot;": "\u2251", - "dotminus;": "\u2238", - "dotplus;": "\u2214", - "dotsquare;": "\u22a1", - "doublebarwedge;": "\u2306", - "downarrow;": "\u2193", - "downdownarrows;": "\u21ca", - "downharpoonleft;": "\u21c3", - "downharpoonright;": "\u21c2", - "drbkarow;": "\u2910", - "drcorn;": "\u231f", - "drcrop;": "\u230c", - "dscr;": "\U0001d4b9", - "dscy;": "\u0455", - "dsol;": "\u29f6", - "dstrok;": "\u0111", - "dtdot;": "\u22f1", - "dtri;": "\u25bf", - "dtrif;": "\u25be", - "duarr;": "\u21f5", - "duhar;": "\u296f", - "dwangle;": "\u29a6", - "dzcy;": "\u045f", - "dzigrarr;": "\u27ff", - "eDDot;": "\u2a77", - "eDot;": "\u2251", - "eacute": "\xe9", - "eacute;": "\xe9", - "easter;": "\u2a6e", - "ecaron;": "\u011b", - "ecir;": "\u2256", - "ecirc": "\xea", - "ecirc;": "\xea", - "ecolon;": "\u2255", - "ecy;": "\u044d", - "edot;": "\u0117", - "ee;": "\u2147", - "efDot;": "\u2252", - "efr;": "\U0001d522", - "eg;": "\u2a9a", - "egrave": "\xe8", - "egrave;": "\xe8", - "egs;": "\u2a96", - "egsdot;": "\u2a98", - "el;": "\u2a99", - "elinters;": "\u23e7", - "ell;": "\u2113", - "els;": "\u2a95", - "elsdot;": "\u2a97", - "emacr;": "\u0113", - "empty;": "\u2205", - "emptyset;": "\u2205", - "emptyv;": "\u2205", - "emsp13;": "\u2004", - "emsp14;": "\u2005", - "emsp;": "\u2003", - "eng;": "\u014b", - "ensp;": "\u2002", - "eogon;": "\u0119", - "eopf;": "\U0001d556", - "epar;": "\u22d5", - "eparsl;": "\u29e3", - "eplus;": "\u2a71", - "epsi;": "\u03b5", - "epsilon;": "\u03b5", - "epsiv;": "\u03f5", - "eqcirc;": "\u2256", - "eqcolon;": "\u2255", - "eqsim;": "\u2242", - "eqslantgtr;": "\u2a96", - "eqslantless;": "\u2a95", - "equals;": "=", - "equest;": "\u225f", - "equiv;": "\u2261", - "equivDD;": "\u2a78", - "eqvparsl;": "\u29e5", - "erDot;": "\u2253", - "erarr;": "\u2971", - "escr;": "\u212f", - "esdot;": "\u2250", - "esim;": "\u2242", - "eta;": "\u03b7", - "eth": "\xf0", - "eth;": "\xf0", - "euml": "\xeb", - "euml;": "\xeb", - "euro;": "\u20ac", - "excl;": "!", - "exist;": "\u2203", - "expectation;": "\u2130", - "exponentiale;": "\u2147", - "fallingdotseq;": "\u2252", - "fcy;": "\u0444", - "female;": "\u2640", - "ffilig;": "\ufb03", - "fflig;": "\ufb00", - "ffllig;": "\ufb04", - "ffr;": "\U0001d523", - "filig;": "\ufb01", - "fjlig;": "fj", - "flat;": "\u266d", - "fllig;": "\ufb02", - "fltns;": "\u25b1", - "fnof;": "\u0192", - "fopf;": "\U0001d557", - "forall;": "\u2200", - "fork;": "\u22d4", - "forkv;": "\u2ad9", - "fpartint;": "\u2a0d", - "frac12": "\xbd", - "frac12;": "\xbd", - "frac13;": "\u2153", - "frac14": "\xbc", - "frac14;": "\xbc", - "frac15;": "\u2155", - "frac16;": "\u2159", - "frac18;": "\u215b", - "frac23;": "\u2154", - "frac25;": "\u2156", - "frac34": "\xbe", - "frac34;": "\xbe", - "frac35;": "\u2157", - "frac38;": "\u215c", - "frac45;": "\u2158", - "frac56;": "\u215a", - "frac58;": "\u215d", - "frac78;": "\u215e", - "frasl;": "\u2044", - "frown;": "\u2322", - "fscr;": "\U0001d4bb", - "gE;": "\u2267", - "gEl;": "\u2a8c", - "gacute;": "\u01f5", - "gamma;": "\u03b3", - "gammad;": "\u03dd", - "gap;": "\u2a86", - "gbreve;": "\u011f", - "gcirc;": "\u011d", - "gcy;": "\u0433", - "gdot;": "\u0121", - "ge;": "\u2265", - "gel;": "\u22db", - "geq;": "\u2265", - "geqq;": "\u2267", - "geqslant;": "\u2a7e", - "ges;": "\u2a7e", - "gescc;": "\u2aa9", - "gesdot;": "\u2a80", - "gesdoto;": "\u2a82", - "gesdotol;": "\u2a84", - "gesl;": "\u22db\ufe00", - "gesles;": "\u2a94", - "gfr;": "\U0001d524", - "gg;": "\u226b", - "ggg;": "\u22d9", - "gimel;": "\u2137", - "gjcy;": "\u0453", - "gl;": "\u2277", - "glE;": "\u2a92", - "gla;": "\u2aa5", - "glj;": "\u2aa4", - "gnE;": "\u2269", - "gnap;": "\u2a8a", - "gnapprox;": "\u2a8a", - "gne;": "\u2a88", - "gneq;": "\u2a88", - "gneqq;": "\u2269", - "gnsim;": "\u22e7", - "gopf;": "\U0001d558", - "grave;": "`", - "gscr;": "\u210a", - "gsim;": "\u2273", - "gsime;": "\u2a8e", - "gsiml;": "\u2a90", - "gt": ">", - "gt;": ">", - "gtcc;": "\u2aa7", - "gtcir;": "\u2a7a", - "gtdot;": "\u22d7", - "gtlPar;": "\u2995", - "gtquest;": "\u2a7c", - "gtrapprox;": "\u2a86", - "gtrarr;": "\u2978", - "gtrdot;": "\u22d7", - "gtreqless;": "\u22db", - "gtreqqless;": "\u2a8c", - "gtrless;": "\u2277", - "gtrsim;": "\u2273", - "gvertneqq;": "\u2269\ufe00", - "gvnE;": "\u2269\ufe00", - "hArr;": "\u21d4", - "hairsp;": "\u200a", - "half;": "\xbd", - "hamilt;": "\u210b", - "hardcy;": "\u044a", - "harr;": "\u2194", - "harrcir;": "\u2948", - "harrw;": "\u21ad", - "hbar;": "\u210f", - "hcirc;": "\u0125", - "hearts;": "\u2665", - "heartsuit;": "\u2665", - "hellip;": "\u2026", - "hercon;": "\u22b9", - "hfr;": "\U0001d525", - "hksearow;": "\u2925", - "hkswarow;": "\u2926", - "hoarr;": "\u21ff", - "homtht;": "\u223b", - "hookleftarrow;": "\u21a9", - "hookrightarrow;": "\u21aa", - "hopf;": "\U0001d559", - "horbar;": "\u2015", - "hscr;": "\U0001d4bd", - "hslash;": "\u210f", - "hstrok;": "\u0127", - "hybull;": "\u2043", - "hyphen;": "\u2010", - "iacute": "\xed", - "iacute;": "\xed", - "ic;": "\u2063", - "icirc": "\xee", - "icirc;": "\xee", - "icy;": "\u0438", - "iecy;": "\u0435", - "iexcl": "\xa1", - "iexcl;": "\xa1", - "iff;": "\u21d4", - "ifr;": "\U0001d526", - "igrave": "\xec", - "igrave;": "\xec", - "ii;": "\u2148", - "iiiint;": "\u2a0c", - "iiint;": "\u222d", - "iinfin;": "\u29dc", - "iiota;": "\u2129", - "ijlig;": "\u0133", - "imacr;": "\u012b", - "image;": "\u2111", - "imagline;": "\u2110", - "imagpart;": "\u2111", - "imath;": "\u0131", - "imof;": "\u22b7", - "imped;": "\u01b5", - "in;": "\u2208", - "incare;": "\u2105", - "infin;": "\u221e", - "infintie;": "\u29dd", - "inodot;": "\u0131", - "int;": "\u222b", - "intcal;": "\u22ba", - "integers;": "\u2124", - "intercal;": "\u22ba", - "intlarhk;": "\u2a17", - "intprod;": "\u2a3c", - "iocy;": "\u0451", - "iogon;": "\u012f", - "iopf;": "\U0001d55a", - "iota;": "\u03b9", - "iprod;": "\u2a3c", - "iquest": "\xbf", - "iquest;": "\xbf", - "iscr;": "\U0001d4be", - "isin;": "\u2208", - "isinE;": "\u22f9", - "isindot;": "\u22f5", - "isins;": "\u22f4", - "isinsv;": "\u22f3", - "isinv;": "\u2208", - "it;": "\u2062", - "itilde;": "\u0129", - "iukcy;": "\u0456", - "iuml": "\xef", - "iuml;": "\xef", - "jcirc;": "\u0135", - "jcy;": "\u0439", - "jfr;": "\U0001d527", - "jmath;": "\u0237", - "jopf;": "\U0001d55b", - "jscr;": "\U0001d4bf", - "jsercy;": "\u0458", - "jukcy;": "\u0454", - "kappa;": "\u03ba", - "kappav;": "\u03f0", - "kcedil;": "\u0137", - "kcy;": "\u043a", - "kfr;": "\U0001d528", - "kgreen;": "\u0138", - "khcy;": "\u0445", - "kjcy;": "\u045c", - "kopf;": "\U0001d55c", - "kscr;": "\U0001d4c0", - "lAarr;": "\u21da", - "lArr;": "\u21d0", - "lAtail;": "\u291b", - "lBarr;": "\u290e", - "lE;": "\u2266", - "lEg;": "\u2a8b", - "lHar;": "\u2962", - "lacute;": "\u013a", - "laemptyv;": "\u29b4", - "lagran;": "\u2112", - "lambda;": "\u03bb", - "lang;": "\u27e8", - "langd;": "\u2991", - "langle;": "\u27e8", - "lap;": "\u2a85", - "laquo": "\xab", - "laquo;": "\xab", - "larr;": "\u2190", - "larrb;": "\u21e4", - "larrbfs;": "\u291f", - "larrfs;": "\u291d", - "larrhk;": "\u21a9", - "larrlp;": "\u21ab", - "larrpl;": "\u2939", - "larrsim;": "\u2973", - "larrtl;": "\u21a2", - "lat;": "\u2aab", - "latail;": "\u2919", - "late;": "\u2aad", - "lates;": "\u2aad\ufe00", - "lbarr;": "\u290c", - "lbbrk;": "\u2772", - "lbrace;": "{", - "lbrack;": "[", - "lbrke;": "\u298b", - "lbrksld;": "\u298f", - "lbrkslu;": "\u298d", - "lcaron;": "\u013e", - "lcedil;": "\u013c", - "lceil;": "\u2308", - "lcub;": "{", - "lcy;": "\u043b", - "ldca;": "\u2936", - "ldquo;": "\u201c", - "ldquor;": "\u201e", - "ldrdhar;": "\u2967", - "ldrushar;": "\u294b", - "ldsh;": "\u21b2", - "le;": "\u2264", - "leftarrow;": "\u2190", - "leftarrowtail;": "\u21a2", - "leftharpoondown;": "\u21bd", - "leftharpoonup;": "\u21bc", - "leftleftarrows;": "\u21c7", - "leftrightarrow;": "\u2194", - "leftrightarrows;": "\u21c6", - "leftrightharpoons;": "\u21cb", - "leftrightsquigarrow;": "\u21ad", - "leftthreetimes;": "\u22cb", - "leg;": "\u22da", - "leq;": "\u2264", - "leqq;": "\u2266", - "leqslant;": "\u2a7d", - "les;": "\u2a7d", - "lescc;": "\u2aa8", - "lesdot;": "\u2a7f", - "lesdoto;": "\u2a81", - "lesdotor;": "\u2a83", - "lesg;": "\u22da\ufe00", - "lesges;": "\u2a93", - "lessapprox;": "\u2a85", - "lessdot;": "\u22d6", - "lesseqgtr;": "\u22da", - "lesseqqgtr;": "\u2a8b", - "lessgtr;": "\u2276", - "lesssim;": "\u2272", - "lfisht;": "\u297c", - "lfloor;": "\u230a", - "lfr;": "\U0001d529", - "lg;": "\u2276", - "lgE;": "\u2a91", - "lhard;": "\u21bd", - "lharu;": "\u21bc", - "lharul;": "\u296a", - "lhblk;": "\u2584", - "ljcy;": "\u0459", - "ll;": "\u226a", - "llarr;": "\u21c7", - "llcorner;": "\u231e", - "llhard;": "\u296b", - "lltri;": "\u25fa", - "lmidot;": "\u0140", - "lmoust;": "\u23b0", - "lmoustache;": "\u23b0", - "lnE;": "\u2268", - "lnap;": "\u2a89", - "lnapprox;": "\u2a89", - "lne;": "\u2a87", - "lneq;": "\u2a87", - "lneqq;": "\u2268", - "lnsim;": "\u22e6", - "loang;": "\u27ec", - "loarr;": "\u21fd", - "lobrk;": "\u27e6", - "longleftarrow;": "\u27f5", - "longleftrightarrow;": "\u27f7", - "longmapsto;": "\u27fc", - "longrightarrow;": "\u27f6", - "looparrowleft;": "\u21ab", - "looparrowright;": "\u21ac", - "lopar;": "\u2985", - "lopf;": "\U0001d55d", - "loplus;": "\u2a2d", - "lotimes;": "\u2a34", - "lowast;": "\u2217", - "lowbar;": "_", - "loz;": "\u25ca", - "lozenge;": "\u25ca", - "lozf;": "\u29eb", - "lpar;": "(", - "lparlt;": "\u2993", - "lrarr;": "\u21c6", - "lrcorner;": "\u231f", - "lrhar;": "\u21cb", - "lrhard;": "\u296d", - "lrm;": "\u200e", - "lrtri;": "\u22bf", - "lsaquo;": "\u2039", - "lscr;": "\U0001d4c1", - "lsh;": "\u21b0", - "lsim;": "\u2272", - "lsime;": "\u2a8d", - "lsimg;": "\u2a8f", - "lsqb;": "[", - "lsquo;": "\u2018", - "lsquor;": "\u201a", - "lstrok;": "\u0142", - "lt": "<", - "lt;": "<", - "ltcc;": "\u2aa6", - "ltcir;": "\u2a79", - "ltdot;": "\u22d6", - "lthree;": "\u22cb", - "ltimes;": "\u22c9", - "ltlarr;": "\u2976", - "ltquest;": "\u2a7b", - "ltrPar;": "\u2996", - "ltri;": "\u25c3", - "ltrie;": "\u22b4", - "ltrif;": "\u25c2", - "lurdshar;": "\u294a", - "luruhar;": "\u2966", - "lvertneqq;": "\u2268\ufe00", - "lvnE;": "\u2268\ufe00", - "mDDot;": "\u223a", - "macr": "\xaf", - "macr;": "\xaf", - "male;": "\u2642", - "malt;": "\u2720", - "maltese;": "\u2720", - "map;": "\u21a6", - "mapsto;": "\u21a6", - "mapstodown;": "\u21a7", - "mapstoleft;": "\u21a4", - "mapstoup;": "\u21a5", - "marker;": "\u25ae", - "mcomma;": "\u2a29", - "mcy;": "\u043c", - "mdash;": "\u2014", - "measuredangle;": "\u2221", - "mfr;": "\U0001d52a", - "mho;": "\u2127", - "micro": "\xb5", - "micro;": "\xb5", - "mid;": "\u2223", - "midast;": "*", - "midcir;": "\u2af0", - "middot": "\xb7", - "middot;": "\xb7", - "minus;": "\u2212", - "minusb;": "\u229f", - "minusd;": "\u2238", - "minusdu;": "\u2a2a", - "mlcp;": "\u2adb", - "mldr;": "\u2026", - "mnplus;": "\u2213", - "models;": "\u22a7", - "mopf;": "\U0001d55e", - "mp;": "\u2213", - "mscr;": "\U0001d4c2", - "mstpos;": "\u223e", - "mu;": "\u03bc", - "multimap;": "\u22b8", - "mumap;": "\u22b8", - "nGg;": "\u22d9\u0338", - "nGt;": "\u226b\u20d2", - "nGtv;": "\u226b\u0338", - "nLeftarrow;": "\u21cd", - "nLeftrightarrow;": "\u21ce", - "nLl;": "\u22d8\u0338", - "nLt;": "\u226a\u20d2", - "nLtv;": "\u226a\u0338", - "nRightarrow;": "\u21cf", - "nVDash;": "\u22af", - "nVdash;": "\u22ae", - "nabla;": "\u2207", - "nacute;": "\u0144", - "nang;": "\u2220\u20d2", - "nap;": "\u2249", - "napE;": "\u2a70\u0338", - "napid;": "\u224b\u0338", - "napos;": "\u0149", - "napprox;": "\u2249", - "natur;": "\u266e", - "natural;": "\u266e", - "naturals;": "\u2115", - "nbsp": "\xa0", - "nbsp;": "\xa0", - "nbump;": "\u224e\u0338", - "nbumpe;": "\u224f\u0338", - "ncap;": "\u2a43", - "ncaron;": "\u0148", - "ncedil;": "\u0146", - "ncong;": "\u2247", - "ncongdot;": "\u2a6d\u0338", - "ncup;": "\u2a42", - "ncy;": "\u043d", - "ndash;": "\u2013", - "ne;": "\u2260", - "neArr;": "\u21d7", - "nearhk;": "\u2924", - "nearr;": "\u2197", - "nearrow;": "\u2197", - "nedot;": "\u2250\u0338", - "nequiv;": "\u2262", - "nesear;": "\u2928", - "nesim;": "\u2242\u0338", - "nexist;": "\u2204", - "nexists;": "\u2204", - "nfr;": "\U0001d52b", - "ngE;": "\u2267\u0338", - "nge;": "\u2271", - "ngeq;": "\u2271", - "ngeqq;": "\u2267\u0338", - "ngeqslant;": "\u2a7e\u0338", - "nges;": "\u2a7e\u0338", - "ngsim;": "\u2275", - "ngt;": "\u226f", - "ngtr;": "\u226f", - "nhArr;": "\u21ce", - "nharr;": "\u21ae", - "nhpar;": "\u2af2", - "ni;": "\u220b", - "nis;": "\u22fc", - "nisd;": "\u22fa", - "niv;": "\u220b", - "njcy;": "\u045a", - "nlArr;": "\u21cd", - "nlE;": "\u2266\u0338", - "nlarr;": "\u219a", - "nldr;": "\u2025", - "nle;": "\u2270", - "nleftarrow;": "\u219a", - "nleftrightarrow;": "\u21ae", - "nleq;": "\u2270", - "nleqq;": "\u2266\u0338", - "nleqslant;": "\u2a7d\u0338", - "nles;": "\u2a7d\u0338", - "nless;": "\u226e", - "nlsim;": "\u2274", - "nlt;": "\u226e", - "nltri;": "\u22ea", - "nltrie;": "\u22ec", - "nmid;": "\u2224", - "nopf;": "\U0001d55f", - "not": "\xac", - "not;": "\xac", - "notin;": "\u2209", - "notinE;": "\u22f9\u0338", - "notindot;": "\u22f5\u0338", - "notinva;": "\u2209", - "notinvb;": "\u22f7", - "notinvc;": "\u22f6", - "notni;": "\u220c", - "notniva;": "\u220c", - "notnivb;": "\u22fe", - "notnivc;": "\u22fd", - "npar;": "\u2226", - "nparallel;": "\u2226", - "nparsl;": "\u2afd\u20e5", - "npart;": "\u2202\u0338", - "npolint;": "\u2a14", - "npr;": "\u2280", - "nprcue;": "\u22e0", - "npre;": "\u2aaf\u0338", - "nprec;": "\u2280", - "npreceq;": "\u2aaf\u0338", - "nrArr;": "\u21cf", - "nrarr;": "\u219b", - "nrarrc;": "\u2933\u0338", - "nrarrw;": "\u219d\u0338", - "nrightarrow;": "\u219b", - "nrtri;": "\u22eb", - "nrtrie;": "\u22ed", - "nsc;": "\u2281", - "nsccue;": "\u22e1", - "nsce;": "\u2ab0\u0338", - "nscr;": "\U0001d4c3", - "nshortmid;": "\u2224", - "nshortparallel;": "\u2226", - "nsim;": "\u2241", - "nsime;": "\u2244", - "nsimeq;": "\u2244", - "nsmid;": "\u2224", - "nspar;": "\u2226", - "nsqsube;": "\u22e2", - "nsqsupe;": "\u22e3", - "nsub;": "\u2284", - "nsubE;": "\u2ac5\u0338", - "nsube;": "\u2288", - "nsubset;": "\u2282\u20d2", - "nsubseteq;": "\u2288", - "nsubseteqq;": "\u2ac5\u0338", - "nsucc;": "\u2281", - "nsucceq;": "\u2ab0\u0338", - "nsup;": "\u2285", - "nsupE;": "\u2ac6\u0338", - "nsupe;": "\u2289", - "nsupset;": "\u2283\u20d2", - "nsupseteq;": "\u2289", - "nsupseteqq;": "\u2ac6\u0338", - "ntgl;": "\u2279", - "ntilde": "\xf1", - "ntilde;": "\xf1", - "ntlg;": "\u2278", - "ntriangleleft;": "\u22ea", - "ntrianglelefteq;": "\u22ec", - "ntriangleright;": "\u22eb", - "ntrianglerighteq;": "\u22ed", - "nu;": "\u03bd", - "num;": "#", - "numero;": "\u2116", - "numsp;": "\u2007", - "nvDash;": "\u22ad", - "nvHarr;": "\u2904", - "nvap;": "\u224d\u20d2", - "nvdash;": "\u22ac", - "nvge;": "\u2265\u20d2", - "nvgt;": ">\u20d2", - "nvinfin;": "\u29de", - "nvlArr;": "\u2902", - "nvle;": "\u2264\u20d2", - "nvlt;": "<\u20d2", - "nvltrie;": "\u22b4\u20d2", - "nvrArr;": "\u2903", - "nvrtrie;": "\u22b5\u20d2", - "nvsim;": "\u223c\u20d2", - "nwArr;": "\u21d6", - "nwarhk;": "\u2923", - "nwarr;": "\u2196", - "nwarrow;": "\u2196", - "nwnear;": "\u2927", - "oS;": "\u24c8", - "oacute": "\xf3", - "oacute;": "\xf3", - "oast;": "\u229b", - "ocir;": "\u229a", - "ocirc": "\xf4", - "ocirc;": "\xf4", - "ocy;": "\u043e", - "odash;": "\u229d", - "odblac;": "\u0151", - "odiv;": "\u2a38", - "odot;": "\u2299", - "odsold;": "\u29bc", - "oelig;": "\u0153", - "ofcir;": "\u29bf", - "ofr;": "\U0001d52c", - "ogon;": "\u02db", - "ograve": "\xf2", - "ograve;": "\xf2", - "ogt;": "\u29c1", - "ohbar;": "\u29b5", - "ohm;": "\u03a9", - "oint;": "\u222e", - "olarr;": "\u21ba", - "olcir;": "\u29be", - "olcross;": "\u29bb", - "oline;": "\u203e", - "olt;": "\u29c0", - "omacr;": "\u014d", - "omega;": "\u03c9", - "omicron;": "\u03bf", - "omid;": "\u29b6", - "ominus;": "\u2296", - "oopf;": "\U0001d560", - "opar;": "\u29b7", - "operp;": "\u29b9", - "oplus;": "\u2295", - "or;": "\u2228", - "orarr;": "\u21bb", - "ord;": "\u2a5d", - "order;": "\u2134", - "orderof;": "\u2134", - "ordf": "\xaa", - "ordf;": "\xaa", - "ordm": "\xba", - "ordm;": "\xba", - "origof;": "\u22b6", - "oror;": "\u2a56", - "orslope;": "\u2a57", - "orv;": "\u2a5b", - "oscr;": "\u2134", - "oslash": "\xf8", - "oslash;": "\xf8", - "osol;": "\u2298", - "otilde": "\xf5", - "otilde;": "\xf5", - "otimes;": "\u2297", - "otimesas;": "\u2a36", - "ouml": "\xf6", - "ouml;": "\xf6", - "ovbar;": "\u233d", - "par;": "\u2225", - "para": "\xb6", - "para;": "\xb6", - "parallel;": "\u2225", - "parsim;": "\u2af3", - "parsl;": "\u2afd", - "part;": "\u2202", - "pcy;": "\u043f", - "percnt;": "%", - "period;": ".", - "permil;": "\u2030", - "perp;": "\u22a5", - "pertenk;": "\u2031", - "pfr;": "\U0001d52d", - "phi;": "\u03c6", - "phiv;": "\u03d5", - "phmmat;": "\u2133", - "phone;": "\u260e", - "pi;": "\u03c0", - "pitchfork;": "\u22d4", - "piv;": "\u03d6", - "planck;": "\u210f", - "planckh;": "\u210e", - "plankv;": "\u210f", - "plus;": "+", - "plusacir;": "\u2a23", - "plusb;": "\u229e", - "pluscir;": "\u2a22", - "plusdo;": "\u2214", - "plusdu;": "\u2a25", - "pluse;": "\u2a72", - "plusmn": "\xb1", - "plusmn;": "\xb1", - "plussim;": "\u2a26", - "plustwo;": "\u2a27", - "pm;": "\xb1", - "pointint;": "\u2a15", - "popf;": "\U0001d561", - "pound": "\xa3", - "pound;": "\xa3", - "pr;": "\u227a", - "prE;": "\u2ab3", - "prap;": "\u2ab7", - "prcue;": "\u227c", - "pre;": "\u2aaf", - "prec;": "\u227a", - "precapprox;": "\u2ab7", - "preccurlyeq;": "\u227c", - "preceq;": "\u2aaf", - "precnapprox;": "\u2ab9", - "precneqq;": "\u2ab5", - "precnsim;": "\u22e8", - "precsim;": "\u227e", - "prime;": "\u2032", - "primes;": "\u2119", - "prnE;": "\u2ab5", - "prnap;": "\u2ab9", - "prnsim;": "\u22e8", - "prod;": "\u220f", - "profalar;": "\u232e", - "profline;": "\u2312", - "profsurf;": "\u2313", - "prop;": "\u221d", - "propto;": "\u221d", - "prsim;": "\u227e", - "prurel;": "\u22b0", - "pscr;": "\U0001d4c5", - "psi;": "\u03c8", - "puncsp;": "\u2008", - "qfr;": "\U0001d52e", - "qint;": "\u2a0c", - "qopf;": "\U0001d562", - "qprime;": "\u2057", - "qscr;": "\U0001d4c6", - "quaternions;": "\u210d", - "quatint;": "\u2a16", - "quest;": "?", - "questeq;": "\u225f", - "quot": "\"", - "quot;": "\"", - "rAarr;": "\u21db", - "rArr;": "\u21d2", - "rAtail;": "\u291c", - "rBarr;": "\u290f", - "rHar;": "\u2964", - "race;": "\u223d\u0331", - "racute;": "\u0155", - "radic;": "\u221a", - "raemptyv;": "\u29b3", - "rang;": "\u27e9", - "rangd;": "\u2992", - "range;": "\u29a5", - "rangle;": "\u27e9", - "raquo": "\xbb", - "raquo;": "\xbb", - "rarr;": "\u2192", - "rarrap;": "\u2975", - "rarrb;": "\u21e5", - "rarrbfs;": "\u2920", - "rarrc;": "\u2933", - "rarrfs;": "\u291e", - "rarrhk;": "\u21aa", - "rarrlp;": "\u21ac", - "rarrpl;": "\u2945", - "rarrsim;": "\u2974", - "rarrtl;": "\u21a3", - "rarrw;": "\u219d", - "ratail;": "\u291a", - "ratio;": "\u2236", - "rationals;": "\u211a", - "rbarr;": "\u290d", - "rbbrk;": "\u2773", - "rbrace;": "}", - "rbrack;": "]", - "rbrke;": "\u298c", - "rbrksld;": "\u298e", - "rbrkslu;": "\u2990", - "rcaron;": "\u0159", - "rcedil;": "\u0157", - "rceil;": "\u2309", - "rcub;": "}", - "rcy;": "\u0440", - "rdca;": "\u2937", - "rdldhar;": "\u2969", - "rdquo;": "\u201d", - "rdquor;": "\u201d", - "rdsh;": "\u21b3", - "real;": "\u211c", - "realine;": "\u211b", - "realpart;": "\u211c", - "reals;": "\u211d", - "rect;": "\u25ad", - "reg": "\xae", - "reg;": "\xae", - "rfisht;": "\u297d", - "rfloor;": "\u230b", - "rfr;": "\U0001d52f", - "rhard;": "\u21c1", - "rharu;": "\u21c0", - "rharul;": "\u296c", - "rho;": "\u03c1", - "rhov;": "\u03f1", - "rightarrow;": "\u2192", - "rightarrowtail;": "\u21a3", - "rightharpoondown;": "\u21c1", - "rightharpoonup;": "\u21c0", - "rightleftarrows;": "\u21c4", - "rightleftharpoons;": "\u21cc", - "rightrightarrows;": "\u21c9", - "rightsquigarrow;": "\u219d", - "rightthreetimes;": "\u22cc", - "ring;": "\u02da", - "risingdotseq;": "\u2253", - "rlarr;": "\u21c4", - "rlhar;": "\u21cc", - "rlm;": "\u200f", - "rmoust;": "\u23b1", - "rmoustache;": "\u23b1", - "rnmid;": "\u2aee", - "roang;": "\u27ed", - "roarr;": "\u21fe", - "robrk;": "\u27e7", - "ropar;": "\u2986", - "ropf;": "\U0001d563", - "roplus;": "\u2a2e", - "rotimes;": "\u2a35", - "rpar;": ")", - "rpargt;": "\u2994", - "rppolint;": "\u2a12", - "rrarr;": "\u21c9", - "rsaquo;": "\u203a", - "rscr;": "\U0001d4c7", - "rsh;": "\u21b1", - "rsqb;": "]", - "rsquo;": "\u2019", - "rsquor;": "\u2019", - "rthree;": "\u22cc", - "rtimes;": "\u22ca", - "rtri;": "\u25b9", - "rtrie;": "\u22b5", - "rtrif;": "\u25b8", - "rtriltri;": "\u29ce", - "ruluhar;": "\u2968", - "rx;": "\u211e", - "sacute;": "\u015b", - "sbquo;": "\u201a", - "sc;": "\u227b", - "scE;": "\u2ab4", - "scap;": "\u2ab8", - "scaron;": "\u0161", - "sccue;": "\u227d", - "sce;": "\u2ab0", - "scedil;": "\u015f", - "scirc;": "\u015d", - "scnE;": "\u2ab6", - "scnap;": "\u2aba", - "scnsim;": "\u22e9", - "scpolint;": "\u2a13", - "scsim;": "\u227f", - "scy;": "\u0441", - "sdot;": "\u22c5", - "sdotb;": "\u22a1", - "sdote;": "\u2a66", - "seArr;": "\u21d8", - "searhk;": "\u2925", - "searr;": "\u2198", - "searrow;": "\u2198", - "sect": "\xa7", - "sect;": "\xa7", - "semi;": ";", - "seswar;": "\u2929", - "setminus;": "\u2216", - "setmn;": "\u2216", - "sext;": "\u2736", - "sfr;": "\U0001d530", - "sfrown;": "\u2322", - "sharp;": "\u266f", - "shchcy;": "\u0449", - "shcy;": "\u0448", - "shortmid;": "\u2223", - "shortparallel;": "\u2225", - "shy": "\xad", - "shy;": "\xad", - "sigma;": "\u03c3", - "sigmaf;": "\u03c2", - "sigmav;": "\u03c2", - "sim;": "\u223c", - "simdot;": "\u2a6a", - "sime;": "\u2243", - "simeq;": "\u2243", - "simg;": "\u2a9e", - "simgE;": "\u2aa0", - "siml;": "\u2a9d", - "simlE;": "\u2a9f", - "simne;": "\u2246", - "simplus;": "\u2a24", - "simrarr;": "\u2972", - "slarr;": "\u2190", - "smallsetminus;": "\u2216", - "smashp;": "\u2a33", - "smeparsl;": "\u29e4", - "smid;": "\u2223", - "smile;": "\u2323", - "smt;": "\u2aaa", - "smte;": "\u2aac", - "smtes;": "\u2aac\ufe00", - "softcy;": "\u044c", - "sol;": "/", - "solb;": "\u29c4", - "solbar;": "\u233f", - "sopf;": "\U0001d564", - "spades;": "\u2660", - "spadesuit;": "\u2660", - "spar;": "\u2225", - "sqcap;": "\u2293", - "sqcaps;": "\u2293\ufe00", - "sqcup;": "\u2294", - "sqcups;": "\u2294\ufe00", - "sqsub;": "\u228f", - "sqsube;": "\u2291", - "sqsubset;": "\u228f", - "sqsubseteq;": "\u2291", - "sqsup;": "\u2290", - "sqsupe;": "\u2292", - "sqsupset;": "\u2290", - "sqsupseteq;": "\u2292", - "squ;": "\u25a1", - "square;": "\u25a1", - "squarf;": "\u25aa", - "squf;": "\u25aa", - "srarr;": "\u2192", - "sscr;": "\U0001d4c8", - "ssetmn;": "\u2216", - "ssmile;": "\u2323", - "sstarf;": "\u22c6", - "star;": "\u2606", - "starf;": "\u2605", - "straightepsilon;": "\u03f5", - "straightphi;": "\u03d5", - "strns;": "\xaf", - "sub;": "\u2282", - "subE;": "\u2ac5", - "subdot;": "\u2abd", - "sube;": "\u2286", - "subedot;": "\u2ac3", - "submult;": "\u2ac1", - "subnE;": "\u2acb", - "subne;": "\u228a", - "subplus;": "\u2abf", - "subrarr;": "\u2979", - "subset;": "\u2282", - "subseteq;": "\u2286", - "subseteqq;": "\u2ac5", - "subsetneq;": "\u228a", - "subsetneqq;": "\u2acb", - "subsim;": "\u2ac7", - "subsub;": "\u2ad5", - "subsup;": "\u2ad3", - "succ;": "\u227b", - "succapprox;": "\u2ab8", - "succcurlyeq;": "\u227d", - "succeq;": "\u2ab0", - "succnapprox;": "\u2aba", - "succneqq;": "\u2ab6", - "succnsim;": "\u22e9", - "succsim;": "\u227f", - "sum;": "\u2211", - "sung;": "\u266a", - "sup1": "\xb9", - "sup1;": "\xb9", - "sup2": "\xb2", - "sup2;": "\xb2", - "sup3": "\xb3", - "sup3;": "\xb3", - "sup;": "\u2283", - "supE;": "\u2ac6", - "supdot;": "\u2abe", - "supdsub;": "\u2ad8", - "supe;": "\u2287", - "supedot;": "\u2ac4", - "suphsol;": "\u27c9", - "suphsub;": "\u2ad7", - "suplarr;": "\u297b", - "supmult;": "\u2ac2", - "supnE;": "\u2acc", - "supne;": "\u228b", - "supplus;": "\u2ac0", - "supset;": "\u2283", - "supseteq;": "\u2287", - "supseteqq;": "\u2ac6", - "supsetneq;": "\u228b", - "supsetneqq;": "\u2acc", - "supsim;": "\u2ac8", - "supsub;": "\u2ad4", - "supsup;": "\u2ad6", - "swArr;": "\u21d9", - "swarhk;": "\u2926", - "swarr;": "\u2199", - "swarrow;": "\u2199", - "swnwar;": "\u292a", - "szlig": "\xdf", - "szlig;": "\xdf", - "target;": "\u2316", - "tau;": "\u03c4", - "tbrk;": "\u23b4", - "tcaron;": "\u0165", - "tcedil;": "\u0163", - "tcy;": "\u0442", - "tdot;": "\u20db", - "telrec;": "\u2315", - "tfr;": "\U0001d531", - "there4;": "\u2234", - "therefore;": "\u2234", - "theta;": "\u03b8", - "thetasym;": "\u03d1", - "thetav;": "\u03d1", - "thickapprox;": "\u2248", - "thicksim;": "\u223c", - "thinsp;": "\u2009", - "thkap;": "\u2248", - "thksim;": "\u223c", - "thorn": "\xfe", - "thorn;": "\xfe", - "tilde;": "\u02dc", - "times": "\xd7", - "times;": "\xd7", - "timesb;": "\u22a0", - "timesbar;": "\u2a31", - "timesd;": "\u2a30", - "tint;": "\u222d", - "toea;": "\u2928", - "top;": "\u22a4", - "topbot;": "\u2336", - "topcir;": "\u2af1", - "topf;": "\U0001d565", - "topfork;": "\u2ada", - "tosa;": "\u2929", - "tprime;": "\u2034", - "trade;": "\u2122", - "triangle;": "\u25b5", - "triangledown;": "\u25bf", - "triangleleft;": "\u25c3", - "trianglelefteq;": "\u22b4", - "triangleq;": "\u225c", - "triangleright;": "\u25b9", - "trianglerighteq;": "\u22b5", - "tridot;": "\u25ec", - "trie;": "\u225c", - "triminus;": "\u2a3a", - "triplus;": "\u2a39", - "trisb;": "\u29cd", - "tritime;": "\u2a3b", - "trpezium;": "\u23e2", - "tscr;": "\U0001d4c9", - "tscy;": "\u0446", - "tshcy;": "\u045b", - "tstrok;": "\u0167", - "twixt;": "\u226c", - "twoheadleftarrow;": "\u219e", - "twoheadrightarrow;": "\u21a0", - "uArr;": "\u21d1", - "uHar;": "\u2963", - "uacute": "\xfa", - "uacute;": "\xfa", - "uarr;": "\u2191", - "ubrcy;": "\u045e", - "ubreve;": "\u016d", - "ucirc": "\xfb", - "ucirc;": "\xfb", - "ucy;": "\u0443", - "udarr;": "\u21c5", - "udblac;": "\u0171", - "udhar;": "\u296e", - "ufisht;": "\u297e", - "ufr;": "\U0001d532", - "ugrave": "\xf9", - "ugrave;": "\xf9", - "uharl;": "\u21bf", - "uharr;": "\u21be", - "uhblk;": "\u2580", - "ulcorn;": "\u231c", - "ulcorner;": "\u231c", - "ulcrop;": "\u230f", - "ultri;": "\u25f8", - "umacr;": "\u016b", - "uml": "\xa8", - "uml;": "\xa8", - "uogon;": "\u0173", - "uopf;": "\U0001d566", - "uparrow;": "\u2191", - "updownarrow;": "\u2195", - "upharpoonleft;": "\u21bf", - "upharpoonright;": "\u21be", - "uplus;": "\u228e", - "upsi;": "\u03c5", - "upsih;": "\u03d2", - "upsilon;": "\u03c5", - "upuparrows;": "\u21c8", - "urcorn;": "\u231d", - "urcorner;": "\u231d", - "urcrop;": "\u230e", - "uring;": "\u016f", - "urtri;": "\u25f9", - "uscr;": "\U0001d4ca", - "utdot;": "\u22f0", - "utilde;": "\u0169", - "utri;": "\u25b5", - "utrif;": "\u25b4", - "uuarr;": "\u21c8", - "uuml": "\xfc", - "uuml;": "\xfc", - "uwangle;": "\u29a7", - "vArr;": "\u21d5", - "vBar;": "\u2ae8", - "vBarv;": "\u2ae9", - "vDash;": "\u22a8", - "vangrt;": "\u299c", - "varepsilon;": "\u03f5", - "varkappa;": "\u03f0", - "varnothing;": "\u2205", - "varphi;": "\u03d5", - "varpi;": "\u03d6", - "varpropto;": "\u221d", - "varr;": "\u2195", - "varrho;": "\u03f1", - "varsigma;": "\u03c2", - "varsubsetneq;": "\u228a\ufe00", - "varsubsetneqq;": "\u2acb\ufe00", - "varsupsetneq;": "\u228b\ufe00", - "varsupsetneqq;": "\u2acc\ufe00", - "vartheta;": "\u03d1", - "vartriangleleft;": "\u22b2", - "vartriangleright;": "\u22b3", - "vcy;": "\u0432", - "vdash;": "\u22a2", - "vee;": "\u2228", - "veebar;": "\u22bb", - "veeeq;": "\u225a", - "vellip;": "\u22ee", - "verbar;": "|", - "vert;": "|", - "vfr;": "\U0001d533", - "vltri;": "\u22b2", - "vnsub;": "\u2282\u20d2", - "vnsup;": "\u2283\u20d2", - "vopf;": "\U0001d567", - "vprop;": "\u221d", - "vrtri;": "\u22b3", - "vscr;": "\U0001d4cb", - "vsubnE;": "\u2acb\ufe00", - "vsubne;": "\u228a\ufe00", - "vsupnE;": "\u2acc\ufe00", - "vsupne;": "\u228b\ufe00", - "vzigzag;": "\u299a", - "wcirc;": "\u0175", - "wedbar;": "\u2a5f", - "wedge;": "\u2227", - "wedgeq;": "\u2259", - "weierp;": "\u2118", - "wfr;": "\U0001d534", - "wopf;": "\U0001d568", - "wp;": "\u2118", - "wr;": "\u2240", - "wreath;": "\u2240", - "wscr;": "\U0001d4cc", - "xcap;": "\u22c2", - "xcirc;": "\u25ef", - "xcup;": "\u22c3", - "xdtri;": "\u25bd", - "xfr;": "\U0001d535", - "xhArr;": "\u27fa", - "xharr;": "\u27f7", - "xi;": "\u03be", - "xlArr;": "\u27f8", - "xlarr;": "\u27f5", - "xmap;": "\u27fc", - "xnis;": "\u22fb", - "xodot;": "\u2a00", - "xopf;": "\U0001d569", - "xoplus;": "\u2a01", - "xotime;": "\u2a02", - "xrArr;": "\u27f9", - "xrarr;": "\u27f6", - "xscr;": "\U0001d4cd", - "xsqcup;": "\u2a06", - "xuplus;": "\u2a04", - "xutri;": "\u25b3", - "xvee;": "\u22c1", - "xwedge;": "\u22c0", - "yacute": "\xfd", - "yacute;": "\xfd", - "yacy;": "\u044f", - "ycirc;": "\u0177", - "ycy;": "\u044b", - "yen": "\xa5", - "yen;": "\xa5", - "yfr;": "\U0001d536", - "yicy;": "\u0457", - "yopf;": "\U0001d56a", - "yscr;": "\U0001d4ce", - "yucy;": "\u044e", - "yuml": "\xff", - "yuml;": "\xff", - "zacute;": "\u017a", - "zcaron;": "\u017e", - "zcy;": "\u0437", - "zdot;": "\u017c", - "zeetrf;": "\u2128", - "zeta;": "\u03b6", - "zfr;": "\U0001d537", - "zhcy;": "\u0436", - "zigrarr;": "\u21dd", - "zopf;": "\U0001d56b", - "zscr;": "\U0001d4cf", - "zwj;": "\u200d", - "zwnj;": "\u200c", -} - -replacementCharacters = { - 0x0: "\uFFFD", - 0x0d: "\u000D", - 0x80: "\u20AC", - 0x81: "\u0081", - 0x82: "\u201A", - 0x83: "\u0192", - 0x84: "\u201E", - 0x85: "\u2026", - 0x86: "\u2020", - 0x87: "\u2021", - 0x88: "\u02C6", - 0x89: "\u2030", - 0x8A: "\u0160", - 0x8B: "\u2039", - 0x8C: "\u0152", - 0x8D: "\u008D", - 0x8E: "\u017D", - 0x8F: "\u008F", - 0x90: "\u0090", - 0x91: "\u2018", - 0x92: "\u2019", - 0x93: "\u201C", - 0x94: "\u201D", - 0x95: "\u2022", - 0x96: "\u2013", - 0x97: "\u2014", - 0x98: "\u02DC", - 0x99: "\u2122", - 0x9A: "\u0161", - 0x9B: "\u203A", - 0x9C: "\u0153", - 0x9D: "\u009D", - 0x9E: "\u017E", - 0x9F: "\u0178", -} - -tokenTypes = { - "Doctype": 0, - "Characters": 1, - "SpaceCharacters": 2, - "StartTag": 3, - "EndTag": 4, - "EmptyTag": 5, - "Comment": 6, - "ParseError": 7 -} - -tagTokenTypes = frozenset([tokenTypes["StartTag"], tokenTypes["EndTag"], - tokenTypes["EmptyTag"]]) - - -prefixes = dict([(v, k) for k, v in namespaces.items()]) -prefixes["http://www.w3.org/1998/Math/MathML"] = "math" - - -class DataLossWarning(UserWarning): - """Raised when the current tree is unable to represent the input data""" - pass - - -class _ReparseException(Exception): - pass diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/constants.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/constants.pyc deleted file mode 100644 index bffff0d1822087a9317fc1abc1d43aa37f95f79c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 83207 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 ZGrhf)FK++a+kR#H1KYm1{i}cTe*^ZrVaosj diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/__init__.pyc deleted file mode 100644 index c13b38fe6669e8df166ae340783830acadc637a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 207 zcmZ9GK?=e!5Je-p5JAsTggPy1Q4sM0ilAEwZIjkun#Ls7wmZ-41)Pd2Km0fF7Bka- zk4Mwj<dTwKdN_AjJ3uf(PF`mY9)kSA*62VRQN@l!6&uJ($+)r5*3isNqMo-fx~m{E zizr>$dd*rBU~&y-&_eq{Sr<#`yKtY=W2e5Q6<4e@aCL=TN|8V&r0e!lDwJ@P&UE93 Qczjco>>>HKd(mRa2T{{CL;wH) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py deleted file mode 100644 index 5ba926e..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py +++ /dev/null @@ -1,29 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from . import base - -from collections import OrderedDict - - -def _attr_key(attr): - """Return an appropriate key for an attribute for sorting - - Attributes have a namespace that can be either ``None`` or a string. We - can't compare the two because they're different types, so we convert - ``None`` to an empty string first. - - """ - return (attr[0][0] or ''), attr[0][1] - - -class Filter(base.Filter): - """Alphabetizes attributes for elements""" - def __iter__(self): - for token in base.Filter.__iter__(self): - if token["type"] in ("StartTag", "EmptyTag"): - attrs = OrderedDict() - for name, value in sorted(token["data"].items(), - key=_attr_key): - attrs[name] = value - token["data"] = attrs - yield token diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.pyc deleted file mode 100644 index 0158aaca4f4f7dbedbff86d26229460f9db6cc97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1876 zcmd5+&2QsG6n|qkY0}j$MHP!8aqt0YBgEFb+NA=iLM#++bdkHFBBF98_Bfe#{87(1 zZL0Qwiui{)apU(UEj@9sWk1h*^X7g2-h_WY-TLB>XD1omJt6+zO#`wsEONYp3{fd) zBB%^#5>Oe^BqWgsl!s(CsO-_C2Ohc`WcpNY(qt2SkNzZ@3@GoD>e1<t3PJfM3vY>j zn+z!*(9w7ZH=2Eq*|YlyM9yq&I;T=yHg)UV0J2;!wbgayw!w6j&gxvHMmyC?W3_;A z%*1Vg%%oLo?g_Z}ZLV6CALz_wtim6=`hk;-u(<X~j*#f6`IwN_y&$Af5g<gi+5H2O zDA%=BB=I&)TQ{wiPDN*G6%}>s#m=>QhS0shB6wZRx3(fY@9wv3w2(^`$*7X0vW?7C z<QCFJ8O+X9q_kV8HkwWk>q<?h5gU#y%vST==vaAMP<?>|b=k<4Pvg6&aX6Em_5A7u z<hd>iWL~+*tr}&&jBFiUC>*Pns&(Gbe_mY8;j6N7t2<{=p<C;A*TMS+b*KQXOU<i? zdP}4>_97<sFOV3uS)w@cQnqnX8??a2SC{eXO*^YD&R*}GSFiTkw|m*w_VSzjs(poL z-ozi`MmH~YWt}wUrF;GJJpF}5{!5pt%Ih{>xYB%O^eis4LH}(mO|y_Q<#Z+u$KpF+ zcbk=CaHT9t(IkeE4M1q%`k+7g;~5M1VO)IAnD`V61>^#)pg_6sKn^K68uRh)bC7rU zKChIG9-R8VE2B!3-Fmq7pv+&!rf;#hye3C<D(KWB?N-pi$%1YKUBe+Th;cdVQ@bP= z@}S%VborKX&D$F^I_<F(!-X7fg*Z5QPQM3q6VeS-@WN<F`{(cJn3w*{eg%*V`c<6o z&@pm48gC+w!;W#y(CD}_M^3ixgPeQjM+O2jtddJ75epG&xGuo|>U+Zp>n7~NPi~s> zl%{Fo-ErZ0E>!NgD%dJ*!oo4LNE6%26n@jyXDB1fxxm(M^3ZtEQkqUZO4KEcx=%O} zzN<)##I_iU=VC`Z6HkS|P3{WA$)u^<f>xTAb>10fxpHZm*BNTYrXG^?t4B0nzR5cX z(Q@DVqAw1|oXlNDMThGW86^-=!t<5z`~dw}F-RQW&slAZ${g-?>mlON;4MGi#C`wv U*B$$o6SD)5&w}k>I~+dw7x}Q*B>(^b diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/base.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/base.py deleted file mode 100644 index c7dbaed..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/base.py +++ /dev/null @@ -1,12 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - - -class Filter(object): - def __init__(self, source): - self.source = source - - def __iter__(self): - return iter(self.source) - - def __getattr__(self, name): - return getattr(self.source, name) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/base.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/base.pyc deleted file mode 100644 index 46bfa344f6728a84fa61c7b98eb4549e580544bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1341 zcmd5*UvJbf40qbwU_*m_0N!}1CXH+YP9UKPfy5ir)Z>MdP-vU<$VmT?xW_i_1s&g* zFMyrv4)F=Ns!naEc78wGNq-;gAN_pzxq|UY>HFqO0%1yurdNOiXavj!GzrWTXi}J` zAanv|0<{30!Y_aoz^C~R=n2fS9SXIaFXL?Zh?b%Zog2_7+w`4ByiY!Dmp0h0#X~ZN z)>fT1%2_nNZ~=G8`QAFRHrNEY-ZHi)q!?gGgpdv=RD_e26bKh96Ub-r_$r~F@8lgv zACTi#z%77^6lWPHK96fWHgtopOvXVtp(Pks=d5HT>m?v*viEjbppnbM%er&g_#kht z<n=ROwm-g|PQSM&Q~!Kgy$n~c^o>8EXVJ@#vbX)QZ37n09pmYTg}Pu@6ty(1?!5ep zjeFs2DeG8+Aj=|{r~P%ToKm*6s1z4EFia2?b6{a}Lz7Sv%}W6*L48@%+|c4muW9i{ z&dIijAc0eg$K;M6<7VNRiUfIVHUz1mtK?sf_h^4%us|GXa&)8_yV@3w*#^E32$fPJ zP^H)$DaVU6Hk{Eah5Pa6rqhEXGv`Z^bCGfm`^zS3|7}KdZc)5AjBi)$rF-dl#`=iA n9&qrCpInf~>EqtS%h#2croxzFTlmBlyj~amjM2vaJWl@r*1kbw diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py deleted file mode 100644 index aefb5c8..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py +++ /dev/null @@ -1,73 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from . import base - - -class Filter(base.Filter): - """Injects ``<meta charset=ENCODING>`` tag into head of document""" - def __init__(self, source, encoding): - """Creates a Filter - - :arg source: the source token stream - - :arg encoding: the encoding to set - - """ - base.Filter.__init__(self, source) - self.encoding = encoding - - def __iter__(self): - state = "pre_head" - meta_found = (self.encoding is None) - pending = [] - - for token in base.Filter.__iter__(self): - type = token["type"] - if type == "StartTag": - if token["name"].lower() == "head": - state = "in_head" - - elif type == "EmptyTag": - if token["name"].lower() == "meta": - # replace charset with actual encoding - has_http_equiv_content_type = False - for (namespace, name), value in token["data"].items(): - if namespace is not None: - continue - elif name.lower() == 'charset': - token["data"][(namespace, name)] = self.encoding - meta_found = True - break - elif name == 'http-equiv' and value.lower() == 'content-type': - has_http_equiv_content_type = True - else: - if has_http_equiv_content_type and (None, "content") in token["data"]: - token["data"][(None, "content")] = 'text/html; charset=%s' % self.encoding - meta_found = True - - elif token["name"].lower() == "head" and not meta_found: - # insert meta into empty head - yield {"type": "StartTag", "name": "head", - "data": token["data"]} - yield {"type": "EmptyTag", "name": "meta", - "data": {(None, "charset"): self.encoding}} - yield {"type": "EndTag", "name": "head"} - meta_found = True - continue - - elif type == "EndTag": - if token["name"].lower() == "head" and pending: - # insert meta into head (if necessary) and flush pending queue - yield pending.pop(0) - if not meta_found: - yield {"type": "EmptyTag", "name": "meta", - "data": {(None, "charset"): self.encoding}} - while pending: - yield pending.pop(0) - meta_found = True - state = "post_head" - - if state == "in_head": - pending.append(token) - else: - yield token diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.pyc deleted file mode 100644 index 868ed4eba4b0a5a4dc9fa6c2827f4312508a7445..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2648 zcmd5;-EJF26h5=IH?f;GNkan_1+9dTETq(}01HZ6p|&aN1*USU6rz^R#yfV_*+1{j zx=Cdtp>W3ym%IQE!#h;sA-Ls&@0?xt50&fM-tn0;-<&!Bv$em^wm$j!+~WaNpBnzZ z-nS^f2g1isQAiXi+EWx+v}aLNqrDm_-y*+8VV$A|?KLp3lWx%1rlBIgLB9~468*4e zlW)^bdkNA4KBCPBm{knkL7s$#(QXi>NoLG4cz!Sq@*s)L8YV>?3=&_vVPJITg?XUB zZ1Z617!JH#8ym#kAOzsK1q`^w7C0a@vEr};io+CW1>K=K6LsqEh&sg$An(OvJutbm zzkfZ_#&ZUTUWNm1Z1-+|cjsR3o16Rlj`2oL5Szp~)SmAoL&r}BMWkahV5=6-?Zx4S zXsl>#(Tr%O=+q)LlZgu*6ue?#R{<2=&a`KA?s!gVOsnNopKD$=a`L3e2Kt&~4s}I4 zCOOivlN)S|UPJ2`ZVTd3iC@gH!+||7u)Q{WvCmrfnUVmwZV(5?b!D>HTE>hqxekZo z^HQTeyT6U69P(38oiq!kFs3v0vd%CGeVyf<r^lU>PqTyg$<fvBB)-zkKI;y?$dAAD zpJrF^8Ks>Eois?df;cx`7;c%X-;Uh-%#z2Q>ex@R&Y_9I&%@xLGnA0$oj`)-a=_dw zV3*UAegk@NI_0c0EpMm+Cq)YnD?H%%{0`qE26M&18B3}kEz{hh5z)Lx$5YE#G_KLO z&VW-zcOD;Db4==-J{RW=nl-opjx5ST;nwNmxWP$}>}PIbA@d=Bl2~!gV)T;m|57aD z1$tSyKPvcjZqxC$EH@!+iG|&H{1ZL0_%~moIW%n2Y>5;4s7cwMH2H&nvt_D|Zi%pe zDx>%yNWumnh8A5%SYhJ*a*KaPz}VhgY+tE3jI%4@4`()I&y;^&tc19ua(=ElWV1TO z-&n|>JX0|GRVx=hK>@75H32F>3b6}s!5Q6!kS29^6|cfbi@N@@tfKU*Fuem_i9tcH zmY7n)t}3mYTo#xACIMO%gWjl2jl(oUl$+$Qag=wtLi1aq-y1Zzu+ShTI)0C^JA3q+ zjLEk3uvErhU!;Jv0AvKG#;<~Ju|sjDg2teB`TrpzyVKr8mi7wH;55@NH=BYp*_@<W zxI4zn%mZ&E+}Mk>5Q39N8<%@nz;=|HlLeIPM4-M0f}vH>6kHpJ#-v+%QUudtg_qEV z(b~4;RKb>v;sO?pJ~mR0Up;S>ALj*E*LLjVIO+986Z165ji@8tu2-H~O8S3J*?(Wg zRGc%ADxF8JfnE~p|28pP2xwy52g2lu&V;&)J46eG3nj{B_k*m^rY35p(%8H-MXzbI zKl*I6;L(%}S|_H`X@*G=`-WE;i%u&b>Bu6KJ!am=@}ZZz>{VC1>Q)|gWu1M)q03Wm zpk*7+MAFm?3;h<hRd&Dzp8R_Zq-?dSZ0n+GsTH-URxFH`tv<rcR_E2b80+dob=KNc z7qI$)wXV*pb+v)7t(rhzvd)28$KEFJwn$jB+8i_#50UG#M-WCn*L9=BFG8NO<6Re5 zuj@*u@ALW#cM0{@Tt!^BToySGHd}tCCvQWQRl~v*sByQCW$N=a)#tYYekpkAZhlLx TlQ3N`19OvgmkaljwO0EVx^rCu diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/lint.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/lint.py deleted file mode 100644 index fcc07ee..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/lint.py +++ /dev/null @@ -1,93 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from pip._vendor.six import text_type - -from . import base -from ..constants import namespaces, voidElements - -from ..constants import spaceCharacters -spaceCharacters = "".join(spaceCharacters) - - -class Filter(base.Filter): - """Lints the token stream for errors - - If it finds any errors, it'll raise an ``AssertionError``. - - """ - def __init__(self, source, require_matching_tags=True): - """Creates a Filter - - :arg source: the source token stream - - :arg require_matching_tags: whether or not to require matching tags - - """ - super(Filter, self).__init__(source) - self.require_matching_tags = require_matching_tags - - def __iter__(self): - open_elements = [] - for token in base.Filter.__iter__(self): - type = token["type"] - if type in ("StartTag", "EmptyTag"): - namespace = token["namespace"] - name = token["name"] - assert namespace is None or isinstance(namespace, text_type) - assert namespace != "" - assert isinstance(name, text_type) - assert name != "" - assert isinstance(token["data"], dict) - if (not namespace or namespace == namespaces["html"]) and name in voidElements: - assert type == "EmptyTag" - else: - assert type == "StartTag" - if type == "StartTag" and self.require_matching_tags: - open_elements.append((namespace, name)) - for (namespace, name), value in token["data"].items(): - assert namespace is None or isinstance(namespace, text_type) - assert namespace != "" - assert isinstance(name, text_type) - assert name != "" - assert isinstance(value, text_type) - - elif type == "EndTag": - namespace = token["namespace"] - name = token["name"] - assert namespace is None or isinstance(namespace, text_type) - assert namespace != "" - assert isinstance(name, text_type) - assert name != "" - if (not namespace or namespace == namespaces["html"]) and name in voidElements: - assert False, "Void element reported as EndTag token: %(tag)s" % {"tag": name} - elif self.require_matching_tags: - start = open_elements.pop() - assert start == (namespace, name) - - elif type == "Comment": - data = token["data"] - assert isinstance(data, text_type) - - elif type in ("Characters", "SpaceCharacters"): - data = token["data"] - assert isinstance(data, text_type) - assert data != "" - if type == "SpaceCharacters": - assert data.strip(spaceCharacters) == "" - - elif type == "Doctype": - name = token["name"] - assert name is None or isinstance(name, text_type) - assert token["publicId"] is None or isinstance(name, text_type) - assert token["systemId"] is None or isinstance(name, text_type) - - elif type == "Entity": - assert isinstance(token["name"], text_type) - - elif type == "SerializerError": - assert isinstance(token["data"], text_type) - - else: - assert False, "Unknown token type: %(type)s" % {"type": type} - - yield token diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/lint.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/lint.pyc deleted file mode 100644 index 81d0c4d08cf3d436d0e3c72772239f055ec04d8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3500 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 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/optionaltags.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/optionaltags.py deleted file mode 100644 index 4a86501..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/optionaltags.py +++ /dev/null @@ -1,207 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from . import base - - -class Filter(base.Filter): - """Removes optional tags from the token stream""" - def slider(self): - previous1 = previous2 = None - for token in self.source: - if previous1 is not None: - yield previous2, previous1, token - previous2 = previous1 - previous1 = token - if previous1 is not None: - yield previous2, previous1, None - - def __iter__(self): - for previous, token, next in self.slider(): - type = token["type"] - if type == "StartTag": - if (token["data"] or - not self.is_optional_start(token["name"], previous, next)): - yield token - elif type == "EndTag": - if not self.is_optional_end(token["name"], next): - yield token - else: - yield token - - def is_optional_start(self, tagname, previous, next): - type = next and next["type"] or None - if tagname in 'html': - # An html element's start tag may be omitted if the first thing - # inside the html element is not a space character or a comment. - return type not in ("Comment", "SpaceCharacters") - elif tagname == 'head': - # A head element's start tag may be omitted if the first thing - # inside the head element is an element. - # XXX: we also omit the start tag if the head element is empty - if type in ("StartTag", "EmptyTag"): - return True - elif type == "EndTag": - return next["name"] == "head" - elif tagname == 'body': - # A body element's start tag may be omitted if the first thing - # inside the body element is not a space character or a comment, - # except if the first thing inside the body element is a script - # or style element and the node immediately preceding the body - # element is a head element whose end tag has been omitted. - if type in ("Comment", "SpaceCharacters"): - return False - elif type == "StartTag": - # XXX: we do not look at the preceding event, so we never omit - # the body element's start tag if it's followed by a script or - # a style element. - return next["name"] not in ('script', 'style') - else: - return True - elif tagname == 'colgroup': - # A colgroup element's start tag may be omitted if the first thing - # inside the colgroup element is a col element, and if the element - # is not immediately preceded by another colgroup element whose - # end tag has been omitted. - if type in ("StartTag", "EmptyTag"): - # XXX: we do not look at the preceding event, so instead we never - # omit the colgroup element's end tag when it is immediately - # followed by another colgroup element. See is_optional_end. - return next["name"] == "col" - else: - return False - elif tagname == 'tbody': - # A tbody element's start tag may be omitted if the first thing - # inside the tbody element is a tr element, and if the element is - # not immediately preceded by a tbody, thead, or tfoot element - # whose end tag has been omitted. - if type == "StartTag": - # omit the thead and tfoot elements' end tag when they are - # immediately followed by a tbody element. See is_optional_end. - if previous and previous['type'] == 'EndTag' and \ - previous['name'] in ('tbody', 'thead', 'tfoot'): - return False - return next["name"] == 'tr' - else: - return False - return False - - def is_optional_end(self, tagname, next): - type = next and next["type"] or None - if tagname in ('html', 'head', 'body'): - # An html element's end tag may be omitted if the html element - # is not immediately followed by a space character or a comment. - return type not in ("Comment", "SpaceCharacters") - elif tagname in ('li', 'optgroup', 'tr'): - # A li element's end tag may be omitted if the li element is - # immediately followed by another li element or if there is - # no more content in the parent element. - # An optgroup element's end tag may be omitted if the optgroup - # element is immediately followed by another optgroup element, - # or if there is no more content in the parent element. - # A tr element's end tag may be omitted if the tr element is - # immediately followed by another tr element, or if there is - # no more content in the parent element. - if type == "StartTag": - return next["name"] == tagname - else: - return type == "EndTag" or type is None - elif tagname in ('dt', 'dd'): - # A dt element's end tag may be omitted if the dt element is - # immediately followed by another dt element or a dd element. - # A dd element's end tag may be omitted if the dd element is - # immediately followed by another dd element or a dt element, - # or if there is no more content in the parent element. - if type == "StartTag": - return next["name"] in ('dt', 'dd') - elif tagname == 'dd': - return type == "EndTag" or type is None - else: - return False - elif tagname == 'p': - # A p element's end tag may be omitted if the p element is - # immediately followed by an address, article, aside, - # blockquote, datagrid, dialog, dir, div, dl, fieldset, - # footer, form, h1, h2, h3, h4, h5, h6, header, hr, menu, - # nav, ol, p, pre, section, table, or ul, element, or if - # there is no more content in the parent element. - if type in ("StartTag", "EmptyTag"): - return next["name"] in ('address', 'article', 'aside', - 'blockquote', 'datagrid', 'dialog', - 'dir', 'div', 'dl', 'fieldset', 'footer', - 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', - 'header', 'hr', 'menu', 'nav', 'ol', - 'p', 'pre', 'section', 'table', 'ul') - else: - return type == "EndTag" or type is None - elif tagname == 'option': - # An option element's end tag may be omitted if the option - # element is immediately followed by another option element, - # or if it is immediately followed by an <code>optgroup</code> - # element, or if there is no more content in the parent - # element. - if type == "StartTag": - return next["name"] in ('option', 'optgroup') - else: - return type == "EndTag" or type is None - elif tagname in ('rt', 'rp'): - # An rt element's end tag may be omitted if the rt element is - # immediately followed by an rt or rp element, or if there is - # no more content in the parent element. - # An rp element's end tag may be omitted if the rp element is - # immediately followed by an rt or rp element, or if there is - # no more content in the parent element. - if type == "StartTag": - return next["name"] in ('rt', 'rp') - else: - return type == "EndTag" or type is None - elif tagname == 'colgroup': - # A colgroup element's end tag may be omitted if the colgroup - # element is not immediately followed by a space character or - # a comment. - if type in ("Comment", "SpaceCharacters"): - return False - elif type == "StartTag": - # XXX: we also look for an immediately following colgroup - # element. See is_optional_start. - return next["name"] != 'colgroup' - else: - return True - elif tagname in ('thead', 'tbody'): - # A thead element's end tag may be omitted if the thead element - # is immediately followed by a tbody or tfoot element. - # A tbody element's end tag may be omitted if the tbody element - # is immediately followed by a tbody or tfoot element, or if - # there is no more content in the parent element. - # A tfoot element's end tag may be omitted if the tfoot element - # is immediately followed by a tbody element, or if there is no - # more content in the parent element. - # XXX: we never omit the end tag when the following element is - # a tbody. See is_optional_start. - if type == "StartTag": - return next["name"] in ['tbody', 'tfoot'] - elif tagname == 'tbody': - return type == "EndTag" or type is None - else: - return False - elif tagname == 'tfoot': - # A tfoot element's end tag may be omitted if the tfoot element - # is immediately followed by a tbody element, or if there is no - # more content in the parent element. - # XXX: we never omit the end tag when the following element is - # a tbody. See is_optional_start. - if type == "StartTag": - return next["name"] == 'tbody' - else: - return type == "EndTag" or type is None - elif tagname in ('td', 'th'): - # A td element's end tag may be omitted if the td element is - # immediately followed by a td or th element, or if there is - # no more content in the parent element. - # A th element's end tag may be omitted if the th element is - # immediately followed by a td or th element, or if there is - # no more content in the parent element. - if type == "StartTag": - return next["name"] in ('td', 'th') - else: - return type == "EndTag" or type is None - return False diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/optionaltags.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/optionaltags.pyc deleted file mode 100644 index 325713ba2ee52f7644f548db16dcda3b8c6e0cc7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4754 zcmds5&2QX96n|cCHchfglePqcikcHzO3OBBnto8)(ho!rM98UHh$zNcdw1P<?ag?c zCRKt|wIEJNsN8zv&ILGe;{+GPofH29;(*}5d%xN2I-w!uL_`vg=i|LM@AEg~*uM@B z9=$(uyGETKo8Ol{C{TKxJ3jwe6cM#7TCk{9poIdpY+A6%@(bkK6cwq}M+<#CE>h4( zcS=;Z$nT?vL=TAGT_}-XqWMZcOABR-ifo|wbK@<hNtEfp4O{I*X}yo<{BR{q!z9+D zJjmj(miU1ig*s4Pl!g{hR;1BIZWg^X&?WA?5k^eVwLl0iiv`o%2}l%YJ6Lfxg|%Yc zS#{|Y#Q^E_kzYioM9zGrkJ+-9xp9J4vJ#||Nn5i@UNot_MmkwnNo!I!gGrq%1@UC6 zRp7O1vT3pN)MWD}4}6~6uxO(|tLJE)=#E8KZ&zu<rgiAFG(hS!trujtZd2W+n^sIR zViulY-sMAdt4Hj2h*|I^F?Z+TletQPw}fZrlGu1AO)^yrDxw$`(jcnq0Uotguo5O& zI<;jqt;KfORpAbyNm+5KwpF;|>7csescJom{6MAEd#ly8lWH-(yEHYs9G{p~Gqbfb z>FQbko;txljdt}$wH>yPhjFUCC_1jE-fFmS%M>1WC5Zh*RhzmMor=Q6Y8`P*tDF87 zcfZnJLyXfX<UJ)tQb`T62CY%6Y>inZ?v*Y0UzC>z{(sD!)z9H|Wa8D^AJcnqDf?C; zfP9$PDAGFTL4lSEq&&>pG?CuygiEN3G-2ZNz^1Z#Bs4dz<wvwU4AwrdehLPTT8F`= z2b=_3iNQBaw-7Q(+_?;qS!)NGST?UcrEho*%=(`8(22cPkO}p**ylymk2Az$J;qI# zx|{BD*~?r;Qd;?0b}~}hkrG6aZ3f>Nlo?SW4pucfnswPrp%=HfuGGKl9^ig@h#RsF zBj|(H^VSdtf7}`>)Wi%4zPztU0UqU&<Qh_=(sJofv=2%_O2E1JIN&8x#}L7TwA4@Y zGHYTPVD=Cw-Xv}D8mGuU#Q8-_qz%x7p`DMvgSbH~egVd3z<8f@!7!Gv_84ji<2bex zvGGGN4};(*Fh2|CAG*XNvNkWG;#(lz4`Nn>RWg!~Se$ffOj<Fsqo^6ne$PSVm<4@0 z${*;7<rHA)l?nD+E+55>Qka=!&6T9p3Syl}YR$L3T5zT5DX+#+Ns*$>!1K3eu*B_J ztF6~0oqNgKOK6e5nD}d0OlvA^>rBFz>b1yJLoJCKD#_ZJ92h*nvIdV3G6M6a=+%=% zX8=D14BSm;L$syh^7{S@8DiOX<#&@V=KQlQro>^Ixao$<0s!+Hd<F)&T1G*84FL#e zgb5vqk0bC{;b)Jaw^L?Sj_{Mth*DgvWt$PZShkA5?{W#f;z*(2D)*H)-}X4;d(o2F zns`hc@d7_6?T<LvlJi{JCg(e)ZO+wG$agMn&h^=DX`jaI5@t=cI^Z4xx=WD>eOc<F z-2fHQ(mpP`@q!@38L)qwWB+WE-9Ia9zz<Zb`WjS5)K@uCDEaR#5ofCScPyTR=wG_x zUNz#n+WeLi5q|>qV*r6Oz#?M|K)`2X{PWw`XF%04<~rD4!;W`z?C%3Tg#E%c_B78v z2=*#={{{;eA?lF@lw_5SHeYtdF|FOfuOES5m%v~b#M_4W=PvQ<W^eY-6t?&iTNp?F zk<$Z?{1D=%L3lYQ?xlhxg_r^%xv*XURmT$-!G0Oq+|RK$yX;qtHr+UE<k=a37{Du6 zIVGQjnv$*nDCq#RcEeG@uP6kH@_}xU&tTeCWEFwit^~k7-$0=6XL1#7gQ<(avbpE` zDo9g+Bi|Fk8sn^BjF<AwDwC_gVwBXDma{|~0G1m_Lxnyd+7G=bX#k7;P<7rbX6Fc- z)x#k2`9=<Mf#g5|?(2zafv!1aUeo4v(!6HO>y&xTf?GVt++u#y2;t)=!=|xkHs$j` zV1chPFenXbaz{6~>MgQq!kk4AXD&#XQN~Nk_@{fsY&%eThfMEi@xiZ~0B3XR$?^EN zKtJ8-fkR;DkQ*Vg-VN)HQ#+qyhs6c|%g~z?f0_g^Zj*DmlLg|g%>wKBw3`<@PVG{^ zhVKb^lv~)ER=u5cH@A?q()6apNJr#42c?lqFuvz-op<Cqyf=^iVb<&&e$qNO-D7{S z%t!i!C5Qfq+}!2R?=M^Z7Il96H&^A&E1)))1shj{p&X}3$<g7T4EVxvU4cl~)dFj- z+e-W_lA#3Ab^WB~y7+{0<P!=v6i4*!U7OJR&%b;fK^NRH#f}nx>kbSK3=f>0GnN|T o>Y2_I8|N?yIZ_!8G6+Ltk4V{TrXft{O<*pF(y3^9xG-w}1rWLsF#rGn diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/sanitizer.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/sanitizer.py deleted file mode 100644 index af8e77b..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/sanitizer.py +++ /dev/null @@ -1,896 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -import re -from xml.sax.saxutils import escape, unescape - -from pip._vendor.six.moves import urllib_parse as urlparse - -from . import base -from ..constants import namespaces, prefixes - -__all__ = ["Filter"] - - -allowed_elements = frozenset(( - (namespaces['html'], 'a'), - (namespaces['html'], 'abbr'), - (namespaces['html'], 'acronym'), - (namespaces['html'], 'address'), - (namespaces['html'], 'area'), - (namespaces['html'], 'article'), - (namespaces['html'], 'aside'), - (namespaces['html'], 'audio'), - (namespaces['html'], 'b'), - (namespaces['html'], 'big'), - (namespaces['html'], 'blockquote'), - (namespaces['html'], 'br'), - (namespaces['html'], 'button'), - (namespaces['html'], 'canvas'), - (namespaces['html'], 'caption'), - (namespaces['html'], 'center'), - (namespaces['html'], 'cite'), - (namespaces['html'], 'code'), - (namespaces['html'], 'col'), - (namespaces['html'], 'colgroup'), - (namespaces['html'], 'command'), - (namespaces['html'], 'datagrid'), - (namespaces['html'], 'datalist'), - (namespaces['html'], 'dd'), - (namespaces['html'], 'del'), - (namespaces['html'], 'details'), - (namespaces['html'], 'dfn'), - (namespaces['html'], 'dialog'), - (namespaces['html'], 'dir'), - (namespaces['html'], 'div'), - (namespaces['html'], 'dl'), - (namespaces['html'], 'dt'), - (namespaces['html'], 'em'), - (namespaces['html'], 'event-source'), - (namespaces['html'], 'fieldset'), - (namespaces['html'], 'figcaption'), - (namespaces['html'], 'figure'), - (namespaces['html'], 'footer'), - (namespaces['html'], 'font'), - (namespaces['html'], 'form'), - (namespaces['html'], 'header'), - (namespaces['html'], 'h1'), - (namespaces['html'], 'h2'), - (namespaces['html'], 'h3'), - (namespaces['html'], 'h4'), - (namespaces['html'], 'h5'), - (namespaces['html'], 'h6'), - (namespaces['html'], 'hr'), - (namespaces['html'], 'i'), - (namespaces['html'], 'img'), - (namespaces['html'], 'input'), - (namespaces['html'], 'ins'), - (namespaces['html'], 'keygen'), - (namespaces['html'], 'kbd'), - (namespaces['html'], 'label'), - (namespaces['html'], 'legend'), - (namespaces['html'], 'li'), - (namespaces['html'], 'm'), - (namespaces['html'], 'map'), - (namespaces['html'], 'menu'), - (namespaces['html'], 'meter'), - (namespaces['html'], 'multicol'), - (namespaces['html'], 'nav'), - (namespaces['html'], 'nextid'), - (namespaces['html'], 'ol'), - (namespaces['html'], 'output'), - (namespaces['html'], 'optgroup'), - (namespaces['html'], 'option'), - (namespaces['html'], 'p'), - (namespaces['html'], 'pre'), - (namespaces['html'], 'progress'), - (namespaces['html'], 'q'), - (namespaces['html'], 's'), - (namespaces['html'], 'samp'), - (namespaces['html'], 'section'), - (namespaces['html'], 'select'), - (namespaces['html'], 'small'), - (namespaces['html'], 'sound'), - (namespaces['html'], 'source'), - (namespaces['html'], 'spacer'), - (namespaces['html'], 'span'), - (namespaces['html'], 'strike'), - (namespaces['html'], 'strong'), - (namespaces['html'], 'sub'), - (namespaces['html'], 'sup'), - (namespaces['html'], 'table'), - (namespaces['html'], 'tbody'), - (namespaces['html'], 'td'), - (namespaces['html'], 'textarea'), - (namespaces['html'], 'time'), - (namespaces['html'], 'tfoot'), - (namespaces['html'], 'th'), - (namespaces['html'], 'thead'), - (namespaces['html'], 'tr'), - (namespaces['html'], 'tt'), - (namespaces['html'], 'u'), - (namespaces['html'], 'ul'), - (namespaces['html'], 'var'), - (namespaces['html'], 'video'), - (namespaces['mathml'], 'maction'), - (namespaces['mathml'], 'math'), - (namespaces['mathml'], 'merror'), - (namespaces['mathml'], 'mfrac'), - (namespaces['mathml'], 'mi'), - (namespaces['mathml'], 'mmultiscripts'), - (namespaces['mathml'], 'mn'), - (namespaces['mathml'], 'mo'), - (namespaces['mathml'], 'mover'), - (namespaces['mathml'], 'mpadded'), - (namespaces['mathml'], 'mphantom'), - (namespaces['mathml'], 'mprescripts'), - (namespaces['mathml'], 'mroot'), - (namespaces['mathml'], 'mrow'), - (namespaces['mathml'], 'mspace'), - (namespaces['mathml'], 'msqrt'), - (namespaces['mathml'], 'mstyle'), - (namespaces['mathml'], 'msub'), - (namespaces['mathml'], 'msubsup'), - (namespaces['mathml'], 'msup'), - (namespaces['mathml'], 'mtable'), - (namespaces['mathml'], 'mtd'), - (namespaces['mathml'], 'mtext'), - (namespaces['mathml'], 'mtr'), - (namespaces['mathml'], 'munder'), - (namespaces['mathml'], 'munderover'), - (namespaces['mathml'], 'none'), - (namespaces['svg'], 'a'), - (namespaces['svg'], 'animate'), - (namespaces['svg'], 'animateColor'), - (namespaces['svg'], 'animateMotion'), - (namespaces['svg'], 'animateTransform'), - (namespaces['svg'], 'clipPath'), - (namespaces['svg'], 'circle'), - (namespaces['svg'], 'defs'), - (namespaces['svg'], 'desc'), - (namespaces['svg'], 'ellipse'), - (namespaces['svg'], 'font-face'), - (namespaces['svg'], 'font-face-name'), - (namespaces['svg'], 'font-face-src'), - (namespaces['svg'], 'g'), - (namespaces['svg'], 'glyph'), - (namespaces['svg'], 'hkern'), - (namespaces['svg'], 'linearGradient'), - (namespaces['svg'], 'line'), - (namespaces['svg'], 'marker'), - (namespaces['svg'], 'metadata'), - (namespaces['svg'], 'missing-glyph'), - (namespaces['svg'], 'mpath'), - (namespaces['svg'], 'path'), - (namespaces['svg'], 'polygon'), - (namespaces['svg'], 'polyline'), - (namespaces['svg'], 'radialGradient'), - (namespaces['svg'], 'rect'), - (namespaces['svg'], 'set'), - (namespaces['svg'], 'stop'), - (namespaces['svg'], 'svg'), - (namespaces['svg'], 'switch'), - (namespaces['svg'], 'text'), - (namespaces['svg'], 'title'), - (namespaces['svg'], 'tspan'), - (namespaces['svg'], 'use'), -)) - -allowed_attributes = frozenset(( - # HTML attributes - (None, 'abbr'), - (None, 'accept'), - (None, 'accept-charset'), - (None, 'accesskey'), - (None, 'action'), - (None, 'align'), - (None, 'alt'), - (None, 'autocomplete'), - (None, 'autofocus'), - (None, 'axis'), - (None, 'background'), - (None, 'balance'), - (None, 'bgcolor'), - (None, 'bgproperties'), - (None, 'border'), - (None, 'bordercolor'), - (None, 'bordercolordark'), - (None, 'bordercolorlight'), - (None, 'bottompadding'), - (None, 'cellpadding'), - (None, 'cellspacing'), - (None, 'ch'), - (None, 'challenge'), - (None, 'char'), - (None, 'charoff'), - (None, 'choff'), - (None, 'charset'), - (None, 'checked'), - (None, 'cite'), - (None, 'class'), - (None, 'clear'), - (None, 'color'), - (None, 'cols'), - (None, 'colspan'), - (None, 'compact'), - (None, 'contenteditable'), - (None, 'controls'), - (None, 'coords'), - (None, 'data'), - (None, 'datafld'), - (None, 'datapagesize'), - (None, 'datasrc'), - (None, 'datetime'), - (None, 'default'), - (None, 'delay'), - (None, 'dir'), - (None, 'disabled'), - (None, 'draggable'), - (None, 'dynsrc'), - (None, 'enctype'), - (None, 'end'), - (None, 'face'), - (None, 'for'), - (None, 'form'), - (None, 'frame'), - (None, 'galleryimg'), - (None, 'gutter'), - (None, 'headers'), - (None, 'height'), - (None, 'hidefocus'), - (None, 'hidden'), - (None, 'high'), - (None, 'href'), - (None, 'hreflang'), - (None, 'hspace'), - (None, 'icon'), - (None, 'id'), - (None, 'inputmode'), - (None, 'ismap'), - (None, 'keytype'), - (None, 'label'), - (None, 'leftspacing'), - (None, 'lang'), - (None, 'list'), - (None, 'longdesc'), - (None, 'loop'), - (None, 'loopcount'), - (None, 'loopend'), - (None, 'loopstart'), - (None, 'low'), - (None, 'lowsrc'), - (None, 'max'), - (None, 'maxlength'), - (None, 'media'), - (None, 'method'), - (None, 'min'), - (None, 'multiple'), - (None, 'name'), - (None, 'nohref'), - (None, 'noshade'), - (None, 'nowrap'), - (None, 'open'), - (None, 'optimum'), - (None, 'pattern'), - (None, 'ping'), - (None, 'point-size'), - (None, 'poster'), - (None, 'pqg'), - (None, 'preload'), - (None, 'prompt'), - (None, 'radiogroup'), - (None, 'readonly'), - (None, 'rel'), - (None, 'repeat-max'), - (None, 'repeat-min'), - (None, 'replace'), - (None, 'required'), - (None, 'rev'), - (None, 'rightspacing'), - (None, 'rows'), - (None, 'rowspan'), - (None, 'rules'), - (None, 'scope'), - (None, 'selected'), - (None, 'shape'), - (None, 'size'), - (None, 'span'), - (None, 'src'), - (None, 'start'), - (None, 'step'), - (None, 'style'), - (None, 'summary'), - (None, 'suppress'), - (None, 'tabindex'), - (None, 'target'), - (None, 'template'), - (None, 'title'), - (None, 'toppadding'), - (None, 'type'), - (None, 'unselectable'), - (None, 'usemap'), - (None, 'urn'), - (None, 'valign'), - (None, 'value'), - (None, 'variable'), - (None, 'volume'), - (None, 'vspace'), - (None, 'vrml'), - (None, 'width'), - (None, 'wrap'), - (namespaces['xml'], 'lang'), - # MathML attributes - (None, 'actiontype'), - (None, 'align'), - (None, 'columnalign'), - (None, 'columnalign'), - (None, 'columnalign'), - (None, 'columnlines'), - (None, 'columnspacing'), - (None, 'columnspan'), - (None, 'depth'), - (None, 'display'), - (None, 'displaystyle'), - (None, 'equalcolumns'), - (None, 'equalrows'), - (None, 'fence'), - (None, 'fontstyle'), - (None, 'fontweight'), - (None, 'frame'), - (None, 'height'), - (None, 'linethickness'), - (None, 'lspace'), - (None, 'mathbackground'), - (None, 'mathcolor'), - (None, 'mathvariant'), - (None, 'mathvariant'), - (None, 'maxsize'), - (None, 'minsize'), - (None, 'other'), - (None, 'rowalign'), - (None, 'rowalign'), - (None, 'rowalign'), - (None, 'rowlines'), - (None, 'rowspacing'), - (None, 'rowspan'), - (None, 'rspace'), - (None, 'scriptlevel'), - (None, 'selection'), - (None, 'separator'), - (None, 'stretchy'), - (None, 'width'), - (None, 'width'), - (namespaces['xlink'], 'href'), - (namespaces['xlink'], 'show'), - (namespaces['xlink'], 'type'), - # SVG attributes - (None, 'accent-height'), - (None, 'accumulate'), - (None, 'additive'), - (None, 'alphabetic'), - (None, 'arabic-form'), - (None, 'ascent'), - (None, 'attributeName'), - (None, 'attributeType'), - (None, 'baseProfile'), - (None, 'bbox'), - (None, 'begin'), - (None, 'by'), - (None, 'calcMode'), - (None, 'cap-height'), - (None, 'class'), - (None, 'clip-path'), - (None, 'color'), - (None, 'color-rendering'), - (None, 'content'), - (None, 'cx'), - (None, 'cy'), - (None, 'd'), - (None, 'dx'), - (None, 'dy'), - (None, 'descent'), - (None, 'display'), - (None, 'dur'), - (None, 'end'), - (None, 'fill'), - (None, 'fill-opacity'), - (None, 'fill-rule'), - (None, 'font-family'), - (None, 'font-size'), - (None, 'font-stretch'), - (None, 'font-style'), - (None, 'font-variant'), - (None, 'font-weight'), - (None, 'from'), - (None, 'fx'), - (None, 'fy'), - (None, 'g1'), - (None, 'g2'), - (None, 'glyph-name'), - (None, 'gradientUnits'), - (None, 'hanging'), - (None, 'height'), - (None, 'horiz-adv-x'), - (None, 'horiz-origin-x'), - (None, 'id'), - (None, 'ideographic'), - (None, 'k'), - (None, 'keyPoints'), - (None, 'keySplines'), - (None, 'keyTimes'), - (None, 'lang'), - (None, 'marker-end'), - (None, 'marker-mid'), - (None, 'marker-start'), - (None, 'markerHeight'), - (None, 'markerUnits'), - (None, 'markerWidth'), - (None, 'mathematical'), - (None, 'max'), - (None, 'min'), - (None, 'name'), - (None, 'offset'), - (None, 'opacity'), - (None, 'orient'), - (None, 'origin'), - (None, 'overline-position'), - (None, 'overline-thickness'), - (None, 'panose-1'), - (None, 'path'), - (None, 'pathLength'), - (None, 'points'), - (None, 'preserveAspectRatio'), - (None, 'r'), - (None, 'refX'), - (None, 'refY'), - (None, 'repeatCount'), - (None, 'repeatDur'), - (None, 'requiredExtensions'), - (None, 'requiredFeatures'), - (None, 'restart'), - (None, 'rotate'), - (None, 'rx'), - (None, 'ry'), - (None, 'slope'), - (None, 'stemh'), - (None, 'stemv'), - (None, 'stop-color'), - (None, 'stop-opacity'), - (None, 'strikethrough-position'), - (None, 'strikethrough-thickness'), - (None, 'stroke'), - (None, 'stroke-dasharray'), - (None, 'stroke-dashoffset'), - (None, 'stroke-linecap'), - (None, 'stroke-linejoin'), - (None, 'stroke-miterlimit'), - (None, 'stroke-opacity'), - (None, 'stroke-width'), - (None, 'systemLanguage'), - (None, 'target'), - (None, 'text-anchor'), - (None, 'to'), - (None, 'transform'), - (None, 'type'), - (None, 'u1'), - (None, 'u2'), - (None, 'underline-position'), - (None, 'underline-thickness'), - (None, 'unicode'), - (None, 'unicode-range'), - (None, 'units-per-em'), - (None, 'values'), - (None, 'version'), - (None, 'viewBox'), - (None, 'visibility'), - (None, 'width'), - (None, 'widths'), - (None, 'x'), - (None, 'x-height'), - (None, 'x1'), - (None, 'x2'), - (namespaces['xlink'], 'actuate'), - (namespaces['xlink'], 'arcrole'), - (namespaces['xlink'], 'href'), - (namespaces['xlink'], 'role'), - (namespaces['xlink'], 'show'), - (namespaces['xlink'], 'title'), - (namespaces['xlink'], 'type'), - (namespaces['xml'], 'base'), - (namespaces['xml'], 'lang'), - (namespaces['xml'], 'space'), - (None, 'y'), - (None, 'y1'), - (None, 'y2'), - (None, 'zoomAndPan'), -)) - -attr_val_is_uri = frozenset(( - (None, 'href'), - (None, 'src'), - (None, 'cite'), - (None, 'action'), - (None, 'longdesc'), - (None, 'poster'), - (None, 'background'), - (None, 'datasrc'), - (None, 'dynsrc'), - (None, 'lowsrc'), - (None, 'ping'), - (namespaces['xlink'], 'href'), - (namespaces['xml'], 'base'), -)) - -svg_attr_val_allows_ref = frozenset(( - (None, 'clip-path'), - (None, 'color-profile'), - (None, 'cursor'), - (None, 'fill'), - (None, 'filter'), - (None, 'marker'), - (None, 'marker-start'), - (None, 'marker-mid'), - (None, 'marker-end'), - (None, 'mask'), - (None, 'stroke'), -)) - -svg_allow_local_href = frozenset(( - (None, 'altGlyph'), - (None, 'animate'), - (None, 'animateColor'), - (None, 'animateMotion'), - (None, 'animateTransform'), - (None, 'cursor'), - (None, 'feImage'), - (None, 'filter'), - (None, 'linearGradient'), - (None, 'pattern'), - (None, 'radialGradient'), - (None, 'textpath'), - (None, 'tref'), - (None, 'set'), - (None, 'use') -)) - -allowed_css_properties = frozenset(( - 'azimuth', - 'background-color', - 'border-bottom-color', - 'border-collapse', - 'border-color', - 'border-left-color', - 'border-right-color', - 'border-top-color', - 'clear', - 'color', - 'cursor', - 'direction', - 'display', - 'elevation', - 'float', - 'font', - 'font-family', - 'font-size', - 'font-style', - 'font-variant', - 'font-weight', - 'height', - 'letter-spacing', - 'line-height', - 'overflow', - 'pause', - 'pause-after', - 'pause-before', - 'pitch', - 'pitch-range', - 'richness', - 'speak', - 'speak-header', - 'speak-numeral', - 'speak-punctuation', - 'speech-rate', - 'stress', - 'text-align', - 'text-decoration', - 'text-indent', - 'unicode-bidi', - 'vertical-align', - 'voice-family', - 'volume', - 'white-space', - 'width', -)) - -allowed_css_keywords = frozenset(( - 'auto', - 'aqua', - 'black', - 'block', - 'blue', - 'bold', - 'both', - 'bottom', - 'brown', - 'center', - 'collapse', - 'dashed', - 'dotted', - 'fuchsia', - 'gray', - 'green', - '!important', - 'italic', - 'left', - 'lime', - 'maroon', - 'medium', - 'none', - 'navy', - 'normal', - 'nowrap', - 'olive', - 'pointer', - 'purple', - 'red', - 'right', - 'solid', - 'silver', - 'teal', - 'top', - 'transparent', - 'underline', - 'white', - 'yellow', -)) - -allowed_svg_properties = frozenset(( - 'fill', - 'fill-opacity', - 'fill-rule', - 'stroke', - 'stroke-width', - 'stroke-linecap', - 'stroke-linejoin', - 'stroke-opacity', -)) - -allowed_protocols = frozenset(( - 'ed2k', - 'ftp', - 'http', - 'https', - 'irc', - 'mailto', - 'news', - 'gopher', - 'nntp', - 'telnet', - 'webcal', - 'xmpp', - 'callto', - 'feed', - 'urn', - 'aim', - 'rsync', - 'tag', - 'ssh', - 'sftp', - 'rtsp', - 'afs', - 'data', -)) - -allowed_content_types = frozenset(( - 'image/png', - 'image/jpeg', - 'image/gif', - 'image/webp', - 'image/bmp', - 'text/plain', -)) - - -data_content_type = re.compile(r''' - ^ - # Match a content type <application>/<type> - (?P<content_type>[-a-zA-Z0-9.]+/[-a-zA-Z0-9.]+) - # Match any character set and encoding - (?:(?:;charset=(?:[-a-zA-Z0-9]+)(?:;(?:base64))?) - |(?:;(?:base64))?(?:;charset=(?:[-a-zA-Z0-9]+))?) - # Assume the rest is data - ,.* - $ - ''', - re.VERBOSE) - - -class Filter(base.Filter): - """Sanitizes token stream of XHTML+MathML+SVG and of inline style attributes""" - def __init__(self, - source, - allowed_elements=allowed_elements, - allowed_attributes=allowed_attributes, - allowed_css_properties=allowed_css_properties, - allowed_css_keywords=allowed_css_keywords, - allowed_svg_properties=allowed_svg_properties, - allowed_protocols=allowed_protocols, - allowed_content_types=allowed_content_types, - attr_val_is_uri=attr_val_is_uri, - svg_attr_val_allows_ref=svg_attr_val_allows_ref, - svg_allow_local_href=svg_allow_local_href): - """Creates a Filter - - :arg allowed_elements: set of elements to allow--everything else will - be escaped - - :arg allowed_attributes: set of attributes to allow in - elements--everything else will be stripped - - :arg allowed_css_properties: set of CSS properties to allow--everything - else will be stripped - - :arg allowed_css_keywords: set of CSS keywords to allow--everything - else will be stripped - - :arg allowed_svg_properties: set of SVG properties to allow--everything - else will be removed - - :arg allowed_protocols: set of allowed protocols for URIs - - :arg allowed_content_types: set of allowed content types for ``data`` URIs. - - :arg attr_val_is_uri: set of attributes that have URI values--values - that have a scheme not listed in ``allowed_protocols`` are removed - - :arg svg_attr_val_allows_ref: set of SVG attributes that can have - references - - :arg svg_allow_local_href: set of SVG elements that can have local - hrefs--these are removed - - """ - super(Filter, self).__init__(source) - self.allowed_elements = allowed_elements - self.allowed_attributes = allowed_attributes - self.allowed_css_properties = allowed_css_properties - self.allowed_css_keywords = allowed_css_keywords - self.allowed_svg_properties = allowed_svg_properties - self.allowed_protocols = allowed_protocols - self.allowed_content_types = allowed_content_types - self.attr_val_is_uri = attr_val_is_uri - self.svg_attr_val_allows_ref = svg_attr_val_allows_ref - self.svg_allow_local_href = svg_allow_local_href - - def __iter__(self): - for token in base.Filter.__iter__(self): - token = self.sanitize_token(token) - if token: - yield token - - # Sanitize the +html+, escaping all elements not in ALLOWED_ELEMENTS, and - # stripping out all attributes not in ALLOWED_ATTRIBUTES. Style attributes - # are parsed, and a restricted set, specified by ALLOWED_CSS_PROPERTIES and - # ALLOWED_CSS_KEYWORDS, are allowed through. attributes in ATTR_VAL_IS_URI - # are scanned, and only URI schemes specified in ALLOWED_PROTOCOLS are - # allowed. - # - # sanitize_html('<script> do_nasty_stuff() </script>') - # => <script> do_nasty_stuff() </script> - # sanitize_html('<a href="javascript: sucker();">Click here for $100</a>') - # => <a>Click here for $100</a> - def sanitize_token(self, token): - - # accommodate filters which use token_type differently - token_type = token["type"] - if token_type in ("StartTag", "EndTag", "EmptyTag"): - name = token["name"] - namespace = token["namespace"] - if ((namespace, name) in self.allowed_elements or - (namespace is None and - (namespaces["html"], name) in self.allowed_elements)): - return self.allowed_token(token) - else: - return self.disallowed_token(token) - elif token_type == "Comment": - pass - else: - return token - - def allowed_token(self, token): - if "data" in token: - attrs = token["data"] - attr_names = set(attrs.keys()) - - # Remove forbidden attributes - for to_remove in (attr_names - self.allowed_attributes): - del token["data"][to_remove] - attr_names.remove(to_remove) - - # Remove attributes with disallowed URL values - for attr in (attr_names & self.attr_val_is_uri): - assert attr in attrs - # I don't have a clue where this regexp comes from or why it matches those - # characters, nor why we call unescape. I just know it's always been here. - # Should you be worried by this comment in a sanitizer? Yes. On the other hand, all - # this will do is remove *more* than it otherwise would. - val_unescaped = re.sub("[`\x00-\x20\x7f-\xa0\\s]+", '', - unescape(attrs[attr])).lower() - # remove replacement characters from unescaped characters - val_unescaped = val_unescaped.replace("\ufffd", "") - try: - uri = urlparse.urlparse(val_unescaped) - except ValueError: - uri = None - del attrs[attr] - if uri and uri.scheme: - if uri.scheme not in self.allowed_protocols: - del attrs[attr] - if uri.scheme == 'data': - m = data_content_type.match(uri.path) - if not m: - del attrs[attr] - elif m.group('content_type') not in self.allowed_content_types: - del attrs[attr] - - for attr in self.svg_attr_val_allows_ref: - if attr in attrs: - attrs[attr] = re.sub(r'url\s*\(\s*[^#\s][^)]+?\)', - ' ', - unescape(attrs[attr])) - if (token["name"] in self.svg_allow_local_href and - (namespaces['xlink'], 'href') in attrs and re.search(r'^\s*[^#\s].*', - attrs[(namespaces['xlink'], 'href')])): - del attrs[(namespaces['xlink'], 'href')] - if (None, 'style') in attrs: - attrs[(None, 'style')] = self.sanitize_css(attrs[(None, 'style')]) - token["data"] = attrs - return token - - def disallowed_token(self, token): - token_type = token["type"] - if token_type == "EndTag": - token["data"] = "</%s>" % token["name"] - elif token["data"]: - assert token_type in ("StartTag", "EmptyTag") - attrs = [] - for (ns, name), v in token["data"].items(): - attrs.append(' %s="%s"' % (name if ns is None else "%s:%s" % (prefixes[ns], name), escape(v))) - token["data"] = "<%s%s>" % (token["name"], ''.join(attrs)) - else: - token["data"] = "<%s>" % token["name"] - if token.get("selfClosing"): - token["data"] = token["data"][:-1] + "/>" - - token["type"] = "Characters" - - del token["name"] - return token - - def sanitize_css(self, style): - # disallow urls - style = re.compile(r'url\s*\(\s*[^\s)]+?\s*\)\s*').sub(' ', style) - - # gauntlet - if not re.match(r"""^([:,;#%.\sa-zA-Z0-9!]|\w-\w|'[\s\w]+'|"[\s\w]+"|\([\d,\s]+\))*$""", style): - return '' - if not re.match(r"^\s*([-\w]+\s*:[^:;]*(;\s*|$))*$", style): - return '' - - clean = [] - for prop, value in re.findall(r"([-\w]+)\s*:\s*([^:;]*)", style): - if not value: - continue - if prop.lower() in self.allowed_css_properties: - clean.append(prop + ': ' + value + ';') - elif prop.split('-')[0].lower() in ['background', 'border', 'margin', - 'padding']: - for keyword in value.split(): - if keyword not in self.allowed_css_keywords and \ - not re.match(r"^(#[0-9a-fA-F]+|rgb\(\d+%?,\d*%?,?\d*%?\)?|\d{0,2}\.?\d{0,2}(cm|em|ex|in|mm|pc|pt|px|%|,|\))?)$", keyword): # noqa - break - else: - clean.append(prop + ': ' + value + ';') - elif prop.lower() in self.allowed_svg_properties: - clean.append(prop + ': ' + value + ';') - - return ' '.join(clean) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/sanitizer.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/sanitizer.pyc deleted file mode 100644 index b326666b8f33c24fb5362ad4f37e1a882c06ddd4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27270 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 apEq;l3&*<<^Yx!M*?!H6m1}Kfo&8<W?vmXA diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/whitespace.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/whitespace.py deleted file mode 100644 index 0d12584..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/whitespace.py +++ /dev/null @@ -1,38 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -import re - -from . import base -from ..constants import rcdataElements, spaceCharacters -spaceCharacters = "".join(spaceCharacters) - -SPACES_REGEX = re.compile("[%s]+" % spaceCharacters) - - -class Filter(base.Filter): - """Collapses whitespace except in pre, textarea, and script elements""" - spacePreserveElements = frozenset(["pre", "textarea"] + list(rcdataElements)) - - def __iter__(self): - preserve = 0 - for token in base.Filter.__iter__(self): - type = token["type"] - if type == "StartTag" \ - and (preserve or token["name"] in self.spacePreserveElements): - preserve += 1 - - elif type == "EndTag" and preserve: - preserve -= 1 - - elif not preserve and type == "SpaceCharacters" and token["data"]: - # Test on token["data"] above to not introduce spaces where there were not - token["data"] = " " - - elif not preserve and type == "Characters": - token["data"] = collapse_spaces(token["data"]) - - yield token - - -def collapse_spaces(text): - return SPACES_REGEX.sub(' ', text) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/whitespace.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/whitespace.pyc deleted file mode 100644 index 65f33056cacc7089e38dc307b549171e5b49ea06..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1941 zcmd5-Yi`>{5FS!8^|0gwHJU(03g}M&Ax+8zY26eEil(mGUo{NM=!1d5Qsl~}ynJML zsmOx;qe#!t6Z8~4L@v-{^a7o4C0A%KkP6~xI5Rst^Ub%b#$WyJgJ1Se6WV+l{QKq4 zF6rM`N%`xLB+4BM9m-t_UCJ92Hpqd`CE28~Noj-9CdnPjJqkVc?NI8GY*F5(uuXY~ z!VX(oH1Cq=&>POyA<?AyE~RZ)?!eTel&v1k`!sVX?b5GAZ-{;h`;_kDCEUZ7lTnXL z%TVtK)tXx@;;AlWZA6siRjG_=vn|aQna;|>+~$|M$dWP@k<5%xvD8PI!`2amX|kBc zT4XLv5N3~sO48WGV<~b`7;U%FRh)>!^H{|Rr_nV>QN6?B<$Znnk?~mjCX?*?2T$bw z3V1$cMQ{(?8B3Q0W5&8mXRJ3#>;RU#z`+BaXtzbdWP}9u3l@i^lyRkn9=<;3CTuA~ zu}nl|hFLMJlz2EaVrgO};)lbyNQXL689T+MgBoaYSPgJ)A`>8hJ@6zb^iNi}vTKKy zZ^;nN9h$pz#j|ke>(f8znqOQLKDchs6?f5~3zyVOx^hS#SznU|96x7=w{b8dKI4pq zwktflVucmTN_Ibk`vj(*`rSsgY!vIfTbl-KWqzz*o)-_+k#B8e*G6)+&6{AZ^(K;_ zeeb*)&<`mwdv>|MBTJteJ)6sFjmU(NGbizxwH9$MEJJF{bX=rxfM}EdFaRk)lNvY< z>n_VJKSrQN0N4Yhv8;?DFffYD`)sj8JXS&rwGjVeTC$mTWJ9#2fhDRIa%L0pB<(VT zO-y;gB)#cp#1^tbuUPXdl`Uc;{6(z%St(PduD@FPmrvESczyBY;8pSXKz(wMJk!h1 z)0KM6pR>w8@vE$Qloi^<Qa&<IzB`MKVX{xO5Jg%l|J>yAQ<+WundQCqx8(e|x(r&p zJ&vFLfCV|8GjO_2k7eI|kDm|SzPs<-bw`$x5K#o^86F@RMR}Rl60b-UMQNF^-eG;F z%9SXzFt%x#X%nFP06FZgw*9Sm*Fa$YxVJPEkAb-7+M@^BfFOrBdO&J@;`jjK#NoEX zeRQ;@*ZOWkn#u8t!|@~v#@~*AG+3|e>Gm?i;r{=$j&a>biRgr!5suMjytCTWipLwk z699|AUcV4ZFcfS+cXs4S2`chcyq>hBJ!U>Hv%>NtDf23mBG|_=;2dD<Ef7|F$3(D4 b_xYOEU!Y-)znXh)&%N#3ac;T$jltk=7<<9x diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/html5parser.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/html5parser.py deleted file mode 100644 index ae41a13..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/html5parser.py +++ /dev/null @@ -1,2791 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals -from pip._vendor.six import with_metaclass, viewkeys - -import types -from collections import OrderedDict - -from . import _inputstream -from . import _tokenizer - -from . import treebuilders -from .treebuilders.base import Marker - -from . import _utils -from .constants import ( - spaceCharacters, asciiUpper2Lower, - specialElements, headingElements, cdataElements, rcdataElements, - tokenTypes, tagTokenTypes, - namespaces, - htmlIntegrationPointElements, mathmlTextIntegrationPointElements, - adjustForeignAttributes as adjustForeignAttributesMap, - adjustMathMLAttributes, adjustSVGAttributes, - E, - _ReparseException -) - - -def parse(doc, treebuilder="etree", namespaceHTMLElements=True, **kwargs): - """Parse an HTML document as a string or file-like object into a tree - - :arg doc: the document to parse as a string or file-like object - - :arg treebuilder: the treebuilder to use when parsing - - :arg namespaceHTMLElements: whether or not to namespace HTML elements - - :returns: parsed tree - - Example: - - >>> from html5lib.html5parser import parse - >>> parse('<html><body><p>This is a doc</p></body></html>') - <Element u'{http://www.w3.org/1999/xhtml}html' at 0x7feac4909db0> - - """ - tb = treebuilders.getTreeBuilder(treebuilder) - p = HTMLParser(tb, namespaceHTMLElements=namespaceHTMLElements) - return p.parse(doc, **kwargs) - - -def parseFragment(doc, container="div", treebuilder="etree", namespaceHTMLElements=True, **kwargs): - """Parse an HTML fragment as a string or file-like object into a tree - - :arg doc: the fragment to parse as a string or file-like object - - :arg container: the container context to parse the fragment in - - :arg treebuilder: the treebuilder to use when parsing - - :arg namespaceHTMLElements: whether or not to namespace HTML elements - - :returns: parsed tree - - Example: - - >>> from html5lib.html5libparser import parseFragment - >>> parseFragment('<b>this is a fragment</b>') - <Element u'DOCUMENT_FRAGMENT' at 0x7feac484b090> - - """ - tb = treebuilders.getTreeBuilder(treebuilder) - p = HTMLParser(tb, namespaceHTMLElements=namespaceHTMLElements) - return p.parseFragment(doc, container=container, **kwargs) - - -def method_decorator_metaclass(function): - class Decorated(type): - def __new__(meta, classname, bases, classDict): - for attributeName, attribute in classDict.items(): - if isinstance(attribute, types.FunctionType): - attribute = function(attribute) - - classDict[attributeName] = attribute - return type.__new__(meta, classname, bases, classDict) - return Decorated - - -class HTMLParser(object): - """HTML parser - - Generates a tree structure from a stream of (possibly malformed) HTML. - - """ - - def __init__(self, tree=None, strict=False, namespaceHTMLElements=True, debug=False): - """ - :arg tree: a treebuilder class controlling the type of tree that will be - returned. Built in treebuilders can be accessed through - html5lib.treebuilders.getTreeBuilder(treeType) - - :arg strict: raise an exception when a parse error is encountered - - :arg namespaceHTMLElements: whether or not to namespace HTML elements - - :arg debug: whether or not to enable debug mode which logs things - - Example: - - >>> from html5lib.html5parser import HTMLParser - >>> parser = HTMLParser() # generates parser with etree builder - >>> parser = HTMLParser('lxml', strict=True) # generates parser with lxml builder which is strict - - """ - - # Raise an exception on the first error encountered - self.strict = strict - - if tree is None: - tree = treebuilders.getTreeBuilder("etree") - self.tree = tree(namespaceHTMLElements) - self.errors = [] - - self.phases = dict([(name, cls(self, self.tree)) for name, cls in - getPhases(debug).items()]) - - def _parse(self, stream, innerHTML=False, container="div", scripting=False, **kwargs): - - self.innerHTMLMode = innerHTML - self.container = container - self.scripting = scripting - self.tokenizer = _tokenizer.HTMLTokenizer(stream, parser=self, **kwargs) - self.reset() - - try: - self.mainLoop() - except _ReparseException: - self.reset() - self.mainLoop() - - def reset(self): - self.tree.reset() - self.firstStartTag = False - self.errors = [] - self.log = [] # only used with debug mode - # "quirks" / "limited quirks" / "no quirks" - self.compatMode = "no quirks" - - if self.innerHTMLMode: - self.innerHTML = self.container.lower() - - if self.innerHTML in cdataElements: - self.tokenizer.state = self.tokenizer.rcdataState - elif self.innerHTML in rcdataElements: - self.tokenizer.state = self.tokenizer.rawtextState - elif self.innerHTML == 'plaintext': - self.tokenizer.state = self.tokenizer.plaintextState - else: - # state already is data state - # self.tokenizer.state = self.tokenizer.dataState - pass - self.phase = self.phases["beforeHtml"] - self.phase.insertHtmlElement() - self.resetInsertionMode() - else: - self.innerHTML = False # pylint:disable=redefined-variable-type - self.phase = self.phases["initial"] - - self.lastPhase = None - - self.beforeRCDataPhase = None - - self.framesetOK = True - - @property - def documentEncoding(self): - """Name of the character encoding that was used to decode the input stream, or - :obj:`None` if that is not determined yet - - """ - if not hasattr(self, 'tokenizer'): - return None - return self.tokenizer.stream.charEncoding[0].name - - def isHTMLIntegrationPoint(self, element): - if (element.name == "annotation-xml" and - element.namespace == namespaces["mathml"]): - return ("encoding" in element.attributes and - element.attributes["encoding"].translate( - asciiUpper2Lower) in - ("text/html", "application/xhtml+xml")) - else: - return (element.namespace, element.name) in htmlIntegrationPointElements - - def isMathMLTextIntegrationPoint(self, element): - return (element.namespace, element.name) in mathmlTextIntegrationPointElements - - def mainLoop(self): - CharactersToken = tokenTypes["Characters"] - SpaceCharactersToken = tokenTypes["SpaceCharacters"] - StartTagToken = tokenTypes["StartTag"] - EndTagToken = tokenTypes["EndTag"] - CommentToken = tokenTypes["Comment"] - DoctypeToken = tokenTypes["Doctype"] - ParseErrorToken = tokenTypes["ParseError"] - - for token in self.normalizedTokens(): - prev_token = None - new_token = token - while new_token is not None: - prev_token = new_token - currentNode = self.tree.openElements[-1] if self.tree.openElements else None - currentNodeNamespace = currentNode.namespace if currentNode else None - currentNodeName = currentNode.name if currentNode else None - - type = new_token["type"] - - if type == ParseErrorToken: - self.parseError(new_token["data"], new_token.get("datavars", {})) - new_token = None - else: - if (len(self.tree.openElements) == 0 or - currentNodeNamespace == self.tree.defaultNamespace or - (self.isMathMLTextIntegrationPoint(currentNode) and - ((type == StartTagToken and - token["name"] not in frozenset(["mglyph", "malignmark"])) or - type in (CharactersToken, SpaceCharactersToken))) or - (currentNodeNamespace == namespaces["mathml"] and - currentNodeName == "annotation-xml" and - type == StartTagToken and - token["name"] == "svg") or - (self.isHTMLIntegrationPoint(currentNode) and - type in (StartTagToken, CharactersToken, SpaceCharactersToken))): - phase = self.phase - else: - phase = self.phases["inForeignContent"] - - if type == CharactersToken: - new_token = phase.processCharacters(new_token) - elif type == SpaceCharactersToken: - new_token = phase.processSpaceCharacters(new_token) - elif type == StartTagToken: - new_token = phase.processStartTag(new_token) - elif type == EndTagToken: - new_token = phase.processEndTag(new_token) - elif type == CommentToken: - new_token = phase.processComment(new_token) - elif type == DoctypeToken: - new_token = phase.processDoctype(new_token) - - if (type == StartTagToken and prev_token["selfClosing"] and - not prev_token["selfClosingAcknowledged"]): - self.parseError("non-void-element-with-trailing-solidus", - {"name": prev_token["name"]}) - - # When the loop finishes it's EOF - reprocess = True - phases = [] - while reprocess: - phases.append(self.phase) - reprocess = self.phase.processEOF() - if reprocess: - assert self.phase not in phases - - def normalizedTokens(self): - for token in self.tokenizer: - yield self.normalizeToken(token) - - def parse(self, stream, *args, **kwargs): - """Parse a HTML document into a well-formed tree - - :arg stream: a file-like object or string containing the HTML to be parsed - - The optional encoding parameter must be a string that indicates - the encoding. If specified, that encoding will be used, - regardless of any BOM or later declaration (such as in a meta - element). - - :arg scripting: treat noscript elements as if JavaScript was turned on - - :returns: parsed tree - - Example: - - >>> from html5lib.html5parser import HTMLParser - >>> parser = HTMLParser() - >>> parser.parse('<html><body><p>This is a doc</p></body></html>') - <Element u'{http://www.w3.org/1999/xhtml}html' at 0x7feac4909db0> - - """ - self._parse(stream, False, None, *args, **kwargs) - return self.tree.getDocument() - - def parseFragment(self, stream, *args, **kwargs): - """Parse a HTML fragment into a well-formed tree fragment - - :arg container: name of the element we're setting the innerHTML - property if set to None, default to 'div' - - :arg stream: a file-like object or string containing the HTML to be parsed - - The optional encoding parameter must be a string that indicates - the encoding. If specified, that encoding will be used, - regardless of any BOM or later declaration (such as in a meta - element) - - :arg scripting: treat noscript elements as if JavaScript was turned on - - :returns: parsed tree - - Example: - - >>> from html5lib.html5libparser import HTMLParser - >>> parser = HTMLParser() - >>> parser.parseFragment('<b>this is a fragment</b>') - <Element u'DOCUMENT_FRAGMENT' at 0x7feac484b090> - - """ - self._parse(stream, True, *args, **kwargs) - return self.tree.getFragment() - - def parseError(self, errorcode="XXX-undefined-error", datavars=None): - # XXX The idea is to make errorcode mandatory. - if datavars is None: - datavars = {} - self.errors.append((self.tokenizer.stream.position(), errorcode, datavars)) - if self.strict: - raise ParseError(E[errorcode] % datavars) - - def normalizeToken(self, token): - # HTML5 specific normalizations to the token stream - if token["type"] == tokenTypes["StartTag"]: - raw = token["data"] - token["data"] = OrderedDict(raw) - if len(raw) > len(token["data"]): - # we had some duplicated attribute, fix so first wins - token["data"].update(raw[::-1]) - - return token - - def adjustMathMLAttributes(self, token): - adjust_attributes(token, adjustMathMLAttributes) - - def adjustSVGAttributes(self, token): - adjust_attributes(token, adjustSVGAttributes) - - def adjustForeignAttributes(self, token): - adjust_attributes(token, adjustForeignAttributesMap) - - def reparseTokenNormal(self, token): - # pylint:disable=unused-argument - self.parser.phase() - - def resetInsertionMode(self): - # The name of this method is mostly historical. (It's also used in the - # specification.) - last = False - newModes = { - "select": "inSelect", - "td": "inCell", - "th": "inCell", - "tr": "inRow", - "tbody": "inTableBody", - "thead": "inTableBody", - "tfoot": "inTableBody", - "caption": "inCaption", - "colgroup": "inColumnGroup", - "table": "inTable", - "head": "inBody", - "body": "inBody", - "frameset": "inFrameset", - "html": "beforeHead" - } - for node in self.tree.openElements[::-1]: - nodeName = node.name - new_phase = None - if node == self.tree.openElements[0]: - assert self.innerHTML - last = True - nodeName = self.innerHTML - # Check for conditions that should only happen in the innerHTML - # case - if nodeName in ("select", "colgroup", "head", "html"): - assert self.innerHTML - - if not last and node.namespace != self.tree.defaultNamespace: - continue - - if nodeName in newModes: - new_phase = self.phases[newModes[nodeName]] - break - elif last: - new_phase = self.phases["inBody"] - break - - self.phase = new_phase - - def parseRCDataRawtext(self, token, contentType): - # Generic RCDATA/RAWTEXT Parsing algorithm - assert contentType in ("RAWTEXT", "RCDATA") - - self.tree.insertElement(token) - - if contentType == "RAWTEXT": - self.tokenizer.state = self.tokenizer.rawtextState - else: - self.tokenizer.state = self.tokenizer.rcdataState - - self.originalPhase = self.phase - - self.phase = self.phases["text"] - - -@_utils.memoize -def getPhases(debug): - def log(function): - """Logger that records which phase processes each token""" - type_names = dict((value, key) for key, value in - tokenTypes.items()) - - def wrapped(self, *args, **kwargs): - if function.__name__.startswith("process") and len(args) > 0: - token = args[0] - try: - info = {"type": type_names[token['type']]} - except: - raise - if token['type'] in tagTokenTypes: - info["name"] = token['name'] - - self.parser.log.append((self.parser.tokenizer.state.__name__, - self.parser.phase.__class__.__name__, - self.__class__.__name__, - function.__name__, - info)) - return function(self, *args, **kwargs) - else: - return function(self, *args, **kwargs) - return wrapped - - def getMetaclass(use_metaclass, metaclass_func): - if use_metaclass: - return method_decorator_metaclass(metaclass_func) - else: - return type - - # pylint:disable=unused-argument - class Phase(with_metaclass(getMetaclass(debug, log))): - """Base class for helper object that implements each phase of processing - """ - - def __init__(self, parser, tree): - self.parser = parser - self.tree = tree - - def processEOF(self): - raise NotImplementedError - - def processComment(self, token): - # For most phases the following is correct. Where it's not it will be - # overridden. - self.tree.insertComment(token, self.tree.openElements[-1]) - - def processDoctype(self, token): - self.parser.parseError("unexpected-doctype") - - def processCharacters(self, token): - self.tree.insertText(token["data"]) - - def processSpaceCharacters(self, token): - self.tree.insertText(token["data"]) - - def processStartTag(self, token): - return self.startTagHandler[token["name"]](token) - - def startTagHtml(self, token): - if not self.parser.firstStartTag and token["name"] == "html": - self.parser.parseError("non-html-root") - # XXX Need a check here to see if the first start tag token emitted is - # this token... If it's not, invoke self.parser.parseError(). - for attr, value in token["data"].items(): - if attr not in self.tree.openElements[0].attributes: - self.tree.openElements[0].attributes[attr] = value - self.parser.firstStartTag = False - - def processEndTag(self, token): - return self.endTagHandler[token["name"]](token) - - class InitialPhase(Phase): - def processSpaceCharacters(self, token): - pass - - def processComment(self, token): - self.tree.insertComment(token, self.tree.document) - - def processDoctype(self, token): - name = token["name"] - publicId = token["publicId"] - systemId = token["systemId"] - correct = token["correct"] - - if (name != "html" or publicId is not None or - systemId is not None and systemId != "about:legacy-compat"): - self.parser.parseError("unknown-doctype") - - if publicId is None: - publicId = "" - - self.tree.insertDoctype(token) - - if publicId != "": - publicId = publicId.translate(asciiUpper2Lower) - - if (not correct or token["name"] != "html" or - publicId.startswith( - ("+//silmaril//dtd html pro v0r11 19970101//", - "-//advasoft ltd//dtd html 3.0 aswedit + extensions//", - "-//as//dtd html 3.0 aswedit + extensions//", - "-//ietf//dtd html 2.0 level 1//", - "-//ietf//dtd html 2.0 level 2//", - "-//ietf//dtd html 2.0 strict level 1//", - "-//ietf//dtd html 2.0 strict level 2//", - "-//ietf//dtd html 2.0 strict//", - "-//ietf//dtd html 2.0//", - "-//ietf//dtd html 2.1e//", - "-//ietf//dtd html 3.0//", - "-//ietf//dtd html 3.2 final//", - "-//ietf//dtd html 3.2//", - "-//ietf//dtd html 3//", - "-//ietf//dtd html level 0//", - "-//ietf//dtd html level 1//", - "-//ietf//dtd html level 2//", - "-//ietf//dtd html level 3//", - "-//ietf//dtd html strict level 0//", - "-//ietf//dtd html strict level 1//", - "-//ietf//dtd html strict level 2//", - "-//ietf//dtd html strict level 3//", - "-//ietf//dtd html strict//", - "-//ietf//dtd html//", - "-//metrius//dtd metrius presentational//", - "-//microsoft//dtd internet explorer 2.0 html strict//", - "-//microsoft//dtd internet explorer 2.0 html//", - "-//microsoft//dtd internet explorer 2.0 tables//", - "-//microsoft//dtd internet explorer 3.0 html strict//", - "-//microsoft//dtd internet explorer 3.0 html//", - "-//microsoft//dtd internet explorer 3.0 tables//", - "-//netscape comm. corp.//dtd html//", - "-//netscape comm. corp.//dtd strict html//", - "-//o'reilly and associates//dtd html 2.0//", - "-//o'reilly and associates//dtd html extended 1.0//", - "-//o'reilly and associates//dtd html extended relaxed 1.0//", - "-//softquad software//dtd hotmetal pro 6.0::19990601::extensions to html 4.0//", - "-//softquad//dtd hotmetal pro 4.0::19971010::extensions to html 4.0//", - "-//spyglass//dtd html 2.0 extended//", - "-//sq//dtd html 2.0 hotmetal + extensions//", - "-//sun microsystems corp.//dtd hotjava html//", - "-//sun microsystems corp.//dtd hotjava strict html//", - "-//w3c//dtd html 3 1995-03-24//", - "-//w3c//dtd html 3.2 draft//", - "-//w3c//dtd html 3.2 final//", - "-//w3c//dtd html 3.2//", - "-//w3c//dtd html 3.2s draft//", - "-//w3c//dtd html 4.0 frameset//", - "-//w3c//dtd html 4.0 transitional//", - "-//w3c//dtd html experimental 19960712//", - "-//w3c//dtd html experimental 970421//", - "-//w3c//dtd w3 html//", - "-//w3o//dtd w3 html 3.0//", - "-//webtechs//dtd mozilla html 2.0//", - "-//webtechs//dtd mozilla html//")) or - publicId in ("-//w3o//dtd w3 html strict 3.0//en//", - "-/w3c/dtd html 4.0 transitional/en", - "html") or - publicId.startswith( - ("-//w3c//dtd html 4.01 frameset//", - "-//w3c//dtd html 4.01 transitional//")) and - systemId is None or - systemId and systemId.lower() == "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd"): - self.parser.compatMode = "quirks" - elif (publicId.startswith( - ("-//w3c//dtd xhtml 1.0 frameset//", - "-//w3c//dtd xhtml 1.0 transitional//")) or - publicId.startswith( - ("-//w3c//dtd html 4.01 frameset//", - "-//w3c//dtd html 4.01 transitional//")) and - systemId is not None): - self.parser.compatMode = "limited quirks" - - self.parser.phase = self.parser.phases["beforeHtml"] - - def anythingElse(self): - self.parser.compatMode = "quirks" - self.parser.phase = self.parser.phases["beforeHtml"] - - def processCharacters(self, token): - self.parser.parseError("expected-doctype-but-got-chars") - self.anythingElse() - return token - - def processStartTag(self, token): - self.parser.parseError("expected-doctype-but-got-start-tag", - {"name": token["name"]}) - self.anythingElse() - return token - - def processEndTag(self, token): - self.parser.parseError("expected-doctype-but-got-end-tag", - {"name": token["name"]}) - self.anythingElse() - return token - - def processEOF(self): - self.parser.parseError("expected-doctype-but-got-eof") - self.anythingElse() - return True - - class BeforeHtmlPhase(Phase): - # helper methods - def insertHtmlElement(self): - self.tree.insertRoot(impliedTagToken("html", "StartTag")) - self.parser.phase = self.parser.phases["beforeHead"] - - # other - def processEOF(self): - self.insertHtmlElement() - return True - - def processComment(self, token): - self.tree.insertComment(token, self.tree.document) - - def processSpaceCharacters(self, token): - pass - - def processCharacters(self, token): - self.insertHtmlElement() - return token - - def processStartTag(self, token): - if token["name"] == "html": - self.parser.firstStartTag = True - self.insertHtmlElement() - return token - - def processEndTag(self, token): - if token["name"] not in ("head", "body", "html", "br"): - self.parser.parseError("unexpected-end-tag-before-html", - {"name": token["name"]}) - else: - self.insertHtmlElement() - return token - - class BeforeHeadPhase(Phase): - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - - self.startTagHandler = _utils.MethodDispatcher([ - ("html", self.startTagHtml), - ("head", self.startTagHead) - ]) - self.startTagHandler.default = self.startTagOther - - self.endTagHandler = _utils.MethodDispatcher([ - (("head", "body", "html", "br"), self.endTagImplyHead) - ]) - self.endTagHandler.default = self.endTagOther - - def processEOF(self): - self.startTagHead(impliedTagToken("head", "StartTag")) - return True - - def processSpaceCharacters(self, token): - pass - - def processCharacters(self, token): - self.startTagHead(impliedTagToken("head", "StartTag")) - return token - - def startTagHtml(self, token): - return self.parser.phases["inBody"].processStartTag(token) - - def startTagHead(self, token): - self.tree.insertElement(token) - self.tree.headPointer = self.tree.openElements[-1] - self.parser.phase = self.parser.phases["inHead"] - - def startTagOther(self, token): - self.startTagHead(impliedTagToken("head", "StartTag")) - return token - - def endTagImplyHead(self, token): - self.startTagHead(impliedTagToken("head", "StartTag")) - return token - - def endTagOther(self, token): - self.parser.parseError("end-tag-after-implied-root", - {"name": token["name"]}) - - class InHeadPhase(Phase): - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - - self.startTagHandler = _utils.MethodDispatcher([ - ("html", self.startTagHtml), - ("title", self.startTagTitle), - (("noframes", "style"), self.startTagNoFramesStyle), - ("noscript", self.startTagNoscript), - ("script", self.startTagScript), - (("base", "basefont", "bgsound", "command", "link"), - self.startTagBaseLinkCommand), - ("meta", self.startTagMeta), - ("head", self.startTagHead) - ]) - self.startTagHandler.default = self.startTagOther - - self.endTagHandler = _utils.MethodDispatcher([ - ("head", self.endTagHead), - (("br", "html", "body"), self.endTagHtmlBodyBr) - ]) - self.endTagHandler.default = self.endTagOther - - # the real thing - def processEOF(self): - self.anythingElse() - return True - - def processCharacters(self, token): - self.anythingElse() - return token - - def startTagHtml(self, token): - return self.parser.phases["inBody"].processStartTag(token) - - def startTagHead(self, token): - self.parser.parseError("two-heads-are-not-better-than-one") - - def startTagBaseLinkCommand(self, token): - self.tree.insertElement(token) - self.tree.openElements.pop() - token["selfClosingAcknowledged"] = True - - def startTagMeta(self, token): - self.tree.insertElement(token) - self.tree.openElements.pop() - token["selfClosingAcknowledged"] = True - - attributes = token["data"] - if self.parser.tokenizer.stream.charEncoding[1] == "tentative": - if "charset" in attributes: - self.parser.tokenizer.stream.changeEncoding(attributes["charset"]) - elif ("content" in attributes and - "http-equiv" in attributes and - attributes["http-equiv"].lower() == "content-type"): - # Encoding it as UTF-8 here is a hack, as really we should pass - # the abstract Unicode string, and just use the - # ContentAttrParser on that, but using UTF-8 allows all chars - # to be encoded and as a ASCII-superset works. - data = _inputstream.EncodingBytes(attributes["content"].encode("utf-8")) - parser = _inputstream.ContentAttrParser(data) - codec = parser.parse() - self.parser.tokenizer.stream.changeEncoding(codec) - - def startTagTitle(self, token): - self.parser.parseRCDataRawtext(token, "RCDATA") - - def startTagNoFramesStyle(self, token): - # Need to decide whether to implement the scripting-disabled case - self.parser.parseRCDataRawtext(token, "RAWTEXT") - - def startTagNoscript(self, token): - if self.parser.scripting: - self.parser.parseRCDataRawtext(token, "RAWTEXT") - else: - self.tree.insertElement(token) - self.parser.phase = self.parser.phases["inHeadNoscript"] - - def startTagScript(self, token): - self.tree.insertElement(token) - self.parser.tokenizer.state = self.parser.tokenizer.scriptDataState - self.parser.originalPhase = self.parser.phase - self.parser.phase = self.parser.phases["text"] - - def startTagOther(self, token): - self.anythingElse() - return token - - def endTagHead(self, token): - node = self.parser.tree.openElements.pop() - assert node.name == "head", "Expected head got %s" % node.name - self.parser.phase = self.parser.phases["afterHead"] - - def endTagHtmlBodyBr(self, token): - self.anythingElse() - return token - - def endTagOther(self, token): - self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) - - def anythingElse(self): - self.endTagHead(impliedTagToken("head")) - - class InHeadNoscriptPhase(Phase): - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - - self.startTagHandler = _utils.MethodDispatcher([ - ("html", self.startTagHtml), - (("basefont", "bgsound", "link", "meta", "noframes", "style"), self.startTagBaseLinkCommand), - (("head", "noscript"), self.startTagHeadNoscript), - ]) - self.startTagHandler.default = self.startTagOther - - self.endTagHandler = _utils.MethodDispatcher([ - ("noscript", self.endTagNoscript), - ("br", self.endTagBr), - ]) - self.endTagHandler.default = self.endTagOther - - def processEOF(self): - self.parser.parseError("eof-in-head-noscript") - self.anythingElse() - return True - - def processComment(self, token): - return self.parser.phases["inHead"].processComment(token) - - def processCharacters(self, token): - self.parser.parseError("char-in-head-noscript") - self.anythingElse() - return token - - def processSpaceCharacters(self, token): - return self.parser.phases["inHead"].processSpaceCharacters(token) - - def startTagHtml(self, token): - return self.parser.phases["inBody"].processStartTag(token) - - def startTagBaseLinkCommand(self, token): - return self.parser.phases["inHead"].processStartTag(token) - - def startTagHeadNoscript(self, token): - self.parser.parseError("unexpected-start-tag", {"name": token["name"]}) - - def startTagOther(self, token): - self.parser.parseError("unexpected-inhead-noscript-tag", {"name": token["name"]}) - self.anythingElse() - return token - - def endTagNoscript(self, token): - node = self.parser.tree.openElements.pop() - assert node.name == "noscript", "Expected noscript got %s" % node.name - self.parser.phase = self.parser.phases["inHead"] - - def endTagBr(self, token): - self.parser.parseError("unexpected-inhead-noscript-tag", {"name": token["name"]}) - self.anythingElse() - return token - - def endTagOther(self, token): - self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) - - def anythingElse(self): - # Caller must raise parse error first! - self.endTagNoscript(impliedTagToken("noscript")) - - class AfterHeadPhase(Phase): - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - - self.startTagHandler = _utils.MethodDispatcher([ - ("html", self.startTagHtml), - ("body", self.startTagBody), - ("frameset", self.startTagFrameset), - (("base", "basefont", "bgsound", "link", "meta", "noframes", "script", - "style", "title"), - self.startTagFromHead), - ("head", self.startTagHead) - ]) - self.startTagHandler.default = self.startTagOther - self.endTagHandler = _utils.MethodDispatcher([(("body", "html", "br"), - self.endTagHtmlBodyBr)]) - self.endTagHandler.default = self.endTagOther - - def processEOF(self): - self.anythingElse() - return True - - def processCharacters(self, token): - self.anythingElse() - return token - - def startTagHtml(self, token): - return self.parser.phases["inBody"].processStartTag(token) - - def startTagBody(self, token): - self.parser.framesetOK = False - self.tree.insertElement(token) - self.parser.phase = self.parser.phases["inBody"] - - def startTagFrameset(self, token): - self.tree.insertElement(token) - self.parser.phase = self.parser.phases["inFrameset"] - - def startTagFromHead(self, token): - self.parser.parseError("unexpected-start-tag-out-of-my-head", - {"name": token["name"]}) - self.tree.openElements.append(self.tree.headPointer) - self.parser.phases["inHead"].processStartTag(token) - for node in self.tree.openElements[::-1]: - if node.name == "head": - self.tree.openElements.remove(node) - break - - def startTagHead(self, token): - self.parser.parseError("unexpected-start-tag", {"name": token["name"]}) - - def startTagOther(self, token): - self.anythingElse() - return token - - def endTagHtmlBodyBr(self, token): - self.anythingElse() - return token - - def endTagOther(self, token): - self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) - - def anythingElse(self): - self.tree.insertElement(impliedTagToken("body", "StartTag")) - self.parser.phase = self.parser.phases["inBody"] - self.parser.framesetOK = True - - class InBodyPhase(Phase): - # http://www.whatwg.org/specs/web-apps/current-work/#parsing-main-inbody - # the really-really-really-very crazy mode - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - - # Set this to the default handler - self.processSpaceCharacters = self.processSpaceCharactersNonPre - - self.startTagHandler = _utils.MethodDispatcher([ - ("html", self.startTagHtml), - (("base", "basefont", "bgsound", "command", "link", "meta", - "script", "style", "title"), - self.startTagProcessInHead), - ("body", self.startTagBody), - ("frameset", self.startTagFrameset), - (("address", "article", "aside", "blockquote", "center", "details", - "dir", "div", "dl", "fieldset", "figcaption", "figure", - "footer", "header", "hgroup", "main", "menu", "nav", "ol", "p", - "section", "summary", "ul"), - self.startTagCloseP), - (headingElements, self.startTagHeading), - (("pre", "listing"), self.startTagPreListing), - ("form", self.startTagForm), - (("li", "dd", "dt"), self.startTagListItem), - ("plaintext", self.startTagPlaintext), - ("a", self.startTagA), - (("b", "big", "code", "em", "font", "i", "s", "small", "strike", - "strong", "tt", "u"), self.startTagFormatting), - ("nobr", self.startTagNobr), - ("button", self.startTagButton), - (("applet", "marquee", "object"), self.startTagAppletMarqueeObject), - ("xmp", self.startTagXmp), - ("table", self.startTagTable), - (("area", "br", "embed", "img", "keygen", "wbr"), - self.startTagVoidFormatting), - (("param", "source", "track"), self.startTagParamSource), - ("input", self.startTagInput), - ("hr", self.startTagHr), - ("image", self.startTagImage), - ("isindex", self.startTagIsIndex), - ("textarea", self.startTagTextarea), - ("iframe", self.startTagIFrame), - ("noscript", self.startTagNoscript), - (("noembed", "noframes"), self.startTagRawtext), - ("select", self.startTagSelect), - (("rp", "rt"), self.startTagRpRt), - (("option", "optgroup"), self.startTagOpt), - (("math"), self.startTagMath), - (("svg"), self.startTagSvg), - (("caption", "col", "colgroup", "frame", "head", - "tbody", "td", "tfoot", "th", "thead", - "tr"), self.startTagMisplaced) - ]) - self.startTagHandler.default = self.startTagOther - - self.endTagHandler = _utils.MethodDispatcher([ - ("body", self.endTagBody), - ("html", self.endTagHtml), - (("address", "article", "aside", "blockquote", "button", "center", - "details", "dialog", "dir", "div", "dl", "fieldset", "figcaption", "figure", - "footer", "header", "hgroup", "listing", "main", "menu", "nav", "ol", "pre", - "section", "summary", "ul"), self.endTagBlock), - ("form", self.endTagForm), - ("p", self.endTagP), - (("dd", "dt", "li"), self.endTagListItem), - (headingElements, self.endTagHeading), - (("a", "b", "big", "code", "em", "font", "i", "nobr", "s", "small", - "strike", "strong", "tt", "u"), self.endTagFormatting), - (("applet", "marquee", "object"), self.endTagAppletMarqueeObject), - ("br", self.endTagBr), - ]) - self.endTagHandler.default = self.endTagOther - - def isMatchingFormattingElement(self, node1, node2): - return (node1.name == node2.name and - node1.namespace == node2.namespace and - node1.attributes == node2.attributes) - - # helper - def addFormattingElement(self, token): - self.tree.insertElement(token) - element = self.tree.openElements[-1] - - matchingElements = [] - for node in self.tree.activeFormattingElements[::-1]: - if node is Marker: - break - elif self.isMatchingFormattingElement(node, element): - matchingElements.append(node) - - assert len(matchingElements) <= 3 - if len(matchingElements) == 3: - self.tree.activeFormattingElements.remove(matchingElements[-1]) - self.tree.activeFormattingElements.append(element) - - # the real deal - def processEOF(self): - allowed_elements = frozenset(("dd", "dt", "li", "p", "tbody", "td", - "tfoot", "th", "thead", "tr", "body", - "html")) - for node in self.tree.openElements[::-1]: - if node.name not in allowed_elements: - self.parser.parseError("expected-closing-tag-but-got-eof") - break - # Stop parsing - - def processSpaceCharactersDropNewline(self, token): - # Sometimes (start of <pre>, <listing>, and <textarea> blocks) we - # want to drop leading newlines - data = token["data"] - self.processSpaceCharacters = self.processSpaceCharactersNonPre - if (data.startswith("\n") and - self.tree.openElements[-1].name in ("pre", "listing", "textarea") and - not self.tree.openElements[-1].hasContent()): - data = data[1:] - if data: - self.tree.reconstructActiveFormattingElements() - self.tree.insertText(data) - - def processCharacters(self, token): - if token["data"] == "\u0000": - # The tokenizer should always emit null on its own - return - self.tree.reconstructActiveFormattingElements() - self.tree.insertText(token["data"]) - # This must be bad for performance - if (self.parser.framesetOK and - any([char not in spaceCharacters - for char in token["data"]])): - self.parser.framesetOK = False - - def processSpaceCharactersNonPre(self, token): - self.tree.reconstructActiveFormattingElements() - self.tree.insertText(token["data"]) - - def startTagProcessInHead(self, token): - return self.parser.phases["inHead"].processStartTag(token) - - def startTagBody(self, token): - self.parser.parseError("unexpected-start-tag", {"name": "body"}) - if (len(self.tree.openElements) == 1 or - self.tree.openElements[1].name != "body"): - assert self.parser.innerHTML - else: - self.parser.framesetOK = False - for attr, value in token["data"].items(): - if attr not in self.tree.openElements[1].attributes: - self.tree.openElements[1].attributes[attr] = value - - def startTagFrameset(self, token): - self.parser.parseError("unexpected-start-tag", {"name": "frameset"}) - if (len(self.tree.openElements) == 1 or self.tree.openElements[1].name != "body"): - assert self.parser.innerHTML - elif not self.parser.framesetOK: - pass - else: - if self.tree.openElements[1].parent: - self.tree.openElements[1].parent.removeChild(self.tree.openElements[1]) - while self.tree.openElements[-1].name != "html": - self.tree.openElements.pop() - self.tree.insertElement(token) - self.parser.phase = self.parser.phases["inFrameset"] - - def startTagCloseP(self, token): - if self.tree.elementInScope("p", variant="button"): - self.endTagP(impliedTagToken("p")) - self.tree.insertElement(token) - - def startTagPreListing(self, token): - if self.tree.elementInScope("p", variant="button"): - self.endTagP(impliedTagToken("p")) - self.tree.insertElement(token) - self.parser.framesetOK = False - self.processSpaceCharacters = self.processSpaceCharactersDropNewline - - def startTagForm(self, token): - if self.tree.formPointer: - self.parser.parseError("unexpected-start-tag", {"name": "form"}) - else: - if self.tree.elementInScope("p", variant="button"): - self.endTagP(impliedTagToken("p")) - self.tree.insertElement(token) - self.tree.formPointer = self.tree.openElements[-1] - - def startTagListItem(self, token): - self.parser.framesetOK = False - - stopNamesMap = {"li": ["li"], - "dt": ["dt", "dd"], - "dd": ["dt", "dd"]} - stopNames = stopNamesMap[token["name"]] - for node in reversed(self.tree.openElements): - if node.name in stopNames: - self.parser.phase.processEndTag( - impliedTagToken(node.name, "EndTag")) - break - if (node.nameTuple in specialElements and - node.name not in ("address", "div", "p")): - break - - if self.tree.elementInScope("p", variant="button"): - self.parser.phase.processEndTag( - impliedTagToken("p", "EndTag")) - - self.tree.insertElement(token) - - def startTagPlaintext(self, token): - if self.tree.elementInScope("p", variant="button"): - self.endTagP(impliedTagToken("p")) - self.tree.insertElement(token) - self.parser.tokenizer.state = self.parser.tokenizer.plaintextState - - def startTagHeading(self, token): - if self.tree.elementInScope("p", variant="button"): - self.endTagP(impliedTagToken("p")) - if self.tree.openElements[-1].name in headingElements: - self.parser.parseError("unexpected-start-tag", {"name": token["name"]}) - self.tree.openElements.pop() - self.tree.insertElement(token) - - def startTagA(self, token): - afeAElement = self.tree.elementInActiveFormattingElements("a") - if afeAElement: - self.parser.parseError("unexpected-start-tag-implies-end-tag", - {"startName": "a", "endName": "a"}) - self.endTagFormatting(impliedTagToken("a")) - if afeAElement in self.tree.openElements: - self.tree.openElements.remove(afeAElement) - if afeAElement in self.tree.activeFormattingElements: - self.tree.activeFormattingElements.remove(afeAElement) - self.tree.reconstructActiveFormattingElements() - self.addFormattingElement(token) - - def startTagFormatting(self, token): - self.tree.reconstructActiveFormattingElements() - self.addFormattingElement(token) - - def startTagNobr(self, token): - self.tree.reconstructActiveFormattingElements() - if self.tree.elementInScope("nobr"): - self.parser.parseError("unexpected-start-tag-implies-end-tag", - {"startName": "nobr", "endName": "nobr"}) - self.processEndTag(impliedTagToken("nobr")) - # XXX Need tests that trigger the following - self.tree.reconstructActiveFormattingElements() - self.addFormattingElement(token) - - def startTagButton(self, token): - if self.tree.elementInScope("button"): - self.parser.parseError("unexpected-start-tag-implies-end-tag", - {"startName": "button", "endName": "button"}) - self.processEndTag(impliedTagToken("button")) - return token - else: - self.tree.reconstructActiveFormattingElements() - self.tree.insertElement(token) - self.parser.framesetOK = False - - def startTagAppletMarqueeObject(self, token): - self.tree.reconstructActiveFormattingElements() - self.tree.insertElement(token) - self.tree.activeFormattingElements.append(Marker) - self.parser.framesetOK = False - - def startTagXmp(self, token): - if self.tree.elementInScope("p", variant="button"): - self.endTagP(impliedTagToken("p")) - self.tree.reconstructActiveFormattingElements() - self.parser.framesetOK = False - self.parser.parseRCDataRawtext(token, "RAWTEXT") - - def startTagTable(self, token): - if self.parser.compatMode != "quirks": - if self.tree.elementInScope("p", variant="button"): - self.processEndTag(impliedTagToken("p")) - self.tree.insertElement(token) - self.parser.framesetOK = False - self.parser.phase = self.parser.phases["inTable"] - - def startTagVoidFormatting(self, token): - self.tree.reconstructActiveFormattingElements() - self.tree.insertElement(token) - self.tree.openElements.pop() - token["selfClosingAcknowledged"] = True - self.parser.framesetOK = False - - def startTagInput(self, token): - framesetOK = self.parser.framesetOK - self.startTagVoidFormatting(token) - if ("type" in token["data"] and - token["data"]["type"].translate(asciiUpper2Lower) == "hidden"): - # input type=hidden doesn't change framesetOK - self.parser.framesetOK = framesetOK - - def startTagParamSource(self, token): - self.tree.insertElement(token) - self.tree.openElements.pop() - token["selfClosingAcknowledged"] = True - - def startTagHr(self, token): - if self.tree.elementInScope("p", variant="button"): - self.endTagP(impliedTagToken("p")) - self.tree.insertElement(token) - self.tree.openElements.pop() - token["selfClosingAcknowledged"] = True - self.parser.framesetOK = False - - def startTagImage(self, token): - # No really... - self.parser.parseError("unexpected-start-tag-treated-as", - {"originalName": "image", "newName": "img"}) - self.processStartTag(impliedTagToken("img", "StartTag", - attributes=token["data"], - selfClosing=token["selfClosing"])) - - def startTagIsIndex(self, token): - self.parser.parseError("deprecated-tag", {"name": "isindex"}) - if self.tree.formPointer: - return - form_attrs = {} - if "action" in token["data"]: - form_attrs["action"] = token["data"]["action"] - self.processStartTag(impliedTagToken("form", "StartTag", - attributes=form_attrs)) - self.processStartTag(impliedTagToken("hr", "StartTag")) - self.processStartTag(impliedTagToken("label", "StartTag")) - # XXX Localization ... - if "prompt" in token["data"]: - prompt = token["data"]["prompt"] - else: - prompt = "This is a searchable index. Enter search keywords: " - self.processCharacters( - {"type": tokenTypes["Characters"], "data": prompt}) - attributes = token["data"].copy() - if "action" in attributes: - del attributes["action"] - if "prompt" in attributes: - del attributes["prompt"] - attributes["name"] = "isindex" - self.processStartTag(impliedTagToken("input", "StartTag", - attributes=attributes, - selfClosing=token["selfClosing"])) - self.processEndTag(impliedTagToken("label")) - self.processStartTag(impliedTagToken("hr", "StartTag")) - self.processEndTag(impliedTagToken("form")) - - def startTagTextarea(self, token): - self.tree.insertElement(token) - self.parser.tokenizer.state = self.parser.tokenizer.rcdataState - self.processSpaceCharacters = self.processSpaceCharactersDropNewline - self.parser.framesetOK = False - - def startTagIFrame(self, token): - self.parser.framesetOK = False - self.startTagRawtext(token) - - def startTagNoscript(self, token): - if self.parser.scripting: - self.startTagRawtext(token) - else: - self.startTagOther(token) - - def startTagRawtext(self, token): - """iframe, noembed noframes, noscript(if scripting enabled)""" - self.parser.parseRCDataRawtext(token, "RAWTEXT") - - def startTagOpt(self, token): - if self.tree.openElements[-1].name == "option": - self.parser.phase.processEndTag(impliedTagToken("option")) - self.tree.reconstructActiveFormattingElements() - self.parser.tree.insertElement(token) - - def startTagSelect(self, token): - self.tree.reconstructActiveFormattingElements() - self.tree.insertElement(token) - self.parser.framesetOK = False - if self.parser.phase in (self.parser.phases["inTable"], - self.parser.phases["inCaption"], - self.parser.phases["inColumnGroup"], - self.parser.phases["inTableBody"], - self.parser.phases["inRow"], - self.parser.phases["inCell"]): - self.parser.phase = self.parser.phases["inSelectInTable"] - else: - self.parser.phase = self.parser.phases["inSelect"] - - def startTagRpRt(self, token): - if self.tree.elementInScope("ruby"): - self.tree.generateImpliedEndTags() - if self.tree.openElements[-1].name != "ruby": - self.parser.parseError() - self.tree.insertElement(token) - - def startTagMath(self, token): - self.tree.reconstructActiveFormattingElements() - self.parser.adjustMathMLAttributes(token) - self.parser.adjustForeignAttributes(token) - token["namespace"] = namespaces["mathml"] - self.tree.insertElement(token) - # Need to get the parse error right for the case where the token - # has a namespace not equal to the xmlns attribute - if token["selfClosing"]: - self.tree.openElements.pop() - token["selfClosingAcknowledged"] = True - - def startTagSvg(self, token): - self.tree.reconstructActiveFormattingElements() - self.parser.adjustSVGAttributes(token) - self.parser.adjustForeignAttributes(token) - token["namespace"] = namespaces["svg"] - self.tree.insertElement(token) - # Need to get the parse error right for the case where the token - # has a namespace not equal to the xmlns attribute - if token["selfClosing"]: - self.tree.openElements.pop() - token["selfClosingAcknowledged"] = True - - def startTagMisplaced(self, token): - """ Elements that should be children of other elements that have a - different insertion mode; here they are ignored - "caption", "col", "colgroup", "frame", "frameset", "head", - "option", "optgroup", "tbody", "td", "tfoot", "th", "thead", - "tr", "noscript" - """ - self.parser.parseError("unexpected-start-tag-ignored", {"name": token["name"]}) - - def startTagOther(self, token): - self.tree.reconstructActiveFormattingElements() - self.tree.insertElement(token) - - def endTagP(self, token): - if not self.tree.elementInScope("p", variant="button"): - self.startTagCloseP(impliedTagToken("p", "StartTag")) - self.parser.parseError("unexpected-end-tag", {"name": "p"}) - self.endTagP(impliedTagToken("p", "EndTag")) - else: - self.tree.generateImpliedEndTags("p") - if self.tree.openElements[-1].name != "p": - self.parser.parseError("unexpected-end-tag", {"name": "p"}) - node = self.tree.openElements.pop() - while node.name != "p": - node = self.tree.openElements.pop() - - def endTagBody(self, token): - if not self.tree.elementInScope("body"): - self.parser.parseError() - return - elif self.tree.openElements[-1].name != "body": - for node in self.tree.openElements[2:]: - if node.name not in frozenset(("dd", "dt", "li", "optgroup", - "option", "p", "rp", "rt", - "tbody", "td", "tfoot", - "th", "thead", "tr", "body", - "html")): - # Not sure this is the correct name for the parse error - self.parser.parseError( - "expected-one-end-tag-but-got-another", - {"gotName": "body", "expectedName": node.name}) - break - self.parser.phase = self.parser.phases["afterBody"] - - def endTagHtml(self, token): - # We repeat the test for the body end tag token being ignored here - if self.tree.elementInScope("body"): - self.endTagBody(impliedTagToken("body")) - return token - - def endTagBlock(self, token): - # Put us back in the right whitespace handling mode - if token["name"] == "pre": - self.processSpaceCharacters = self.processSpaceCharactersNonPre - inScope = self.tree.elementInScope(token["name"]) - if inScope: - self.tree.generateImpliedEndTags() - if self.tree.openElements[-1].name != token["name"]: - self.parser.parseError("end-tag-too-early", {"name": token["name"]}) - if inScope: - node = self.tree.openElements.pop() - while node.name != token["name"]: - node = self.tree.openElements.pop() - - def endTagForm(self, token): - node = self.tree.formPointer - self.tree.formPointer = None - if node is None or not self.tree.elementInScope(node): - self.parser.parseError("unexpected-end-tag", - {"name": "form"}) - else: - self.tree.generateImpliedEndTags() - if self.tree.openElements[-1] != node: - self.parser.parseError("end-tag-too-early-ignored", - {"name": "form"}) - self.tree.openElements.remove(node) - - def endTagListItem(self, token): - if token["name"] == "li": - variant = "list" - else: - variant = None - if not self.tree.elementInScope(token["name"], variant=variant): - self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) - else: - self.tree.generateImpliedEndTags(exclude=token["name"]) - if self.tree.openElements[-1].name != token["name"]: - self.parser.parseError( - "end-tag-too-early", - {"name": token["name"]}) - node = self.tree.openElements.pop() - while node.name != token["name"]: - node = self.tree.openElements.pop() - - def endTagHeading(self, token): - for item in headingElements: - if self.tree.elementInScope(item): - self.tree.generateImpliedEndTags() - break - if self.tree.openElements[-1].name != token["name"]: - self.parser.parseError("end-tag-too-early", {"name": token["name"]}) - - for item in headingElements: - if self.tree.elementInScope(item): - item = self.tree.openElements.pop() - while item.name not in headingElements: - item = self.tree.openElements.pop() - break - - def endTagFormatting(self, token): - """The much-feared adoption agency algorithm""" - # http://svn.whatwg.org/webapps/complete.html#adoptionAgency revision 7867 - # XXX Better parseError messages appreciated. - - # Step 1 - outerLoopCounter = 0 - - # Step 2 - while outerLoopCounter < 8: - - # Step 3 - outerLoopCounter += 1 - - # Step 4: - - # Let the formatting element be the last element in - # the list of active formatting elements that: - # - is between the end of the list and the last scope - # marker in the list, if any, or the start of the list - # otherwise, and - # - has the same tag name as the token. - formattingElement = self.tree.elementInActiveFormattingElements( - token["name"]) - if (not formattingElement or - (formattingElement in self.tree.openElements and - not self.tree.elementInScope(formattingElement.name))): - # If there is no such node, then abort these steps - # and instead act as described in the "any other - # end tag" entry below. - self.endTagOther(token) - return - - # Otherwise, if there is such a node, but that node is - # not in the stack of open elements, then this is a - # parse error; remove the element from the list, and - # abort these steps. - elif formattingElement not in self.tree.openElements: - self.parser.parseError("adoption-agency-1.2", {"name": token["name"]}) - self.tree.activeFormattingElements.remove(formattingElement) - return - - # Otherwise, if there is such a node, and that node is - # also in the stack of open elements, but the element - # is not in scope, then this is a parse error; ignore - # the token, and abort these steps. - elif not self.tree.elementInScope(formattingElement.name): - self.parser.parseError("adoption-agency-4.4", {"name": token["name"]}) - return - - # Otherwise, there is a formatting element and that - # element is in the stack and is in scope. If the - # element is not the current node, this is a parse - # error. In any case, proceed with the algorithm as - # written in the following steps. - else: - if formattingElement != self.tree.openElements[-1]: - self.parser.parseError("adoption-agency-1.3", {"name": token["name"]}) - - # Step 5: - - # Let the furthest block be the topmost node in the - # stack of open elements that is lower in the stack - # than the formatting element, and is an element in - # the special category. There might not be one. - afeIndex = self.tree.openElements.index(formattingElement) - furthestBlock = None - for element in self.tree.openElements[afeIndex:]: - if element.nameTuple in specialElements: - furthestBlock = element - break - - # Step 6: - - # If there is no furthest block, then the UA must - # first pop all the nodes from the bottom of the stack - # of open elements, from the current node up to and - # including the formatting element, then remove the - # formatting element from the list of active - # formatting elements, and finally abort these steps. - if furthestBlock is None: - element = self.tree.openElements.pop() - while element != formattingElement: - element = self.tree.openElements.pop() - self.tree.activeFormattingElements.remove(element) - return - - # Step 7 - commonAncestor = self.tree.openElements[afeIndex - 1] - - # Step 8: - # The bookmark is supposed to help us identify where to reinsert - # nodes in step 15. We have to ensure that we reinsert nodes after - # the node before the active formatting element. Note the bookmark - # can move in step 9.7 - bookmark = self.tree.activeFormattingElements.index(formattingElement) - - # Step 9 - lastNode = node = furthestBlock - innerLoopCounter = 0 - - index = self.tree.openElements.index(node) - while innerLoopCounter < 3: - innerLoopCounter += 1 - # Node is element before node in open elements - index -= 1 - node = self.tree.openElements[index] - if node not in self.tree.activeFormattingElements: - self.tree.openElements.remove(node) - continue - # Step 9.6 - if node == formattingElement: - break - # Step 9.7 - if lastNode == furthestBlock: - bookmark = self.tree.activeFormattingElements.index(node) + 1 - # Step 9.8 - clone = node.cloneNode() - # Replace node with clone - self.tree.activeFormattingElements[ - self.tree.activeFormattingElements.index(node)] = clone - self.tree.openElements[ - self.tree.openElements.index(node)] = clone - node = clone - # Step 9.9 - # Remove lastNode from its parents, if any - if lastNode.parent: - lastNode.parent.removeChild(lastNode) - node.appendChild(lastNode) - # Step 9.10 - lastNode = node - - # Step 10 - # Foster parent lastNode if commonAncestor is a - # table, tbody, tfoot, thead, or tr we need to foster - # parent the lastNode - if lastNode.parent: - lastNode.parent.removeChild(lastNode) - - if commonAncestor.name in frozenset(("table", "tbody", "tfoot", "thead", "tr")): - parent, insertBefore = self.tree.getTableMisnestedNodePosition() - parent.insertBefore(lastNode, insertBefore) - else: - commonAncestor.appendChild(lastNode) - - # Step 11 - clone = formattingElement.cloneNode() - - # Step 12 - furthestBlock.reparentChildren(clone) - - # Step 13 - furthestBlock.appendChild(clone) - - # Step 14 - self.tree.activeFormattingElements.remove(formattingElement) - self.tree.activeFormattingElements.insert(bookmark, clone) - - # Step 15 - self.tree.openElements.remove(formattingElement) - self.tree.openElements.insert( - self.tree.openElements.index(furthestBlock) + 1, clone) - - def endTagAppletMarqueeObject(self, token): - if self.tree.elementInScope(token["name"]): - self.tree.generateImpliedEndTags() - if self.tree.openElements[-1].name != token["name"]: - self.parser.parseError("end-tag-too-early", {"name": token["name"]}) - - if self.tree.elementInScope(token["name"]): - element = self.tree.openElements.pop() - while element.name != token["name"]: - element = self.tree.openElements.pop() - self.tree.clearActiveFormattingElements() - - def endTagBr(self, token): - self.parser.parseError("unexpected-end-tag-treated-as", - {"originalName": "br", "newName": "br element"}) - self.tree.reconstructActiveFormattingElements() - self.tree.insertElement(impliedTagToken("br", "StartTag")) - self.tree.openElements.pop() - - def endTagOther(self, token): - for node in self.tree.openElements[::-1]: - if node.name == token["name"]: - self.tree.generateImpliedEndTags(exclude=token["name"]) - if self.tree.openElements[-1].name != token["name"]: - self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) - while self.tree.openElements.pop() != node: - pass - break - else: - if node.nameTuple in specialElements: - self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) - break - - class TextPhase(Phase): - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - self.startTagHandler = _utils.MethodDispatcher([]) - self.startTagHandler.default = self.startTagOther - self.endTagHandler = _utils.MethodDispatcher([ - ("script", self.endTagScript)]) - self.endTagHandler.default = self.endTagOther - - def processCharacters(self, token): - self.tree.insertText(token["data"]) - - def processEOF(self): - self.parser.parseError("expected-named-closing-tag-but-got-eof", - {"name": self.tree.openElements[-1].name}) - self.tree.openElements.pop() - self.parser.phase = self.parser.originalPhase - return True - - def startTagOther(self, token): - assert False, "Tried to process start tag %s in RCDATA/RAWTEXT mode" % token['name'] - - def endTagScript(self, token): - node = self.tree.openElements.pop() - assert node.name == "script" - self.parser.phase = self.parser.originalPhase - # The rest of this method is all stuff that only happens if - # document.write works - - def endTagOther(self, token): - self.tree.openElements.pop() - self.parser.phase = self.parser.originalPhase - - class InTablePhase(Phase): - # http://www.whatwg.org/specs/web-apps/current-work/#in-table - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - self.startTagHandler = _utils.MethodDispatcher([ - ("html", self.startTagHtml), - ("caption", self.startTagCaption), - ("colgroup", self.startTagColgroup), - ("col", self.startTagCol), - (("tbody", "tfoot", "thead"), self.startTagRowGroup), - (("td", "th", "tr"), self.startTagImplyTbody), - ("table", self.startTagTable), - (("style", "script"), self.startTagStyleScript), - ("input", self.startTagInput), - ("form", self.startTagForm) - ]) - self.startTagHandler.default = self.startTagOther - - self.endTagHandler = _utils.MethodDispatcher([ - ("table", self.endTagTable), - (("body", "caption", "col", "colgroup", "html", "tbody", "td", - "tfoot", "th", "thead", "tr"), self.endTagIgnore) - ]) - self.endTagHandler.default = self.endTagOther - - # helper methods - def clearStackToTableContext(self): - # "clear the stack back to a table context" - while self.tree.openElements[-1].name not in ("table", "html"): - # self.parser.parseError("unexpected-implied-end-tag-in-table", - # {"name": self.tree.openElements[-1].name}) - self.tree.openElements.pop() - # When the current node is <html> it's an innerHTML case - - # processing methods - def processEOF(self): - if self.tree.openElements[-1].name != "html": - self.parser.parseError("eof-in-table") - else: - assert self.parser.innerHTML - # Stop parsing - - def processSpaceCharacters(self, token): - originalPhase = self.parser.phase - self.parser.phase = self.parser.phases["inTableText"] - self.parser.phase.originalPhase = originalPhase - self.parser.phase.processSpaceCharacters(token) - - def processCharacters(self, token): - originalPhase = self.parser.phase - self.parser.phase = self.parser.phases["inTableText"] - self.parser.phase.originalPhase = originalPhase - self.parser.phase.processCharacters(token) - - def insertText(self, token): - # If we get here there must be at least one non-whitespace character - # Do the table magic! - self.tree.insertFromTable = True - self.parser.phases["inBody"].processCharacters(token) - self.tree.insertFromTable = False - - def startTagCaption(self, token): - self.clearStackToTableContext() - self.tree.activeFormattingElements.append(Marker) - self.tree.insertElement(token) - self.parser.phase = self.parser.phases["inCaption"] - - def startTagColgroup(self, token): - self.clearStackToTableContext() - self.tree.insertElement(token) - self.parser.phase = self.parser.phases["inColumnGroup"] - - def startTagCol(self, token): - self.startTagColgroup(impliedTagToken("colgroup", "StartTag")) - return token - - def startTagRowGroup(self, token): - self.clearStackToTableContext() - self.tree.insertElement(token) - self.parser.phase = self.parser.phases["inTableBody"] - - def startTagImplyTbody(self, token): - self.startTagRowGroup(impliedTagToken("tbody", "StartTag")) - return token - - def startTagTable(self, token): - self.parser.parseError("unexpected-start-tag-implies-end-tag", - {"startName": "table", "endName": "table"}) - self.parser.phase.processEndTag(impliedTagToken("table")) - if not self.parser.innerHTML: - return token - - def startTagStyleScript(self, token): - return self.parser.phases["inHead"].processStartTag(token) - - def startTagInput(self, token): - if ("type" in token["data"] and - token["data"]["type"].translate(asciiUpper2Lower) == "hidden"): - self.parser.parseError("unexpected-hidden-input-in-table") - self.tree.insertElement(token) - # XXX associate with form - self.tree.openElements.pop() - else: - self.startTagOther(token) - - def startTagForm(self, token): - self.parser.parseError("unexpected-form-in-table") - if self.tree.formPointer is None: - self.tree.insertElement(token) - self.tree.formPointer = self.tree.openElements[-1] - self.tree.openElements.pop() - - def startTagOther(self, token): - self.parser.parseError("unexpected-start-tag-implies-table-voodoo", {"name": token["name"]}) - # Do the table magic! - self.tree.insertFromTable = True - self.parser.phases["inBody"].processStartTag(token) - self.tree.insertFromTable = False - - def endTagTable(self, token): - if self.tree.elementInScope("table", variant="table"): - self.tree.generateImpliedEndTags() - if self.tree.openElements[-1].name != "table": - self.parser.parseError("end-tag-too-early-named", - {"gotName": "table", - "expectedName": self.tree.openElements[-1].name}) - while self.tree.openElements[-1].name != "table": - self.tree.openElements.pop() - self.tree.openElements.pop() - self.parser.resetInsertionMode() - else: - # innerHTML case - assert self.parser.innerHTML - self.parser.parseError() - - def endTagIgnore(self, token): - self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) - - def endTagOther(self, token): - self.parser.parseError("unexpected-end-tag-implies-table-voodoo", {"name": token["name"]}) - # Do the table magic! - self.tree.insertFromTable = True - self.parser.phases["inBody"].processEndTag(token) - self.tree.insertFromTable = False - - class InTableTextPhase(Phase): - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - self.originalPhase = None - self.characterTokens = [] - - def flushCharacters(self): - data = "".join([item["data"] for item in self.characterTokens]) - if any([item not in spaceCharacters for item in data]): - token = {"type": tokenTypes["Characters"], "data": data} - self.parser.phases["inTable"].insertText(token) - elif data: - self.tree.insertText(data) - self.characterTokens = [] - - def processComment(self, token): - self.flushCharacters() - self.parser.phase = self.originalPhase - return token - - def processEOF(self): - self.flushCharacters() - self.parser.phase = self.originalPhase - return True - - def processCharacters(self, token): - if token["data"] == "\u0000": - return - self.characterTokens.append(token) - - def processSpaceCharacters(self, token): - # pretty sure we should never reach here - self.characterTokens.append(token) - # assert False - - def processStartTag(self, token): - self.flushCharacters() - self.parser.phase = self.originalPhase - return token - - def processEndTag(self, token): - self.flushCharacters() - self.parser.phase = self.originalPhase - return token - - class InCaptionPhase(Phase): - # http://www.whatwg.org/specs/web-apps/current-work/#in-caption - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - - self.startTagHandler = _utils.MethodDispatcher([ - ("html", self.startTagHtml), - (("caption", "col", "colgroup", "tbody", "td", "tfoot", "th", - "thead", "tr"), self.startTagTableElement) - ]) - self.startTagHandler.default = self.startTagOther - - self.endTagHandler = _utils.MethodDispatcher([ - ("caption", self.endTagCaption), - ("table", self.endTagTable), - (("body", "col", "colgroup", "html", "tbody", "td", "tfoot", "th", - "thead", "tr"), self.endTagIgnore) - ]) - self.endTagHandler.default = self.endTagOther - - def ignoreEndTagCaption(self): - return not self.tree.elementInScope("caption", variant="table") - - def processEOF(self): - self.parser.phases["inBody"].processEOF() - - def processCharacters(self, token): - return self.parser.phases["inBody"].processCharacters(token) - - def startTagTableElement(self, token): - self.parser.parseError() - # XXX Have to duplicate logic here to find out if the tag is ignored - ignoreEndTag = self.ignoreEndTagCaption() - self.parser.phase.processEndTag(impliedTagToken("caption")) - if not ignoreEndTag: - return token - - def startTagOther(self, token): - return self.parser.phases["inBody"].processStartTag(token) - - def endTagCaption(self, token): - if not self.ignoreEndTagCaption(): - # AT this code is quite similar to endTagTable in "InTable" - self.tree.generateImpliedEndTags() - if self.tree.openElements[-1].name != "caption": - self.parser.parseError("expected-one-end-tag-but-got-another", - {"gotName": "caption", - "expectedName": self.tree.openElements[-1].name}) - while self.tree.openElements[-1].name != "caption": - self.tree.openElements.pop() - self.tree.openElements.pop() - self.tree.clearActiveFormattingElements() - self.parser.phase = self.parser.phases["inTable"] - else: - # innerHTML case - assert self.parser.innerHTML - self.parser.parseError() - - def endTagTable(self, token): - self.parser.parseError() - ignoreEndTag = self.ignoreEndTagCaption() - self.parser.phase.processEndTag(impliedTagToken("caption")) - if not ignoreEndTag: - return token - - def endTagIgnore(self, token): - self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) - - def endTagOther(self, token): - return self.parser.phases["inBody"].processEndTag(token) - - class InColumnGroupPhase(Phase): - # http://www.whatwg.org/specs/web-apps/current-work/#in-column - - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - - self.startTagHandler = _utils.MethodDispatcher([ - ("html", self.startTagHtml), - ("col", self.startTagCol) - ]) - self.startTagHandler.default = self.startTagOther - - self.endTagHandler = _utils.MethodDispatcher([ - ("colgroup", self.endTagColgroup), - ("col", self.endTagCol) - ]) - self.endTagHandler.default = self.endTagOther - - def ignoreEndTagColgroup(self): - return self.tree.openElements[-1].name == "html" - - def processEOF(self): - if self.tree.openElements[-1].name == "html": - assert self.parser.innerHTML - return - else: - ignoreEndTag = self.ignoreEndTagColgroup() - self.endTagColgroup(impliedTagToken("colgroup")) - if not ignoreEndTag: - return True - - def processCharacters(self, token): - ignoreEndTag = self.ignoreEndTagColgroup() - self.endTagColgroup(impliedTagToken("colgroup")) - if not ignoreEndTag: - return token - - def startTagCol(self, token): - self.tree.insertElement(token) - self.tree.openElements.pop() - token["selfClosingAcknowledged"] = True - - def startTagOther(self, token): - ignoreEndTag = self.ignoreEndTagColgroup() - self.endTagColgroup(impliedTagToken("colgroup")) - if not ignoreEndTag: - return token - - def endTagColgroup(self, token): - if self.ignoreEndTagColgroup(): - # innerHTML case - assert self.parser.innerHTML - self.parser.parseError() - else: - self.tree.openElements.pop() - self.parser.phase = self.parser.phases["inTable"] - - def endTagCol(self, token): - self.parser.parseError("no-end-tag", {"name": "col"}) - - def endTagOther(self, token): - ignoreEndTag = self.ignoreEndTagColgroup() - self.endTagColgroup(impliedTagToken("colgroup")) - if not ignoreEndTag: - return token - - class InTableBodyPhase(Phase): - # http://www.whatwg.org/specs/web-apps/current-work/#in-table0 - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - self.startTagHandler = _utils.MethodDispatcher([ - ("html", self.startTagHtml), - ("tr", self.startTagTr), - (("td", "th"), self.startTagTableCell), - (("caption", "col", "colgroup", "tbody", "tfoot", "thead"), - self.startTagTableOther) - ]) - self.startTagHandler.default = self.startTagOther - - self.endTagHandler = _utils.MethodDispatcher([ - (("tbody", "tfoot", "thead"), self.endTagTableRowGroup), - ("table", self.endTagTable), - (("body", "caption", "col", "colgroup", "html", "td", "th", - "tr"), self.endTagIgnore) - ]) - self.endTagHandler.default = self.endTagOther - - # helper methods - def clearStackToTableBodyContext(self): - while self.tree.openElements[-1].name not in ("tbody", "tfoot", - "thead", "html"): - # self.parser.parseError("unexpected-implied-end-tag-in-table", - # {"name": self.tree.openElements[-1].name}) - self.tree.openElements.pop() - if self.tree.openElements[-1].name == "html": - assert self.parser.innerHTML - - # the rest - def processEOF(self): - self.parser.phases["inTable"].processEOF() - - def processSpaceCharacters(self, token): - return self.parser.phases["inTable"].processSpaceCharacters(token) - - def processCharacters(self, token): - return self.parser.phases["inTable"].processCharacters(token) - - def startTagTr(self, token): - self.clearStackToTableBodyContext() - self.tree.insertElement(token) - self.parser.phase = self.parser.phases["inRow"] - - def startTagTableCell(self, token): - self.parser.parseError("unexpected-cell-in-table-body", - {"name": token["name"]}) - self.startTagTr(impliedTagToken("tr", "StartTag")) - return token - - def startTagTableOther(self, token): - # XXX AT Any ideas on how to share this with endTagTable? - if (self.tree.elementInScope("tbody", variant="table") or - self.tree.elementInScope("thead", variant="table") or - self.tree.elementInScope("tfoot", variant="table")): - self.clearStackToTableBodyContext() - self.endTagTableRowGroup( - impliedTagToken(self.tree.openElements[-1].name)) - return token - else: - # innerHTML case - assert self.parser.innerHTML - self.parser.parseError() - - def startTagOther(self, token): - return self.parser.phases["inTable"].processStartTag(token) - - def endTagTableRowGroup(self, token): - if self.tree.elementInScope(token["name"], variant="table"): - self.clearStackToTableBodyContext() - self.tree.openElements.pop() - self.parser.phase = self.parser.phases["inTable"] - else: - self.parser.parseError("unexpected-end-tag-in-table-body", - {"name": token["name"]}) - - def endTagTable(self, token): - if (self.tree.elementInScope("tbody", variant="table") or - self.tree.elementInScope("thead", variant="table") or - self.tree.elementInScope("tfoot", variant="table")): - self.clearStackToTableBodyContext() - self.endTagTableRowGroup( - impliedTagToken(self.tree.openElements[-1].name)) - return token - else: - # innerHTML case - assert self.parser.innerHTML - self.parser.parseError() - - def endTagIgnore(self, token): - self.parser.parseError("unexpected-end-tag-in-table-body", - {"name": token["name"]}) - - def endTagOther(self, token): - return self.parser.phases["inTable"].processEndTag(token) - - class InRowPhase(Phase): - # http://www.whatwg.org/specs/web-apps/current-work/#in-row - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - self.startTagHandler = _utils.MethodDispatcher([ - ("html", self.startTagHtml), - (("td", "th"), self.startTagTableCell), - (("caption", "col", "colgroup", "tbody", "tfoot", "thead", - "tr"), self.startTagTableOther) - ]) - self.startTagHandler.default = self.startTagOther - - self.endTagHandler = _utils.MethodDispatcher([ - ("tr", self.endTagTr), - ("table", self.endTagTable), - (("tbody", "tfoot", "thead"), self.endTagTableRowGroup), - (("body", "caption", "col", "colgroup", "html", "td", "th"), - self.endTagIgnore) - ]) - self.endTagHandler.default = self.endTagOther - - # helper methods (XXX unify this with other table helper methods) - def clearStackToTableRowContext(self): - while self.tree.openElements[-1].name not in ("tr", "html"): - self.parser.parseError("unexpected-implied-end-tag-in-table-row", - {"name": self.tree.openElements[-1].name}) - self.tree.openElements.pop() - - def ignoreEndTagTr(self): - return not self.tree.elementInScope("tr", variant="table") - - # the rest - def processEOF(self): - self.parser.phases["inTable"].processEOF() - - def processSpaceCharacters(self, token): - return self.parser.phases["inTable"].processSpaceCharacters(token) - - def processCharacters(self, token): - return self.parser.phases["inTable"].processCharacters(token) - - def startTagTableCell(self, token): - self.clearStackToTableRowContext() - self.tree.insertElement(token) - self.parser.phase = self.parser.phases["inCell"] - self.tree.activeFormattingElements.append(Marker) - - def startTagTableOther(self, token): - ignoreEndTag = self.ignoreEndTagTr() - self.endTagTr(impliedTagToken("tr")) - # XXX how are we sure it's always ignored in the innerHTML case? - if not ignoreEndTag: - return token - - def startTagOther(self, token): - return self.parser.phases["inTable"].processStartTag(token) - - def endTagTr(self, token): - if not self.ignoreEndTagTr(): - self.clearStackToTableRowContext() - self.tree.openElements.pop() - self.parser.phase = self.parser.phases["inTableBody"] - else: - # innerHTML case - assert self.parser.innerHTML - self.parser.parseError() - - def endTagTable(self, token): - ignoreEndTag = self.ignoreEndTagTr() - self.endTagTr(impliedTagToken("tr")) - # Reprocess the current tag if the tr end tag was not ignored - # XXX how are we sure it's always ignored in the innerHTML case? - if not ignoreEndTag: - return token - - def endTagTableRowGroup(self, token): - if self.tree.elementInScope(token["name"], variant="table"): - self.endTagTr(impliedTagToken("tr")) - return token - else: - self.parser.parseError() - - def endTagIgnore(self, token): - self.parser.parseError("unexpected-end-tag-in-table-row", - {"name": token["name"]}) - - def endTagOther(self, token): - return self.parser.phases["inTable"].processEndTag(token) - - class InCellPhase(Phase): - # http://www.whatwg.org/specs/web-apps/current-work/#in-cell - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - self.startTagHandler = _utils.MethodDispatcher([ - ("html", self.startTagHtml), - (("caption", "col", "colgroup", "tbody", "td", "tfoot", "th", - "thead", "tr"), self.startTagTableOther) - ]) - self.startTagHandler.default = self.startTagOther - - self.endTagHandler = _utils.MethodDispatcher([ - (("td", "th"), self.endTagTableCell), - (("body", "caption", "col", "colgroup", "html"), self.endTagIgnore), - (("table", "tbody", "tfoot", "thead", "tr"), self.endTagImply) - ]) - self.endTagHandler.default = self.endTagOther - - # helper - def closeCell(self): - if self.tree.elementInScope("td", variant="table"): - self.endTagTableCell(impliedTagToken("td")) - elif self.tree.elementInScope("th", variant="table"): - self.endTagTableCell(impliedTagToken("th")) - - # the rest - def processEOF(self): - self.parser.phases["inBody"].processEOF() - - def processCharacters(self, token): - return self.parser.phases["inBody"].processCharacters(token) - - def startTagTableOther(self, token): - if (self.tree.elementInScope("td", variant="table") or - self.tree.elementInScope("th", variant="table")): - self.closeCell() - return token - else: - # innerHTML case - assert self.parser.innerHTML - self.parser.parseError() - - def startTagOther(self, token): - return self.parser.phases["inBody"].processStartTag(token) - - def endTagTableCell(self, token): - if self.tree.elementInScope(token["name"], variant="table"): - self.tree.generateImpliedEndTags(token["name"]) - if self.tree.openElements[-1].name != token["name"]: - self.parser.parseError("unexpected-cell-end-tag", - {"name": token["name"]}) - while True: - node = self.tree.openElements.pop() - if node.name == token["name"]: - break - else: - self.tree.openElements.pop() - self.tree.clearActiveFormattingElements() - self.parser.phase = self.parser.phases["inRow"] - else: - self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) - - def endTagIgnore(self, token): - self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) - - def endTagImply(self, token): - if self.tree.elementInScope(token["name"], variant="table"): - self.closeCell() - return token - else: - # sometimes innerHTML case - self.parser.parseError() - - def endTagOther(self, token): - return self.parser.phases["inBody"].processEndTag(token) - - class InSelectPhase(Phase): - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - - self.startTagHandler = _utils.MethodDispatcher([ - ("html", self.startTagHtml), - ("option", self.startTagOption), - ("optgroup", self.startTagOptgroup), - ("select", self.startTagSelect), - (("input", "keygen", "textarea"), self.startTagInput), - ("script", self.startTagScript) - ]) - self.startTagHandler.default = self.startTagOther - - self.endTagHandler = _utils.MethodDispatcher([ - ("option", self.endTagOption), - ("optgroup", self.endTagOptgroup), - ("select", self.endTagSelect) - ]) - self.endTagHandler.default = self.endTagOther - - # http://www.whatwg.org/specs/web-apps/current-work/#in-select - def processEOF(self): - if self.tree.openElements[-1].name != "html": - self.parser.parseError("eof-in-select") - else: - assert self.parser.innerHTML - - def processCharacters(self, token): - if token["data"] == "\u0000": - return - self.tree.insertText(token["data"]) - - def startTagOption(self, token): - # We need to imply </option> if <option> is the current node. - if self.tree.openElements[-1].name == "option": - self.tree.openElements.pop() - self.tree.insertElement(token) - - def startTagOptgroup(self, token): - if self.tree.openElements[-1].name == "option": - self.tree.openElements.pop() - if self.tree.openElements[-1].name == "optgroup": - self.tree.openElements.pop() - self.tree.insertElement(token) - - def startTagSelect(self, token): - self.parser.parseError("unexpected-select-in-select") - self.endTagSelect(impliedTagToken("select")) - - def startTagInput(self, token): - self.parser.parseError("unexpected-input-in-select") - if self.tree.elementInScope("select", variant="select"): - self.endTagSelect(impliedTagToken("select")) - return token - else: - assert self.parser.innerHTML - - def startTagScript(self, token): - return self.parser.phases["inHead"].processStartTag(token) - - def startTagOther(self, token): - self.parser.parseError("unexpected-start-tag-in-select", - {"name": token["name"]}) - - def endTagOption(self, token): - if self.tree.openElements[-1].name == "option": - self.tree.openElements.pop() - else: - self.parser.parseError("unexpected-end-tag-in-select", - {"name": "option"}) - - def endTagOptgroup(self, token): - # </optgroup> implicitly closes <option> - if (self.tree.openElements[-1].name == "option" and - self.tree.openElements[-2].name == "optgroup"): - self.tree.openElements.pop() - # It also closes </optgroup> - if self.tree.openElements[-1].name == "optgroup": - self.tree.openElements.pop() - # But nothing else - else: - self.parser.parseError("unexpected-end-tag-in-select", - {"name": "optgroup"}) - - def endTagSelect(self, token): - if self.tree.elementInScope("select", variant="select"): - node = self.tree.openElements.pop() - while node.name != "select": - node = self.tree.openElements.pop() - self.parser.resetInsertionMode() - else: - # innerHTML case - assert self.parser.innerHTML - self.parser.parseError() - - def endTagOther(self, token): - self.parser.parseError("unexpected-end-tag-in-select", - {"name": token["name"]}) - - class InSelectInTablePhase(Phase): - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - - self.startTagHandler = _utils.MethodDispatcher([ - (("caption", "table", "tbody", "tfoot", "thead", "tr", "td", "th"), - self.startTagTable) - ]) - self.startTagHandler.default = self.startTagOther - - self.endTagHandler = _utils.MethodDispatcher([ - (("caption", "table", "tbody", "tfoot", "thead", "tr", "td", "th"), - self.endTagTable) - ]) - self.endTagHandler.default = self.endTagOther - - def processEOF(self): - self.parser.phases["inSelect"].processEOF() - - def processCharacters(self, token): - return self.parser.phases["inSelect"].processCharacters(token) - - def startTagTable(self, token): - self.parser.parseError("unexpected-table-element-start-tag-in-select-in-table", {"name": token["name"]}) - self.endTagOther(impliedTagToken("select")) - return token - - def startTagOther(self, token): - return self.parser.phases["inSelect"].processStartTag(token) - - def endTagTable(self, token): - self.parser.parseError("unexpected-table-element-end-tag-in-select-in-table", {"name": token["name"]}) - if self.tree.elementInScope(token["name"], variant="table"): - self.endTagOther(impliedTagToken("select")) - return token - - def endTagOther(self, token): - return self.parser.phases["inSelect"].processEndTag(token) - - class InForeignContentPhase(Phase): - breakoutElements = frozenset(["b", "big", "blockquote", "body", "br", - "center", "code", "dd", "div", "dl", "dt", - "em", "embed", "h1", "h2", "h3", - "h4", "h5", "h6", "head", "hr", "i", "img", - "li", "listing", "menu", "meta", "nobr", - "ol", "p", "pre", "ruby", "s", "small", - "span", "strong", "strike", "sub", "sup", - "table", "tt", "u", "ul", "var"]) - - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - - def adjustSVGTagNames(self, token): - replacements = {"altglyph": "altGlyph", - "altglyphdef": "altGlyphDef", - "altglyphitem": "altGlyphItem", - "animatecolor": "animateColor", - "animatemotion": "animateMotion", - "animatetransform": "animateTransform", - "clippath": "clipPath", - "feblend": "feBlend", - "fecolormatrix": "feColorMatrix", - "fecomponenttransfer": "feComponentTransfer", - "fecomposite": "feComposite", - "feconvolvematrix": "feConvolveMatrix", - "fediffuselighting": "feDiffuseLighting", - "fedisplacementmap": "feDisplacementMap", - "fedistantlight": "feDistantLight", - "feflood": "feFlood", - "fefunca": "feFuncA", - "fefuncb": "feFuncB", - "fefuncg": "feFuncG", - "fefuncr": "feFuncR", - "fegaussianblur": "feGaussianBlur", - "feimage": "feImage", - "femerge": "feMerge", - "femergenode": "feMergeNode", - "femorphology": "feMorphology", - "feoffset": "feOffset", - "fepointlight": "fePointLight", - "fespecularlighting": "feSpecularLighting", - "fespotlight": "feSpotLight", - "fetile": "feTile", - "feturbulence": "feTurbulence", - "foreignobject": "foreignObject", - "glyphref": "glyphRef", - "lineargradient": "linearGradient", - "radialgradient": "radialGradient", - "textpath": "textPath"} - - if token["name"] in replacements: - token["name"] = replacements[token["name"]] - - def processCharacters(self, token): - if token["data"] == "\u0000": - token["data"] = "\uFFFD" - elif (self.parser.framesetOK and - any(char not in spaceCharacters for char in token["data"])): - self.parser.framesetOK = False - Phase.processCharacters(self, token) - - def processStartTag(self, token): - currentNode = self.tree.openElements[-1] - if (token["name"] in self.breakoutElements or - (token["name"] == "font" and - set(token["data"].keys()) & set(["color", "face", "size"]))): - self.parser.parseError("unexpected-html-element-in-foreign-content", - {"name": token["name"]}) - while (self.tree.openElements[-1].namespace != - self.tree.defaultNamespace and - not self.parser.isHTMLIntegrationPoint(self.tree.openElements[-1]) and - not self.parser.isMathMLTextIntegrationPoint(self.tree.openElements[-1])): - self.tree.openElements.pop() - return token - - else: - if currentNode.namespace == namespaces["mathml"]: - self.parser.adjustMathMLAttributes(token) - elif currentNode.namespace == namespaces["svg"]: - self.adjustSVGTagNames(token) - self.parser.adjustSVGAttributes(token) - self.parser.adjustForeignAttributes(token) - token["namespace"] = currentNode.namespace - self.tree.insertElement(token) - if token["selfClosing"]: - self.tree.openElements.pop() - token["selfClosingAcknowledged"] = True - - def processEndTag(self, token): - nodeIndex = len(self.tree.openElements) - 1 - node = self.tree.openElements[-1] - if node.name.translate(asciiUpper2Lower) != token["name"]: - self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) - - while True: - if node.name.translate(asciiUpper2Lower) == token["name"]: - # XXX this isn't in the spec but it seems necessary - if self.parser.phase == self.parser.phases["inTableText"]: - self.parser.phase.flushCharacters() - self.parser.phase = self.parser.phase.originalPhase - while self.tree.openElements.pop() != node: - assert self.tree.openElements - new_token = None - break - nodeIndex -= 1 - - node = self.tree.openElements[nodeIndex] - if node.namespace != self.tree.defaultNamespace: - continue - else: - new_token = self.parser.phase.processEndTag(token) - break - return new_token - - class AfterBodyPhase(Phase): - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - - self.startTagHandler = _utils.MethodDispatcher([ - ("html", self.startTagHtml) - ]) - self.startTagHandler.default = self.startTagOther - - self.endTagHandler = _utils.MethodDispatcher([("html", self.endTagHtml)]) - self.endTagHandler.default = self.endTagOther - - def processEOF(self): - # Stop parsing - pass - - def processComment(self, token): - # This is needed because data is to be appended to the <html> element - # here and not to whatever is currently open. - self.tree.insertComment(token, self.tree.openElements[0]) - - def processCharacters(self, token): - self.parser.parseError("unexpected-char-after-body") - self.parser.phase = self.parser.phases["inBody"] - return token - - def startTagHtml(self, token): - return self.parser.phases["inBody"].processStartTag(token) - - def startTagOther(self, token): - self.parser.parseError("unexpected-start-tag-after-body", - {"name": token["name"]}) - self.parser.phase = self.parser.phases["inBody"] - return token - - def endTagHtml(self, name): - if self.parser.innerHTML: - self.parser.parseError("unexpected-end-tag-after-body-innerhtml") - else: - self.parser.phase = self.parser.phases["afterAfterBody"] - - def endTagOther(self, token): - self.parser.parseError("unexpected-end-tag-after-body", - {"name": token["name"]}) - self.parser.phase = self.parser.phases["inBody"] - return token - - class InFramesetPhase(Phase): - # http://www.whatwg.org/specs/web-apps/current-work/#in-frameset - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - - self.startTagHandler = _utils.MethodDispatcher([ - ("html", self.startTagHtml), - ("frameset", self.startTagFrameset), - ("frame", self.startTagFrame), - ("noframes", self.startTagNoframes) - ]) - self.startTagHandler.default = self.startTagOther - - self.endTagHandler = _utils.MethodDispatcher([ - ("frameset", self.endTagFrameset) - ]) - self.endTagHandler.default = self.endTagOther - - def processEOF(self): - if self.tree.openElements[-1].name != "html": - self.parser.parseError("eof-in-frameset") - else: - assert self.parser.innerHTML - - def processCharacters(self, token): - self.parser.parseError("unexpected-char-in-frameset") - - def startTagFrameset(self, token): - self.tree.insertElement(token) - - def startTagFrame(self, token): - self.tree.insertElement(token) - self.tree.openElements.pop() - - def startTagNoframes(self, token): - return self.parser.phases["inBody"].processStartTag(token) - - def startTagOther(self, token): - self.parser.parseError("unexpected-start-tag-in-frameset", - {"name": token["name"]}) - - def endTagFrameset(self, token): - if self.tree.openElements[-1].name == "html": - # innerHTML case - self.parser.parseError("unexpected-frameset-in-frameset-innerhtml") - else: - self.tree.openElements.pop() - if (not self.parser.innerHTML and - self.tree.openElements[-1].name != "frameset"): - # If we're not in innerHTML mode and the current node is not a - # "frameset" element (anymore) then switch. - self.parser.phase = self.parser.phases["afterFrameset"] - - def endTagOther(self, token): - self.parser.parseError("unexpected-end-tag-in-frameset", - {"name": token["name"]}) - - class AfterFramesetPhase(Phase): - # http://www.whatwg.org/specs/web-apps/current-work/#after3 - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - - self.startTagHandler = _utils.MethodDispatcher([ - ("html", self.startTagHtml), - ("noframes", self.startTagNoframes) - ]) - self.startTagHandler.default = self.startTagOther - - self.endTagHandler = _utils.MethodDispatcher([ - ("html", self.endTagHtml) - ]) - self.endTagHandler.default = self.endTagOther - - def processEOF(self): - # Stop parsing - pass - - def processCharacters(self, token): - self.parser.parseError("unexpected-char-after-frameset") - - def startTagNoframes(self, token): - return self.parser.phases["inHead"].processStartTag(token) - - def startTagOther(self, token): - self.parser.parseError("unexpected-start-tag-after-frameset", - {"name": token["name"]}) - - def endTagHtml(self, token): - self.parser.phase = self.parser.phases["afterAfterFrameset"] - - def endTagOther(self, token): - self.parser.parseError("unexpected-end-tag-after-frameset", - {"name": token["name"]}) - - class AfterAfterBodyPhase(Phase): - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - - self.startTagHandler = _utils.MethodDispatcher([ - ("html", self.startTagHtml) - ]) - self.startTagHandler.default = self.startTagOther - - def processEOF(self): - pass - - def processComment(self, token): - self.tree.insertComment(token, self.tree.document) - - def processSpaceCharacters(self, token): - return self.parser.phases["inBody"].processSpaceCharacters(token) - - def processCharacters(self, token): - self.parser.parseError("expected-eof-but-got-char") - self.parser.phase = self.parser.phases["inBody"] - return token - - def startTagHtml(self, token): - return self.parser.phases["inBody"].processStartTag(token) - - def startTagOther(self, token): - self.parser.parseError("expected-eof-but-got-start-tag", - {"name": token["name"]}) - self.parser.phase = self.parser.phases["inBody"] - return token - - def processEndTag(self, token): - self.parser.parseError("expected-eof-but-got-end-tag", - {"name": token["name"]}) - self.parser.phase = self.parser.phases["inBody"] - return token - - class AfterAfterFramesetPhase(Phase): - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - - self.startTagHandler = _utils.MethodDispatcher([ - ("html", self.startTagHtml), - ("noframes", self.startTagNoFrames) - ]) - self.startTagHandler.default = self.startTagOther - - def processEOF(self): - pass - - def processComment(self, token): - self.tree.insertComment(token, self.tree.document) - - def processSpaceCharacters(self, token): - return self.parser.phases["inBody"].processSpaceCharacters(token) - - def processCharacters(self, token): - self.parser.parseError("expected-eof-but-got-char") - - def startTagHtml(self, token): - return self.parser.phases["inBody"].processStartTag(token) - - def startTagNoFrames(self, token): - return self.parser.phases["inHead"].processStartTag(token) - - def startTagOther(self, token): - self.parser.parseError("expected-eof-but-got-start-tag", - {"name": token["name"]}) - - def processEndTag(self, token): - self.parser.parseError("expected-eof-but-got-end-tag", - {"name": token["name"]}) - # pylint:enable=unused-argument - - return { - "initial": InitialPhase, - "beforeHtml": BeforeHtmlPhase, - "beforeHead": BeforeHeadPhase, - "inHead": InHeadPhase, - "inHeadNoscript": InHeadNoscriptPhase, - "afterHead": AfterHeadPhase, - "inBody": InBodyPhase, - "text": TextPhase, - "inTable": InTablePhase, - "inTableText": InTableTextPhase, - "inCaption": InCaptionPhase, - "inColumnGroup": InColumnGroupPhase, - "inTableBody": InTableBodyPhase, - "inRow": InRowPhase, - "inCell": InCellPhase, - "inSelect": InSelectPhase, - "inSelectInTable": InSelectInTablePhase, - "inForeignContent": InForeignContentPhase, - "afterBody": AfterBodyPhase, - "inFrameset": InFramesetPhase, - "afterFrameset": AfterFramesetPhase, - "afterAfterBody": AfterAfterBodyPhase, - "afterAfterFrameset": AfterAfterFramesetPhase, - # XXX after after frameset - } - - -def adjust_attributes(token, replacements): - needs_adjustment = viewkeys(token['data']) & viewkeys(replacements) - if needs_adjustment: - token['data'] = OrderedDict((replacements.get(k, k), v) - for k, v in token['data'].items()) - - -def impliedTagToken(name, type="EndTag", attributes=None, - selfClosing=False): - if attributes is None: - attributes = {} - return {"type": tokenTypes[type], "name": name, "data": attributes, - "selfClosing": selfClosing} - - -class ParseError(Exception): - """Error in parsed document""" - pass diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/html5parser.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/html5parser.pyc deleted file mode 100644 index ab41c8c7c9bb449a8ae08466287624bb37d2e389..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 141299 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�$7Ge2@||cI{G8Gh$ZEv2JhsN^2{i+*Q5ix~7GI6erEclB#Eq zp#OKY>M-$3eC%>h3;gPNTN<NcLN40v2)Ssk$$Xr)DX$8W#_aX@b+qajd)$kJcXVOX z{Ve(;+@xm_<_=aLINCN!dLD03z^a2Om1wHCZ%Ph*Sjp1Pe0_8h<}<IJt9@ns0WqU- z6@V)&^<Wlh*fbvG!zu{&vP<2Gw9rrYFpLh=j2G^t$}p+m_u?<5%FMs+_E;Gk%F$bB zy%w|WG`=k=*HS1SJCqTIM072;#?F{$d52E_cTmop#11hf4o7<aTk-7_|HC!3(>V35 ze1_k3)<v<o?<C&PtJ1tgZvwx$1`N<GV1!&G2jUU=0#V~1K_ZPu80N<9dLm8;<0Wa% z6#?5x?o)gaxzFziF1!%GE=B6L!!I3jZi-HB+)U)-hPq=(tq3#fycRb=mx~Xf!i`4z zkIx?q@b8qv8{`4|HkphAwU%=d;WBB)MZe<-6=L{#S+L`tSQ67(VS$lgGrH@QBvKqF z*i{B|BZ4tHfINqMV1RlpjC~q?V1QCh>y%_FoM<ki1uYx#OL{<j*BR#&p+?9JUAJBl zxLPRKy_D$Q;ft2Y2352+<##|#OPI{8xU&BbwCX*aCAT8M2q!C{v1Q2j0r2?ze<(kI z5CmItE4uKVZE7~qKOnc?W@8i-Pw<a+i4$6Ph>{7enx#n!aY2!d5!K1wD)cvK+8p5| zeOrEAEJP9CIZZ@AK7#~>8)z#)8mKzj<_H2vhPeZfc8Hj`a)6F=WH#Xyd03<{63Ltg zJ%A`>ZZ)i$wB~D7ueqf6#xCjnY|bbL-^S<veN1K`6U#A~TVU?vHkbD5ez8lr`R^Cu z(Xg?HHf&lvh{~|om_CbU3%9(CHtY3Km{Y13O%nSpWLbcQWQ;o&kV7n@<wZ*g!I?}F zZ4-nlMBD!|vaI|qT6m6#K#?-Qa<Uo<4VpM^$=!y(bU+qUMi_a-_y}$|^7yCm22kzR z;&k8^L4O(##buzM7n?E^*}gR6COY>4*L*ag4)0E|IkZp`Prgl6rnwQZMv^QNZbW!w zpEPwPk$h|^9-?i>n&H7P-dTVLqmIK)(My@WsCc$rKnVgQm_eWPjB*u!ho-&C;Ww^= zVYIg4w-#QYoA}oTpJ?m{|MR$MrwRxc-ot56v#xkRB7-9T#O0u7AqM0cFKPhIMceN^ zNl)}|RRKGfN9q@nh|57v8df}(S$f#iUorLgkyNGqi%<`1kvu3bqm7^&cZ+VAKZ7Gf ze;I!~Rc`+0+IUrhLPUe4AN$sL&*(3<F{wM7s(Bw?n5?$SOA;A!2SuS$LSMS!(*c(2 zLSNK|tgOU;k4AnoG3zEIXwMsfopfvNw)|$07Ougxp>`uKzl!1)_Rz?8_$3P!<*`Xr zB*Ku{6UaoU`S|?u0ROZ#5eOpfDcM-!9vE7Z4O81`FAOksp;7{*<HCFFi_dHQ>iFWt z_=})C=8NFv92ihQ?Z5(mx=We)9|%qzpT8L3-zm%t=QwBd#UoPp1xL8B3ZO`NCM6W* z05cNQ=pwer@?Jpz%M6Gv-0k|kL<O?;6nV*(^>c**nW5<75rG`>a{R=8>;;H0#VJ$X z)eHJT9t1&;b}HQyJVZtV1EsOzU}Kpe`+?P_Cm3p!`N!qsMfi-g;#-v<Uy?&;D0?b& zA!`Q#`b67{7~0qMqM;AGRm^)5U&9x@zYSUe0T;?(3hJ&JYh3DUjnAiQTHd9m&aYDz zCj#Fi@@Fj==<;5&_JQHTMlCgh4l~PwOUpQ$JRsou0y%D5a0$c}^$i7x^-177pTjN6 z9-n_chkvJDk-X2?eZQO-x6U9q8;ECLaA7;&#%I{Lf8C|P{CA-W>%W0TzA^?~dyK)8 zRJmpNl1*rXpl>`3j?04HO9R0r_!VJT;p7v)$R5f`=h9GcVN>pv6?8)*YCO`zG*JVk zu}8Tlco;?edw4XA+VHM#8fWf5&ifJ^K-HX^zavkesyXC*-=EheY2@4STt61SB(;XU zgzs&>)Gs5=U~mSJ@Bk|q=gmH^?)mTfE<BoKdvvxjR6Cf>CJ*p<hv@bmOPpEDC&V*r z<C%5wJsJX#q4B5OE6;a*1soE*yl^<k8rH(`|JEMYwhe6di-?}HD!7EBN>>GEHnQ?p z&>h&?>1=?PlkZ_E_Z<aS4x{5rH4I>4DR*Ndm!2RABsK@HV60IP)wd0V&7|ZJ3Z^kY zdrSy&_wM`vh%9EW4nJ+(4JvYSCM?XhCTB*cz{H2;LaA)ZfdT^B)+V71u1>@65H^|$ z3I`Rc5-_<TlgG4qtVLZ){Mx9!Ho9l${av3wu=4>U?cHD6tB{ixFP<(3mXa7w-bz|w zdzOkOFPEvSeTQV$mW?f5y(NM405g7?mt^hG&Kq*5uz=CRi@?6dgKXrxv;&LP(9U%P zM688l(5V+!Gjk0t^1ejCbFj)5H->70CcShJG+4VE5QDcCHsJNi7mp*NA~o~c8E<;} zgCV%@P;oM&(1OvZCaUtuxLYYHOH!f~R|=eP7e>$4>vM<dE&8}A^e<U?i@)q_3)<U{ z{hk)Hm>rsGMX&}mng<!&w>XI>iqFCj{Po%sH3X|})+4<(QLmrHu?lB(Q!O=`>O4g^ zwYO4(JvG&U;&wuWa1^8rN_XK|1{PuNll>7c!e58x1$})zt9u3q2e1$?=knVNJxSj> z?N;vX+lart{hM;P^>2g-xEUg0U#@?Uhv!i^L^yz+4a+yecGs8Rh$n-2TJfks=!3^< zFMeC|Lp|H_+j4z919-YJKiG%AD2pAf`IS9GJuC4)eB<zQ&Q3jO5uv7K{}+*P6Wvx? z3INc=+!a3s7nmp%KoPvz+({c;ld$?DN2YU-2)AUX<&5s%`1$x7AZzk~A@gy!6xy;B z#}dbnbtyOhe&a#$UGa#d%?Z=zY06Ss1~GjJ@4qC!r#Xg0SxV7jo1{BMP9k~+5HSx# zJc)^IQ5}I$(lz9{(HRbviCWGh1Z~<LAus|<_^AUIh#M>|%@eKqU>w1GNOXuZ#7MEA z#)k~&Sc@cUp@m^I<*`nQ4~L;psoUnRKB(uhfl><KZeHu=kZ}lwO+ln_UIAd34gcfJ z@P_>CX$=1Z+V?VtjooE*n~k6yF4|iUo{&^){{A5n7k)c6VwwgRH#_O{lTJa10g5Fw zuvZ_6%VRQwVK&h%7W*-priDzsgE{`1-Z5p6R~n{F&6s}|%vVwsKy`p2ha5rr@B_j8 z*HbpTNpoAywd8_ui?WMX$rtd?ggGLpbApQ*hGGHZxrm}Er87#D>YCySPJ9|w7X8B8 zIf1$EWMBf5ftV&HNM)ESfW}j%zb$t&bnU%3F#Ois$b;<21H348kST@D=8krS1U9ea zS!VneFTc$TWq&(aP!_x2<Lzg8`F&pgfS2Fpg*aCHBVPU^FMrI-pYZaZc==Oa{*0Hu z;N{PG`Ac57zoPh`d7-y)k)F53Px113Uj7>||AiO285QZYQv7RP{yQ(P^CFv})cRDQ z7yp(Qs?dtmb`&Y+78Q?zG|oc!6IeE8coY;r9N#t?NbQ=7D(B#jwF|N1c1_i*INz$V z>%A9tUECW@)XtyXvv0n(dtdaxzR8Ch7al3UH`<N=rssB@+%;F38wFp~M9k;W=AL8I z<Hz|(zwvWm#p=;6nspwmRwgU~z6w4OJK>1`oA~bcV!}42kN_9()Ii_B+JV7=l><XM z5OKx8s)1z#%LfJqHX)}U&wG)(0_o+r<8K*${R7+Zq}Tmc;rS5$AHb891MBc~75=Ur zSUvE4c)DD?BM*pJ<WR-KXi4}5AF7D+`$&WQ`F)&|>*=hCs)N@st+k4Pv``h<1CK9h zC@~emTwvDYa7bJ+_j$GBKve*Qi%)cr9|Cl_!X~mpZb26Iw_};1dWS27xqdlMV=d@H zeo{?4;)Kfc)JYUvPB3DKaCJh5Jl!~lKAa;BVDoY4gLuO}*wth#ARK^VwjNL#A(-$l z&Cl7|YY^j5DQGHhO>+4`q_VdNl3e{GcAE`F^jpqp{<suq@jHfu?<{#0!yYgro=e60 z=Cww84mR~Ns&TJDts-FAj*ob+?Omuhwj_^I|6CqjBszV&cF`7{LwGyIbR^5qr<w5` zygbhfIV}Z^k)V}<r3Sjy;HwC4P9HKIH%rv;NJhjF+-dGbVJMq1tvO|lgV==WijcvY zoJ7d67T2Vc5u9HO&3eH_A1^2-Q2~3k3U^``Rjp7wbohyrPwaBB6XZqa`FBG~j<Z7d zW)DYSN7G(Q;b=S=`B$)d3<-~;V5xw7RHYh@LK_5<xq~~m05}$t5M_z@Tx3?&M(6tR zz~-%ROK5d~&sw|){XCXsl&g6F^Z4rtHvE8U>%iZ7H1nXl3t1hY)4Y{Iiy2xtgl;4Y zV|I#zIQ;}L9pGT)iDDxIla4IQw-6GXU9{Yo<ieSg;^s&SjgfnuDS}U`CF=ltp8;lP zFWNz`AT3ik^|>D>Jul}^`X{$TVG*w6$I*o^oGXFs`6^f&_%<z90*-b4N<gbUpoFy7 zECYr03OzyW=piK#H+rQK*toh%i8VZ7g@xBrcgsY#qn^PEtw-xUE3^_fVui>azoz8{ z$lA#YIZmfXC)S!Wx>srAjO<ur<B#lEV`!mKmmO;iT`$shtg)%;b*wSG!T5Yo^{i6b zjyQ&D8P9dZadINAY09nG%3ypoi8%-qH~6Bkoo~EBX`OG35UGwGv#;B?*73zMXx+$0 z^w!)w<ifR_AaVO!NU;35pIjMmb0rE{JA@C%esb30<P9$TcCac_b~Yyoi1B~Qwv$nN z@z8r2Q0Xf&xb!Ejh`!YEU9CELx$~2DWFx;O&2qZWaW~ug&XR(TdZKsS2lZg7lTJrA z;9VW_SLE`XI>3+HfV8H9t93hyq%ZZ)+=;8Ub>I1TVzW_OA#5$u&ZD-|^|*88;z>4B zQXWhg$(K$vFIGdxME?aF^jTgy*zFZ~X6&|<)1m`*e^h?qHxB##ouq4bpgUy088EQ( z|M<K#IE&^zr%EIc7eI3EV%=kIdHqTmJLzE)+of5i45w3@?^&q!NU%RfqXaQ+R`};k zq&S2Fyd|5EC3aIse@Uf!qKR{jPu7JZI&tSh^N0P4nBUst!O6KIa2`a0M5+yzrfY(O z8lIZZi`lelMz8Q_S<rZ#TQFlLm0(Kglr%FXA=alL@FR#O!$omYcfwLk#SAl^;e~ux zmOv{`;l~L=QpbS1wrr~$@zDeEY20`qCgy#t08rgqhIyFzLQZNoM3ssjD?(bd<a~GA z7O8<q#U+x&LtfYfAZQC0IBAh*9l_5o*G*-^rhS62Bju(Pv<YSxF{hb<9=X9z#y%s^ zW7B@FEA)tW9{2X*rfKM>knG8v1@2*<f?FbLVXiVqMapC{Sb@nxmD)kB>zbXEq%}o# z?x~qDpG3G0Q4|x1gnDe8!W3jrj{HG1?HB!w?HPiSccDP^6bjj7ybR1V$be%5wSxdj zc)3R&e!Mq77B{7F@Pl*wH%L-t=Jz3+`r>iQ780U5!bE<6&=choFgc^M2giMA{Vyl@ zH;C0bwdv90AJ^k9kaTFr99uyg*b+h0z_!xBmTcHI(K7+v4FRi%0IOg3IEO$gDM)c? z)KW`_LW7j)dSKzZEJ;9q`JzH&+I8+3e9}!U=@A?frVT;(p^UobKa8gR4q?C!2WgAw zwZfIunkb5ek3j=Lh-i}C5Sa1^n*00L1XB{hXCa#KD;Y(T{b<@BcSRF+NE2lY37aU! z-=_@cV5!=j7h{^u$>cV<faKsGIMjD=@v{vttb43=2d*hwxx_l1l3Gz<fh6F2A|Q~g ztDN>hagBu3#kA2W5%C#3HAVCsQ?iJYo6R0g|5LQ;&j|cMB+M8-48CmP`nVa{=^?oB z4*+}{@a}W$I;oL60FX(tqQbg)BoYlgt?Dnw>Ugs8z$uVz;27*6bgV=su*{Ut3Ckc8 zd}{5(y?5Gh0gqsOGei{|W{63WxmZZjRsoqQthGR;kgDcd%|y16#cl#66{s}jCzp`M zY36>Km)CL09&-K#TJ>K!LS~zzdksQB=2Hi^_=RK~MbqdRb8I#o+Qt*TJ074m9u6fG zI7ng{HgB4aP*2Ts%DX=iF~(Z70;YgZRhS35OjcdpW0K7^T9iEGvj_CgqJMv%Py{-} ztx2!lo+!Vw1LV#(E#<f3&&b5NvTktFd*(PsE)+GGK=@E&-nodpceew1AzhaKVDwzQ zUar@@MN8Xeo$$gXFopD9j48gIE1|e-h50*%a@iXM&c{BiElyCr6~2fmp~Vlu@1s~6 z>**p!Qj&{)I)08-(8)7myg{o{ae3-0WzL0gJks0nJl^N(lnaxJy90F~zbBfuB-b|B ze<=PW*n11QH6M9LLjR0a<Actz(6(XXejsT4QqUZ1Gu5%-!U-<2V~K`ZyMxR+%vA}? zua<1T$I;BnOYUDzj%l&YZt`Bzq&$EcQ+Oll_yV6L+9(p8Oxd{}1xl|ZwvaY)M?L-7 z7{BpmcXZ^M9=EHWP50Qd9XDz0SvY|OeIt9_H-!1AXH)19YLt0Cdo$`Wz~~mjh#*L< z_8uB<B{|!HPo~z47-M55^I8xyF`C&VW;DYV2zt`wAZNr(Hmy#_I*D%3UAfK4vrPRU zFH}7gCF)YBEJ~W8++ZGZ<mAjl?z1fXIxn0PMGkuQY`G7jRUhCAdlwqomtVaF?q<v3 zYDUMjJ~*ZI>PPGDAf7BASToQgdy=#AF5!Phy-^5LYA$#mjC67r`5N4cuD^<eTz8nz zh9xGj9{0-n3La>g5{P86z|spdEXU59VS912o*rpjr(Xj_7a;)`>parRx*yN${CRn# z;Yoao6JIuC+rvyzxhmZvPliVz;V?Q`KO5E>DJ87P3fWdO1bmn&{DSMI$3Dmw5Th}Q z!07eZ20DpB)p;qNp!@(HU^ND8rj5?>Ov^RFCGXSoo_sK`ZA&l^fK_6tJc_JyMG&X~ z1}qlZODQAzN`;r!$Z5kK3S+(B$8CbPrfLYaqu3c|hFM|sLFHr15?uXEyM$%jngkn! z28P`jqou`m3@L{5Anv*aRYtdCJA{;)P><sC^-8Vy1ZUeyUZ|HTuH{8TCvHpgSc518 zc$~SnvGBiR>Jly*)9X60!o#U*t1*-Gd=wpa=R@6{yAzA+O|Vg>BK2`Sk+^sZ61JRP z22L<#Zbv3lK<^;z9dl9K*>j@4L5LGKdu!%ATD6beH#8rlu?Fpyqu`Zw8^{rNoAaW0 zXkoXr>8tm)j&8HN@lT^oJO#m{A^@|H^8W_SCBpy?eM+Y9L1FXX(9|Lf-EeEp(1SXA zqtDg%Kmvv}@QGij7TSP9UAxRax~Od#?jsG7N7zS>Z7TZkm0>rAIL2<#v@Y14y<w%) z`;KH-HK}9F{vz%+`Qzu>yKS*>Xs$|m18NLO_{=3xEGV(W4h3K>woDPfGvF6^0PWbp zZmmIk;1{?IyyUX@e{BXm8izt-^XFTNE#<3jI1aFJvxJQukVH{v3{9f{W#a*@tw z&Q?)#<}<%KIrAkxb5Q5uWiw|l(*XnKY-gT-3qASFEl-|&)8dry`nY-K*&h29tVE0v z{l6A*ydzDguU)_WRgBD(7aXTjvuqER@;yt`8j_{y5GJ-t>WkRP?;3qe;P;<tb*+_z z?9IB-aX`De(Q%cK4i9EaIS#lT&7D4NtiXKOoU>g@jQbcX*Cr&k+w?Don97=9@I0rZ zX=2tRQVh<lfZN(?r7Z1vD8gFIM5l3udOTugZYWlWqR!am(*pF6os!<bRv0PuxivmZ zzEW~(v_Mlwv@yty>I@;o36k1);+Gym&T|y9vzQ7~^O2?6d{l%BLIVjI)E#6A0$M~M z#rf{C1M#ox&@X0JlYP6Rw_KdE$6&BkwT>>c;ryw~2axb1eA&rL8sx-NPA(!A%KWl1 z(vV#nkCLlS2P{lYi%#?FQ<w}LHrSL(f%2w>ZjiIAp{K3v$hm%+g(GM+VnD_A*p*QH z4@2Hu$ar^>jH|&LvVhsco7d5*iye5wsp1tXe~uf&8z4>N7nIgYAL9^ipy8rv7FrT> zS)EiVvv44Mf>b7S7+^hZ#oZ}!VD+4Zqb=7e`<D2V-kLE#<->LPXRd0qaPUUv4Jg%Q zVFZIR7}UJoV@1&TO(J4?ixRsdYDesLKC~%Bm(zmZLieU4xUxp)PdcK7TN6g>$kNu3 z`#G^hZK<`$vR&j!v=l*p;>c}72-4MV7r}jO8R<b^_{$W9Dn5-KWPmC?ie`Kx0ZIOy zanCxalAog6k!@4dIqG<2CsmbjZZpItpqC6|$&H~#p$?&FhD}P}PN<MdrA$h^{esta zNt&!FQ<g^Z-`|;Zd4!G`okkqd5i(+SdLCCaGs$o|rWkth@+g)Wt^Q%O?<6}%aRqjn zb+Ewjf9|zg2RlrUHt;~6PJB}rk*UW~!CNX*LzJd}j~AsWNvx+q=4+9-GEq9UFYb*+ zX|pkyC~YrlQ(W?*MWQnydeDo{Y*tEq=Ctn=nGJ;wBBx{TRZ*6{k1*qPUVai6DKwmb z81K9y9Q>mjXVcS%h-fsb!+a#!FqRQhTb!08B&Kz4JHd?LrtEHfu9os?JSrZ*B}-CK zlM}2>E_8$W(S)=}NG1UMqWmIm(rXJjUIT*L<RzJ*aWCVRxm`#su3$Mdx*@IbIFhVs zQKOf2<Anf0Jxrt!wkA;rqy<T9cT8W{4puYYc;ArXv!rqF;N|0JZs#dR8ClLroPU_0 zUWEj=Fs)OxGj6_<ph1v(u#e)#z<$}b*Nbz8y%LOeN;E@kv3Aj{4RWll12!GPSXNja zO0Pdb*s%R{i1kouL&lxR^vH;w3!MNN{FBQeV3mXM3poJO7wN(2B+#EAsLVXb)49Lo z(dTvG#m_E^KAxbz;L!(&673W!NtA8e$|G)^G>9ke%mE7-C^6Rg))D!Tj~z#D9}PBg zVM{(ZPw~xdM<N>G5@|Yw4<{m9XDF3VGuMlD*;5gau>RkKuE`-oIPPH$BK>>qh?hec zMa54~KnSjFSSmpI6B)#K6IN8i*$C!C=vCs(ydh+eX8@7U5F$h^CxejK@+TSOON@L| zsQA^+`Dfmq4<IXL=+kuIN@!w=xJ}MpTfGU_?0JqIMXUZ9dq>6*A<tGrG8vT5SRd?u zZC+y37cU~6faJWj(#e&?1AzoXt&^8v=rSY;=A%elwFHCcBAo6P*~9F67UxVGF^~m= z9t-$5XE^s>^cF!#_}s#JnD}C0J=W;Ch4t`8!j7;Wj^5JIDJA7_CL*AQ{`hDY7_``a z<B3d~LrPf=NyIv1DC?PGEt4|INXYuzKOznI)z}TYd`Vo{(v6WTU}8ml!=ACl;-%Xm zVqhAfg|(~Akd)cm3@swEza=DiOmAC64H*`n;}MIUW<|!<FcDE@;&>b>UBnGzT>M?m z{;lXwI#vdbpy+O3^y}dSUPwIm&25R|6HZ=UG)4yJ1^y+4EnfV4G%>WTsez*=6!8IC z^D;RP;(}9H3%7`<DHFJ!DJFP~6LN-I8r_6xl4@DIZS0(8>HsgF=B1sf$&{qap;{1# zgS6QN<M=$slc+8)(w+?v#w7WI(92G!HT()pqJ&MX&F9*ma=hdkmnE3UCi-{mH%Y*o z)0-~QUEpE{jazJ00D}M4^qE3y_PBMns%NP_lOr=K1C}HXumJU9B2G)C6H7Rqkpf6g z;C5U;Z>HZOSvF~BK7fqW1jwdy?HHQdN9e@PwcX^HhdqRh4lmrIL-^S-sxW<m+c6Js z>S7cjW<facNi3Uwzv8F}G>I{Voj4R2`H~ZHkO5{IEN7Tvt24Tf{5dpj1p&(TQ*+}F z;~|}4KSWGFh(vm6Gr5pQdOe+bE(5ap;IuurFzoWpiO#9Kd8e>Og$i+1qZ|yrR6aUn z#(*$OC%QFWqtej{`FNreXHzEMWI^ok^|1`Cpju1mSY~@p<#8|M*ZCNl3-64_%A&C! zK*u|l%8VM;j-%mgIg-+k=eNM=ehYT9^}+SNH@4SuO!?E8zOggJ5(`Fly&<*{1|5qe z$6bA<kE+LG(=*Z&-EcN~t^+rPo=%&@x6C7g=Mm}#;!*8Zy@Cwrl)9a0SH_1$X-(E4 z#pp!O6qH*9w6EKqHy8U$q{pJ-bfE1tUQF?IULBQDWaTW|&VjN`>RT1-Wf*=tUMuxw z(sO`A+RmkCbTl8uXx{5dj|fj!(&MM$c67~8L(?>JGNyLHYu=D2AG@MCA$jM9&^>Z@ z<->#(5u6LI$M|bQn6v8w@n}MrO@Tp9Hl<tC^4sJy^8Kb@6z4=9rO4&YY}#6(iE<g; zsd@}e`)v?)9eoLphz-y-noq<sXdPD}J-}lXux~#Ij*=5!MC14k$PcmG^jhyrUAV^p z=jXkO4=ovi7^=rrXwVm;dQ9y@Ks;kxL#MEX(`yQCH-af06&TK`8_iF`A_~Xe5_r+6 zAs4D1z5cR8_2?qabyGcFE1e@Jaa&+uPV>c7k6ih`K-HrYKdwXrsjtP&dE?Kr<U$SP zqN>MYGD|z$PcZFcMPg*yL(O1qGyfR!ZixK}Pmp+RMQalkVtR+d5KpvC!tDBmjuBKY z*s<4O856CbsSuynBrtK^jxa)@wsOwF)~}UdK`Hh7XuKR#r#p0*=Z9?vvQn(1g-s~O zM!Q6sjq2yySI=0YjcYPRf%wg7)M+Y2@g+07r7|%~nzH82XwU-fA;_##9=?ksNt_H2 z=YvN|c-0|0+*LC25`y1ZV!-a;<V~668S_j5g|s{EJajU8H{rm3yvh9}M7<kHd5Sor zzQ62t{Oda63pWNV(Ot4D*;6F4RTFPnpR=nx4VUWkQviw)Q<71pWYC205&I%7RGzw0 z3P6XGKv}R%sh$WFZ>yqR&E)cTkuenw=%P?9wnwnd9@20TpCJJ81ArKTHFZck<uOf{ zQ6xMV-TtE-!*M{Ci*<JjbOOMpcODUB&B&bCo+qGA@<OM-j5@Ya>Zm2~fMXlnPOq`V zmR(gEx9P@9L`*LES2!?{#(~D$g%22gH?8E)w?K8~ysot0IN8qAA2i;X((OW-meTF= zdt)tXYTaT(JD~Zd2!oROCgz0PNQV`p!*eTpla7<%0zqxcFvcKTv&bHsFPVu)`Tnch zCSFf!;(1Q(ut!1=au6F@y*#%T?G;j*p+_>Ih`ci@$QVy_6)`8rzPO5(NC>(`qm$8g z*$X`JN=!Z3LoUi%UzY%KD_nDX?d%11$_pynabpyHF`Jpd#1&wywGG#lXyN<-mk=qk z3?Ry(-%J1zslKEXa^KEg6AOZzov+@ZkP~SYk?qjRC8GZ8c-a<lPS|21*k^8^(h0Qh z?d<SYG+A0X9$;#EImVEqPaqFC?bWG7*slbRZV|=Y3~Km?QOtD)|M32PZ&C0M)5_V7 zCG+t!rJMQnT~Y9l4&@rfrfVFKBk`gm^|Ejd+|TsJDlL_l^<D)13IdIYo_9D5vX-O` zZ`eVS6?tOmJ>TTSTx}_ZJ5jDI)oNg5dyEgFhR%InQipda+UOOS^4KE=OGPe>whSGh zb>r;!`Yuk`P3TsvbxZ5qQhUA#V=<*KBavRl5?;Wz3m7lpg_N2-HI-Y+dm(zU8|MIt zT8kh@Y0M!-hYHA^&RDoQuL&x?K;kGd2MODpI)a4lQoddR8Fel*kCByE=tl@@`~d1L zkoj<wFPq9AQBlCX0*^X!NG_H%S%nlQ&Lt#E8ZkN4{VR5w{d;o`b&K~lyXui2?b2mG zeM*2t*Xh&PoqC?0D37~|BDv3T*0!baxZ6_5`tU?M3e&u{C|r4w`9rFj;<RA{yFpCh zq{|;Ch)tF=ADlPqf3rA#WmjkL$qxJ?86d$F1^L@Fek~B!ej~;)c{5U!le`A}5emUk zk1<NzYiE0c===48dF6C-zPa#ZfKd6-_r&!A4HaO78Y?I$lDZIxvKAbluLbybs%G4d zp=}b71os18y&)Y%DmuxElqV1($}ZQ*-%cFOrS?w&IE#y!Np$v<a3$A6Ct-<Gkn?7% zdt`Cj7oMy;i^e2TWPj;O?&s9<?n0evxNk*!NASD8E0xyIpCw}P@F&`BHsDkX`YI0K zw?4N5+u0D6<O>yRyTi2IIF@xu_E$QlAE~S-?{CA6C+`cU-#yB6o|$P<PTDTUhZQZV zB(bv<6WmK^_6%Ojo?_%HfcU>oXyGTE8qD?fycyN*;#4}jzBr#v(4=cP5)GcDesVG? z=NoadGTjq?+1u=Q3a$E1c5VaO4KaVMM0*PNJp*g;>u;_^#?jh|uo_M_7ZLD*@c%#p z{t})yoqPR=rt4pZRpn=qcuk8U<}zk6<CFJb<NW_$-nGWqbzS9s$Kx4~-;dbMq&KM@ z*R`E^98$-Zq!@QReoUNZCh2h+Li3p1x#!$F*S;^GbFZ-}rbQ{m{X@i$f&`H&Ar&Z9 z1N;C1a)tPZDx?Y|DiGoi&>tXC5JEzN3iEwyowLurXYNcUX3(6QCZ2Qm*=L`9_G7KR z9(%2|)iqCJHmv;=?+L+rJ;hrc{Y3n)i4itF0RLz%8HouFLVm^{(ugMF>j(2$mf0c4 ze1obYy_4zGvPYE(N?3O>Zm6s$ThSB82at%=?sV(z7B?Q4)cByxk7T}L0*E7<<kXsL z!L3@Lg}XT2wHyXz$=BnzQ=1q)gPYY1c;gr~76YB>xM!Yt&%Ge+>N}wtS<*i5KUl%P z@WQFd`q7aQRN*_WgVov$slhphTH$hdB=qkQ*NW&7B=k61ryfL|L}uCU9zShG$r-#r zFu}jnC}w@mOD28?dS0>ujULG=gh{rDrcodz<LT~D?xfTI;@A>uodc6Of@G<Moj!p? zO2!9=Q%~4vK{&pt2$v11F2nQNc$_~%O$ub7;Ik1k28C3gMwvkX1<qa%;1)=OAWCKi zik!Hthyau_(&14qJY9<%z9t19VV$|bpTFUH4HR&*9j*}^wLM_Nx^aKQmEx+N-uFr} zj-WlO53R6{*`e)Q=7(*ZU&lCa<2aLw35LQA)fsDxrAISkod~t6ixk(hehBQ*g3S>D zbs6LKT1*8~f*7BRf%4)S;JrzvOcae=C~_4Ak5qCm$BUp~lCU>yCNpF``wS8;5~m{t z=u%ZKt~{wt%?(DWVv-y+--(45p!%4Y6pSY!tz?+ydz2oXakXbZE*n<SN)0@cP&R(; zC_BU>cjHZl<Uk6ayP?wU+xlgLWz^r>4~+0uZ#^57ebo<~$9;MlVE&dsvSE*~>+GYW z+O>M9N0IFU+Hw!klpgdL7RP}a;RyA(TZ@o{;Gyt7xr>G#N|Dg<KCxr-TxM*Xh;aib z=|eJ(VoL!jAdVOmpDiq7$a-T7<&>uOipX`wG}do9OPn21zNDJq4D}TtT*A}*!QUHL zg^zHQDaI)CHfW^Z#zPkhosquiJmBGzu&f)E^KzUA%P4M2owe-sw34K(J6)nNMYT|4 zrU9PD(WYh7RsWxR_wMx(>ks$@;)pMEf)hwt&47mjWhW=KDV|2sc0#DEpFfX;JB=h% z++i$)i%EVG-42T9n@3{ZGs;kh{pkT^u1{%zY|(7L1qe!Q<;EeA8d#yGp|4dbEx5*J zsYR+%G$mu?Pn^9JK_lT`r};q8=oO|u#S70fQ!hhSmNF1tPBg(Jz0cU00ZrR09_#CH zR_EH6Bq8-OZuwk(XnS+PUE~M4+ojq)N(>&^*{mkxE<u2cnMZ_B<}!DNJ+Go^|42!h z+#L?{*&m1Yf+>##As&SWaL2?p37?wi{Vum8rqK%Ozd2MCte@i@6nR`#t>+wOMiqH< zM!zFU5G)_d6nUz56GdK43>Hu*J`!5b?in=;V~H|O)pMf7OAD(yPwUyj!m>!vhDZY) zCU!X_(PBoUmMCH%BY6XDQZm*sByoL~H#w?JR=ycD(6OHRXWsT3&Ztw`yL=$fovwU> z<W!BQZs<3e!r#W7bivMCCTdHN2T{2tajg0r(6~eiaax1T24}DyE5x(>Jr{}G>BU~* z0I-J+Yi~RJ-qOr!{iUucfBYm{_3D656V+svPa}cl;i@RPz*sDoXZSRUcmuIoBx{Jv zv0%*i9d=w6gDGg-n?b8PH9+98roMJ_RQ2wnq|fRkh*LS$NpLZEg9A$`1BWcT`kQrv zsQg-LR91titSV+Dh=O224KyP+XecGHy~@(6at8jYDYOaw;ZV=_PT{&D#4QsCm&04u zZiuxi)2mkcmOXPg-y8$t889(b&IcDK0wV47?`Jc5wZ$#J+tG~_6xECFDU5;>8Y1OY zg?!)TQw~}F_MgjW)wApkB}Z_h3^uz7M@w#+80+pw*5%fvb{N1DSG<v1nH}gUlo;V2 z?_VGh2n!lOnv^54DOL)KA<hs)cGwspkOP9oVhh>Feky`D>@WzcfS?HeZsYGU{$Atn zGd>R3-EaH@#{ZD<A2j}?@gFk&hmBt}{=>$9#P}aE{z2m(GXA5+KWzMu8vls#KW6-+ z#y@8K<Hmo?_>Y^~2_iDiLjMIlBmIQ=5}F6)!IXrK*qr2_lzcSr3CTwze?$^n4A|f& z(W@Q?$Sg`Y*Ts6Rx0QE|cIDdjUb`ElX4PDM7ek>c6%e5ylt-1euL0M5Uuy8{H-sJa z8~W3gpP(s>Y|vZ`G_1qYlajymas4@^KTqk;Y5gh52dwS&QYa0r%V+A%niOi(h0|@+ zqi(%blNUfCdvT&$mPD(KcC-07@PvKsNEMw>I~VpAZ%K9}ZH$`bMnhhUI^~uU(QepA z<+7l4!}_&A-j8}ZW>K%BT)M=y<!8EGsjnyB>@}qHjdEzkjZu`@N0=gKbZ5D^A&W8_ zI<Ji043dr+ST0%MTj_csizGRA{s}YmI66}Y7z<e{DbAD>X-bMUB}JQ(;!Q~rr=*xu zQq(Ca?vxaHN{T%tMW2%5Pe~D|q!?6E6e=kWl@y6eibW+wqZ07QKVeG18UG}Ho*;6R z{3nh7ar~Sz{!{olZTu2`e$@C+<L4RUe*!;0X8bew`Elc)#m^^=KaHPr#-G8@dE;Ne z&qd>3!q2SnpT+U^YC(A!k;<^CK4!wB1tdtQku|BmXRr$@bN?LYUbK7VMt8PxtFx5c z)Z~T&WAfxeP!(TH+{;5B_cU-wo?q?)`Qi*IP`4Sadb8XOa12m8)DoJ3qiv9}gLP=e z9HR5V0>sH_YR>Mo%u8Xp6;<0|v*%=XZ6=9erBUy^Sng_Hc+=qx1@USy(*TDNrx6qx zX@0G$jhib2>u$z5(mJ%8ISh!*GR+Q-k85?c4Oo~ozmnu@Gmy`5i_1qChWK8}$vvCS z=dBy<#*HBUtY%i?%=pW+P^ktN>eXs53ZAdmmSp+STwik={ka$FQKwO^2m?P??(~wf zX>Jp_q*1IF9Db`S^~PDgW=W;-I9+PA+sT+!o%E$%t8y+bQ$@O*lt+5T$zOExXPx|- zlkYkCVceA2axaSN<<?B2mt@uAtVL$&j9zY*YeAd_oZ0kT5ZZK8(mE@WKTm3+_wua8 zdjfAYm}`ffB|v8FR-DmHGYDPP;Du^63c7+RRhXN|jlTP0yPk}uW^|aLV@a{S8eHiF zm0qJ9%8-+iXm%85OHpQP+pcul@#N@zgnO-xG@=^3RBr@AE~-J7N&V<cy>PJy*sdfQ z-84g>UD=Qq7O%n%PN7|M+M2^&3I=;XaeEWuhEUU}w}Nsw8<zb#P{GNnxmiq?8-1lT z%a&rrG~Ke8${WE{k}cU%!>>z^Zu1RxF$^q(N5`ZPFB|4eLkuhXS9?+S%FDAjv3VYm z9;2TjoqC?_f=~DOI{d%YJ-EYC_9{NWMO~erX$J(>P6acZqtiN_>IOnjqBM+>CyU>> zpaL47s2LyBj0FSYa0k4C81tdvTgf4WR5@fVh=k?%*FX7Ig<J$#5|ZMGEC&r4pm}(G zkGU=G+2G?5I{jtFFA~z@upNYL)x5lel(!R)Hhxwk%%3>}8$+BN8lL@n!gY)pHC7Sc z=ruNX2b$~6G1bH+t3hHnb8zfEoAx#Kf#^dE3?51OP+^w}nw&JNQ2HvGjETF7e+pMI zM*%sX*}_yraFWAA75xcx-xml%mO5&@WhgQLsI0)E_Mp=!$V$|2W6J<#)y-!A#}NQH zZp;?hGyA9HebsH-M&fhZL;Fy5;)5Pa-qmdeEi7EWjlDJ+j$n@tC!IlznlO`MN+;oA z&`1Q4Qx!%F@dRwCty*eUO2Kb7)^cdSVD1{fqQi(<VEY;ukt%Ql?(<CCtv&W3vbUSb z@YkeTx1Bh(f$!`9KF53;*Wq}pHd!o1lBl+^A~Q#9{5Yk`V==1=o<PNo`cDVF$B^SF zVd$l5wSKTR0)s_Kbqd@_m#aL<4LFjerV1I+jarZR!Bra43o0fKLkUwo52r%XFG?KF z{kh7uR{N(KfnN*!W8|9BeSI;kU4;GawRW$2Q5BC7K!@*laU_^n?naK)=9_%|8ZSOC z0WaU?Me5~;JuHXDqyF2Y2dO9Fc<A@y2sb1q-WQmMzYSLHQ&IR$V&_S=1=zU{f5*kk zWgl?#Vf_C<VRX|z<nIIK^63uzF;<AkK%8iczqH@SVoUH6vv6PrhT}nEags&Ey^R$g zPEq2p2U9APB8<V{fIHI_DJx-*fYGr65YO;j>;(XaH~)=$(cxzbE7XETVO$^?wJ5G4 z0e!`0MV>!TzA#~8Y-H=C?A7h@GuWT=L+Yq2eE~uOaq&eq@&{>$qVMpiOKgl^|Bm?y zK*jA*^CDga%A)H}yIn_C(seaSN4<Nbx-$hFPK|$QI|S`8Fsw}ut{zPSI%7m2Xu>k$ zo?sNwU<J1<L5w(j%}Zc#6!@{YIvC(h^LCLJF3%3A6K3^Hc5%}>Pq6+K<_Wy_n0lI* zH+d11=pdyO>MZkwWfDvUgL}E<2RCIm-}^j^;ctThpRN5f0=~2bzQ?<v{X8@>Q7DcS zk$w;%`VJtB`DlU6&;G*L$o|6SLRL-KKqX$lp`rdlai8?gBU*VfAV}n9A8!#YZL`n1 zX-y-BUFh2``Gx8HritUbwoH6jj&40yh5Cz8k5<^Oei{A3`UjMcb#q2^a02#UL_P@c zi0I&;t=l9CC=i7M{4Dfzn<WQ&x-m&Wr8q8$2`cQipz7s{r0dAN14Nbe1q%kyX|MxI zx)rTXA<Orz)mvpv`_^PEQ)dx9oloX^D;{`%%*!`<`35g{dHEJE|IN$0ybQzM?mrMF zls%(61)V4!Nj>qo;E0Ng1Q9FT717wuD-QFa*z4#m?lw#q65smovn!l5llo<{-O_<W zNN|l6Vnh(qw7~476*gqb>#Ra)wm2z#9k+5eLzc^ya=dJm4CoOt{@r$afHUD^C}6t{ zssy@{FnZ{E%v?kM64@<2r8sM~Tv;lIQ)R9RdJqY@vN+@dhu0w-LN2&E<Zq<7H2)_@ zimfNJ6Gs{3jPp-`gj}3ETFZlSI(;XvsC}1i=X2YY3)BxRfTSCImTw~=ce^}z+ZD(H zZ~-f(MH6u0^e+p}mG0g<FvF6<uQ&rZJiv1ot-r@nBzanPW{m|Ot`>GI!;d6sS!0NJ ztpiDxP{?F3K_$7e5}xLJM{#u|q-0|{9ZKv>w}MdOWbZ^-d2lWv*p8OqQ+TK@8iTNM z8c%buY?D@Q204wflF=?jwBV4gCx||b`c@s)l%XC<041lfjpOJ7sB$cWHnvGN^tc0I zU<lsIwg|_9yWFs?6nXxhn712^!tVAq*jR4X-EHh|??NW_w?pa!g3QjgEbLSXE}+o= z2e*pN@GpYd-Ac9<Elk-~LeM^b`721=5k3Q}!fI?Q2r<`<QE_Khov5CXs$A?E&q&ou zG-jGmdejNWXV$E;?KXS%G;u3sZFNr}9!1>@1{)TWv{4D+dPqYt$t^?y~Sh5iRr4 z=eRr{SCV0sMcBX!m%M{H93IAbAJOdr^xgGCRv%<1PMD<)GbqTJz(3K9B(4|GD5#T* zs6;?wg-}2TfP%={Y@)OA>77C(NHZN3oR9%xLF|95a}{)l)&u!)N(|@$VTpkqM~=8V zjvOu-8J3vOIx-6DO2uLf+{%}pM^SY-;7h5?K@JEa+0^441Ga3CwP|1fv8LGmQyQDs z{)yB=?PLDfa4r@nR_otKQNYe`+`srf@oCZd*8UP7RH@7U>Ir(^Mk;?jzlH`s!Jf0p zecq@Rwm*2{M+2QcHDJ0eZ}%w1!cI5j)8*oaAh+_y2T|DJ;!;7w!EnpS<sQ}VqBo@! zARK=^3lN{rj7~x{Y>a_EqG6+mLAk7_ws2%oWDJ{BpX(du#J>;JM<1XRG;+|A>nk|A z0*Y)IdU7*aigUbwB9hgWMzc;j5mU&MCfRCbLviI&vLustO7~^FY2MluT2;;>%M21@ zZliD>R&9X!CpeX=NShqlr}4p3h0Of{e8v$t5eA)M9v*O~XmQB}cMYjONIW4C^hhZ@ zE}9+}5!J6YnaZ7v0*21)Vb5q(g9uQ&;SWX|Tn2j{o!E|jRAWR!Pe6VJwfY>&t)rll z^#UW^5wV0w^S;HBnuLwO>ad_Xbv-#v&Q<7(1EsN?toWgOa5k0`)|gb)!3GHf%LT&9 z8QX9(C^(XW!BFekpC^z|kWEB}W#R%LX?XPQ5Pg^F+b!wp<5OeBv&=n9%x6O!I4b6Z zQska~bCr6-4ne9~wL`F0c5ZmWTyP~W59sp!QMbbwz=7<XDmxQE7#<Qwjt<Td35!37 zqvP%?SuCpt(3=J5h`BH-a*$x8dfkL-=#G?dMmc7MsL@?oHxN05+8hu`7@%PV5V9`U zTmZ=$70jT3>}9HUHsyR|Q#p5>PYdh8bL<ayBEb3V6rM*opDxX!gzJ$@o~#Kjpk-^~ ze^#+3aIke0)sc-+otw-chGb;}0mm9lkU4MO-W^UTSu*8P9A)NEaVIy~4X&q-7Ht#m zWTW?CB<wQmS_4>10QPl0YXtDS$jqN+iMu(U8_-*J{{OtK4K+XxyUbSo>}p+p3<c~2 zuhs5h5--8-8tw@Jj;%#R&&6JMs@CpKkv$b-)S)zc_&E*~)i^&~W)EK)03Vi7T?exV zDrW{li`7e7&UH9p=Po+<We%be14h4hjAqtzD2po%Wz6sm`9OBiy|=Ri`5wFTT;Z}? z^sMI?{&KTB-v*Uzvtv|hV0V6t=)Dr}bIQLd2bhR4D=5DfP<S1cU)H8{#a()`ZK4i) z5s5XigYGW<D(Wy{4asR_HrTC(i|8~+!<E@G*8$6HndhB({AEG|{u~uog{)NaC;SM9 zUPeioESAn)$e*vWBR@3k<F60s?FXEF{Mu?=eh=;Cs*K`LC@z0%wcf8)aY>;*tCh;H z8SFRKqszmitG$lJ_1ytowtU;8Saw|zY1OUw_rdJu9{$PK{vJn$bg1wA-TNDxHFK}I z9~m;3zweIB%6qh8LYiSx339qon>$XmgQk6jJ(E4!!mf#!Q`O^mM<tL$y;bibdVod< z3h0aaEYy1LE#i^Kq8!%&2|}Pz%IDj90*tt)igsEGq_)H&!7$W7{3VG7n)T9?x9hF* zWj&H+2WA6zi0ad9&4z8n;o;t>b11!-YU=51`XwH~Dps3Gbj2QR1CyIL2B}0asb``> zr48qzE`3Ik#3Yn0kzU!Hok@<>?usX(6q2l@q%wA7hmUdZ!}}yJFYxjky!;L?f56Kh z@$#p<{3S2n<>haAIYp>C&C4_|7kIhM%N#E}W!d8yOdi9sdW?qU(bvtR<*>)Cd5>CZ zkD`i4D98v<8|J!m27P-6?TMC<Fe4L_6XQpYANaz7!^M-uT5-B~zIe~vGk;Y)RQ#pl zRB^UAQ(P?mWbyf;Up!ijicb`uDIO_)taxP8`-<@(_LQ6qE`6J5qx@+kx<Uw`CFAjj zxPdf;#55gPVQDnSkgu_$-v}N3Kr~nu9wBcb>@P~<pXOOl@l^bwOLzs{ln@R4>M4G8 z3JJXO`eF0h2qQJ%Q~2mrWTGlmC||~TP6Gos)bX;i9q%B8#$i)Mt~V6e_&J&7jhfs3 zAP#@SWrxi4SV3FOQSeA=JUV-59&Iu_He7_jRuK5nf(G|sL`>;T+PRJDm-mZk<#*Yg zEl3zda)8WVkQMQwSaDa_H32RBp65h!a|1x+V~XImz29K&FxQ|Pbwq2Fxt;_pl?Xl~ z_z@?g5<IPaMD)KR-YhCbcW-qxjDR>1@e>kjfD5AI@2>=wx;<|XE*ckfnzxVhQs(8M z1UfbpL?k@v-`SxY*^YxHiv{n?Xki6^@*f&%W;lpkY*jacas2EE9S-=c_aH78!>}D5 zthWw!%3&1v2mN-XCm=%<^q%77G%vr3i-Hjn8;c&&%kQ!8oX0T$k;LiiBF8K&RB_Z= z7%VJ!Y^TS5dPE-a_2|?)Cl_u&DcBBAM)jMX^pTZ#$618XfXEX(XAc3rBEc~%XLwBV z=#BG2$n6q1x?vD3_Ua8k2&0pW<tXqb_?(T<bE;7Tqf|v6t5p|y(m{{2;gPO-)Orb^ zdE_cI5X1vaG47(qfOwlJ%2OH_f`X$bbnsQC$W?nscq!r1Wh*rplE)1yoFt3z7eTX) z$Qj-lqy_)f^?r`Gf5<{?^~IZ&KzIfj+MG-?;xr(XO%pM^8o^o4V?@L(77hT|cf&q1 g`MbJf*N65_PHaDL&s^F|n%DpT`HAtd!uIk11+tt~^#A|> diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/serializer.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/serializer.py deleted file mode 100644 index 53f4d44..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/serializer.py +++ /dev/null @@ -1,409 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals -from pip._vendor.six import text_type - -import re - -from codecs import register_error, xmlcharrefreplace_errors - -from .constants import voidElements, booleanAttributes, spaceCharacters -from .constants import rcdataElements, entities, xmlEntities -from . import treewalkers, _utils -from xml.sax.saxutils import escape - -_quoteAttributeSpecChars = "".join(spaceCharacters) + "\"'=<>`" -_quoteAttributeSpec = re.compile("[" + _quoteAttributeSpecChars + "]") -_quoteAttributeLegacy = re.compile("[" + _quoteAttributeSpecChars + - "\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n" - "\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15" - "\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f" - "\x20\x2f\x60\xa0\u1680\u180e\u180f\u2000" - "\u2001\u2002\u2003\u2004\u2005\u2006\u2007" - "\u2008\u2009\u200a\u2028\u2029\u202f\u205f" - "\u3000]") - - -_encode_entity_map = {} -_is_ucs4 = len("\U0010FFFF") == 1 -for k, v in list(entities.items()): - # skip multi-character entities - if ((_is_ucs4 and len(v) > 1) or - (not _is_ucs4 and len(v) > 2)): - continue - if v != "&": - if len(v) == 2: - v = _utils.surrogatePairToCodepoint(v) - else: - v = ord(v) - if v not in _encode_entity_map or k.islower(): - # prefer < over < and similarly for &, >, etc. - _encode_entity_map[v] = k - - -def htmlentityreplace_errors(exc): - if isinstance(exc, (UnicodeEncodeError, UnicodeTranslateError)): - res = [] - codepoints = [] - skip = False - for i, c in enumerate(exc.object[exc.start:exc.end]): - if skip: - skip = False - continue - index = i + exc.start - if _utils.isSurrogatePair(exc.object[index:min([exc.end, index + 2])]): - codepoint = _utils.surrogatePairToCodepoint(exc.object[index:index + 2]) - skip = True - else: - codepoint = ord(c) - codepoints.append(codepoint) - for cp in codepoints: - e = _encode_entity_map.get(cp) - if e: - res.append("&") - res.append(e) - if not e.endswith(";"): - res.append(";") - else: - res.append("&#x%s;" % (hex(cp)[2:])) - return ("".join(res), exc.end) - else: - return xmlcharrefreplace_errors(exc) - - -register_error("htmlentityreplace", htmlentityreplace_errors) - - -def serialize(input, tree="etree", encoding=None, **serializer_opts): - """Serializes the input token stream using the specified treewalker - - :arg input: the token stream to serialize - - :arg tree: the treewalker to use - - :arg encoding: the encoding to use - - :arg serializer_opts: any options to pass to the - :py:class:`html5lib.serializer.HTMLSerializer` that gets created - - :returns: the tree serialized as a string - - Example: - - >>> from html5lib.html5parser import parse - >>> from html5lib.serializer import serialize - >>> token_stream = parse('<html><body><p>Hi!</p></body></html>') - >>> serialize(token_stream, omit_optional_tags=False) - '<html><head></head><body><p>Hi!</p></body></html>' - - """ - # XXX: Should we cache this? - walker = treewalkers.getTreeWalker(tree) - s = HTMLSerializer(**serializer_opts) - return s.render(walker(input), encoding) - - -class HTMLSerializer(object): - - # attribute quoting options - quote_attr_values = "legacy" # be secure by default - quote_char = '"' - use_best_quote_char = True - - # tag syntax options - omit_optional_tags = True - minimize_boolean_attributes = True - use_trailing_solidus = False - space_before_trailing_solidus = True - - # escaping options - escape_lt_in_attrs = False - escape_rcdata = False - resolve_entities = True - - # miscellaneous options - alphabetical_attributes = False - inject_meta_charset = True - strip_whitespace = False - sanitize = False - - options = ("quote_attr_values", "quote_char", "use_best_quote_char", - "omit_optional_tags", "minimize_boolean_attributes", - "use_trailing_solidus", "space_before_trailing_solidus", - "escape_lt_in_attrs", "escape_rcdata", "resolve_entities", - "alphabetical_attributes", "inject_meta_charset", - "strip_whitespace", "sanitize") - - def __init__(self, **kwargs): - """Initialize HTMLSerializer - - :arg inject_meta_charset: Whether or not to inject the meta charset. - - Defaults to ``True``. - - :arg quote_attr_values: Whether to quote attribute values that don't - require quoting per legacy browser behavior (``"legacy"``), when - required by the standard (``"spec"``), or always (``"always"``). - - Defaults to ``"legacy"``. - - :arg quote_char: Use given quote character for attribute quoting. - - Defaults to ``"`` which will use double quotes unless attribute - value contains a double quote, in which case single quotes are - used. - - :arg escape_lt_in_attrs: Whether or not to escape ``<`` in attribute - values. - - Defaults to ``False``. - - :arg escape_rcdata: Whether to escape characters that need to be - escaped within normal elements within rcdata elements such as - style. - - Defaults to ``False``. - - :arg resolve_entities: Whether to resolve named character entities that - appear in the source tree. The XML predefined entities < > - & " ' are unaffected by this setting. - - Defaults to ``True``. - - :arg strip_whitespace: Whether to remove semantically meaningless - whitespace. (This compresses all whitespace to a single space - except within ``pre``.) - - Defaults to ``False``. - - :arg minimize_boolean_attributes: Shortens boolean attributes to give - just the attribute value, for example:: - - <input disabled="disabled"> - - becomes:: - - <input disabled> - - Defaults to ``True``. - - :arg use_trailing_solidus: Includes a close-tag slash at the end of the - start tag of void elements (empty elements whose end tag is - forbidden). E.g. ``<hr/>``. - - Defaults to ``False``. - - :arg space_before_trailing_solidus: Places a space immediately before - the closing slash in a tag using a trailing solidus. E.g. - ``<hr />``. Requires ``use_trailing_solidus=True``. - - Defaults to ``True``. - - :arg sanitize: Strip all unsafe or unknown constructs from output. - See :py:class:`html5lib.filters.sanitizer.Filter`. - - Defaults to ``False``. - - :arg omit_optional_tags: Omit start/end tags that are optional. - - Defaults to ``True``. - - :arg alphabetical_attributes: Reorder attributes to be in alphabetical order. - - Defaults to ``False``. - - """ - unexpected_args = frozenset(kwargs) - frozenset(self.options) - if len(unexpected_args) > 0: - raise TypeError("__init__() got an unexpected keyword argument '%s'" % next(iter(unexpected_args))) - if 'quote_char' in kwargs: - self.use_best_quote_char = False - for attr in self.options: - setattr(self, attr, kwargs.get(attr, getattr(self, attr))) - self.errors = [] - self.strict = False - - def encode(self, string): - assert(isinstance(string, text_type)) - if self.encoding: - return string.encode(self.encoding, "htmlentityreplace") - else: - return string - - def encodeStrict(self, string): - assert(isinstance(string, text_type)) - if self.encoding: - return string.encode(self.encoding, "strict") - else: - return string - - def serialize(self, treewalker, encoding=None): - # pylint:disable=too-many-nested-blocks - self.encoding = encoding - in_cdata = False - self.errors = [] - - if encoding and self.inject_meta_charset: - from .filters.inject_meta_charset import Filter - treewalker = Filter(treewalker, encoding) - # Alphabetical attributes is here under the assumption that none of - # the later filters add or change order of attributes; it needs to be - # before the sanitizer so escaped elements come out correctly - if self.alphabetical_attributes: - from .filters.alphabeticalattributes import Filter - treewalker = Filter(treewalker) - # WhitespaceFilter should be used before OptionalTagFilter - # for maximum efficiently of this latter filter - if self.strip_whitespace: - from .filters.whitespace import Filter - treewalker = Filter(treewalker) - if self.sanitize: - from .filters.sanitizer import Filter - treewalker = Filter(treewalker) - if self.omit_optional_tags: - from .filters.optionaltags import Filter - treewalker = Filter(treewalker) - - for token in treewalker: - type = token["type"] - if type == "Doctype": - doctype = "<!DOCTYPE %s" % token["name"] - - if token["publicId"]: - doctype += ' PUBLIC "%s"' % token["publicId"] - elif token["systemId"]: - doctype += " SYSTEM" - if token["systemId"]: - if token["systemId"].find('"') >= 0: - if token["systemId"].find("'") >= 0: - self.serializeError("System identifer contains both single and double quote characters") - quote_char = "'" - else: - quote_char = '"' - doctype += " %s%s%s" % (quote_char, token["systemId"], quote_char) - - doctype += ">" - yield self.encodeStrict(doctype) - - elif type in ("Characters", "SpaceCharacters"): - if type == "SpaceCharacters" or in_cdata: - if in_cdata and token["data"].find("</") >= 0: - self.serializeError("Unexpected </ in CDATA") - yield self.encode(token["data"]) - else: - yield self.encode(escape(token["data"])) - - elif type in ("StartTag", "EmptyTag"): - name = token["name"] - yield self.encodeStrict("<%s" % name) - if name in rcdataElements and not self.escape_rcdata: - in_cdata = True - elif in_cdata: - self.serializeError("Unexpected child element of a CDATA element") - for (_, attr_name), attr_value in token["data"].items(): - # TODO: Add namespace support here - k = attr_name - v = attr_value - yield self.encodeStrict(' ') - - yield self.encodeStrict(k) - if not self.minimize_boolean_attributes or \ - (k not in booleanAttributes.get(name, tuple()) and - k not in booleanAttributes.get("", tuple())): - yield self.encodeStrict("=") - if self.quote_attr_values == "always" or len(v) == 0: - quote_attr = True - elif self.quote_attr_values == "spec": - quote_attr = _quoteAttributeSpec.search(v) is not None - elif self.quote_attr_values == "legacy": - quote_attr = _quoteAttributeLegacy.search(v) is not None - else: - raise ValueError("quote_attr_values must be one of: " - "'always', 'spec', or 'legacy'") - v = v.replace("&", "&") - if self.escape_lt_in_attrs: - v = v.replace("<", "<") - if quote_attr: - quote_char = self.quote_char - if self.use_best_quote_char: - if "'" in v and '"' not in v: - quote_char = '"' - elif '"' in v and "'" not in v: - quote_char = "'" - if quote_char == "'": - v = v.replace("'", "'") - else: - v = v.replace('"', """) - yield self.encodeStrict(quote_char) - yield self.encode(v) - yield self.encodeStrict(quote_char) - else: - yield self.encode(v) - if name in voidElements and self.use_trailing_solidus: - if self.space_before_trailing_solidus: - yield self.encodeStrict(" /") - else: - yield self.encodeStrict("/") - yield self.encode(">") - - elif type == "EndTag": - name = token["name"] - if name in rcdataElements: - in_cdata = False - elif in_cdata: - self.serializeError("Unexpected child element of a CDATA element") - yield self.encodeStrict("</%s>" % name) - - elif type == "Comment": - data = token["data"] - if data.find("--") >= 0: - self.serializeError("Comment contains --") - yield self.encodeStrict("<!--%s-->" % token["data"]) - - elif type == "Entity": - name = token["name"] - key = name + ";" - if key not in entities: - self.serializeError("Entity %s not recognized" % name) - if self.resolve_entities and key not in xmlEntities: - data = entities[key] - else: - data = "&%s;" % name - yield self.encodeStrict(data) - - else: - self.serializeError(token["data"]) - - def render(self, treewalker, encoding=None): - """Serializes the stream from the treewalker into a string - - :arg treewalker: the treewalker to serialize - - :arg encoding: the string encoding to use - - :returns: the serialized tree - - Example: - - >>> from html5lib import parse, getTreeWalker - >>> from html5lib.serializer import HTMLSerializer - >>> token_stream = parse('<html><body>Hi!</body></html>') - >>> walker = getTreeWalker('etree') - >>> serializer = HTMLSerializer(omit_optional_tags=False) - >>> serializer.render(walker(token_stream)) - '<html><head></head><body>Hi!</body></html>' - - """ - if encoding: - return b"".join(list(self.serialize(treewalker, encoding))) - else: - return "".join(list(self.serialize(treewalker))) - - def serializeError(self, data="XXX ERROR MESSAGE NEEDED"): - # XXX The idea is to make data mandatory. - self.errors.append(data) - if self.strict: - raise SerializeError - - -class SerializeError(Exception): - """Error in serialized tree""" - pass diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/serializer.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/serializer.pyc deleted file mode 100644 index fbe40516fa3664ac3ecb62afca1b7408e9579fbf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13932 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 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py deleted file mode 100644 index 7ef5959..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py +++ /dev/null @@ -1,30 +0,0 @@ -"""Tree adapters let you convert from one tree structure to another - -Example: - -.. code-block:: python - - from pip._vendor import html5lib - from pip._vendor.html5lib.treeadapters import genshi - - doc = '<html><body>Hi!</body></html>' - treebuilder = html5lib.getTreeBuilder('etree') - parser = html5lib.HTMLParser(tree=treebuilder) - tree = parser.parse(doc) - TreeWalker = html5lib.getTreeWalker('etree') - - genshi_tree = genshi.to_genshi(TreeWalker(tree)) - -""" -from __future__ import absolute_import, division, unicode_literals - -from . import sax - -__all__ = ["sax"] - -try: - from . import genshi # noqa -except ImportError: - pass -else: - __all__.append("genshi") diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treeadapters/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treeadapters/__init__.pyc deleted file mode 100644 index 89e6a13de110d8d593ea52624e115671064936d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1022 zcmZuvZEMp|6h2A2wu@{|*+)NIKQ$AUY^Xy=H$)gra58FP5|C@s+_l%<<i?wu+7A36 z{z3nXf53B+ZgpTF=bqQ+xjA`Sf4015Kes=RVfAd_`R0oYr9~$Nh|oHax}Y4$T!>uA zS`f7$YeUoqCv8F62DJfM2cizf8!&Mo>cVmtsMe`#J&1bXT;-3TEjD51fl0t|oO~NT zi7tHgAnn302d8`R(ceVk>bC<hGD5I8jSDMG$&|2csVg?t`CJ&wu8q!^&IPm7R$5by zZDlajEY7u^3gdZai#RKkIQG0Cz`<1PCrXcJ$H%N#+NsVxkFf@*kVU}fB2TqpGAlF^ zOl_uKDw+JRC%7#J#C~_j)#OCv<y6+-sUEWv)*n#+=^)YR^7LFj9fY+v2<vp87zih+ zq)LUsfjjt#u(XD^O~vmE>g(^(L=l_ve)IY0;{9cv^{MUTAIy4!VgzpngZl9Cf^}_# zwX0ao?jx?~o5Gr%=$nt^E6gSetmcj9ukq@;?Cp7;B#HSgH1;8yI4QNNtl-VoY!7p( zoXb+`-0omd<&ypxR}uvft5TvSz$aq~q>LBU>THr7Og8M*+Wp`^pn)zL&hcY8w_fdE zS0oqChZw<-P=_uWl06LTOExpHQrOg{5+S{-#c^f~N`zSAqCnO7=)u~QKQIgnBj>Rd z;XF3swWdE?hBu3F`P?M=_u1jmxBTG9yf_-aDi^QQ8*_lqqzFeLYH?rYrA6j_dw4P7 zmz1jCl|*aZkTyeF|E>H&&Sfqw=K-plwmHajS}Ae*82yqq+Hsz^JMO02a(109r|td) D!F(B7 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py deleted file mode 100644 index 61d5fb6..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py +++ /dev/null @@ -1,54 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from genshi.core import QName, Attrs -from genshi.core import START, END, TEXT, COMMENT, DOCTYPE - - -def to_genshi(walker): - """Convert a tree to a genshi tree - - :arg walker: the treewalker to use to walk the tree to convert it - - :returns: generator of genshi nodes - - """ - text = [] - for token in walker: - type = token["type"] - if type in ("Characters", "SpaceCharacters"): - text.append(token["data"]) - elif text: - yield TEXT, "".join(text), (None, -1, -1) - text = [] - - if type in ("StartTag", "EmptyTag"): - if token["namespace"]: - name = "{%s}%s" % (token["namespace"], token["name"]) - else: - name = token["name"] - attrs = Attrs([(QName("{%s}%s" % attr if attr[0] is not None else attr[1]), value) - for attr, value in token["data"].items()]) - yield (START, (QName(name), attrs), (None, -1, -1)) - if type == "EmptyTag": - type = "EndTag" - - if type == "EndTag": - if token["namespace"]: - name = "{%s}%s" % (token["namespace"], token["name"]) - else: - name = token["name"] - - yield END, QName(name), (None, -1, -1) - - elif type == "Comment": - yield COMMENT, token["data"], (None, -1, -1) - - elif type == "Doctype": - yield DOCTYPE, (token["name"], token["publicId"], - token["systemId"]), (None, -1, -1) - - else: - pass # FIXME: What to do? - - if text: - yield TEXT, "".join(text), (None, -1, -1) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treeadapters/genshi.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treeadapters/genshi.pyc deleted file mode 100644 index 7d345cb9c4fe8ea6ac57bdcb523b4ce9fef8f771..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1973 zcmd5-&2k$>5boL4za=MuSVl<>x`dLc3Q7uafy+>&Y#nm25>_f8TM1&lGm_WZKhMl6 zRxBN;@Cb0@DR={pJOgh5Ra~KaR{jBss&HdVJKOzD|4;YG{;g4a=bQECKCB)Kzn^|> zftnz}@y8$ph#0sGA`4s#A{$&A80}dQ79c8uTZE_tZYf7?gO<T9LsS8`0#Oy*DnvDK zYY?r0yM}TF_!hve124j$Q$k+>1<<i^(bsVC4pkCnT8x4yO{CTp#CR|ZRFK5_Ix<-t z_z4%IFwjDJq3TfNx`@kXeJ>J*dZ@Kj9l{Jd7(R4{nq2hy`?`SNVeiYKE+et`_~4+| z&*}Zgd&8$sdOky(+|s^JCHWl@EX$I?>CbEdu>brgwzObjQI%Rt8x}V3n=mbb{1_Gt zj=}5|p!JFYi{B<p`k)zQeT<3>aD#8a*oMzpZaGFBw9+(Iwiwy2LQ8%Jyk?9cL)aR$ z#uhY}1&DJT0c0>KG(!UD^tcGGD9BxSX2G%u%M$1kEQ-ME(Bf~xv<mVUW48#+xNLSB zCe}p>(E3*vocu@;F3W&LBHaS9i!$x<%{*+1wgOWN<QC)WfK@ozVyi6H4Ssf!h09(q zi^`=l{#Nehq+#lE%~<?_>FRlwy!97>>qejf`l2jUjT?E@-oUD1xVJ7e(CQa-D8I75 zAIj}q1{1+b4LWzQ2eR*R*-PS?kh<-)wG^VQ6Qm|0R!4yWYPB{#JD!}hUwGkE$ep%6 zLNS!hdD6&~Q6%7EmvDb&JJ2gLQs_*^YKJ^vlj}sblkvH`7`tEPf*JL)o~I(KQHV#L z^n9EOmC+;(QqLDxFp}k-_A>lJ@CQB_b@@PhQV+d}VR})j=fqTTC&qD7WF(_GJ-e%x zca`x-8)j?+8WpqKi#e&$$m}IiBw}so{lqunk)t#_3<LiWH;&X?X%Ri*eKWqV5x%)0 z`X+3%<a+;_z(2%ojNq#Jf92OuA147Xs5BKZcPLYHl^iEQY>0jm3&$J?T|9U@Mam&B z4zUiYIux!$rR@-9%;nu-3}|tx&3&blDHibjYz;vrH-v{*n-Q9MVV2)^1gQ=h1hc3! zq`IjLW}X(^nJ2sBB;?o?-Iu4``Frv(eldNpeG=c_mhW%-AF9)j_)B>opGn#scGDoe z7sN_?VR%nJIGBu{5M<ub3=>ae_ee+K2Vrp7rSA5)mr~1h^I>>5o#TjNZpkPIs7`7Z z7pRn2gVk7_-DD-U$*NWzx!YC^xdFR{c>Nr)Hj&!E_XgXr3s#BsI}Nf)O+FfpGaL>v z8aZUtp$>G+UjUuZDhNN3BCkCa@yY>EG?%B~G?Be5-2bC`6^v;&N_ZBEPbfJ>opZ-( HvX1>HevZ?0 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treeadapters/sax.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treeadapters/sax.py deleted file mode 100644 index f4ccea5..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treeadapters/sax.py +++ /dev/null @@ -1,50 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from xml.sax.xmlreader import AttributesNSImpl - -from ..constants import adjustForeignAttributes, unadjustForeignAttributes - -prefix_mapping = {} -for prefix, localName, namespace in adjustForeignAttributes.values(): - if prefix is not None: - prefix_mapping[prefix] = namespace - - -def to_sax(walker, handler): - """Call SAX-like content handler based on treewalker walker - - :arg walker: the treewalker to use to walk the tree to convert it - - :arg handler: SAX handler to use - - """ - handler.startDocument() - for prefix, namespace in prefix_mapping.items(): - handler.startPrefixMapping(prefix, namespace) - - for token in walker: - type = token["type"] - if type == "Doctype": - continue - elif type in ("StartTag", "EmptyTag"): - attrs = AttributesNSImpl(token["data"], - unadjustForeignAttributes) - handler.startElementNS((token["namespace"], token["name"]), - token["name"], - attrs) - if type == "EmptyTag": - handler.endElementNS((token["namespace"], token["name"]), - token["name"]) - elif type == "EndTag": - handler.endElementNS((token["namespace"], token["name"]), - token["name"]) - elif type in ("Characters", "SpaceCharacters"): - handler.characters(token["data"]) - elif type == "Comment": - pass - else: - assert False, "Unknown token type" - - for prefix, namespace in prefix_mapping.items(): - handler.endPrefixMapping(prefix) - handler.endDocument() diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treeadapters/sax.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treeadapters/sax.pyc deleted file mode 100644 index 65d841e74ad09095e67cc9e7d3213d26023b949f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1970 zcmd5+-EJF26h5>5cbuewh+rufzQa^X-3qWuR8>T2Dp9FcWj6{kt=x%s;%q$oli69v zshkT4;*uBPg?JBMfbYzP#FePv5_|XT%$f7^&3DdB;m_6j{h!v}j_KxC#P_>*9;Lrw z;Nuabi9$g`L7_)OkHP{C3nX~WBVDAhM8gv11@eoe%M?~<SfQ{=!zzh@Xjr3pmsEw$ z>U2%?>}{LgAjAp{8#G)cwL*TGrZqB$q%f_q=E?aX;W_e4^a~=av&o=c0VD(@Y8N2v zI)pq<W1U$w3c@5d)>fhOgISOUab)jdl10Hd_SHxSRvD?&wqRFY*|XLJ$M8*igYUyc z2OgAd7Iq6l`e#{cpT|Z8ljzRYHnEmPA6Xr<JHssD-DetqMZSfgGvd9A`F*mOcsUW< z^v0trJOyV0>CvJ<*B*)UEjpTSiUsr45LZQ76uA`5s}e0rO#IX%^N!A+^23@nnwH7@ zK{hunQPY+<(pA~ThD3leHThGa<_R+8qeYpnQBICgbWvXj##{NQgM;@%+~ln~pW1)% z$$_prpkF$Ns!IZ_*8*G4*H>J?$2_$)N+IjyHwYF#3*PL}{EKA{n;&wx!W_D2KZ+yX z2Ry;Mzl!#8?eIGnMrz#}?ESE#gQ;qb(J3mjty3BKTA9|dOqJh?qn0&FT}VBJF8|c) zE&O(+ncOILTlQ2f+u694rO?FA;C7W2NHbH$wgS5p<|gMZqqzl;2g$86K9BY?Q5kpD zvv};r+~or+jeRXA8BY$v#9s1*&3$QQR>L5Yp-K}uR!+^ctjxxd&!%+@_fMsfW1NgM z<I^-?<0T#E+>gT$^kko4d>Bom_yWwtQw0fFJ$GOnhJOT<FaLY0_A0_#7Afxw8_hVY zU4teu>Li$tLYX8%G(lVA7O*NzEkknVubjop+@Q~wL!Ygjw=+1<io^8=wgJ70{5u6> z8{g94qCdwyp`7zxnxba7OAd^|^}-zl=MU1^m0bBZWOqwh<~eT~%Ou{^*{SpGptqL_ z<kC7;aeniHJC(#8mA0WFC(=1aox}t)X;o(?P3I)mKC0JwKkr<AWsakZ>7(v>^ssBb z?v5X)^Kbq4<{^HQr1QFy1j$Yife)>B?4y^H(JNNDcQnJcV$(Ubq5eh(#~to{>C1#$ zqm#<{gXGeIxA6!wSEnw+s@6qQY<jDrE*heYw=Qa8OH}Z0;Je}E8ssM4g7=x%gs$g~ zBF;6@Xmpa<%&5_*&*A!fJNMlkyn)d?)DJj0z6NlVakX{S;W%L@kxlzdm@9XmnRX~= zQfDgdf68;_S;u3kd+7iECac(^7e}i9IR<y^{tqaw0??B%_A{-XG8HNJ|F(Az#FfQ1 IDBLLg1@%VQi2wiq diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py deleted file mode 100644 index d44447e..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py +++ /dev/null @@ -1,88 +0,0 @@ -"""A collection of modules for building different kinds of trees from HTML -documents. - -To create a treebuilder for a new type of tree, you need to do -implement several things: - -1. A set of classes for various types of elements: Document, Doctype, Comment, - Element. These must implement the interface of ``base.treebuilders.Node`` - (although comment nodes have a different signature for their constructor, - see ``treebuilders.etree.Comment``) Textual content may also be implemented - as another node type, or not, as your tree implementation requires. - -2. A treebuilder object (called ``TreeBuilder`` by convention) that inherits - from ``treebuilders.base.TreeBuilder``. This has 4 required attributes: - - * ``documentClass`` - the class to use for the bottommost node of a document - * ``elementClass`` - the class to use for HTML Elements - * ``commentClass`` - the class to use for comments - * ``doctypeClass`` - the class to use for doctypes - - It also has one required method: - - * ``getDocument`` - Returns the root node of the complete document tree - -3. If you wish to run the unit tests, you must also create a ``testSerializer`` - method on your treebuilder which accepts a node and returns a string - containing Node and its children serialized according to the format used in - the unittests - -""" - -from __future__ import absolute_import, division, unicode_literals - -from .._utils import default_etree - -treeBuilderCache = {} - - -def getTreeBuilder(treeType, implementation=None, **kwargs): - """Get a TreeBuilder class for various types of trees with built-in support - - :arg treeType: the name of the tree type required (case-insensitive). Supported - values are: - - * "dom" - A generic builder for DOM implementations, defaulting to a - xml.dom.minidom based implementation. - * "etree" - A generic builder for tree implementations exposing an - ElementTree-like interface, defaulting to xml.etree.cElementTree if - available and xml.etree.ElementTree if not. - * "lxml" - A etree-based builder for lxml.etree, handling limitations - of lxml's implementation. - - :arg implementation: (Currently applies to the "etree" and "dom" tree - types). A module implementing the tree type e.g. xml.etree.ElementTree - or xml.etree.cElementTree. - - :arg kwargs: Any additional options to pass to the TreeBuilder when - creating it. - - Example: - - >>> from html5lib.treebuilders import getTreeBuilder - >>> builder = getTreeBuilder('etree') - - """ - - treeType = treeType.lower() - if treeType not in treeBuilderCache: - if treeType == "dom": - from . import dom - # Come up with a sane default (pref. from the stdlib) - if implementation is None: - from xml.dom import minidom - implementation = minidom - # NEVER cache here, caching is done in the dom submodule - return dom.getDomModule(implementation, **kwargs).TreeBuilder - elif treeType == "lxml": - from . import etree_lxml - treeBuilderCache[treeType] = etree_lxml.TreeBuilder - elif treeType == "etree": - from . import etree - if implementation is None: - implementation = default_etree - # NEVER cache here, caching is done in the etree submodule - return etree.getETreeModule(implementation, **kwargs).TreeBuilder - else: - raise ValueError("""Unrecognised treebuilder "%s" """ % treeType) - return treeBuilderCache.get(treeType) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/__init__.pyc deleted file mode 100644 index 98f445782422f3cc450598c877f6089292da0dd9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3662 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 R2ZUfx3v115&8y9|)<0hJLw^7O diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/base.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/base.py deleted file mode 100644 index 73973db..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/base.py +++ /dev/null @@ -1,417 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals -from pip._vendor.six import text_type - -from ..constants import scopingElements, tableInsertModeElements, namespaces - -# The scope markers are inserted when entering object elements, -# marquees, table cells, and table captions, and are used to prevent formatting -# from "leaking" into tables, object elements, and marquees. -Marker = None - -listElementsMap = { - None: (frozenset(scopingElements), False), - "button": (frozenset(scopingElements | set([(namespaces["html"], "button")])), False), - "list": (frozenset(scopingElements | set([(namespaces["html"], "ol"), - (namespaces["html"], "ul")])), False), - "table": (frozenset([(namespaces["html"], "html"), - (namespaces["html"], "table")]), False), - "select": (frozenset([(namespaces["html"], "optgroup"), - (namespaces["html"], "option")]), True) -} - - -class Node(object): - """Represents an item in the tree""" - def __init__(self, name): - """Creates a Node - - :arg name: The tag name associated with the node - - """ - # The tag name assocaited with the node - self.name = name - # The parent of the current node (or None for the document node) - self.parent = None - # The value of the current node (applies to text nodes and comments) - self.value = None - # A dict holding name -> value pairs for attributes of the node - self.attributes = {} - # A list of child nodes of the current node. This must include all - # elements but not necessarily other node types. - self.childNodes = [] - # A list of miscellaneous flags that can be set on the node. - self._flags = [] - - def __str__(self): - attributesStr = " ".join(["%s=\"%s\"" % (name, value) - for name, value in - self.attributes.items()]) - if attributesStr: - return "<%s %s>" % (self.name, attributesStr) - else: - return "<%s>" % (self.name) - - def __repr__(self): - return "<%s>" % (self.name) - - def appendChild(self, node): - """Insert node as a child of the current node - - :arg node: the node to insert - - """ - raise NotImplementedError - - def insertText(self, data, insertBefore=None): - """Insert data as text in the current node, positioned before the - start of node insertBefore or to the end of the node's text. - - :arg data: the data to insert - - :arg insertBefore: True if you want to insert the text before the node - and False if you want to insert it after the node - - """ - raise NotImplementedError - - def insertBefore(self, node, refNode): - """Insert node as a child of the current node, before refNode in the - list of child nodes. Raises ValueError if refNode is not a child of - the current node - - :arg node: the node to insert - - :arg refNode: the child node to insert the node before - - """ - raise NotImplementedError - - def removeChild(self, node): - """Remove node from the children of the current node - - :arg node: the child node to remove - - """ - raise NotImplementedError - - def reparentChildren(self, newParent): - """Move all the children of the current node to newParent. - This is needed so that trees that don't store text as nodes move the - text in the correct way - - :arg newParent: the node to move all this node's children to - - """ - # XXX - should this method be made more general? - for child in self.childNodes: - newParent.appendChild(child) - self.childNodes = [] - - def cloneNode(self): - """Return a shallow copy of the current node i.e. a node with the same - name and attributes but with no parent or child nodes - """ - raise NotImplementedError - - def hasContent(self): - """Return true if the node has children or text, false otherwise - """ - raise NotImplementedError - - -class ActiveFormattingElements(list): - def append(self, node): - equalCount = 0 - if node != Marker: - for element in self[::-1]: - if element == Marker: - break - if self.nodesEqual(element, node): - equalCount += 1 - if equalCount == 3: - self.remove(element) - break - list.append(self, node) - - def nodesEqual(self, node1, node2): - if not node1.nameTuple == node2.nameTuple: - return False - - if not node1.attributes == node2.attributes: - return False - - return True - - -class TreeBuilder(object): - """Base treebuilder implementation - - * documentClass - the class to use for the bottommost node of a document - * elementClass - the class to use for HTML Elements - * commentClass - the class to use for comments - * doctypeClass - the class to use for doctypes - - """ - # pylint:disable=not-callable - - # Document class - documentClass = None - - # The class to use for creating a node - elementClass = None - - # The class to use for creating comments - commentClass = None - - # The class to use for creating doctypes - doctypeClass = None - - # Fragment class - fragmentClass = None - - def __init__(self, namespaceHTMLElements): - """Create a TreeBuilder - - :arg namespaceHTMLElements: whether or not to namespace HTML elements - - """ - if namespaceHTMLElements: - self.defaultNamespace = "http://www.w3.org/1999/xhtml" - else: - self.defaultNamespace = None - self.reset() - - def reset(self): - self.openElements = [] - self.activeFormattingElements = ActiveFormattingElements() - - # XXX - rename these to headElement, formElement - self.headPointer = None - self.formPointer = None - - self.insertFromTable = False - - self.document = self.documentClass() - - def elementInScope(self, target, variant=None): - - # If we pass a node in we match that. if we pass a string - # match any node with that name - exactNode = hasattr(target, "nameTuple") - if not exactNode: - if isinstance(target, text_type): - target = (namespaces["html"], target) - assert isinstance(target, tuple) - - listElements, invert = listElementsMap[variant] - - for node in reversed(self.openElements): - if exactNode and node == target: - return True - elif not exactNode and node.nameTuple == target: - return True - elif (invert ^ (node.nameTuple in listElements)): - return False - - assert False # We should never reach this point - - def reconstructActiveFormattingElements(self): - # Within this algorithm the order of steps described in the - # specification is not quite the same as the order of steps in the - # code. It should still do the same though. - - # Step 1: stop the algorithm when there's nothing to do. - if not self.activeFormattingElements: - return - - # Step 2 and step 3: we start with the last element. So i is -1. - i = len(self.activeFormattingElements) - 1 - entry = self.activeFormattingElements[i] - if entry == Marker or entry in self.openElements: - return - - # Step 6 - while entry != Marker and entry not in self.openElements: - if i == 0: - # This will be reset to 0 below - i = -1 - break - i -= 1 - # Step 5: let entry be one earlier in the list. - entry = self.activeFormattingElements[i] - - while True: - # Step 7 - i += 1 - - # Step 8 - entry = self.activeFormattingElements[i] - clone = entry.cloneNode() # Mainly to get a new copy of the attributes - - # Step 9 - element = self.insertElement({"type": "StartTag", - "name": clone.name, - "namespace": clone.namespace, - "data": clone.attributes}) - - # Step 10 - self.activeFormattingElements[i] = element - - # Step 11 - if element == self.activeFormattingElements[-1]: - break - - def clearActiveFormattingElements(self): - entry = self.activeFormattingElements.pop() - while self.activeFormattingElements and entry != Marker: - entry = self.activeFormattingElements.pop() - - def elementInActiveFormattingElements(self, name): - """Check if an element exists between the end of the active - formatting elements and the last marker. If it does, return it, else - return false""" - - for item in self.activeFormattingElements[::-1]: - # Check for Marker first because if it's a Marker it doesn't have a - # name attribute. - if item == Marker: - break - elif item.name == name: - return item - return False - - def insertRoot(self, token): - element = self.createElement(token) - self.openElements.append(element) - self.document.appendChild(element) - - def insertDoctype(self, token): - name = token["name"] - publicId = token["publicId"] - systemId = token["systemId"] - - doctype = self.doctypeClass(name, publicId, systemId) - self.document.appendChild(doctype) - - def insertComment(self, token, parent=None): - if parent is None: - parent = self.openElements[-1] - parent.appendChild(self.commentClass(token["data"])) - - def createElement(self, token): - """Create an element but don't insert it anywhere""" - name = token["name"] - namespace = token.get("namespace", self.defaultNamespace) - element = self.elementClass(name, namespace) - element.attributes = token["data"] - return element - - def _getInsertFromTable(self): - return self._insertFromTable - - def _setInsertFromTable(self, value): - """Switch the function used to insert an element from the - normal one to the misnested table one and back again""" - self._insertFromTable = value - if value: - self.insertElement = self.insertElementTable - else: - self.insertElement = self.insertElementNormal - - insertFromTable = property(_getInsertFromTable, _setInsertFromTable) - - def insertElementNormal(self, token): - name = token["name"] - assert isinstance(name, text_type), "Element %s not unicode" % name - namespace = token.get("namespace", self.defaultNamespace) - element = self.elementClass(name, namespace) - element.attributes = token["data"] - self.openElements[-1].appendChild(element) - self.openElements.append(element) - return element - - def insertElementTable(self, token): - """Create an element and insert it into the tree""" - element = self.createElement(token) - if self.openElements[-1].name not in tableInsertModeElements: - return self.insertElementNormal(token) - else: - # We should be in the InTable mode. This means we want to do - # special magic element rearranging - parent, insertBefore = self.getTableMisnestedNodePosition() - if insertBefore is None: - parent.appendChild(element) - else: - parent.insertBefore(element, insertBefore) - self.openElements.append(element) - return element - - def insertText(self, data, parent=None): - """Insert text data.""" - if parent is None: - parent = self.openElements[-1] - - if (not self.insertFromTable or (self.insertFromTable and - self.openElements[-1].name - not in tableInsertModeElements)): - parent.insertText(data) - else: - # We should be in the InTable mode. This means we want to do - # special magic element rearranging - parent, insertBefore = self.getTableMisnestedNodePosition() - parent.insertText(data, insertBefore) - - def getTableMisnestedNodePosition(self): - """Get the foster parent element, and sibling to insert before - (or None) when inserting a misnested table node""" - # The foster parent element is the one which comes before the most - # recently opened table element - # XXX - this is really inelegant - lastTable = None - fosterParent = None - insertBefore = None - for elm in self.openElements[::-1]: - if elm.name == "table": - lastTable = elm - break - if lastTable: - # XXX - we should really check that this parent is actually a - # node here - if lastTable.parent: - fosterParent = lastTable.parent - insertBefore = lastTable - else: - fosterParent = self.openElements[ - self.openElements.index(lastTable) - 1] - else: - fosterParent = self.openElements[0] - return fosterParent, insertBefore - - def generateImpliedEndTags(self, exclude=None): - name = self.openElements[-1].name - # XXX td, th and tr are not actually needed - if (name in frozenset(("dd", "dt", "li", "option", "optgroup", "p", "rp", "rt")) and - name != exclude): - self.openElements.pop() - # XXX This is not entirely what the specification says. We should - # investigate it more closely. - self.generateImpliedEndTags(exclude) - - def getDocument(self): - """Return the final tree""" - return self.document - - def getFragment(self): - """Return the final fragment""" - # assert self.innerHTML - fragment = self.fragmentClass() - self.openElements[0].reparentChildren(fragment) - return fragment - - def testSerializer(self, node): - """Serialize the subtree of node in the format required by unit tests - - :arg node: the node from which to start serializing - - """ - raise NotImplementedError diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/base.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/base.pyc deleted file mode 100644 index 55b4a962f427facbbf98e954cd763ccd7fe9cd5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16123 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 J$<E1B{|g(aJ(B<c diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/dom.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/dom.py deleted file mode 100644 index dcfac22..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/dom.py +++ /dev/null @@ -1,236 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - - -from collections import MutableMapping -from xml.dom import minidom, Node -import weakref - -from . import base -from .. import constants -from ..constants import namespaces -from .._utils import moduleFactoryFactory - - -def getDomBuilder(DomImplementation): - Dom = DomImplementation - - class AttrList(MutableMapping): - def __init__(self, element): - self.element = element - - def __iter__(self): - return iter(self.element.attributes.keys()) - - def __setitem__(self, name, value): - if isinstance(name, tuple): - raise NotImplementedError - else: - attr = self.element.ownerDocument.createAttribute(name) - attr.value = value - self.element.attributes[name] = attr - - def __len__(self): - return len(self.element.attributes) - - def items(self): - return list(self.element.attributes.items()) - - def values(self): - return list(self.element.attributes.values()) - - def __getitem__(self, name): - if isinstance(name, tuple): - raise NotImplementedError - else: - return self.element.attributes[name].value - - def __delitem__(self, name): - if isinstance(name, tuple): - raise NotImplementedError - else: - del self.element.attributes[name] - - class NodeBuilder(base.Node): - def __init__(self, element): - base.Node.__init__(self, element.nodeName) - self.element = element - - namespace = property(lambda self: hasattr(self.element, "namespaceURI") and - self.element.namespaceURI or None) - - def appendChild(self, node): - node.parent = self - self.element.appendChild(node.element) - - def insertText(self, data, insertBefore=None): - text = self.element.ownerDocument.createTextNode(data) - if insertBefore: - self.element.insertBefore(text, insertBefore.element) - else: - self.element.appendChild(text) - - def insertBefore(self, node, refNode): - self.element.insertBefore(node.element, refNode.element) - node.parent = self - - def removeChild(self, node): - if node.element.parentNode == self.element: - self.element.removeChild(node.element) - node.parent = None - - def reparentChildren(self, newParent): - while self.element.hasChildNodes(): - child = self.element.firstChild - self.element.removeChild(child) - newParent.element.appendChild(child) - self.childNodes = [] - - def getAttributes(self): - return AttrList(self.element) - - def setAttributes(self, attributes): - if attributes: - for name, value in list(attributes.items()): - if isinstance(name, tuple): - if name[0] is not None: - qualifiedName = (name[0] + ":" + name[1]) - else: - qualifiedName = name[1] - self.element.setAttributeNS(name[2], qualifiedName, - value) - else: - self.element.setAttribute( - name, value) - attributes = property(getAttributes, setAttributes) - - def cloneNode(self): - return NodeBuilder(self.element.cloneNode(False)) - - def hasContent(self): - return self.element.hasChildNodes() - - def getNameTuple(self): - if self.namespace is None: - return namespaces["html"], self.name - else: - return self.namespace, self.name - - nameTuple = property(getNameTuple) - - class TreeBuilder(base.TreeBuilder): # pylint:disable=unused-variable - def documentClass(self): - self.dom = Dom.getDOMImplementation().createDocument(None, None, None) - return weakref.proxy(self) - - def insertDoctype(self, token): - name = token["name"] - publicId = token["publicId"] - systemId = token["systemId"] - - domimpl = Dom.getDOMImplementation() - doctype = domimpl.createDocumentType(name, publicId, systemId) - self.document.appendChild(NodeBuilder(doctype)) - if Dom == minidom: - doctype.ownerDocument = self.dom - - def elementClass(self, name, namespace=None): - if namespace is None and self.defaultNamespace is None: - node = self.dom.createElement(name) - else: - node = self.dom.createElementNS(namespace, name) - - return NodeBuilder(node) - - def commentClass(self, data): - return NodeBuilder(self.dom.createComment(data)) - - def fragmentClass(self): - return NodeBuilder(self.dom.createDocumentFragment()) - - def appendChild(self, node): - self.dom.appendChild(node.element) - - def testSerializer(self, element): - return testSerializer(element) - - def getDocument(self): - return self.dom - - def getFragment(self): - return base.TreeBuilder.getFragment(self).element - - def insertText(self, data, parent=None): - data = data - if parent != self: - base.TreeBuilder.insertText(self, data, parent) - else: - # HACK: allow text nodes as children of the document node - if hasattr(self.dom, '_child_node_types'): - # pylint:disable=protected-access - if Node.TEXT_NODE not in self.dom._child_node_types: - self.dom._child_node_types = list(self.dom._child_node_types) - self.dom._child_node_types.append(Node.TEXT_NODE) - self.dom.appendChild(self.dom.createTextNode(data)) - - implementation = DomImplementation - name = None - - def testSerializer(element): - element.normalize() - rv = [] - - def serializeElement(element, indent=0): - if element.nodeType == Node.DOCUMENT_TYPE_NODE: - if element.name: - if element.publicId or element.systemId: - publicId = element.publicId or "" - systemId = element.systemId or "" - rv.append("""|%s<!DOCTYPE %s "%s" "%s">""" % - (' ' * indent, element.name, publicId, systemId)) - else: - rv.append("|%s<!DOCTYPE %s>" % (' ' * indent, element.name)) - else: - rv.append("|%s<!DOCTYPE >" % (' ' * indent,)) - elif element.nodeType == Node.DOCUMENT_NODE: - rv.append("#document") - elif element.nodeType == Node.DOCUMENT_FRAGMENT_NODE: - rv.append("#document-fragment") - elif element.nodeType == Node.COMMENT_NODE: - rv.append("|%s<!-- %s -->" % (' ' * indent, element.nodeValue)) - elif element.nodeType == Node.TEXT_NODE: - rv.append("|%s\"%s\"" % (' ' * indent, element.nodeValue)) - else: - if (hasattr(element, "namespaceURI") and - element.namespaceURI is not None): - name = "%s %s" % (constants.prefixes[element.namespaceURI], - element.nodeName) - else: - name = element.nodeName - rv.append("|%s<%s>" % (' ' * indent, name)) - if element.hasAttributes(): - attributes = [] - for i in range(len(element.attributes)): - attr = element.attributes.item(i) - name = attr.nodeName - value = attr.value - ns = attr.namespaceURI - if ns: - name = "%s %s" % (constants.prefixes[ns], attr.localName) - else: - name = attr.nodeName - attributes.append((name, value)) - - for name, value in sorted(attributes): - rv.append('|%s%s="%s"' % (' ' * (indent + 2), name, value)) - indent += 2 - for child in element.childNodes: - serializeElement(child, indent) - serializeElement(element, 0) - - return "\n".join(rv) - - return locals() - - -# The actual means to get a module! -getDomModule = moduleFactoryFactory(getDomBuilder) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/dom.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/dom.pyc deleted file mode 100644 index 6839b0c89a69876c89bac5cc6cdcca0b39f9c76f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13400 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 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/etree.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/etree.py deleted file mode 100644 index 0dedf44..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/etree.py +++ /dev/null @@ -1,340 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals -# pylint:disable=protected-access - -from pip._vendor.six import text_type - -import re - -from . import base -from .. import _ihatexml -from .. import constants -from ..constants import namespaces -from .._utils import moduleFactoryFactory - -tag_regexp = re.compile("{([^}]*)}(.*)") - - -def getETreeBuilder(ElementTreeImplementation, fullTree=False): - ElementTree = ElementTreeImplementation - ElementTreeCommentType = ElementTree.Comment("asd").tag - - class Element(base.Node): - def __init__(self, name, namespace=None): - self._name = name - self._namespace = namespace - self._element = ElementTree.Element(self._getETreeTag(name, - namespace)) - if namespace is None: - self.nameTuple = namespaces["html"], self._name - else: - self.nameTuple = self._namespace, self._name - self.parent = None - self._childNodes = [] - self._flags = [] - - def _getETreeTag(self, name, namespace): - if namespace is None: - etree_tag = name - else: - etree_tag = "{%s}%s" % (namespace, name) - return etree_tag - - def _setName(self, name): - self._name = name - self._element.tag = self._getETreeTag(self._name, self._namespace) - - def _getName(self): - return self._name - - name = property(_getName, _setName) - - def _setNamespace(self, namespace): - self._namespace = namespace - self._element.tag = self._getETreeTag(self._name, self._namespace) - - def _getNamespace(self): - return self._namespace - - namespace = property(_getNamespace, _setNamespace) - - def _getAttributes(self): - return self._element.attrib - - def _setAttributes(self, attributes): - # Delete existing attributes first - # XXX - there may be a better way to do this... - for key in list(self._element.attrib.keys()): - del self._element.attrib[key] - for key, value in attributes.items(): - if isinstance(key, tuple): - name = "{%s}%s" % (key[2], key[1]) - else: - name = key - self._element.set(name, value) - - attributes = property(_getAttributes, _setAttributes) - - def _getChildNodes(self): - return self._childNodes - - def _setChildNodes(self, value): - del self._element[:] - self._childNodes = [] - for element in value: - self.insertChild(element) - - childNodes = property(_getChildNodes, _setChildNodes) - - def hasContent(self): - """Return true if the node has children or text""" - return bool(self._element.text or len(self._element)) - - def appendChild(self, node): - self._childNodes.append(node) - self._element.append(node._element) - node.parent = self - - def insertBefore(self, node, refNode): - index = list(self._element).index(refNode._element) - self._element.insert(index, node._element) - node.parent = self - - def removeChild(self, node): - self._childNodes.remove(node) - self._element.remove(node._element) - node.parent = None - - def insertText(self, data, insertBefore=None): - if not(len(self._element)): - if not self._element.text: - self._element.text = "" - self._element.text += data - elif insertBefore is None: - # Insert the text as the tail of the last child element - if not self._element[-1].tail: - self._element[-1].tail = "" - self._element[-1].tail += data - else: - # Insert the text before the specified node - children = list(self._element) - index = children.index(insertBefore._element) - if index > 0: - if not self._element[index - 1].tail: - self._element[index - 1].tail = "" - self._element[index - 1].tail += data - else: - if not self._element.text: - self._element.text = "" - self._element.text += data - - def cloneNode(self): - element = type(self)(self.name, self.namespace) - for name, value in self.attributes.items(): - element.attributes[name] = value - return element - - def reparentChildren(self, newParent): - if newParent.childNodes: - newParent.childNodes[-1]._element.tail += self._element.text - else: - if not newParent._element.text: - newParent._element.text = "" - if self._element.text is not None: - newParent._element.text += self._element.text - self._element.text = "" - base.Node.reparentChildren(self, newParent) - - class Comment(Element): - def __init__(self, data): - # Use the superclass constructor to set all properties on the - # wrapper element - self._element = ElementTree.Comment(data) - self.parent = None - self._childNodes = [] - self._flags = [] - - def _getData(self): - return self._element.text - - def _setData(self, value): - self._element.text = value - - data = property(_getData, _setData) - - class DocumentType(Element): - def __init__(self, name, publicId, systemId): - Element.__init__(self, "<!DOCTYPE>") - self._element.text = name - self.publicId = publicId - self.systemId = systemId - - def _getPublicId(self): - return self._element.get("publicId", "") - - def _setPublicId(self, value): - if value is not None: - self._element.set("publicId", value) - - publicId = property(_getPublicId, _setPublicId) - - def _getSystemId(self): - return self._element.get("systemId", "") - - def _setSystemId(self, value): - if value is not None: - self._element.set("systemId", value) - - systemId = property(_getSystemId, _setSystemId) - - class Document(Element): - def __init__(self): - Element.__init__(self, "DOCUMENT_ROOT") - - class DocumentFragment(Element): - def __init__(self): - Element.__init__(self, "DOCUMENT_FRAGMENT") - - def testSerializer(element): - rv = [] - - def serializeElement(element, indent=0): - if not(hasattr(element, "tag")): - element = element.getroot() - if element.tag == "<!DOCTYPE>": - if element.get("publicId") or element.get("systemId"): - publicId = element.get("publicId") or "" - systemId = element.get("systemId") or "" - rv.append("""<!DOCTYPE %s "%s" "%s">""" % - (element.text, publicId, systemId)) - else: - rv.append("<!DOCTYPE %s>" % (element.text,)) - elif element.tag == "DOCUMENT_ROOT": - rv.append("#document") - if element.text is not None: - rv.append("|%s\"%s\"" % (' ' * (indent + 2), element.text)) - if element.tail is not None: - raise TypeError("Document node cannot have tail") - if hasattr(element, "attrib") and len(element.attrib): - raise TypeError("Document node cannot have attributes") - elif element.tag == ElementTreeCommentType: - rv.append("|%s<!-- %s -->" % (' ' * indent, element.text)) - else: - assert isinstance(element.tag, text_type), \ - "Expected unicode, got %s, %s" % (type(element.tag), element.tag) - nsmatch = tag_regexp.match(element.tag) - - if nsmatch is None: - name = element.tag - else: - ns, name = nsmatch.groups() - prefix = constants.prefixes[ns] - name = "%s %s" % (prefix, name) - rv.append("|%s<%s>" % (' ' * indent, name)) - - if hasattr(element, "attrib"): - attributes = [] - for name, value in element.attrib.items(): - nsmatch = tag_regexp.match(name) - if nsmatch is not None: - ns, name = nsmatch.groups() - prefix = constants.prefixes[ns] - attr_string = "%s %s" % (prefix, name) - else: - attr_string = name - attributes.append((attr_string, value)) - - for name, value in sorted(attributes): - rv.append('|%s%s="%s"' % (' ' * (indent + 2), name, value)) - if element.text: - rv.append("|%s\"%s\"" % (' ' * (indent + 2), element.text)) - indent += 2 - for child in element: - serializeElement(child, indent) - if element.tail: - rv.append("|%s\"%s\"" % (' ' * (indent - 2), element.tail)) - serializeElement(element, 0) - - return "\n".join(rv) - - def tostring(element): # pylint:disable=unused-variable - """Serialize an element and its child nodes to a string""" - rv = [] - filter = _ihatexml.InfosetFilter() - - def serializeElement(element): - if isinstance(element, ElementTree.ElementTree): - element = element.getroot() - - if element.tag == "<!DOCTYPE>": - if element.get("publicId") or element.get("systemId"): - publicId = element.get("publicId") or "" - systemId = element.get("systemId") or "" - rv.append("""<!DOCTYPE %s PUBLIC "%s" "%s">""" % - (element.text, publicId, systemId)) - else: - rv.append("<!DOCTYPE %s>" % (element.text,)) - elif element.tag == "DOCUMENT_ROOT": - if element.text is not None: - rv.append(element.text) - if element.tail is not None: - raise TypeError("Document node cannot have tail") - if hasattr(element, "attrib") and len(element.attrib): - raise TypeError("Document node cannot have attributes") - - for child in element: - serializeElement(child) - - elif element.tag == ElementTreeCommentType: - rv.append("<!--%s-->" % (element.text,)) - else: - # This is assumed to be an ordinary element - if not element.attrib: - rv.append("<%s>" % (filter.fromXmlName(element.tag),)) - else: - attr = " ".join(["%s=\"%s\"" % ( - filter.fromXmlName(name), value) - for name, value in element.attrib.items()]) - rv.append("<%s %s>" % (element.tag, attr)) - if element.text: - rv.append(element.text) - - for child in element: - serializeElement(child) - - rv.append("</%s>" % (element.tag,)) - - if element.tail: - rv.append(element.tail) - - serializeElement(element) - - return "".join(rv) - - class TreeBuilder(base.TreeBuilder): # pylint:disable=unused-variable - documentClass = Document - doctypeClass = DocumentType - elementClass = Element - commentClass = Comment - fragmentClass = DocumentFragment - implementation = ElementTreeImplementation - - def testSerializer(self, element): - return testSerializer(element) - - def getDocument(self): - if fullTree: - return self.document._element - else: - if self.defaultNamespace is not None: - return self.document._element.find( - "{%s}html" % self.defaultNamespace) - else: - return self.document._element.find("html") - - def getFragment(self): - return base.TreeBuilder.getFragment(self)._element - - return locals() - - -getETreeModule = moduleFactoryFactory(getETreeBuilder) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/etree.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/etree.pyc deleted file mode 100644 index 15b7b8e9f7262b4ebdb1779c1cd4d3c0b9c608e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16763 zcmdU0U2I!NcAk4lQKUp!vSdeA>?Dj+6^s*E&Tf7-UB`)I*&FZ1vU{b}8+9EnO<u~B zDU!PP(kmxcfn5i&yszCB1zMo!-&27W?H1Ul7HEM2ed&9FKJ;Oq+Sk4oNWbr!xg_m4 zyPE(DGm`FT{_fm!&YZtFGn4t>sfiOmJaDaM+>ej{Z++i4@lTPd<IgiKW41lB;hAmU zZ1`q7V>U9zW1DYUS+hN6HpXl@V_G@0ku&wIsgIe~xY^E|jXc^=HLh~OY!qxcukwW1 zn6Tx7X-$~zNwYC&%M+$mG}}{VW6F48&TJhp^+|IVa7>$U#?*`EW8@E-aLR-SRX=O$ z8M9WN0^Cg^Q_dhsrjb;y$DLL$2`kO*ZYN5TJnHJrTg|xHX(ux%^xDl@ryf>X%_NMf zt+?#*)dG`nH>o7IyWwh+b+#dk-1TZ4Hc6~O-%9gF75%qcgQ{Am9VgXx;zpc6|8{jd zjJwrZ=;{ukZo5<OwZaS4TGEMbyMH|*@=^JBKiIo=;`zPu$rI1l_&I)?!(=!|8NjqZ zZtjnn{V}tp$pVG8JaZoe_f6uPt&C}S=H3`nkmnO)?i%y{eauhR>}QAC#`<j-CYQFU z2c|B4FJtQY2ipq$Hhf^>!M4eMn{V#r1VWKj_X~uGHNL4&v1SjM1A^DWWXwH4jkhx9 zUe??jH}~@9Ucof-raqkxx|cD@7|~fPa}HN~obPH}PsZ{8d@I}z+er;s{jkj^$^ILe z(2$$!2hBYrpp5whyae1l^D&x09AB9+l8iMu6OJ1&VTkWR1^`7?^#!syJ4~np(t<in zl7y@;lJA)Tmtuq>*_9)Jne(cjHuZusGwLATW`~0$CSL?sPbxDfo=43g(u_@qi2}$* zL3o0MVdcE3&nR=m1Z(A4U|S>Ze6o1vNQ3*x-0{pEV=Bn_%6Mkqm@VbOGi>z<DcFhK zvMkn(xtTZ7dnN&Qd1e6(;5p18dyJd*VP?R557px}cF3Den<=E3368i{CReZa2;7YX zvNMSc<`r*HQWEmIa*~-qGFfEZW|*8`kHT=hx+#IKgm%gkj<niohXMIOLd=2Id)-zD zz>VovBXCB-?^J3xnyvaOL_bzjrO~Qx##V7~m^f@TG@d}=xBJp-Wt@XJRwFEB6ixgg zlI3pHyajEre5)EQH#)6)7{$vU?k?Z{dUU=0gPSkCy3;=OYV`7}wQt0`uh&0}PT^;> zyS%>KZFZNMR2r?;Qu5NJ&B_&4>8acb+x1SgOftRFYF=MX@X6~vV8FpcmQHqWTVhn2 z?PgM`JVAJ<VT@P6?=*gk-hzKvB{2rkBy+5hF`h?eFwvM#&p^uBP`Ba-6fxURpz01a zt(`cM^rOXiZ_(<r-~h^HjvCA{;m3o+NHh}yvXWFcMX6CBS3qWZ4o{p%VnCjPKjYPi z8=pRDUO-_WGedk%ZkMPqlcA{8$<?$Lt7Y<WKo-_#0<ud$y`FGfl7ZhC5Nc$oVworo zlU0b$3BVY0M#)4qB9=a48j6_}`4nq53u{q9=#3a=P#(nWBmj*$1?E?uajPO>M^jz- zh#A*Bld<gFbH;-OBtz3pkr*AK5W<R^ZYkQYqvDItIq@FFITw0v&V}A<M9)op%FO&P zhNiq)hK4aqd0K)h(WSzxCP~!1K8mPP{n9p`6@+kl<I|`~aU~YiNqmIsPmtMNGKs|) zzN1{myI^n6tX!L;V@6V_0hZy7odt7s_Zl_fR+hfk%C*bpdp^5acMN@CNg*3i?2HC{ zsRi1Uj9HNJ$eMPJMrIE_g&ld^+(ACWx4fM<%vI@6>YLTxz_`fQwmvu&wXAZh87ESw z!P9Bg&G2?C?*X3tb}a7!ZoZuGTBwFZjsW#9_}waK8Y*?Q(@LUAL1Qqza;w_vg|cL$ zBe9xiU@(~HH;EFfP39Tzptk^9f7H+Y>I(ZH-W+9)KG*lvE)mlqwav-oBaZ$WGFE!O z<{VDX>>ee@4)HU%TE4BfGw=9~(!VOt&vF#0As-RU6Gn+XZky%SkP)=da9-!=F~)#g zR{*Q?ZpLB3rv@z1C)zVaXGjNhkJ3f4@(E3VKdT3OFQQ`*CcUU#N}^s^YBoyAjj+^) z3thTVjZ1Q<;a`_JQHg73d4dww>zz)^`aTqGwn@fXVS5yrjy3@JoI`*Bi-qr^WEsxy zdxqpcG2AI+EW>f_BVu_hLzAjZ@6a=>LSqH1OuQ$QSFM{YPLomTcH!V#_T!3n;4RoS z2xvSyY(`UG6~JP&@1YnI3FFOpbKYl{7H81Z=P=L%RDlSBLdbJLVNHQn7BnuXhc$3C z`>ab{!f2M6Xvv!GI@pO{x565TdSo-}TGN@4uts5ni@o3#RE!QO=_p#j-wqp{D6FFF zXnE9oV&Iv6QH}$nk>fr~y*|f9;dbX%XgQ9S!xE0)84zxC=tP#Y5R2s+12Xklj@-a` zmtZbIrw_AS{AS8#Sn8gTdm^r@_@<rezAX9DGq3rq{GXx4@ICh~-5Iz(aeMGSt3c)c z7%XSe$Bu)BKW9M0a=7F6jM<VC<oF+bF-sY9Gi##%b3Iv;HAnQZ{~CNOtseehTKB+5 zmxhp?_qc%ng~&=Pk$kH?B&PW(ewxbBGM2f>3#jQVvn(@5j*(_cs?AnVVwD7oqlkah zSg$74;2Z3kN0Qoy5feeGdn<zL&?GleijN~PikD1#hrJ?#0(0I%X4;!Yh~SVn?>*%g z(OM&Q$Z>tHdlv=Eb(m{QbEXOr?7<Z|p-M1-^Pd+6{xf`F>OQ2tIlc3Oxr$P1Do9jI zYy_hRQI+5~Q6CW2p_q$|^dUA-ct=No89=MG5SpVB{t*h!D>>>NgTvaltbMQK57C7L zf!M#`GK@PyXe6eo$*{uuj(UiE@dZY3`KAnRUob&gu=&jb7bmtgOJWa=gJ74oHJq#{ z!VF2>!V*QG&?re#2;-`RMB-8=Z)*u523JJUO3F9U5cI_*Ae(3!*+qK~QD_5_(rNIV zhOE8<j^PikC}24<(-@os4*Pgwnpwt#j!P6~y`vC~)iMJeE(pnJX{BOgxD~s}QK?98 z1oP-+gJMrIcQk#e8+E$yw{Ke(KgPDFm>gz8H#K08(z5*t=9ZY8W%3e}mzhxA1i!_E zZb$GI6GCliNRbT~8CCHyhietlCUUSy#^k)&sls?6TgXiNF3l8*$Y%;U)r=MJTbwWC z<j<VzY(ILJg9He%8-Pue{uT#{Sccmz4hVwX;>dDOBg~i(+6dbYIc^$|xBJ3KXJC%8 zVNw^f4q=4oSk+d+CW;Ivyjr)`%BC6Yoecb3x@N&UOc+723_#`y=!pc}q!@60aGJ%@ znj<pnPw-fMm6^5SbHbQDayTYXLCqnBk}7Tza9}h?ajlaFgbW$2z*7GS^21AOLeEF| zamq0H7DYSxpM#~4?k|)jXG$Kku=T^*MD<Sxs9N{tJSu_<Or)GHGWTsJ-(n)RL}t`@ zlVbJzc*L7IZ#oZMkx96wSn1SyR1fR$7-}f%hr+Fm(D#w~aw@`YijJqdpn2&KY;WeJ zLkiR(bXRILc6|6v=@7<d_N@-Fo7G(7rCt&|ZumW5E@%^aLddwK3%O~vN9j8K?8@bH z>+fGVf5t}cG*QwiG_jiAZtr@lS-V(QAx1PX+`d>Ja*pH|(Mby!MzZoqLpuumDaQLN z0OK5^8E!{CB3whsvQh{S2Pz%P9NODz?$ur%ttl0(cOr2lnG|w?sE?u=BFj<@U2zlm z*C;=%ipWV)MRa??Ij}Kw=Z=dS@b_fkXrI7X^yFxQEcXl(#m4cte6fmo5xF4)L{1Pl zD0$o}OJqTyHzmv806MobQ~Xk_k;=qFtP!jdZP{J2*N71Se6i+a`5#CCPU@pJ?Y<OW zq!jr|@<mFPpOGxow%o%mQ&|S*nG6itWfre6kwKFV{B0HkCent;jG9XP4nX=#JlfiT zeapeVW#tiPrQ%a7*SBzF4OuuEhwxEOFzgfgTx)k``u2&oVgDifG^9hQL1BO1yL5ha zy%Jo$yl%yX-x(4diO@({lz#$%PGT&JKgbwX)JF^KHGuq&DcCtrE9G>iFGSVN2bMj* zz8UBGq(9>qg0tV^)PF^0{a;e@8Skqy>+1mdpHr}hwl1mG<Un#=i<Rbmd5=6FsDpwH zEoX6t?><hk$(@8xL>B;_Di&jqXslP)<O8lYF@jy)(y-?6Xy6}12PAT;?5pw9&ZW4E z!-+WdW&JI<7rwcP&F#NcD?W=|YtO{rNsCxTdnWpWw5ZnZHJ%c58|ipOeY%k<GlUnB zKpYpOKZhtWJYXEz%$O%IkhgOx<JuK~LVLrrE$turd;tLE1<)nWb;JQgyV-=!P+jzn zK21M@19y}1nu=!rko_LF<oSX_5I((q=P3`$73U1m_9KtzJK`K5U87SOoaW*H6T%lo z9n7?y0d)K4ZU+pcC%N`g=x~xu5Ip?#pL*D9wFqJ9f=|SM=Ot4--<TY5^%&fCa3BLL z9PZtk88q`mfmRGWrTCu?g1s@*US|CkP6->uT5|@K$*kF$Gk0=kVGl^pnmeE{$jjqx zI8AFO1xGF&w6=wWdVmgo2F$pZH@kNQ#e~^9#E-08i}WGPdLac8Cr7c-)rSz%@)!OW zf@(tNCNSiLxsxZ)+(8CMV(sqY&bR%myKkBVXZElP<6ig40SFEq92^~*e()OJP8sdr z{i}`z#yGw1jbFkr@V|@ZH3qe@zfQDqUS!hjgN5}SO5o1f%vDa?xQRY_#HdHa2;-tV zsS6lnZy6A?2YPWx?xB_6gX^0-dZzxHJlY=3aetjyT8vA_7vtkf&ge|_aGR~^Yk1o9 z9!>Xib+>lzjiYo21K_Vm6Is$hlpYV9r1r?}e%Gq)b|=9m_^q(S4H2DPaR*9%;}`ZG zoI2?puwOg<?9vh;Us^iTJBF(ByI8>|VZG!Is=rv;#HSYH7xDDQ&;fmsbFiLXjL(Q> zfO|21gP@lg?o`MSo7()I@^Gr7PAAdPG`ar)7wALLY6h=$Zj&K|^HJ1^>>d!Y51wO^ zVGlxmHs&!29H_V5co;=-U(8=63OB>uu8z`dSCiTeZPji@onAK%sDb6jb+I|y+zsR4 zIBQrP<E(yIFH=tkFQ%2;>uo22oL9Q6LZlsQT*ZuW=pFjnp69h=+F&ug93AK&`jr^x zx7wQmNfCQl$b?iHI?n6Dt3+O-Mz`dL0MTZ()%-AYT{-gOKJ^<k0K>l#jt>Y8cBc6I zG<L3d)_2~25~V3Ti>`ha|DVM<;Agy91n-OfELvx9UTE6OVKauOgjq9(^F#Cgg7-Ye zSo9`Pa}YVn!9<zTpskFpPSc&?;4G;=fE2qWH9T-5=pOe%nq110U2Ey|MgNK#7ir1) zM_!xqYs85UWlDa*3Np~~a4ewsxmzpe!(B^AZz(ijYCT>{xbI8*$=~qcD!@KNlR~lC z&`j@TjMo2rsoE~N(?iJCOU=X`pOHR^OG&3xEm=MlT$FB#h2X+f9A}dEEnKj&&!(nu z*kysk;mHR7y;@-(WiaB^v?w1X`lGa{*6#P|ra-Y%b>kK5$MjSQl;BkXW4omd#|7Q| zfhD=*yLRi+=-P*MG5%O4832t7pm$ZoRRZgA{M?PpPvQjOz$bxgVS9KUbP@a=v^k#y z77zwQcP^rnsS5%B0X`Ut=q&%lcHTY4@2y;$;c=6Fm`@?)?Y!b$ZF>$fOcvdhp65`o zKFJUY{~?MLP5ftRmm+6;YfAMRvG1XMK>rEXmcTy5sc5#Qt#hy_%MAL0hzHWw<rO*) z<OARA{LBLud$@>Wi9PK;0EZ=Y*({-=qmJIT=;*e4g#AB@>~a698_@bqx*eq1;p=dl znnR<B(tVT6rO?Ac*k5LfX(xuwZRyH;Z@+u-+!wXTzb0c#Lr+V)7}L&XS)%2Xm6t7b z##4DT!Ni`CwLQIzoGu+%BS^Cm{0<ZDeSWSb4X(2FJtn7^5G`4xM%3B<?skhO(gSdd z+s~)G%kB+~T~K4)Ato|sgqh~d2EzpgWW`#~Mze*>Y(ZcBj*OMcgTV1y0Mo$6OvB<l zXr-oc&cfQRX&?3m?N4S3-gADz|EBjOtj`>35BT#w>=4H&(*p^pud!Y*=3=|iL9q0K zMV`d8_DGhAo`E)gt$EU$JnJza(&M&Kc|enNtkTbrPK@IjSmC07bZNpDxA3CT+xFHE z*+D<VOffIUO)%xy_=PURelMgQ7u%rjaH|cL0v9!*uCUF!k4u}lRR_;oL3G$I+-h@o z^km9#O%s;lW7JQ4{+=+Q!>A0n4^FBOprL5`z$duD2DUzCDhCAQEU8PfA&N|i=R<~& zb!Ctgctuu8LNfw8Do8B1tton4>R1i5kLl8snp7S8Ei$KTcx!lbhS#NdiED7_P5hh3 zSJQQeHYVh4*26}%*V1(rdj(E@Ocs3`@P#dRD_~Cy<ViPrt=7ogMw<jwSZAbbr4^FB zh&lsDa{|I$gfRCffb+4&!v;jiI$WSRC=a^gq)xioOyqTvCTO#t`$QTR6zPWOf-a-M zc0kCi5`W8fy6HHG(Mx@$(|@j2jbm-%qK4Ox2Nlj`98}coArM<Z9oTU3QCmZH!M$gD zIkL(Xn)pA6Q6CT_iKGrN*&`ZMA;CHmhTiRsOWL)eh0(<a$BWpHLZzV|w{(*yUMHDn zk;#G0`oI2kW_qGbAKGFnYb|Dan{{F)wzfJoUIJIkM{E&-+i4$5Fzv9s!@5ThY+z-A z!2qPtV<wKS!$TZ(bJiIVI(9LA2a4pZ|IF_lJ9up2SoT<U`poRBFCQsO7Kv@8(&*vj zKTdQ7>>W_y1mtCnid(8D-3`@~adX#32G|;f<T59)RCHSN+uOOMcBPjzTXB#_R*QM? zbGO+F10GP&0{sFeBMcCQwULGt{7bqtZzlt7Bf)&qzo+d<w=<-V2zx9u<MRNi`vn^o IKQ$}=58?K0JOBUy diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py deleted file mode 100644 index ca12a99..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py +++ /dev/null @@ -1,366 +0,0 @@ -"""Module for supporting the lxml.etree library. The idea here is to use as much -of the native library as possible, without using fragile hacks like custom element -names that break between releases. The downside of this is that we cannot represent -all possible trees; specifically the following are known to cause problems: - -Text or comments as siblings of the root element -Docypes with no name - -When any of these things occur, we emit a DataLossWarning -""" - -from __future__ import absolute_import, division, unicode_literals -# pylint:disable=protected-access - -import warnings -import re -import sys - -from . import base -from ..constants import DataLossWarning -from .. import constants -from . import etree as etree_builders -from .. import _ihatexml - -import lxml.etree as etree - - -fullTree = True -tag_regexp = re.compile("{([^}]*)}(.*)") - -comment_type = etree.Comment("asd").tag - - -class DocumentType(object): - def __init__(self, name, publicId, systemId): - self.name = name - self.publicId = publicId - self.systemId = systemId - - -class Document(object): - def __init__(self): - self._elementTree = None - self._childNodes = [] - - def appendChild(self, element): - self._elementTree.getroot().addnext(element._element) - - def _getChildNodes(self): - return self._childNodes - - childNodes = property(_getChildNodes) - - -def testSerializer(element): - rv = [] - infosetFilter = _ihatexml.InfosetFilter(preventDoubleDashComments=True) - - def serializeElement(element, indent=0): - if not hasattr(element, "tag"): - if hasattr(element, "getroot"): - # Full tree case - rv.append("#document") - if element.docinfo.internalDTD: - if not (element.docinfo.public_id or - element.docinfo.system_url): - dtd_str = "<!DOCTYPE %s>" % element.docinfo.root_name - else: - dtd_str = """<!DOCTYPE %s "%s" "%s">""" % ( - element.docinfo.root_name, - element.docinfo.public_id, - element.docinfo.system_url) - rv.append("|%s%s" % (' ' * (indent + 2), dtd_str)) - next_element = element.getroot() - while next_element.getprevious() is not None: - next_element = next_element.getprevious() - while next_element is not None: - serializeElement(next_element, indent + 2) - next_element = next_element.getnext() - elif isinstance(element, str) or isinstance(element, bytes): - # Text in a fragment - assert isinstance(element, str) or sys.version_info[0] == 2 - rv.append("|%s\"%s\"" % (' ' * indent, element)) - else: - # Fragment case - rv.append("#document-fragment") - for next_element in element: - serializeElement(next_element, indent + 2) - elif element.tag == comment_type: - rv.append("|%s<!-- %s -->" % (' ' * indent, element.text)) - if hasattr(element, "tail") and element.tail: - rv.append("|%s\"%s\"" % (' ' * indent, element.tail)) - else: - assert isinstance(element, etree._Element) - nsmatch = etree_builders.tag_regexp.match(element.tag) - if nsmatch is not None: - ns = nsmatch.group(1) - tag = nsmatch.group(2) - prefix = constants.prefixes[ns] - rv.append("|%s<%s %s>" % (' ' * indent, prefix, - infosetFilter.fromXmlName(tag))) - else: - rv.append("|%s<%s>" % (' ' * indent, - infosetFilter.fromXmlName(element.tag))) - - if hasattr(element, "attrib"): - attributes = [] - for name, value in element.attrib.items(): - nsmatch = tag_regexp.match(name) - if nsmatch is not None: - ns, name = nsmatch.groups() - name = infosetFilter.fromXmlName(name) - prefix = constants.prefixes[ns] - attr_string = "%s %s" % (prefix, name) - else: - attr_string = infosetFilter.fromXmlName(name) - attributes.append((attr_string, value)) - - for name, value in sorted(attributes): - rv.append('|%s%s="%s"' % (' ' * (indent + 2), name, value)) - - if element.text: - rv.append("|%s\"%s\"" % (' ' * (indent + 2), element.text)) - indent += 2 - for child in element: - serializeElement(child, indent) - if hasattr(element, "tail") and element.tail: - rv.append("|%s\"%s\"" % (' ' * (indent - 2), element.tail)) - serializeElement(element, 0) - - return "\n".join(rv) - - -def tostring(element): - """Serialize an element and its child nodes to a string""" - rv = [] - - def serializeElement(element): - if not hasattr(element, "tag"): - if element.docinfo.internalDTD: - if element.docinfo.doctype: - dtd_str = element.docinfo.doctype - else: - dtd_str = "<!DOCTYPE %s>" % element.docinfo.root_name - rv.append(dtd_str) - serializeElement(element.getroot()) - - elif element.tag == comment_type: - rv.append("<!--%s-->" % (element.text,)) - - else: - # This is assumed to be an ordinary element - if not element.attrib: - rv.append("<%s>" % (element.tag,)) - else: - attr = " ".join(["%s=\"%s\"" % (name, value) - for name, value in element.attrib.items()]) - rv.append("<%s %s>" % (element.tag, attr)) - if element.text: - rv.append(element.text) - - for child in element: - serializeElement(child) - - rv.append("</%s>" % (element.tag,)) - - if hasattr(element, "tail") and element.tail: - rv.append(element.tail) - - serializeElement(element) - - return "".join(rv) - - -class TreeBuilder(base.TreeBuilder): - documentClass = Document - doctypeClass = DocumentType - elementClass = None - commentClass = None - fragmentClass = Document - implementation = etree - - def __init__(self, namespaceHTMLElements, fullTree=False): - builder = etree_builders.getETreeModule(etree, fullTree=fullTree) - infosetFilter = self.infosetFilter = _ihatexml.InfosetFilter(preventDoubleDashComments=True) - self.namespaceHTMLElements = namespaceHTMLElements - - class Attributes(dict): - def __init__(self, element, value=None): - if value is None: - value = {} - self._element = element - dict.__init__(self, value) # pylint:disable=non-parent-init-called - for key, value in self.items(): - if isinstance(key, tuple): - name = "{%s}%s" % (key[2], infosetFilter.coerceAttribute(key[1])) - else: - name = infosetFilter.coerceAttribute(key) - self._element._element.attrib[name] = value - - def __setitem__(self, key, value): - dict.__setitem__(self, key, value) - if isinstance(key, tuple): - name = "{%s}%s" % (key[2], infosetFilter.coerceAttribute(key[1])) - else: - name = infosetFilter.coerceAttribute(key) - self._element._element.attrib[name] = value - - class Element(builder.Element): - def __init__(self, name, namespace): - name = infosetFilter.coerceElement(name) - builder.Element.__init__(self, name, namespace=namespace) - self._attributes = Attributes(self) - - def _setName(self, name): - self._name = infosetFilter.coerceElement(name) - self._element.tag = self._getETreeTag( - self._name, self._namespace) - - def _getName(self): - return infosetFilter.fromXmlName(self._name) - - name = property(_getName, _setName) - - def _getAttributes(self): - return self._attributes - - def _setAttributes(self, attributes): - self._attributes = Attributes(self, attributes) - - attributes = property(_getAttributes, _setAttributes) - - def insertText(self, data, insertBefore=None): - data = infosetFilter.coerceCharacters(data) - builder.Element.insertText(self, data, insertBefore) - - def appendChild(self, child): - builder.Element.appendChild(self, child) - - class Comment(builder.Comment): - def __init__(self, data): - data = infosetFilter.coerceComment(data) - builder.Comment.__init__(self, data) - - def _setData(self, data): - data = infosetFilter.coerceComment(data) - self._element.text = data - - def _getData(self): - return self._element.text - - data = property(_getData, _setData) - - self.elementClass = Element - self.commentClass = Comment - # self.fragmentClass = builder.DocumentFragment - base.TreeBuilder.__init__(self, namespaceHTMLElements) - - def reset(self): - base.TreeBuilder.reset(self) - self.insertComment = self.insertCommentInitial - self.initial_comments = [] - self.doctype = None - - def testSerializer(self, element): - return testSerializer(element) - - def getDocument(self): - if fullTree: - return self.document._elementTree - else: - return self.document._elementTree.getroot() - - def getFragment(self): - fragment = [] - element = self.openElements[0]._element - if element.text: - fragment.append(element.text) - fragment.extend(list(element)) - if element.tail: - fragment.append(element.tail) - return fragment - - def insertDoctype(self, token): - name = token["name"] - publicId = token["publicId"] - systemId = token["systemId"] - - if not name: - warnings.warn("lxml cannot represent empty doctype", DataLossWarning) - self.doctype = None - else: - coercedName = self.infosetFilter.coerceElement(name) - if coercedName != name: - warnings.warn("lxml cannot represent non-xml doctype", DataLossWarning) - - doctype = self.doctypeClass(coercedName, publicId, systemId) - self.doctype = doctype - - def insertCommentInitial(self, data, parent=None): - assert parent is None or parent is self.document - assert self.document._elementTree is None - self.initial_comments.append(data) - - def insertCommentMain(self, data, parent=None): - if (parent == self.document and - self.document._elementTree.getroot()[-1].tag == comment_type): - warnings.warn("lxml cannot represent adjacent comments beyond the root elements", DataLossWarning) - super(TreeBuilder, self).insertComment(data, parent) - - def insertRoot(self, token): - # Because of the way libxml2 works, it doesn't seem to be possible to - # alter information like the doctype after the tree has been parsed. - # Therefore we need to use the built-in parser to create our initial - # tree, after which we can add elements like normal - docStr = "" - if self.doctype: - assert self.doctype.name - docStr += "<!DOCTYPE %s" % self.doctype.name - if (self.doctype.publicId is not None or - self.doctype.systemId is not None): - docStr += (' PUBLIC "%s" ' % - (self.infosetFilter.coercePubid(self.doctype.publicId or ""))) - if self.doctype.systemId: - sysid = self.doctype.systemId - if sysid.find("'") >= 0 and sysid.find('"') >= 0: - warnings.warn("DOCTYPE system cannot contain single and double quotes", DataLossWarning) - sysid = sysid.replace("'", 'U00027') - if sysid.find("'") >= 0: - docStr += '"%s"' % sysid - else: - docStr += "'%s'" % sysid - else: - docStr += "''" - docStr += ">" - if self.doctype.name != token["name"]: - warnings.warn("lxml cannot represent doctype with a different name to the root element", DataLossWarning) - docStr += "<THIS_SHOULD_NEVER_APPEAR_PUBLICLY/>" - root = etree.fromstring(docStr) - - # Append the initial comments: - for comment_token in self.initial_comments: - comment = self.commentClass(comment_token["data"]) - root.addprevious(comment._element) - - # Create the root document and add the ElementTree to it - self.document = self.documentClass() - self.document._elementTree = root.getroottree() - - # Give the root element the right name - name = token["name"] - namespace = token.get("namespace", self.defaultNamespace) - if namespace is None: - etree_tag = name - else: - etree_tag = "{%s}%s" % (namespace, name) - root.tag = etree_tag - - # Add the root element to the internal child/open data structures - root_element = self.elementClass(name, namespace) - root_element._element = root - self.document._childNodes.append(root_element) - self.openElements.append(root_element) - - # Reset to the default insert comment function - self.insertComment = self.insertCommentMain diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.pyc deleted file mode 100644 index 5e33fd236b2b64cbee7b155e412b6e8e1d3efdcf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16913 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 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py deleted file mode 100644 index 9bec207..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py +++ /dev/null @@ -1,154 +0,0 @@ -"""A collection of modules for iterating through different kinds of -tree, generating tokens identical to those produced by the tokenizer -module. - -To create a tree walker for a new type of tree, you need to do -implement a tree walker object (called TreeWalker by convention) that -implements a 'serialize' method taking a tree as sole argument and -returning an iterator generating tokens. -""" - -from __future__ import absolute_import, division, unicode_literals - -from .. import constants -from .._utils import default_etree - -__all__ = ["getTreeWalker", "pprint"] - -treeWalkerCache = {} - - -def getTreeWalker(treeType, implementation=None, **kwargs): - """Get a TreeWalker class for various types of tree with built-in support - - :arg str treeType: the name of the tree type required (case-insensitive). - Supported values are: - - * "dom": The xml.dom.minidom DOM implementation - * "etree": A generic walker for tree implementations exposing an - elementtree-like interface (known to work with ElementTree, - cElementTree and lxml.etree). - * "lxml": Optimized walker for lxml.etree - * "genshi": a Genshi stream - - :arg implementation: A module implementing the tree type e.g. - xml.etree.ElementTree or cElementTree (Currently applies to the "etree" - tree type only). - - :arg kwargs: keyword arguments passed to the etree walker--for other - walkers, this has no effect - - :returns: a TreeWalker class - - """ - - treeType = treeType.lower() - if treeType not in treeWalkerCache: - if treeType == "dom": - from . import dom - treeWalkerCache[treeType] = dom.TreeWalker - elif treeType == "genshi": - from . import genshi - treeWalkerCache[treeType] = genshi.TreeWalker - elif treeType == "lxml": - from . import etree_lxml - treeWalkerCache[treeType] = etree_lxml.TreeWalker - elif treeType == "etree": - from . import etree - if implementation is None: - implementation = default_etree - # XXX: NEVER cache here, caching is done in the etree submodule - return etree.getETreeModule(implementation, **kwargs).TreeWalker - return treeWalkerCache.get(treeType) - - -def concatenateCharacterTokens(tokens): - pendingCharacters = [] - for token in tokens: - type = token["type"] - if type in ("Characters", "SpaceCharacters"): - pendingCharacters.append(token["data"]) - else: - if pendingCharacters: - yield {"type": "Characters", "data": "".join(pendingCharacters)} - pendingCharacters = [] - yield token - if pendingCharacters: - yield {"type": "Characters", "data": "".join(pendingCharacters)} - - -def pprint(walker): - """Pretty printer for tree walkers - - Takes a TreeWalker instance and pretty prints the output of walking the tree. - - :arg walker: a TreeWalker instance - - """ - output = [] - indent = 0 - for token in concatenateCharacterTokens(walker): - type = token["type"] - if type in ("StartTag", "EmptyTag"): - # tag name - if token["namespace"] and token["namespace"] != constants.namespaces["html"]: - if token["namespace"] in constants.prefixes: - ns = constants.prefixes[token["namespace"]] - else: - ns = token["namespace"] - name = "%s %s" % (ns, token["name"]) - else: - name = token["name"] - output.append("%s<%s>" % (" " * indent, name)) - indent += 2 - # attributes (sorted for consistent ordering) - attrs = token["data"] - for (namespace, localname), value in sorted(attrs.items()): - if namespace: - if namespace in constants.prefixes: - ns = constants.prefixes[namespace] - else: - ns = namespace - name = "%s %s" % (ns, localname) - else: - name = localname - output.append("%s%s=\"%s\"" % (" " * indent, name, value)) - # self-closing - if type == "EmptyTag": - indent -= 2 - - elif type == "EndTag": - indent -= 2 - - elif type == "Comment": - output.append("%s<!-- %s -->" % (" " * indent, token["data"])) - - elif type == "Doctype": - if token["name"]: - if token["publicId"]: - output.append("""%s<!DOCTYPE %s "%s" "%s">""" % - (" " * indent, - token["name"], - token["publicId"], - token["systemId"] if token["systemId"] else "")) - elif token["systemId"]: - output.append("""%s<!DOCTYPE %s "" "%s">""" % - (" " * indent, - token["name"], - token["systemId"])) - else: - output.append("%s<!DOCTYPE %s>" % (" " * indent, - token["name"])) - else: - output.append("%s<!DOCTYPE >" % (" " * indent,)) - - elif type == "Characters": - output.append("%s\"%s\"" % (" " * indent, token["data"])) - - elif type == "SpaceCharacters": - assert False, "concatenateCharacterTokens should have got rid of all Space tokens" - - else: - raise ValueError("Unknown token type, %s" % type) - - return "\n".join(output) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/__init__.pyc deleted file mode 100644 index ee2a81a4f60a571d546099224344ab1400983cec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5071 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 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/base.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/base.py deleted file mode 100644 index 80c474c..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/base.py +++ /dev/null @@ -1,252 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from xml.dom import Node -from ..constants import namespaces, voidElements, spaceCharacters - -__all__ = ["DOCUMENT", "DOCTYPE", "TEXT", "ELEMENT", "COMMENT", "ENTITY", "UNKNOWN", - "TreeWalker", "NonRecursiveTreeWalker"] - -DOCUMENT = Node.DOCUMENT_NODE -DOCTYPE = Node.DOCUMENT_TYPE_NODE -TEXT = Node.TEXT_NODE -ELEMENT = Node.ELEMENT_NODE -COMMENT = Node.COMMENT_NODE -ENTITY = Node.ENTITY_NODE -UNKNOWN = "<#UNKNOWN#>" - -spaceCharacters = "".join(spaceCharacters) - - -class TreeWalker(object): - """Walks a tree yielding tokens - - Tokens are dicts that all have a ``type`` field specifying the type of the - token. - - """ - def __init__(self, tree): - """Creates a TreeWalker - - :arg tree: the tree to walk - - """ - self.tree = tree - - def __iter__(self): - raise NotImplementedError - - def error(self, msg): - """Generates an error token with the given message - - :arg msg: the error message - - :returns: SerializeError token - - """ - return {"type": "SerializeError", "data": msg} - - def emptyTag(self, namespace, name, attrs, hasChildren=False): - """Generates an EmptyTag token - - :arg namespace: the namespace of the token--can be ``None`` - - :arg name: the name of the element - - :arg attrs: the attributes of the element as a dict - - :arg hasChildren: whether or not to yield a SerializationError because - this tag shouldn't have children - - :returns: EmptyTag token - - """ - yield {"type": "EmptyTag", "name": name, - "namespace": namespace, - "data": attrs} - if hasChildren: - yield self.error("Void element has children") - - def startTag(self, namespace, name, attrs): - """Generates a StartTag token - - :arg namespace: the namespace of the token--can be ``None`` - - :arg name: the name of the element - - :arg attrs: the attributes of the element as a dict - - :returns: StartTag token - - """ - return {"type": "StartTag", - "name": name, - "namespace": namespace, - "data": attrs} - - def endTag(self, namespace, name): - """Generates an EndTag token - - :arg namespace: the namespace of the token--can be ``None`` - - :arg name: the name of the element - - :returns: EndTag token - - """ - return {"type": "EndTag", - "name": name, - "namespace": namespace} - - def text(self, data): - """Generates SpaceCharacters and Characters tokens - - Depending on what's in the data, this generates one or more - ``SpaceCharacters`` and ``Characters`` tokens. - - For example: - - >>> from html5lib.treewalkers.base import TreeWalker - >>> # Give it an empty tree just so it instantiates - >>> walker = TreeWalker([]) - >>> list(walker.text('')) - [] - >>> list(walker.text(' ')) - [{u'data': ' ', u'type': u'SpaceCharacters'}] - >>> list(walker.text(' abc ')) # doctest: +NORMALIZE_WHITESPACE - [{u'data': ' ', u'type': u'SpaceCharacters'}, - {u'data': u'abc', u'type': u'Characters'}, - {u'data': u' ', u'type': u'SpaceCharacters'}] - - :arg data: the text data - - :returns: one or more ``SpaceCharacters`` and ``Characters`` tokens - - """ - data = data - middle = data.lstrip(spaceCharacters) - left = data[:len(data) - len(middle)] - if left: - yield {"type": "SpaceCharacters", "data": left} - data = middle - middle = data.rstrip(spaceCharacters) - right = data[len(middle):] - if middle: - yield {"type": "Characters", "data": middle} - if right: - yield {"type": "SpaceCharacters", "data": right} - - def comment(self, data): - """Generates a Comment token - - :arg data: the comment - - :returns: Comment token - - """ - return {"type": "Comment", "data": data} - - def doctype(self, name, publicId=None, systemId=None): - """Generates a Doctype token - - :arg name: - - :arg publicId: - - :arg systemId: - - :returns: the Doctype token - - """ - return {"type": "Doctype", - "name": name, - "publicId": publicId, - "systemId": systemId} - - def entity(self, name): - """Generates an Entity token - - :arg name: the entity name - - :returns: an Entity token - - """ - return {"type": "Entity", "name": name} - - def unknown(self, nodeType): - """Handles unknown node types""" - return self.error("Unknown node type: " + nodeType) - - -class NonRecursiveTreeWalker(TreeWalker): - def getNodeDetails(self, node): - raise NotImplementedError - - def getFirstChild(self, node): - raise NotImplementedError - - def getNextSibling(self, node): - raise NotImplementedError - - def getParentNode(self, node): - raise NotImplementedError - - def __iter__(self): - currentNode = self.tree - while currentNode is not None: - details = self.getNodeDetails(currentNode) - type, details = details[0], details[1:] - hasChildren = False - - if type == DOCTYPE: - yield self.doctype(*details) - - elif type == TEXT: - for token in self.text(*details): - yield token - - elif type == ELEMENT: - namespace, name, attributes, hasChildren = details - if (not namespace or namespace == namespaces["html"]) and name in voidElements: - for token in self.emptyTag(namespace, name, attributes, - hasChildren): - yield token - hasChildren = False - else: - yield self.startTag(namespace, name, attributes) - - elif type == COMMENT: - yield self.comment(details[0]) - - elif type == ENTITY: - yield self.entity(details[0]) - - elif type == DOCUMENT: - hasChildren = True - - else: - yield self.unknown(details[0]) - - if hasChildren: - firstChild = self.getFirstChild(currentNode) - else: - firstChild = None - - if firstChild is not None: - currentNode = firstChild - else: - while currentNode is not None: - details = self.getNodeDetails(currentNode) - type, details = details[0], details[1:] - if type == ELEMENT: - namespace, name, attributes, hasChildren = details - if (namespace and namespace != namespaces["html"]) or name not in voidElements: - yield self.endTag(namespace, name) - if self.tree is currentNode: - currentNode = None - break - nextSibling = self.getNextSibling(currentNode) - if nextSibling is not None: - currentNode = nextSibling - break - else: - currentNode = self.getParentNode(currentNode) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/base.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/base.pyc deleted file mode 100644 index 62adc9d11de86a5619a971af5c4c07cbcbfe3d98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9693 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 b3L~bdp35D#p36-D$^dZZuaFzdPyXhA7X?F( diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/dom.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/dom.py deleted file mode 100644 index b0c89b0..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/dom.py +++ /dev/null @@ -1,43 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from xml.dom import Node - -from . import base - - -class TreeWalker(base.NonRecursiveTreeWalker): - def getNodeDetails(self, node): - if node.nodeType == Node.DOCUMENT_TYPE_NODE: - return base.DOCTYPE, node.name, node.publicId, node.systemId - - elif node.nodeType in (Node.TEXT_NODE, Node.CDATA_SECTION_NODE): - return base.TEXT, node.nodeValue - - elif node.nodeType == Node.ELEMENT_NODE: - attrs = {} - for attr in list(node.attributes.keys()): - attr = node.getAttributeNode(attr) - if attr.namespaceURI: - attrs[(attr.namespaceURI, attr.localName)] = attr.value - else: - attrs[(None, attr.name)] = attr.value - return (base.ELEMENT, node.namespaceURI, node.nodeName, - attrs, node.hasChildNodes()) - - elif node.nodeType == Node.COMMENT_NODE: - return base.COMMENT, node.nodeValue - - elif node.nodeType in (Node.DOCUMENT_NODE, Node.DOCUMENT_FRAGMENT_NODE): - return (base.DOCUMENT,) - - else: - return base.UNKNOWN, node.nodeType - - def getFirstChild(self, node): - return node.firstChild - - def getNextSibling(self, node): - return node.nextSibling - - def getParentNode(self, node): - return node.parentNode diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/dom.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/dom.pyc deleted file mode 100644 index 0539cc97e3c8d8dcbb8e53b05fc8b84f5788f1fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2517 zcmd5;-ESL35TCpAN1Qf^8$^L7fCLDviso7Y5l9sx*e;47=jePPjiu^1`_|4Tdmp`B zJ5H58pd#^i@i*~|#LU=^Bc2d1#PW@IXXooTGdpMJ&$ZQuzplR+!2ILj?{~l0pigiS z<JSTOkXX>OAhDrmL*hWs0gKLTP$fvp&@1EKfw%;!0!bBmRos_BRN-s|h8DyX_zmC< zz)7zLaTU6a6|^qNWrG}=4J1)tXKHLjD3d%Zj3JR&PNbGuYU;Qdr*e?RB2?0dB2v0x zk!lHvhipl^C95B4VOEh96ha(F>Rc4p7)kPb!uUBZ1Q0YtgApP+#7heVWAmZ}2#h#o z@Vku?DhzBSv?$}#Bs0&^;FSeu7!6Vz&TS}mz&LPLVt$!vg=rOrCFm}tS6HV8LsY9k zal&e=EP98SH$?BU;lC(vuWgu)z^t*{I-G4#a^G0cdT|J^9p={I${`kQF_L>w{K1P& zxU%OQ;=e^sp1%Bjc@`rWJSZ;?jtR)yZ1Wz|`)mP`zC&Jz<(o0S%Q1dvk<NQ8{ZAAR z81U8taEnE^sY|+~^gb)0S%i*}bh)Bl;{(h!cSMS%4lZ-ybKh(tyVYqP9kjh53{DQ) zq1S1(eX5SB&d!L-O_D~5U=#VcujF7q=8eA8MkKhYp?J`K9<T*NhMTRuU@z>po56m^ zo3Y6-39&SV@^hrd!rVo6`=>TXK>@HoCAHxWjEpH{A3Iw!|6HI;>gSO#dy6CLU^YWh z>O2~VBY)pehfUZ6MW?bsq&z}FVR%_87~|aWb#_={4JA$^-8_{lCfk~gH#-N*7%4w< z1~$@-JTij&H#yJzy&sl}bTJo6=Ln9xAHB}8$G3xH(?Sh-K`CMsl!F<3S~buDFwqyd za`Qq?A|u>MRJg-T#iG#etEqeWMbS?$&Y$eQOdszSU+xaR*3)m|SH)xejB+<{bD2Mq zsWy>PkIa*UQFur!e!_`J<E(H`O`^V1vhNz40~b68v>Rv1PJU_D(Ki->^3xI~l1fvW z^(RQc+O)RqEvs&CS`};C+OTT4e}G)#)bV81;Xy#dfaVDg0!r!ZYA^bhj<^Yi67h36 z8l>WXMC4;6w<H(T0ho(t*I`l?G=&P*zXo~-rBg9AU5Pg=9o<f(i>fc<{OmtKrB_QH z6(Z&Kxt&PoH9foz^WhR`qk?Om8DU5>Ck(kw!!XI>vBItYDGK=1oj$4g^sZd?>i>Ru zeVUCc_-G;(tF~2hYL3^Sy3COb$7Wm*5@dl-H_@kl=8-i`)DBL8*;|CqX{H*QdN^2p hF&GzGPQ>!h1N*y0__=gXXT|!KuxTpjwq3XD&fkH6OPT-x diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/etree.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/etree.py deleted file mode 100644 index 95fc0c1..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/etree.py +++ /dev/null @@ -1,130 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from collections import OrderedDict -import re - -from pip._vendor.six import string_types - -from . import base -from .._utils import moduleFactoryFactory - -tag_regexp = re.compile("{([^}]*)}(.*)") - - -def getETreeBuilder(ElementTreeImplementation): - ElementTree = ElementTreeImplementation - ElementTreeCommentType = ElementTree.Comment("asd").tag - - class TreeWalker(base.NonRecursiveTreeWalker): # pylint:disable=unused-variable - """Given the particular ElementTree representation, this implementation, - to avoid using recursion, returns "nodes" as tuples with the following - content: - - 1. The current element - - 2. The index of the element relative to its parent - - 3. A stack of ancestor elements - - 4. A flag "text", "tail" or None to indicate if the current node is a - text node; either the text or tail of the current element (1) - """ - def getNodeDetails(self, node): - if isinstance(node, tuple): # It might be the root Element - elt, _, _, flag = node - if flag in ("text", "tail"): - return base.TEXT, getattr(elt, flag) - else: - node = elt - - if not(hasattr(node, "tag")): - node = node.getroot() - - if node.tag in ("DOCUMENT_ROOT", "DOCUMENT_FRAGMENT"): - return (base.DOCUMENT,) - - elif node.tag == "<!DOCTYPE>": - return (base.DOCTYPE, node.text, - node.get("publicId"), node.get("systemId")) - - elif node.tag == ElementTreeCommentType: - return base.COMMENT, node.text - - else: - assert isinstance(node.tag, string_types), type(node.tag) - # This is assumed to be an ordinary element - match = tag_regexp.match(node.tag) - if match: - namespace, tag = match.groups() - else: - namespace = None - tag = node.tag - attrs = OrderedDict() - for name, value in list(node.attrib.items()): - match = tag_regexp.match(name) - if match: - attrs[(match.group(1), match.group(2))] = value - else: - attrs[(None, name)] = value - return (base.ELEMENT, namespace, tag, - attrs, len(node) or node.text) - - def getFirstChild(self, node): - if isinstance(node, tuple): - element, key, parents, flag = node - else: - element, key, parents, flag = node, None, [], None - - if flag in ("text", "tail"): - return None - else: - if element.text: - return element, key, parents, "text" - elif len(element): - parents.append(element) - return element[0], 0, parents, None - else: - return None - - def getNextSibling(self, node): - if isinstance(node, tuple): - element, key, parents, flag = node - else: - return None - - if flag == "text": - if len(element): - parents.append(element) - return element[0], 0, parents, None - else: - return None - else: - if element.tail and flag != "tail": - return element, key, parents, "tail" - elif key < len(parents[-1]) - 1: - return parents[-1][key + 1], key + 1, parents, None - else: - return None - - def getParentNode(self, node): - if isinstance(node, tuple): - element, key, parents, flag = node - else: - return None - - if flag == "text": - if not parents: - return element - else: - return element, key, parents, None - else: - parent = parents.pop() - if not parents: - return parent - else: - assert list(parents[-1]).count(parent) == 1 - return parent, list(parents[-1]).index(parent), parents, None - - return locals() - -getETreeModule = moduleFactoryFactory(getETreeBuilder) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/etree.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/etree.pyc deleted file mode 100644 index 2fa3cd652391a70880893db6d6ae1b4d68d8dbde..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4770 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 Vjpm<gUUpG--8qbN?rfuN{tE~5IJE!( diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py deleted file mode 100644 index e81ddf3..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py +++ /dev/null @@ -1,213 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals -from pip._vendor.six import text_type - -from lxml import etree -from ..treebuilders.etree import tag_regexp - -from . import base - -from .. import _ihatexml - - -def ensure_str(s): - if s is None: - return None - elif isinstance(s, text_type): - return s - else: - return s.decode("ascii", "strict") - - -class Root(object): - def __init__(self, et): - self.elementtree = et - self.children = [] - - try: - if et.docinfo.internalDTD: - self.children.append(Doctype(self, - ensure_str(et.docinfo.root_name), - ensure_str(et.docinfo.public_id), - ensure_str(et.docinfo.system_url))) - except AttributeError: - pass - - try: - node = et.getroot() - except AttributeError: - node = et - - while node.getprevious() is not None: - node = node.getprevious() - while node is not None: - self.children.append(node) - node = node.getnext() - - self.text = None - self.tail = None - - def __getitem__(self, key): - return self.children[key] - - def getnext(self): - return None - - def __len__(self): - return 1 - - -class Doctype(object): - def __init__(self, root_node, name, public_id, system_id): - self.root_node = root_node - self.name = name - self.public_id = public_id - self.system_id = system_id - - self.text = None - self.tail = None - - def getnext(self): - return self.root_node.children[1] - - -class FragmentRoot(Root): - def __init__(self, children): - self.children = [FragmentWrapper(self, child) for child in children] - self.text = self.tail = None - - def getnext(self): - return None - - -class FragmentWrapper(object): - def __init__(self, fragment_root, obj): - self.root_node = fragment_root - self.obj = obj - if hasattr(self.obj, 'text'): - self.text = ensure_str(self.obj.text) - else: - self.text = None - if hasattr(self.obj, 'tail'): - self.tail = ensure_str(self.obj.tail) - else: - self.tail = None - - def __getattr__(self, name): - return getattr(self.obj, name) - - def getnext(self): - siblings = self.root_node.children - idx = siblings.index(self) - if idx < len(siblings) - 1: - return siblings[idx + 1] - else: - return None - - def __getitem__(self, key): - return self.obj[key] - - def __bool__(self): - return bool(self.obj) - - def getparent(self): - return None - - def __str__(self): - return str(self.obj) - - def __unicode__(self): - return str(self.obj) - - def __len__(self): - return len(self.obj) - - -class TreeWalker(base.NonRecursiveTreeWalker): - def __init__(self, tree): - # pylint:disable=redefined-variable-type - if isinstance(tree, list): - self.fragmentChildren = set(tree) - tree = FragmentRoot(tree) - else: - self.fragmentChildren = set() - tree = Root(tree) - base.NonRecursiveTreeWalker.__init__(self, tree) - self.filter = _ihatexml.InfosetFilter() - - def getNodeDetails(self, node): - if isinstance(node, tuple): # Text node - node, key = node - assert key in ("text", "tail"), "Text nodes are text or tail, found %s" % key - return base.TEXT, ensure_str(getattr(node, key)) - - elif isinstance(node, Root): - return (base.DOCUMENT,) - - elif isinstance(node, Doctype): - return base.DOCTYPE, node.name, node.public_id, node.system_id - - elif isinstance(node, FragmentWrapper) and not hasattr(node, "tag"): - return base.TEXT, ensure_str(node.obj) - - elif node.tag == etree.Comment: - return base.COMMENT, ensure_str(node.text) - - elif node.tag == etree.Entity: - return base.ENTITY, ensure_str(node.text)[1:-1] # strip &; - - else: - # This is assumed to be an ordinary element - match = tag_regexp.match(ensure_str(node.tag)) - if match: - namespace, tag = match.groups() - else: - namespace = None - tag = ensure_str(node.tag) - attrs = {} - for name, value in list(node.attrib.items()): - name = ensure_str(name) - value = ensure_str(value) - match = tag_regexp.match(name) - if match: - attrs[(match.group(1), match.group(2))] = value - else: - attrs[(None, name)] = value - return (base.ELEMENT, namespace, self.filter.fromXmlName(tag), - attrs, len(node) > 0 or node.text) - - def getFirstChild(self, node): - assert not isinstance(node, tuple), "Text nodes have no children" - - assert len(node) or node.text, "Node has no children" - if node.text: - return (node, "text") - else: - return node[0] - - def getNextSibling(self, node): - if isinstance(node, tuple): # Text node - node, key = node - assert key in ("text", "tail"), "Text nodes are text or tail, found %s" % key - if key == "text": - # XXX: we cannot use a "bool(node) and node[0] or None" construct here - # because node[0] might evaluate to False if it has no child element - if len(node): - return node[0] - else: - return None - else: # tail - return node.getnext() - - return (node, "tail") if node.tail else node.getnext() - - def getParentNode(self, node): - if isinstance(node, tuple): # Text node - node, key = node - assert key in ("text", "tail"), "Text nodes are text or tail, found %s" % key - if key == "text": - return node - # else: fallback to "normal" processing - elif node in self.fragmentChildren: - return None - - return node.getparent() diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.pyc deleted file mode 100644 index ed2938fd7569cbed7bcf7ea9073c67ae1edd0731..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10584 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 Da3ovf diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py deleted file mode 100644 index 7483be2..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py +++ /dev/null @@ -1,69 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from genshi.core import QName -from genshi.core import START, END, XML_NAMESPACE, DOCTYPE, TEXT -from genshi.core import START_NS, END_NS, START_CDATA, END_CDATA, PI, COMMENT - -from . import base - -from ..constants import voidElements, namespaces - - -class TreeWalker(base.TreeWalker): - def __iter__(self): - # Buffer the events so we can pass in the following one - previous = None - for event in self.tree: - if previous is not None: - for token in self.tokens(previous, event): - yield token - previous = event - - # Don't forget the final event! - if previous is not None: - for token in self.tokens(previous, None): - yield token - - def tokens(self, event, next): - kind, data, _ = event - if kind == START: - tag, attribs = data - name = tag.localname - namespace = tag.namespace - converted_attribs = {} - for k, v in attribs: - if isinstance(k, QName): - converted_attribs[(k.namespace, k.localname)] = v - else: - converted_attribs[(None, k)] = v - - if namespace == namespaces["html"] and name in voidElements: - for token in self.emptyTag(namespace, name, converted_attribs, - not next or next[0] != END or - next[1] != tag): - yield token - else: - yield self.startTag(namespace, name, converted_attribs) - - elif kind == END: - name = data.localname - namespace = data.namespace - if namespace != namespaces["html"] or name not in voidElements: - yield self.endTag(namespace, name) - - elif kind == COMMENT: - yield self.comment(data) - - elif kind == TEXT: - for token in self.text(data): - yield token - - elif kind == DOCTYPE: - yield self.doctype(*data) - - elif kind in (XML_NAMESPACE, DOCTYPE, START_NS, END_NS, - START_CDATA, END_CDATA, PI): - pass - - else: - yield self.unknown(kind) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/genshi.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/genshi.pyc deleted file mode 100644 index f700c0349832a3338128598004fb0d09dd7746fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2626 zcmd5;&2Jl35dXd1#Ew7Xd^eC2Ckv@{3$y~MpoYX0q{a;!i?pkj#o67YTknUn`|LWw zK0pvB?nwLx{2}mnaNq<-B-8^3W@a4<NSvvieLHVv-n{wv%{b<7wess<)E~Q;eN1}a z`OHA}0}&qmDTF|zU@JrhYy*)A+k|47fp8AdJnZ>=Z_2&^yMU+&yNGB3_5z|3>=L3f z>~gL*Cwdjw6+~6oRYWz|HAHpTbwrD>7ZEjJH%NOPUIF0}qGj02v@gP2K)8Zv74|Bk zHP~y!Ex}*L({&sxcx8MATmTR4b$AsVG^-Rzz~MDHIK4<q?<h;cq4u318YHRK3&it+ zQIG{mtQ)i$#(|r7z7q!8PkUk3RD5)vmXABV$Zs+w+k@`5)zxgc-PzSOdOz5^=XAFB z+6VjFJ8fMg&hGu4?!*1Io+G;3e$Z_eh>$zww9`4z%pn6zR*1~`JG<N6ZC#p)@|{7u z{g1@#&i%c;cBdP#Yq@`X!BH>s1J-KtqB;0c5_s*<kNj9?x=f6iLdXU^*Uz`z)b|g2 zVc$<(63T~dzRxgtg$N&9eJVI5mH<GIV8VoTAa}T|%vbZ{@}aMZ@PMhp_(M#9rwY4| z-^J9xMC|lSNbh3&n#hDXF>qm!QUy~J6BD1P)0;Sq0TPgz(*_P-9R2biN9m$}A05b1 z5*$cgI(gyQy-pJQQU^^jOV)ML_v5U|LJ?$scr3LUr2Z&KhMAPvA5rpz68$D=Lze8E zsMa72Mm_DfM!mFkoP?gAX07va>+H?+D1O$zaqBd`ek*<Jmiu-#e#bjcuhZvb(CW4Z z!Qg5TXSx@LSM`m(6K9`U@;G#(m!z#HItp)w!BLAnekN7QS|{Z4li=FmOgwcQMyca4 z`m$wq%_yjbs;W(T$|k>EMrfTLM!MAK52_la^pVLKpUz=A&w1BC-#}VZlQ}%1)E6)< zVp8A=P8WnAW{KNrTE_SuCPgaRuBcM!s-RAoR5+1TlJp#tDkf#-Jf$krs&H)J_UQ*R z0ab{&GuGjx1gZ$3Ym;609g_tR&ie(X$BzXo<U)!0Y}7z?@Dsmi3~f@E^i9n6CN{}s z+F#7&kg8!)V@Ums!_()A0ZHdC4P7wW;$J0tvO-sX%F)jvCPE_qn{y_zyK3fK5ovC) zGBZeV(?!o!{GAxAiowt2PV$2CqWHF{2<syJUX5c3ZgD1;F1U30TXh)U7wv{<|0t%G zSoIsQsW(Kp3>sT{1$q^F4SF4V1IKyteo=8<>|bF`xnDX%+F{5mLrex_K1w!;Wieky zPnfv9kOzkB{+b*zM`&I$cw^VM7+=;3FH5}e3>9qp(LkSddncAmOhz9aNHuY!`v~JK zWMs-rbCZb2l*Nj9pZa5M@emcUm$>?D;9EQ{Egp;(k28x$rp1%a;ua9iVcd_CXK|A) zTkE`BVG)NFlSv`^LF@_P^>k136mw*fYjTdS>}j0_M_GP|GGJ}7369TA;*p<f-*YZ? z_;g=vj4V!|3<p{M=Luo0kvFf>lii^OYLR9_Rh8&lP%E_CG**o*wX8PiTQxR}T(+f{ zTB2v2xJ)gQj%ns|lB?r5j0MLLAUIBxc*Bsk7XM(#oi8%*Qlx?BB10r&2ozMQ-f3<S zHFN)XsD~-LPb^qmOiO+~8CkPo>n7<8=4?Umoa2z8B7pr*MCSM=HCX)LhjbD_h+9Wz j(kpq_u#YcS+N6hX=f!=G(~@xxw~U5rs%u8WSU3L!jBX_# diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/idna/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/idna/__init__.py deleted file mode 100644 index 847bf93..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/idna/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -from .package_data import __version__ -from .core import * diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/idna/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/idna/__init__.pyc deleted file mode 100644 index a368bb6b629f6bc3954be133121998d57c00dcda..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 291 zcmYL_-AY3-49C-Ryb!<e3A{cGW;Z4W1rc9B5w|NrLOtycWnEj_dfayBGy4K2Ixr-^ z@=rq&Qh%QwjlRxaJJ?%A?>$AnAZT&{4qz?dMSx&kfvaGlYnV3&RAL38VU%M6;$Tv? z!6W`9`DgUl)Ld{vh^kwu-k?@RJ(GsQUAmA=!|ETI#)6E=4yqVAs3e!cX=*Na8@ZjO zH~+bsw(ow@rmMEQ&YK&(OB1p_%7u(Jj;+r{IX5oThaR6e^&7OI*C9!(y^@I5+k$u* Vx8;xq-mZiGaORHJ&U}k=@dH<1LSX;^ diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/idna/codec.py b/venv/lib/python2.7/site-packages/pip/_vendor/idna/codec.py deleted file mode 100644 index 98c65ea..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/idna/codec.py +++ /dev/null @@ -1,118 +0,0 @@ -from .core import encode, decode, alabel, ulabel, IDNAError -import codecs -import re - -_unicode_dots_re = re.compile(u'[\u002e\u3002\uff0e\uff61]') - -class Codec(codecs.Codec): - - def encode(self, data, errors='strict'): - - if errors != 'strict': - raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) - - if not data: - return "", 0 - - return encode(data), len(data) - - def decode(self, data, errors='strict'): - - if errors != 'strict': - raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) - - if not data: - return u"", 0 - - return decode(data), len(data) - -class IncrementalEncoder(codecs.BufferedIncrementalEncoder): - def _buffer_encode(self, data, errors, final): - if errors != 'strict': - raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) - - if not data: - return ("", 0) - - labels = _unicode_dots_re.split(data) - trailing_dot = u'' - if labels: - if not labels[-1]: - trailing_dot = '.' - del labels[-1] - elif not final: - # Keep potentially unfinished label until the next call - del labels[-1] - if labels: - trailing_dot = '.' - - result = [] - size = 0 - for label in labels: - result.append(alabel(label)) - if size: - size += 1 - size += len(label) - - # Join with U+002E - result = ".".join(result) + trailing_dot - size += len(trailing_dot) - return (result, size) - -class IncrementalDecoder(codecs.BufferedIncrementalDecoder): - def _buffer_decode(self, data, errors, final): - if errors != 'strict': - raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) - - if not data: - return (u"", 0) - - # IDNA allows decoding to operate on Unicode strings, too. - if isinstance(data, unicode): - labels = _unicode_dots_re.split(data) - else: - # Must be ASCII string - data = str(data) - unicode(data, "ascii") - labels = data.split(".") - - trailing_dot = u'' - if labels: - if not labels[-1]: - trailing_dot = u'.' - del labels[-1] - elif not final: - # Keep potentially unfinished label until the next call - del labels[-1] - if labels: - trailing_dot = u'.' - - result = [] - size = 0 - for label in labels: - result.append(ulabel(label)) - if size: - size += 1 - size += len(label) - - result = u".".join(result) + trailing_dot - size += len(trailing_dot) - return (result, size) - - -class StreamWriter(Codec, codecs.StreamWriter): - pass - -class StreamReader(Codec, codecs.StreamReader): - pass - -def getregentry(): - return codecs.CodecInfo( - name='idna', - encode=Codec().encode, - decode=Codec().decode, - incrementalencoder=IncrementalEncoder, - incrementaldecoder=IncrementalDecoder, - streamwriter=StreamWriter, - streamreader=StreamReader, - ) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/idna/codec.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/idna/codec.pyc deleted file mode 100644 index 27dbc801bee03c0d9f7e14626d9e4b06962f6531..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4486 zcmd5<OK%)S5U!coch+9#K@vkij^VIG#OnwYf|M7DbI1XM#-NBr(P}c&Yi2V$yYBAI z3tIv^Tsd>$!2by1!Y|+taNq~zz#aIiW*?4YKo(LqyF0brT{S&j)%|@{<NYyHIrGiz z?U05a5C2zjncpBH{2WS%x(+oR>blf)sq0bGqi&9xIqK%AnI|W5De@>OP_sb8c9EJz zQbp>ND9X_e?k`i6Csm+Mh1w291$s=hL-cvGLJ>@%I3$YFSW%^@EQ%RXRK|)~iVl&g zh^|I$JiR*B)hL=7>E=W?JJ!unRO3$bFt2y5J_jFT2cn*bumuQ}hP_BhGg9MbkOX&B zBBO(>S%&S+mDLY#Xx-ECU-+yJsu=rX>G!X<pFa8S=}$l2wmj=~Oc##B>tf^@F0%lk zuo6T<g8Uc}f*)wR#BGoKwK{KxJk(enhc@K?=(>)!S%KKZZ4TY_NWVo^?(aA}h?wKI z?NACEhs+Ykf6cnwfx>#j2Ew;iXV+JKma?+XQZwlHd)lgKL9vGmUj}KE#OeCN;#bRC zi+Bzq$D+<2`NeTJ$6Xe(?siXi1M8#9&m&4ynmNT5MkQ^_jVQ2zn9HL~9YZ9-@FN<1 z9p4MAYTOHSquom)rA_0}gT}*m^_}$o-E-$R(&h8|z4PG(^WcN%kzU4Uz2Eq>(U1FQ z<J8z7NzU4HAFa1O;UT$N_f#77bR&+^puxKwF7+SEGI?K3g;(HKos(|C$+<62*ay6> zN!WLF$6@zNF!A|J`|OHD+h>3LLoE1+PA$H?s-w8}#J4WTh1cC`r9oG<T9y~wYIS?j zAVF6)MtqtqU0N^rd@!8(q#Isv!L3&85j1Y5p;ld$;+)+O^3Wkh<--mO+7F{KM*CyH z-eq{RI^?-{r}$qmoyYJ2FkKc*cSdO5$}!Bh^0b*F{Vhu{?Ys$@W3y58FKs~Mks0YP zvGMlMWMiA425GDlZGq2ov{j@BD?HW8?TfTkqD^phj=*l4r6J2Wn?=&U5M)%M_hHYR zQ)CXvOn7MHd%A^1bc%dG2xv1;CouoeEYCx11|^1sl=u`JfRrXIlmUZD*>a4RGLGNF zRD9rssRS~Xb3tp6#>@t-sAo+}D<N>xPhu<d6!iO`4PWNrEfezU^y0M6y*((Cd)sju zWNAaPhOvx4tAm)Sl%FE=YGnqAmDx=ED0`~dPmcSGJ?VCqgK=ljZY$l&GU6K;G0PC- zjCir;6!5KNms`Yt4SZQ}W}KrUk9kL(IVWSF8Qkdeto~~d6ThYb;~G}*IxfQ-S#b7( zctz6w{{-=sgMqj*O3cWTJ1*&u`D}FnFiF+GbXpfMW!+Ko2GC*bzzC**H4wz`_eSvl zS>Rs;{C{9v4&h$}{GkE-M|y$(lcCAR6N37`;16tr2cCidp925#ZupmX!~a*nzr@ww zbMS}Re(>jnbpZHJvY|jPFku|~QsFTX4E7Mg#JVntk?A)h0%o1qNa2u%$}-^(X~Ab2 z_nGshm_bqIb2{_6vXN}-A46+DGVotvljAH-usF$Lp2e#W6F5u}=2^9S1<NrPAjUBF zYR(a_3Q%X@{uj8r`@#M6GyY8j?x(PV%eY2xX9`}kS_R!(I<{&bpqF5gWosm9w1-9R zn8POfH4T3ju^^=8ef;rNfa3W1>f`11=S}$1nfNnaKGXDd9={5K7Y@AD;5{dMy~JD0 z4n{n#PKIr%dw_iKAd)Hy4ImeM1De{Q;+lYRRZ=XMn9|_le^OdX8i*&gT$c9q-r)=; zS`s-30H^4_oT6O=7{oTn6D7UN`-QPwBgo6(&9vR~xt5$f+-GNfKB+!$ug@`=>M65K zit7pvuA{Qm54-3ZCR1|CNbXg9In@`Oy3irBXV}wfmq$`1c^J=XtTSj~r-)EhF{OsR zZa+>`MyVVO%S?DpN)8o0UsFqj{>f&TviAhge+M&8H;RnBi`i?;WllhbqgChdxixqG O`26Ylw@-PeyuShQvAu5q diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/idna/compat.py b/venv/lib/python2.7/site-packages/pip/_vendor/idna/compat.py deleted file mode 100644 index 4d47f33..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/idna/compat.py +++ /dev/null @@ -1,12 +0,0 @@ -from .core import * -from .codec import * - -def ToASCII(label): - return encode(label) - -def ToUnicode(label): - return decode(label) - -def nameprep(s): - raise NotImplementedError("IDNA 2008 does not utilise nameprep protocol") - diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/idna/compat.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/idna/compat.pyc deleted file mode 100644 index 4f599bda01c59a5d455612b5e3f3f4ea987d8223..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 999 zcmc&y%}N6?5T5O}Y72_s3+!<bYpRt}K}1mxJy@iz7eQp*#Il-AVv^QYy!i9RzJN2^ zswWR#H0*r)O@_(*hVRR@_2-q#6y~Rd{{s})MBw-ZAOQw*79cCZ8^A>gcvz4Sc)1{D z;1%e{3+R^x2r+>tSWgK_==CEMS3~dsPXMn0I+3kAb0B}AQq9Foub?iIYawGKP=LEd z#*EFzi5F~~Sazc&7uK=I37a<UwR*VQYTc_w%kH$&wwvtoN87+NG;F|3X6l)8K9RES zw@!ywXLMD_)mSL5Ez7t{SgLcA_)RnQix_U85Bo=*P8q4ADj@i6QCxf#)uR{wubwJK zALw(HQ9@MQj}@(=5yyl}fMa?IXd(JBCEs-$h@Io^VYJ<7v?H#Ci<I`!$Y(NhB2q~% zj1?v_R(qXlIh*Dh`D)+EjTE_1UhorZwVfGh3*7&;WeLN7rcL`f?@BkO74$UuR9oRm nqsFDZ5Lu7Z9=U!eUa-GjQc7Vj*L)<!e$hy}s0FoBHLQjoOponO diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/idna/core.py b/venv/lib/python2.7/site-packages/pip/_vendor/idna/core.py deleted file mode 100644 index 104624a..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/idna/core.py +++ /dev/null @@ -1,396 +0,0 @@ -from . import idnadata -import bisect -import unicodedata -import re -import sys -from .intranges import intranges_contain - -_virama_combining_class = 9 -_alabel_prefix = b'xn--' -_unicode_dots_re = re.compile(u'[\u002e\u3002\uff0e\uff61]') - -if sys.version_info[0] == 3: - unicode = str - unichr = chr - -class IDNAError(UnicodeError): - """ Base exception for all IDNA-encoding related problems """ - pass - - -class IDNABidiError(IDNAError): - """ Exception when bidirectional requirements are not satisfied """ - pass - - -class InvalidCodepoint(IDNAError): - """ Exception when a disallowed or unallocated codepoint is used """ - pass - - -class InvalidCodepointContext(IDNAError): - """ Exception when the codepoint is not valid in the context it is used """ - pass - - -def _combining_class(cp): - v = unicodedata.combining(unichr(cp)) - if v == 0: - if not unicodedata.name(unichr(cp)): - raise ValueError("Unknown character in unicodedata") - return v - -def _is_script(cp, script): - return intranges_contain(ord(cp), idnadata.scripts[script]) - -def _punycode(s): - return s.encode('punycode') - -def _unot(s): - return 'U+{0:04X}'.format(s) - - -def valid_label_length(label): - - if len(label) > 63: - return False - return True - - -def valid_string_length(label, trailing_dot): - - if len(label) > (254 if trailing_dot else 253): - return False - return True - - -def check_bidi(label, check_ltr=False): - - # Bidi rules should only be applied if string contains RTL characters - bidi_label = False - for (idx, cp) in enumerate(label, 1): - direction = unicodedata.bidirectional(cp) - if direction == '': - # String likely comes from a newer version of Unicode - raise IDNABidiError('Unknown directionality in label {0} at position {1}'.format(repr(label), idx)) - if direction in ['R', 'AL', 'AN']: - bidi_label = True - if not bidi_label and not check_ltr: - return True - - # Bidi rule 1 - direction = unicodedata.bidirectional(label[0]) - if direction in ['R', 'AL']: - rtl = True - elif direction == 'L': - rtl = False - else: - raise IDNABidiError('First codepoint in label {0} must be directionality L, R or AL'.format(repr(label))) - - valid_ending = False - number_type = False - for (idx, cp) in enumerate(label, 1): - direction = unicodedata.bidirectional(cp) - - if rtl: - # Bidi rule 2 - if not direction in ['R', 'AL', 'AN', 'EN', 'ES', 'CS', 'ET', 'ON', 'BN', 'NSM']: - raise IDNABidiError('Invalid direction for codepoint at position {0} in a right-to-left label'.format(idx)) - # Bidi rule 3 - if direction in ['R', 'AL', 'EN', 'AN']: - valid_ending = True - elif direction != 'NSM': - valid_ending = False - # Bidi rule 4 - if direction in ['AN', 'EN']: - if not number_type: - number_type = direction - else: - if number_type != direction: - raise IDNABidiError('Can not mix numeral types in a right-to-left label') - else: - # Bidi rule 5 - if not direction in ['L', 'EN', 'ES', 'CS', 'ET', 'ON', 'BN', 'NSM']: - raise IDNABidiError('Invalid direction for codepoint at position {0} in a left-to-right label'.format(idx)) - # Bidi rule 6 - if direction in ['L', 'EN']: - valid_ending = True - elif direction != 'NSM': - valid_ending = False - - if not valid_ending: - raise IDNABidiError('Label ends with illegal codepoint directionality') - - return True - - -def check_initial_combiner(label): - - if unicodedata.category(label[0])[0] == 'M': - raise IDNAError('Label begins with an illegal combining character') - return True - - -def check_hyphen_ok(label): - - if label[2:4] == '--': - raise IDNAError('Label has disallowed hyphens in 3rd and 4th position') - if label[0] == '-' or label[-1] == '-': - raise IDNAError('Label must not start or end with a hyphen') - return True - - -def check_nfc(label): - - if unicodedata.normalize('NFC', label) != label: - raise IDNAError('Label must be in Normalization Form C') - - -def valid_contextj(label, pos): - - cp_value = ord(label[pos]) - - if cp_value == 0x200c: - - if pos > 0: - if _combining_class(ord(label[pos - 1])) == _virama_combining_class: - return True - - ok = False - for i in range(pos-1, -1, -1): - joining_type = idnadata.joining_types.get(ord(label[i])) - if joining_type == ord('T'): - continue - if joining_type in [ord('L'), ord('D')]: - ok = True - break - - if not ok: - return False - - ok = False - for i in range(pos+1, len(label)): - joining_type = idnadata.joining_types.get(ord(label[i])) - if joining_type == ord('T'): - continue - if joining_type in [ord('R'), ord('D')]: - ok = True - break - return ok - - if cp_value == 0x200d: - - if pos > 0: - if _combining_class(ord(label[pos - 1])) == _virama_combining_class: - return True - return False - - else: - - return False - - -def valid_contexto(label, pos, exception=False): - - cp_value = ord(label[pos]) - - if cp_value == 0x00b7: - if 0 < pos < len(label)-1: - if ord(label[pos - 1]) == 0x006c and ord(label[pos + 1]) == 0x006c: - return True - return False - - elif cp_value == 0x0375: - if pos < len(label)-1 and len(label) > 1: - return _is_script(label[pos + 1], 'Greek') - return False - - elif cp_value == 0x05f3 or cp_value == 0x05f4: - if pos > 0: - return _is_script(label[pos - 1], 'Hebrew') - return False - - elif cp_value == 0x30fb: - for cp in label: - if cp == u'\u30fb': - continue - if _is_script(cp, 'Hiragana') or _is_script(cp, 'Katakana') or _is_script(cp, 'Han'): - return True - return False - - elif 0x660 <= cp_value <= 0x669: - for cp in label: - if 0x6f0 <= ord(cp) <= 0x06f9: - return False - return True - - elif 0x6f0 <= cp_value <= 0x6f9: - for cp in label: - if 0x660 <= ord(cp) <= 0x0669: - return False - return True - - -def check_label(label): - - if isinstance(label, (bytes, bytearray)): - label = label.decode('utf-8') - if len(label) == 0: - raise IDNAError('Empty Label') - - check_nfc(label) - check_hyphen_ok(label) - check_initial_combiner(label) - - for (pos, cp) in enumerate(label): - cp_value = ord(cp) - if intranges_contain(cp_value, idnadata.codepoint_classes['PVALID']): - continue - elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTJ']): - try: - if not valid_contextj(label, pos): - raise InvalidCodepointContext('Joiner {0} not allowed at position {1} in {2}'.format( - _unot(cp_value), pos+1, repr(label))) - except ValueError: - raise IDNAError('Unknown codepoint adjacent to joiner {0} at position {1} in {2}'.format( - _unot(cp_value), pos+1, repr(label))) - elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTO']): - if not valid_contexto(label, pos): - raise InvalidCodepointContext('Codepoint {0} not allowed at position {1} in {2}'.format(_unot(cp_value), pos+1, repr(label))) - else: - raise InvalidCodepoint('Codepoint {0} at position {1} of {2} not allowed'.format(_unot(cp_value), pos+1, repr(label))) - - check_bidi(label) - - -def alabel(label): - - try: - label = label.encode('ascii') - ulabel(label) - if not valid_label_length(label): - raise IDNAError('Label too long') - return label - except UnicodeEncodeError: - pass - - if not label: - raise IDNAError('No Input') - - label = unicode(label) - check_label(label) - label = _punycode(label) - label = _alabel_prefix + label - - if not valid_label_length(label): - raise IDNAError('Label too long') - - return label - - -def ulabel(label): - - if not isinstance(label, (bytes, bytearray)): - try: - label = label.encode('ascii') - except UnicodeEncodeError: - check_label(label) - return label - - label = label.lower() - if label.startswith(_alabel_prefix): - label = label[len(_alabel_prefix):] - else: - check_label(label) - return label.decode('ascii') - - label = label.decode('punycode') - check_label(label) - return label - - -def uts46_remap(domain, std3_rules=True, transitional=False): - """Re-map the characters in the string according to UTS46 processing.""" - from .uts46data import uts46data - output = u"" - try: - for pos, char in enumerate(domain): - code_point = ord(char) - uts46row = uts46data[code_point if code_point < 256 else - bisect.bisect_left(uts46data, (code_point, "Z")) - 1] - status = uts46row[1] - replacement = uts46row[2] if len(uts46row) == 3 else None - if (status == "V" or - (status == "D" and not transitional) or - (status == "3" and not std3_rules and replacement is None)): - output += char - elif replacement is not None and (status == "M" or - (status == "3" and not std3_rules) or - (status == "D" and transitional)): - output += replacement - elif status != "I": - raise IndexError() - return unicodedata.normalize("NFC", output) - except IndexError: - raise InvalidCodepoint( - "Codepoint {0} not allowed at position {1} in {2}".format( - _unot(code_point), pos + 1, repr(domain))) - - -def encode(s, strict=False, uts46=False, std3_rules=False, transitional=False): - - if isinstance(s, (bytes, bytearray)): - s = s.decode("ascii") - if uts46: - s = uts46_remap(s, std3_rules, transitional) - trailing_dot = False - result = [] - if strict: - labels = s.split('.') - else: - labels = _unicode_dots_re.split(s) - if not labels or labels == ['']: - raise IDNAError('Empty domain') - if labels[-1] == '': - del labels[-1] - trailing_dot = True - for label in labels: - s = alabel(label) - if s: - result.append(s) - else: - raise IDNAError('Empty label') - if trailing_dot: - result.append(b'') - s = b'.'.join(result) - if not valid_string_length(s, trailing_dot): - raise IDNAError('Domain too long') - return s - - -def decode(s, strict=False, uts46=False, std3_rules=False): - - if isinstance(s, (bytes, bytearray)): - s = s.decode("ascii") - if uts46: - s = uts46_remap(s, std3_rules, False) - trailing_dot = False - result = [] - if not strict: - labels = _unicode_dots_re.split(s) - else: - labels = s.split(u'.') - if not labels or labels == ['']: - raise IDNAError('Empty domain') - if not labels[-1]: - del labels[-1] - trailing_dot = True - for label in labels: - s = ulabel(label) - if s: - result.append(s) - else: - raise IDNAError('Empty label') - if trailing_dot: - result.append(u'') - return u'.'.join(result) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/idna/core.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/idna/core.pyc deleted file mode 100644 index 766c26dd68e038cda212bf9b57fcc59e20d73091..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13150 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 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/idna/idnadata.py b/venv/lib/python2.7/site-packages/pip/_vendor/idna/idnadata.py deleted file mode 100644 index a80c959..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/idna/idnadata.py +++ /dev/null @@ -1,1979 +0,0 @@ -# This file is automatically generated by tools/idna-data - -__version__ = "11.0.0" -scripts = { - 'Greek': ( - 0x37000000374, - 0x37500000378, - 0x37a0000037e, - 0x37f00000380, - 0x38400000385, - 0x38600000387, - 0x3880000038b, - 0x38c0000038d, - 0x38e000003a2, - 0x3a3000003e2, - 0x3f000000400, - 0x1d2600001d2b, - 0x1d5d00001d62, - 0x1d6600001d6b, - 0x1dbf00001dc0, - 0x1f0000001f16, - 0x1f1800001f1e, - 0x1f2000001f46, - 0x1f4800001f4e, - 0x1f5000001f58, - 0x1f5900001f5a, - 0x1f5b00001f5c, - 0x1f5d00001f5e, - 0x1f5f00001f7e, - 0x1f8000001fb5, - 0x1fb600001fc5, - 0x1fc600001fd4, - 0x1fd600001fdc, - 0x1fdd00001ff0, - 0x1ff200001ff5, - 0x1ff600001fff, - 0x212600002127, - 0xab650000ab66, - 0x101400001018f, - 0x101a0000101a1, - 0x1d2000001d246, - ), - 'Han': ( - 0x2e8000002e9a, - 0x2e9b00002ef4, - 0x2f0000002fd6, - 0x300500003006, - 0x300700003008, - 0x30210000302a, - 0x30380000303c, - 0x340000004db6, - 0x4e0000009ff0, - 0xf9000000fa6e, - 0xfa700000fada, - 0x200000002a6d7, - 0x2a7000002b735, - 0x2b7400002b81e, - 0x2b8200002cea2, - 0x2ceb00002ebe1, - 0x2f8000002fa1e, - ), - 'Hebrew': ( - 0x591000005c8, - 0x5d0000005eb, - 0x5ef000005f5, - 0xfb1d0000fb37, - 0xfb380000fb3d, - 0xfb3e0000fb3f, - 0xfb400000fb42, - 0xfb430000fb45, - 0xfb460000fb50, - ), - 'Hiragana': ( - 0x304100003097, - 0x309d000030a0, - 0x1b0010001b11f, - 0x1f2000001f201, - ), - 'Katakana': ( - 0x30a1000030fb, - 0x30fd00003100, - 0x31f000003200, - 0x32d0000032ff, - 0x330000003358, - 0xff660000ff70, - 0xff710000ff9e, - 0x1b0000001b001, - ), -} -joining_types = { - 0x600: 85, - 0x601: 85, - 0x602: 85, - 0x603: 85, - 0x604: 85, - 0x605: 85, - 0x608: 85, - 0x60b: 85, - 0x620: 68, - 0x621: 85, - 0x622: 82, - 0x623: 82, - 0x624: 82, - 0x625: 82, - 0x626: 68, - 0x627: 82, - 0x628: 68, - 0x629: 82, - 0x62a: 68, - 0x62b: 68, - 0x62c: 68, - 0x62d: 68, - 0x62e: 68, - 0x62f: 82, - 0x630: 82, - 0x631: 82, - 0x632: 82, - 0x633: 68, - 0x634: 68, - 0x635: 68, - 0x636: 68, - 0x637: 68, - 0x638: 68, - 0x639: 68, - 0x63a: 68, - 0x63b: 68, - 0x63c: 68, - 0x63d: 68, - 0x63e: 68, - 0x63f: 68, - 0x640: 67, - 0x641: 68, - 0x642: 68, - 0x643: 68, - 0x644: 68, - 0x645: 68, - 0x646: 68, - 0x647: 68, - 0x648: 82, - 0x649: 68, - 0x64a: 68, - 0x66e: 68, - 0x66f: 68, - 0x671: 82, - 0x672: 82, - 0x673: 82, - 0x674: 85, - 0x675: 82, - 0x676: 82, - 0x677: 82, - 0x678: 68, - 0x679: 68, - 0x67a: 68, - 0x67b: 68, - 0x67c: 68, - 0x67d: 68, - 0x67e: 68, - 0x67f: 68, - 0x680: 68, - 0x681: 68, - 0x682: 68, - 0x683: 68, - 0x684: 68, - 0x685: 68, - 0x686: 68, - 0x687: 68, - 0x688: 82, - 0x689: 82, - 0x68a: 82, - 0x68b: 82, - 0x68c: 82, - 0x68d: 82, - 0x68e: 82, - 0x68f: 82, - 0x690: 82, - 0x691: 82, - 0x692: 82, - 0x693: 82, - 0x694: 82, - 0x695: 82, - 0x696: 82, - 0x697: 82, - 0x698: 82, - 0x699: 82, - 0x69a: 68, - 0x69b: 68, - 0x69c: 68, - 0x69d: 68, - 0x69e: 68, - 0x69f: 68, - 0x6a0: 68, - 0x6a1: 68, - 0x6a2: 68, - 0x6a3: 68, - 0x6a4: 68, - 0x6a5: 68, - 0x6a6: 68, - 0x6a7: 68, - 0x6a8: 68, - 0x6a9: 68, - 0x6aa: 68, - 0x6ab: 68, - 0x6ac: 68, - 0x6ad: 68, - 0x6ae: 68, - 0x6af: 68, - 0x6b0: 68, - 0x6b1: 68, - 0x6b2: 68, - 0x6b3: 68, - 0x6b4: 68, - 0x6b5: 68, - 0x6b6: 68, - 0x6b7: 68, - 0x6b8: 68, - 0x6b9: 68, - 0x6ba: 68, - 0x6bb: 68, - 0x6bc: 68, - 0x6bd: 68, - 0x6be: 68, - 0x6bf: 68, - 0x6c0: 82, - 0x6c1: 68, - 0x6c2: 68, - 0x6c3: 82, - 0x6c4: 82, - 0x6c5: 82, - 0x6c6: 82, - 0x6c7: 82, - 0x6c8: 82, - 0x6c9: 82, - 0x6ca: 82, - 0x6cb: 82, - 0x6cc: 68, - 0x6cd: 82, - 0x6ce: 68, - 0x6cf: 82, - 0x6d0: 68, - 0x6d1: 68, - 0x6d2: 82, - 0x6d3: 82, - 0x6d5: 82, - 0x6dd: 85, - 0x6ee: 82, - 0x6ef: 82, - 0x6fa: 68, - 0x6fb: 68, - 0x6fc: 68, - 0x6ff: 68, - 0x70f: 84, - 0x710: 82, - 0x712: 68, - 0x713: 68, - 0x714: 68, - 0x715: 82, - 0x716: 82, - 0x717: 82, - 0x718: 82, - 0x719: 82, - 0x71a: 68, - 0x71b: 68, - 0x71c: 68, - 0x71d: 68, - 0x71e: 82, - 0x71f: 68, - 0x720: 68, - 0x721: 68, - 0x722: 68, - 0x723: 68, - 0x724: 68, - 0x725: 68, - 0x726: 68, - 0x727: 68, - 0x728: 82, - 0x729: 68, - 0x72a: 82, - 0x72b: 68, - 0x72c: 82, - 0x72d: 68, - 0x72e: 68, - 0x72f: 82, - 0x74d: 82, - 0x74e: 68, - 0x74f: 68, - 0x750: 68, - 0x751: 68, - 0x752: 68, - 0x753: 68, - 0x754: 68, - 0x755: 68, - 0x756: 68, - 0x757: 68, - 0x758: 68, - 0x759: 82, - 0x75a: 82, - 0x75b: 82, - 0x75c: 68, - 0x75d: 68, - 0x75e: 68, - 0x75f: 68, - 0x760: 68, - 0x761: 68, - 0x762: 68, - 0x763: 68, - 0x764: 68, - 0x765: 68, - 0x766: 68, - 0x767: 68, - 0x768: 68, - 0x769: 68, - 0x76a: 68, - 0x76b: 82, - 0x76c: 82, - 0x76d: 68, - 0x76e: 68, - 0x76f: 68, - 0x770: 68, - 0x771: 82, - 0x772: 68, - 0x773: 82, - 0x774: 82, - 0x775: 68, - 0x776: 68, - 0x777: 68, - 0x778: 82, - 0x779: 82, - 0x77a: 68, - 0x77b: 68, - 0x77c: 68, - 0x77d: 68, - 0x77e: 68, - 0x77f: 68, - 0x7ca: 68, - 0x7cb: 68, - 0x7cc: 68, - 0x7cd: 68, - 0x7ce: 68, - 0x7cf: 68, - 0x7d0: 68, - 0x7d1: 68, - 0x7d2: 68, - 0x7d3: 68, - 0x7d4: 68, - 0x7d5: 68, - 0x7d6: 68, - 0x7d7: 68, - 0x7d8: 68, - 0x7d9: 68, - 0x7da: 68, - 0x7db: 68, - 0x7dc: 68, - 0x7dd: 68, - 0x7de: 68, - 0x7df: 68, - 0x7e0: 68, - 0x7e1: 68, - 0x7e2: 68, - 0x7e3: 68, - 0x7e4: 68, - 0x7e5: 68, - 0x7e6: 68, - 0x7e7: 68, - 0x7e8: 68, - 0x7e9: 68, - 0x7ea: 68, - 0x7fa: 67, - 0x840: 82, - 0x841: 68, - 0x842: 68, - 0x843: 68, - 0x844: 68, - 0x845: 68, - 0x846: 82, - 0x847: 82, - 0x848: 68, - 0x849: 82, - 0x84a: 68, - 0x84b: 68, - 0x84c: 68, - 0x84d: 68, - 0x84e: 68, - 0x84f: 68, - 0x850: 68, - 0x851: 68, - 0x852: 68, - 0x853: 68, - 0x854: 82, - 0x855: 68, - 0x856: 85, - 0x857: 85, - 0x858: 85, - 0x860: 68, - 0x861: 85, - 0x862: 68, - 0x863: 68, - 0x864: 68, - 0x865: 68, - 0x866: 85, - 0x867: 82, - 0x868: 68, - 0x869: 82, - 0x86a: 82, - 0x8a0: 68, - 0x8a1: 68, - 0x8a2: 68, - 0x8a3: 68, - 0x8a4: 68, - 0x8a5: 68, - 0x8a6: 68, - 0x8a7: 68, - 0x8a8: 68, - 0x8a9: 68, - 0x8aa: 82, - 0x8ab: 82, - 0x8ac: 82, - 0x8ad: 85, - 0x8ae: 82, - 0x8af: 68, - 0x8b0: 68, - 0x8b1: 82, - 0x8b2: 82, - 0x8b3: 68, - 0x8b4: 68, - 0x8b6: 68, - 0x8b7: 68, - 0x8b8: 68, - 0x8b9: 82, - 0x8ba: 68, - 0x8bb: 68, - 0x8bc: 68, - 0x8bd: 68, - 0x8e2: 85, - 0x1806: 85, - 0x1807: 68, - 0x180a: 67, - 0x180e: 85, - 0x1820: 68, - 0x1821: 68, - 0x1822: 68, - 0x1823: 68, - 0x1824: 68, - 0x1825: 68, - 0x1826: 68, - 0x1827: 68, - 0x1828: 68, - 0x1829: 68, - 0x182a: 68, - 0x182b: 68, - 0x182c: 68, - 0x182d: 68, - 0x182e: 68, - 0x182f: 68, - 0x1830: 68, - 0x1831: 68, - 0x1832: 68, - 0x1833: 68, - 0x1834: 68, - 0x1835: 68, - 0x1836: 68, - 0x1837: 68, - 0x1838: 68, - 0x1839: 68, - 0x183a: 68, - 0x183b: 68, - 0x183c: 68, - 0x183d: 68, - 0x183e: 68, - 0x183f: 68, - 0x1840: 68, - 0x1841: 68, - 0x1842: 68, - 0x1843: 68, - 0x1844: 68, - 0x1845: 68, - 0x1846: 68, - 0x1847: 68, - 0x1848: 68, - 0x1849: 68, - 0x184a: 68, - 0x184b: 68, - 0x184c: 68, - 0x184d: 68, - 0x184e: 68, - 0x184f: 68, - 0x1850: 68, - 0x1851: 68, - 0x1852: 68, - 0x1853: 68, - 0x1854: 68, - 0x1855: 68, - 0x1856: 68, - 0x1857: 68, - 0x1858: 68, - 0x1859: 68, - 0x185a: 68, - 0x185b: 68, - 0x185c: 68, - 0x185d: 68, - 0x185e: 68, - 0x185f: 68, - 0x1860: 68, - 0x1861: 68, - 0x1862: 68, - 0x1863: 68, - 0x1864: 68, - 0x1865: 68, - 0x1866: 68, - 0x1867: 68, - 0x1868: 68, - 0x1869: 68, - 0x186a: 68, - 0x186b: 68, - 0x186c: 68, - 0x186d: 68, - 0x186e: 68, - 0x186f: 68, - 0x1870: 68, - 0x1871: 68, - 0x1872: 68, - 0x1873: 68, - 0x1874: 68, - 0x1875: 68, - 0x1876: 68, - 0x1877: 68, - 0x1878: 68, - 0x1880: 85, - 0x1881: 85, - 0x1882: 85, - 0x1883: 85, - 0x1884: 85, - 0x1885: 84, - 0x1886: 84, - 0x1887: 68, - 0x1888: 68, - 0x1889: 68, - 0x188a: 68, - 0x188b: 68, - 0x188c: 68, - 0x188d: 68, - 0x188e: 68, - 0x188f: 68, - 0x1890: 68, - 0x1891: 68, - 0x1892: 68, - 0x1893: 68, - 0x1894: 68, - 0x1895: 68, - 0x1896: 68, - 0x1897: 68, - 0x1898: 68, - 0x1899: 68, - 0x189a: 68, - 0x189b: 68, - 0x189c: 68, - 0x189d: 68, - 0x189e: 68, - 0x189f: 68, - 0x18a0: 68, - 0x18a1: 68, - 0x18a2: 68, - 0x18a3: 68, - 0x18a4: 68, - 0x18a5: 68, - 0x18a6: 68, - 0x18a7: 68, - 0x18a8: 68, - 0x18aa: 68, - 0x200c: 85, - 0x200d: 67, - 0x202f: 85, - 0x2066: 85, - 0x2067: 85, - 0x2068: 85, - 0x2069: 85, - 0xa840: 68, - 0xa841: 68, - 0xa842: 68, - 0xa843: 68, - 0xa844: 68, - 0xa845: 68, - 0xa846: 68, - 0xa847: 68, - 0xa848: 68, - 0xa849: 68, - 0xa84a: 68, - 0xa84b: 68, - 0xa84c: 68, - 0xa84d: 68, - 0xa84e: 68, - 0xa84f: 68, - 0xa850: 68, - 0xa851: 68, - 0xa852: 68, - 0xa853: 68, - 0xa854: 68, - 0xa855: 68, - 0xa856: 68, - 0xa857: 68, - 0xa858: 68, - 0xa859: 68, - 0xa85a: 68, - 0xa85b: 68, - 0xa85c: 68, - 0xa85d: 68, - 0xa85e: 68, - 0xa85f: 68, - 0xa860: 68, - 0xa861: 68, - 0xa862: 68, - 0xa863: 68, - 0xa864: 68, - 0xa865: 68, - 0xa866: 68, - 0xa867: 68, - 0xa868: 68, - 0xa869: 68, - 0xa86a: 68, - 0xa86b: 68, - 0xa86c: 68, - 0xa86d: 68, - 0xa86e: 68, - 0xa86f: 68, - 0xa870: 68, - 0xa871: 68, - 0xa872: 76, - 0xa873: 85, - 0x10ac0: 68, - 0x10ac1: 68, - 0x10ac2: 68, - 0x10ac3: 68, - 0x10ac4: 68, - 0x10ac5: 82, - 0x10ac6: 85, - 0x10ac7: 82, - 0x10ac8: 85, - 0x10ac9: 82, - 0x10aca: 82, - 0x10acb: 85, - 0x10acc: 85, - 0x10acd: 76, - 0x10ace: 82, - 0x10acf: 82, - 0x10ad0: 82, - 0x10ad1: 82, - 0x10ad2: 82, - 0x10ad3: 68, - 0x10ad4: 68, - 0x10ad5: 68, - 0x10ad6: 68, - 0x10ad7: 76, - 0x10ad8: 68, - 0x10ad9: 68, - 0x10ada: 68, - 0x10adb: 68, - 0x10adc: 68, - 0x10add: 82, - 0x10ade: 68, - 0x10adf: 68, - 0x10ae0: 68, - 0x10ae1: 82, - 0x10ae2: 85, - 0x10ae3: 85, - 0x10ae4: 82, - 0x10aeb: 68, - 0x10aec: 68, - 0x10aed: 68, - 0x10aee: 68, - 0x10aef: 82, - 0x10b80: 68, - 0x10b81: 82, - 0x10b82: 68, - 0x10b83: 82, - 0x10b84: 82, - 0x10b85: 82, - 0x10b86: 68, - 0x10b87: 68, - 0x10b88: 68, - 0x10b89: 82, - 0x10b8a: 68, - 0x10b8b: 68, - 0x10b8c: 82, - 0x10b8d: 68, - 0x10b8e: 82, - 0x10b8f: 82, - 0x10b90: 68, - 0x10b91: 82, - 0x10ba9: 82, - 0x10baa: 82, - 0x10bab: 82, - 0x10bac: 82, - 0x10bad: 68, - 0x10bae: 68, - 0x10baf: 85, - 0x10d00: 76, - 0x10d01: 68, - 0x10d02: 68, - 0x10d03: 68, - 0x10d04: 68, - 0x10d05: 68, - 0x10d06: 68, - 0x10d07: 68, - 0x10d08: 68, - 0x10d09: 68, - 0x10d0a: 68, - 0x10d0b: 68, - 0x10d0c: 68, - 0x10d0d: 68, - 0x10d0e: 68, - 0x10d0f: 68, - 0x10d10: 68, - 0x10d11: 68, - 0x10d12: 68, - 0x10d13: 68, - 0x10d14: 68, - 0x10d15: 68, - 0x10d16: 68, - 0x10d17: 68, - 0x10d18: 68, - 0x10d19: 68, - 0x10d1a: 68, - 0x10d1b: 68, - 0x10d1c: 68, - 0x10d1d: 68, - 0x10d1e: 68, - 0x10d1f: 68, - 0x10d20: 68, - 0x10d21: 68, - 0x10d22: 82, - 0x10d23: 68, - 0x10f30: 68, - 0x10f31: 68, - 0x10f32: 68, - 0x10f33: 82, - 0x10f34: 68, - 0x10f35: 68, - 0x10f36: 68, - 0x10f37: 68, - 0x10f38: 68, - 0x10f39: 68, - 0x10f3a: 68, - 0x10f3b: 68, - 0x10f3c: 68, - 0x10f3d: 68, - 0x10f3e: 68, - 0x10f3f: 68, - 0x10f40: 68, - 0x10f41: 68, - 0x10f42: 68, - 0x10f43: 68, - 0x10f44: 68, - 0x10f45: 85, - 0x10f51: 68, - 0x10f52: 68, - 0x10f53: 68, - 0x10f54: 82, - 0x110bd: 85, - 0x110cd: 85, - 0x1e900: 68, - 0x1e901: 68, - 0x1e902: 68, - 0x1e903: 68, - 0x1e904: 68, - 0x1e905: 68, - 0x1e906: 68, - 0x1e907: 68, - 0x1e908: 68, - 0x1e909: 68, - 0x1e90a: 68, - 0x1e90b: 68, - 0x1e90c: 68, - 0x1e90d: 68, - 0x1e90e: 68, - 0x1e90f: 68, - 0x1e910: 68, - 0x1e911: 68, - 0x1e912: 68, - 0x1e913: 68, - 0x1e914: 68, - 0x1e915: 68, - 0x1e916: 68, - 0x1e917: 68, - 0x1e918: 68, - 0x1e919: 68, - 0x1e91a: 68, - 0x1e91b: 68, - 0x1e91c: 68, - 0x1e91d: 68, - 0x1e91e: 68, - 0x1e91f: 68, - 0x1e920: 68, - 0x1e921: 68, - 0x1e922: 68, - 0x1e923: 68, - 0x1e924: 68, - 0x1e925: 68, - 0x1e926: 68, - 0x1e927: 68, - 0x1e928: 68, - 0x1e929: 68, - 0x1e92a: 68, - 0x1e92b: 68, - 0x1e92c: 68, - 0x1e92d: 68, - 0x1e92e: 68, - 0x1e92f: 68, - 0x1e930: 68, - 0x1e931: 68, - 0x1e932: 68, - 0x1e933: 68, - 0x1e934: 68, - 0x1e935: 68, - 0x1e936: 68, - 0x1e937: 68, - 0x1e938: 68, - 0x1e939: 68, - 0x1e93a: 68, - 0x1e93b: 68, - 0x1e93c: 68, - 0x1e93d: 68, - 0x1e93e: 68, - 0x1e93f: 68, - 0x1e940: 68, - 0x1e941: 68, - 0x1e942: 68, - 0x1e943: 68, -} -codepoint_classes = { - 'PVALID': ( - 0x2d0000002e, - 0x300000003a, - 0x610000007b, - 0xdf000000f7, - 0xf800000100, - 0x10100000102, - 0x10300000104, - 0x10500000106, - 0x10700000108, - 0x1090000010a, - 0x10b0000010c, - 0x10d0000010e, - 0x10f00000110, - 0x11100000112, - 0x11300000114, - 0x11500000116, - 0x11700000118, - 0x1190000011a, - 0x11b0000011c, - 0x11d0000011e, - 0x11f00000120, - 0x12100000122, - 0x12300000124, - 0x12500000126, - 0x12700000128, - 0x1290000012a, - 0x12b0000012c, - 0x12d0000012e, - 0x12f00000130, - 0x13100000132, - 0x13500000136, - 0x13700000139, - 0x13a0000013b, - 0x13c0000013d, - 0x13e0000013f, - 0x14200000143, - 0x14400000145, - 0x14600000147, - 0x14800000149, - 0x14b0000014c, - 0x14d0000014e, - 0x14f00000150, - 0x15100000152, - 0x15300000154, - 0x15500000156, - 0x15700000158, - 0x1590000015a, - 0x15b0000015c, - 0x15d0000015e, - 0x15f00000160, - 0x16100000162, - 0x16300000164, - 0x16500000166, - 0x16700000168, - 0x1690000016a, - 0x16b0000016c, - 0x16d0000016e, - 0x16f00000170, - 0x17100000172, - 0x17300000174, - 0x17500000176, - 0x17700000178, - 0x17a0000017b, - 0x17c0000017d, - 0x17e0000017f, - 0x18000000181, - 0x18300000184, - 0x18500000186, - 0x18800000189, - 0x18c0000018e, - 0x19200000193, - 0x19500000196, - 0x1990000019c, - 0x19e0000019f, - 0x1a1000001a2, - 0x1a3000001a4, - 0x1a5000001a6, - 0x1a8000001a9, - 0x1aa000001ac, - 0x1ad000001ae, - 0x1b0000001b1, - 0x1b4000001b5, - 0x1b6000001b7, - 0x1b9000001bc, - 0x1bd000001c4, - 0x1ce000001cf, - 0x1d0000001d1, - 0x1d2000001d3, - 0x1d4000001d5, - 0x1d6000001d7, - 0x1d8000001d9, - 0x1da000001db, - 0x1dc000001de, - 0x1df000001e0, - 0x1e1000001e2, - 0x1e3000001e4, - 0x1e5000001e6, - 0x1e7000001e8, - 0x1e9000001ea, - 0x1eb000001ec, - 0x1ed000001ee, - 0x1ef000001f1, - 0x1f5000001f6, - 0x1f9000001fa, - 0x1fb000001fc, - 0x1fd000001fe, - 0x1ff00000200, - 0x20100000202, - 0x20300000204, - 0x20500000206, - 0x20700000208, - 0x2090000020a, - 0x20b0000020c, - 0x20d0000020e, - 0x20f00000210, - 0x21100000212, - 0x21300000214, - 0x21500000216, - 0x21700000218, - 0x2190000021a, - 0x21b0000021c, - 0x21d0000021e, - 0x21f00000220, - 0x22100000222, - 0x22300000224, - 0x22500000226, - 0x22700000228, - 0x2290000022a, - 0x22b0000022c, - 0x22d0000022e, - 0x22f00000230, - 0x23100000232, - 0x2330000023a, - 0x23c0000023d, - 0x23f00000241, - 0x24200000243, - 0x24700000248, - 0x2490000024a, - 0x24b0000024c, - 0x24d0000024e, - 0x24f000002b0, - 0x2b9000002c2, - 0x2c6000002d2, - 0x2ec000002ed, - 0x2ee000002ef, - 0x30000000340, - 0x34200000343, - 0x3460000034f, - 0x35000000370, - 0x37100000372, - 0x37300000374, - 0x37700000378, - 0x37b0000037e, - 0x39000000391, - 0x3ac000003cf, - 0x3d7000003d8, - 0x3d9000003da, - 0x3db000003dc, - 0x3dd000003de, - 0x3df000003e0, - 0x3e1000003e2, - 0x3e3000003e4, - 0x3e5000003e6, - 0x3e7000003e8, - 0x3e9000003ea, - 0x3eb000003ec, - 0x3ed000003ee, - 0x3ef000003f0, - 0x3f3000003f4, - 0x3f8000003f9, - 0x3fb000003fd, - 0x43000000460, - 0x46100000462, - 0x46300000464, - 0x46500000466, - 0x46700000468, - 0x4690000046a, - 0x46b0000046c, - 0x46d0000046e, - 0x46f00000470, - 0x47100000472, - 0x47300000474, - 0x47500000476, - 0x47700000478, - 0x4790000047a, - 0x47b0000047c, - 0x47d0000047e, - 0x47f00000480, - 0x48100000482, - 0x48300000488, - 0x48b0000048c, - 0x48d0000048e, - 0x48f00000490, - 0x49100000492, - 0x49300000494, - 0x49500000496, - 0x49700000498, - 0x4990000049a, - 0x49b0000049c, - 0x49d0000049e, - 0x49f000004a0, - 0x4a1000004a2, - 0x4a3000004a4, - 0x4a5000004a6, - 0x4a7000004a8, - 0x4a9000004aa, - 0x4ab000004ac, - 0x4ad000004ae, - 0x4af000004b0, - 0x4b1000004b2, - 0x4b3000004b4, - 0x4b5000004b6, - 0x4b7000004b8, - 0x4b9000004ba, - 0x4bb000004bc, - 0x4bd000004be, - 0x4bf000004c0, - 0x4c2000004c3, - 0x4c4000004c5, - 0x4c6000004c7, - 0x4c8000004c9, - 0x4ca000004cb, - 0x4cc000004cd, - 0x4ce000004d0, - 0x4d1000004d2, - 0x4d3000004d4, - 0x4d5000004d6, - 0x4d7000004d8, - 0x4d9000004da, - 0x4db000004dc, - 0x4dd000004de, - 0x4df000004e0, - 0x4e1000004e2, - 0x4e3000004e4, - 0x4e5000004e6, - 0x4e7000004e8, - 0x4e9000004ea, - 0x4eb000004ec, - 0x4ed000004ee, - 0x4ef000004f0, - 0x4f1000004f2, - 0x4f3000004f4, - 0x4f5000004f6, - 0x4f7000004f8, - 0x4f9000004fa, - 0x4fb000004fc, - 0x4fd000004fe, - 0x4ff00000500, - 0x50100000502, - 0x50300000504, - 0x50500000506, - 0x50700000508, - 0x5090000050a, - 0x50b0000050c, - 0x50d0000050e, - 0x50f00000510, - 0x51100000512, - 0x51300000514, - 0x51500000516, - 0x51700000518, - 0x5190000051a, - 0x51b0000051c, - 0x51d0000051e, - 0x51f00000520, - 0x52100000522, - 0x52300000524, - 0x52500000526, - 0x52700000528, - 0x5290000052a, - 0x52b0000052c, - 0x52d0000052e, - 0x52f00000530, - 0x5590000055a, - 0x56000000587, - 0x58800000589, - 0x591000005be, - 0x5bf000005c0, - 0x5c1000005c3, - 0x5c4000005c6, - 0x5c7000005c8, - 0x5d0000005eb, - 0x5ef000005f3, - 0x6100000061b, - 0x62000000640, - 0x64100000660, - 0x66e00000675, - 0x679000006d4, - 0x6d5000006dd, - 0x6df000006e9, - 0x6ea000006f0, - 0x6fa00000700, - 0x7100000074b, - 0x74d000007b2, - 0x7c0000007f6, - 0x7fd000007fe, - 0x8000000082e, - 0x8400000085c, - 0x8600000086b, - 0x8a0000008b5, - 0x8b6000008be, - 0x8d3000008e2, - 0x8e300000958, - 0x96000000964, - 0x96600000970, - 0x97100000984, - 0x9850000098d, - 0x98f00000991, - 0x993000009a9, - 0x9aa000009b1, - 0x9b2000009b3, - 0x9b6000009ba, - 0x9bc000009c5, - 0x9c7000009c9, - 0x9cb000009cf, - 0x9d7000009d8, - 0x9e0000009e4, - 0x9e6000009f2, - 0x9fc000009fd, - 0x9fe000009ff, - 0xa0100000a04, - 0xa0500000a0b, - 0xa0f00000a11, - 0xa1300000a29, - 0xa2a00000a31, - 0xa3200000a33, - 0xa3500000a36, - 0xa3800000a3a, - 0xa3c00000a3d, - 0xa3e00000a43, - 0xa4700000a49, - 0xa4b00000a4e, - 0xa5100000a52, - 0xa5c00000a5d, - 0xa6600000a76, - 0xa8100000a84, - 0xa8500000a8e, - 0xa8f00000a92, - 0xa9300000aa9, - 0xaaa00000ab1, - 0xab200000ab4, - 0xab500000aba, - 0xabc00000ac6, - 0xac700000aca, - 0xacb00000ace, - 0xad000000ad1, - 0xae000000ae4, - 0xae600000af0, - 0xaf900000b00, - 0xb0100000b04, - 0xb0500000b0d, - 0xb0f00000b11, - 0xb1300000b29, - 0xb2a00000b31, - 0xb3200000b34, - 0xb3500000b3a, - 0xb3c00000b45, - 0xb4700000b49, - 0xb4b00000b4e, - 0xb5600000b58, - 0xb5f00000b64, - 0xb6600000b70, - 0xb7100000b72, - 0xb8200000b84, - 0xb8500000b8b, - 0xb8e00000b91, - 0xb9200000b96, - 0xb9900000b9b, - 0xb9c00000b9d, - 0xb9e00000ba0, - 0xba300000ba5, - 0xba800000bab, - 0xbae00000bba, - 0xbbe00000bc3, - 0xbc600000bc9, - 0xbca00000bce, - 0xbd000000bd1, - 0xbd700000bd8, - 0xbe600000bf0, - 0xc0000000c0d, - 0xc0e00000c11, - 0xc1200000c29, - 0xc2a00000c3a, - 0xc3d00000c45, - 0xc4600000c49, - 0xc4a00000c4e, - 0xc5500000c57, - 0xc5800000c5b, - 0xc6000000c64, - 0xc6600000c70, - 0xc8000000c84, - 0xc8500000c8d, - 0xc8e00000c91, - 0xc9200000ca9, - 0xcaa00000cb4, - 0xcb500000cba, - 0xcbc00000cc5, - 0xcc600000cc9, - 0xcca00000cce, - 0xcd500000cd7, - 0xcde00000cdf, - 0xce000000ce4, - 0xce600000cf0, - 0xcf100000cf3, - 0xd0000000d04, - 0xd0500000d0d, - 0xd0e00000d11, - 0xd1200000d45, - 0xd4600000d49, - 0xd4a00000d4f, - 0xd5400000d58, - 0xd5f00000d64, - 0xd6600000d70, - 0xd7a00000d80, - 0xd8200000d84, - 0xd8500000d97, - 0xd9a00000db2, - 0xdb300000dbc, - 0xdbd00000dbe, - 0xdc000000dc7, - 0xdca00000dcb, - 0xdcf00000dd5, - 0xdd600000dd7, - 0xdd800000de0, - 0xde600000df0, - 0xdf200000df4, - 0xe0100000e33, - 0xe3400000e3b, - 0xe4000000e4f, - 0xe5000000e5a, - 0xe8100000e83, - 0xe8400000e85, - 0xe8700000e89, - 0xe8a00000e8b, - 0xe8d00000e8e, - 0xe9400000e98, - 0xe9900000ea0, - 0xea100000ea4, - 0xea500000ea6, - 0xea700000ea8, - 0xeaa00000eac, - 0xead00000eb3, - 0xeb400000eba, - 0xebb00000ebe, - 0xec000000ec5, - 0xec600000ec7, - 0xec800000ece, - 0xed000000eda, - 0xede00000ee0, - 0xf0000000f01, - 0xf0b00000f0c, - 0xf1800000f1a, - 0xf2000000f2a, - 0xf3500000f36, - 0xf3700000f38, - 0xf3900000f3a, - 0xf3e00000f43, - 0xf4400000f48, - 0xf4900000f4d, - 0xf4e00000f52, - 0xf5300000f57, - 0xf5800000f5c, - 0xf5d00000f69, - 0xf6a00000f6d, - 0xf7100000f73, - 0xf7400000f75, - 0xf7a00000f81, - 0xf8200000f85, - 0xf8600000f93, - 0xf9400000f98, - 0xf9900000f9d, - 0xf9e00000fa2, - 0xfa300000fa7, - 0xfa800000fac, - 0xfad00000fb9, - 0xfba00000fbd, - 0xfc600000fc7, - 0x10000000104a, - 0x10500000109e, - 0x10d0000010fb, - 0x10fd00001100, - 0x120000001249, - 0x124a0000124e, - 0x125000001257, - 0x125800001259, - 0x125a0000125e, - 0x126000001289, - 0x128a0000128e, - 0x1290000012b1, - 0x12b2000012b6, - 0x12b8000012bf, - 0x12c0000012c1, - 0x12c2000012c6, - 0x12c8000012d7, - 0x12d800001311, - 0x131200001316, - 0x13180000135b, - 0x135d00001360, - 0x138000001390, - 0x13a0000013f6, - 0x14010000166d, - 0x166f00001680, - 0x16810000169b, - 0x16a0000016eb, - 0x16f1000016f9, - 0x17000000170d, - 0x170e00001715, - 0x172000001735, - 0x174000001754, - 0x17600000176d, - 0x176e00001771, - 0x177200001774, - 0x1780000017b4, - 0x17b6000017d4, - 0x17d7000017d8, - 0x17dc000017de, - 0x17e0000017ea, - 0x18100000181a, - 0x182000001879, - 0x1880000018ab, - 0x18b0000018f6, - 0x19000000191f, - 0x19200000192c, - 0x19300000193c, - 0x19460000196e, - 0x197000001975, - 0x1980000019ac, - 0x19b0000019ca, - 0x19d0000019da, - 0x1a0000001a1c, - 0x1a2000001a5f, - 0x1a6000001a7d, - 0x1a7f00001a8a, - 0x1a9000001a9a, - 0x1aa700001aa8, - 0x1ab000001abe, - 0x1b0000001b4c, - 0x1b5000001b5a, - 0x1b6b00001b74, - 0x1b8000001bf4, - 0x1c0000001c38, - 0x1c4000001c4a, - 0x1c4d00001c7e, - 0x1cd000001cd3, - 0x1cd400001cfa, - 0x1d0000001d2c, - 0x1d2f00001d30, - 0x1d3b00001d3c, - 0x1d4e00001d4f, - 0x1d6b00001d78, - 0x1d7900001d9b, - 0x1dc000001dfa, - 0x1dfb00001e00, - 0x1e0100001e02, - 0x1e0300001e04, - 0x1e0500001e06, - 0x1e0700001e08, - 0x1e0900001e0a, - 0x1e0b00001e0c, - 0x1e0d00001e0e, - 0x1e0f00001e10, - 0x1e1100001e12, - 0x1e1300001e14, - 0x1e1500001e16, - 0x1e1700001e18, - 0x1e1900001e1a, - 0x1e1b00001e1c, - 0x1e1d00001e1e, - 0x1e1f00001e20, - 0x1e2100001e22, - 0x1e2300001e24, - 0x1e2500001e26, - 0x1e2700001e28, - 0x1e2900001e2a, - 0x1e2b00001e2c, - 0x1e2d00001e2e, - 0x1e2f00001e30, - 0x1e3100001e32, - 0x1e3300001e34, - 0x1e3500001e36, - 0x1e3700001e38, - 0x1e3900001e3a, - 0x1e3b00001e3c, - 0x1e3d00001e3e, - 0x1e3f00001e40, - 0x1e4100001e42, - 0x1e4300001e44, - 0x1e4500001e46, - 0x1e4700001e48, - 0x1e4900001e4a, - 0x1e4b00001e4c, - 0x1e4d00001e4e, - 0x1e4f00001e50, - 0x1e5100001e52, - 0x1e5300001e54, - 0x1e5500001e56, - 0x1e5700001e58, - 0x1e5900001e5a, - 0x1e5b00001e5c, - 0x1e5d00001e5e, - 0x1e5f00001e60, - 0x1e6100001e62, - 0x1e6300001e64, - 0x1e6500001e66, - 0x1e6700001e68, - 0x1e6900001e6a, - 0x1e6b00001e6c, - 0x1e6d00001e6e, - 0x1e6f00001e70, - 0x1e7100001e72, - 0x1e7300001e74, - 0x1e7500001e76, - 0x1e7700001e78, - 0x1e7900001e7a, - 0x1e7b00001e7c, - 0x1e7d00001e7e, - 0x1e7f00001e80, - 0x1e8100001e82, - 0x1e8300001e84, - 0x1e8500001e86, - 0x1e8700001e88, - 0x1e8900001e8a, - 0x1e8b00001e8c, - 0x1e8d00001e8e, - 0x1e8f00001e90, - 0x1e9100001e92, - 0x1e9300001e94, - 0x1e9500001e9a, - 0x1e9c00001e9e, - 0x1e9f00001ea0, - 0x1ea100001ea2, - 0x1ea300001ea4, - 0x1ea500001ea6, - 0x1ea700001ea8, - 0x1ea900001eaa, - 0x1eab00001eac, - 0x1ead00001eae, - 0x1eaf00001eb0, - 0x1eb100001eb2, - 0x1eb300001eb4, - 0x1eb500001eb6, - 0x1eb700001eb8, - 0x1eb900001eba, - 0x1ebb00001ebc, - 0x1ebd00001ebe, - 0x1ebf00001ec0, - 0x1ec100001ec2, - 0x1ec300001ec4, - 0x1ec500001ec6, - 0x1ec700001ec8, - 0x1ec900001eca, - 0x1ecb00001ecc, - 0x1ecd00001ece, - 0x1ecf00001ed0, - 0x1ed100001ed2, - 0x1ed300001ed4, - 0x1ed500001ed6, - 0x1ed700001ed8, - 0x1ed900001eda, - 0x1edb00001edc, - 0x1edd00001ede, - 0x1edf00001ee0, - 0x1ee100001ee2, - 0x1ee300001ee4, - 0x1ee500001ee6, - 0x1ee700001ee8, - 0x1ee900001eea, - 0x1eeb00001eec, - 0x1eed00001eee, - 0x1eef00001ef0, - 0x1ef100001ef2, - 0x1ef300001ef4, - 0x1ef500001ef6, - 0x1ef700001ef8, - 0x1ef900001efa, - 0x1efb00001efc, - 0x1efd00001efe, - 0x1eff00001f08, - 0x1f1000001f16, - 0x1f2000001f28, - 0x1f3000001f38, - 0x1f4000001f46, - 0x1f5000001f58, - 0x1f6000001f68, - 0x1f7000001f71, - 0x1f7200001f73, - 0x1f7400001f75, - 0x1f7600001f77, - 0x1f7800001f79, - 0x1f7a00001f7b, - 0x1f7c00001f7d, - 0x1fb000001fb2, - 0x1fb600001fb7, - 0x1fc600001fc7, - 0x1fd000001fd3, - 0x1fd600001fd8, - 0x1fe000001fe3, - 0x1fe400001fe8, - 0x1ff600001ff7, - 0x214e0000214f, - 0x218400002185, - 0x2c3000002c5f, - 0x2c6100002c62, - 0x2c6500002c67, - 0x2c6800002c69, - 0x2c6a00002c6b, - 0x2c6c00002c6d, - 0x2c7100002c72, - 0x2c7300002c75, - 0x2c7600002c7c, - 0x2c8100002c82, - 0x2c8300002c84, - 0x2c8500002c86, - 0x2c8700002c88, - 0x2c8900002c8a, - 0x2c8b00002c8c, - 0x2c8d00002c8e, - 0x2c8f00002c90, - 0x2c9100002c92, - 0x2c9300002c94, - 0x2c9500002c96, - 0x2c9700002c98, - 0x2c9900002c9a, - 0x2c9b00002c9c, - 0x2c9d00002c9e, - 0x2c9f00002ca0, - 0x2ca100002ca2, - 0x2ca300002ca4, - 0x2ca500002ca6, - 0x2ca700002ca8, - 0x2ca900002caa, - 0x2cab00002cac, - 0x2cad00002cae, - 0x2caf00002cb0, - 0x2cb100002cb2, - 0x2cb300002cb4, - 0x2cb500002cb6, - 0x2cb700002cb8, - 0x2cb900002cba, - 0x2cbb00002cbc, - 0x2cbd00002cbe, - 0x2cbf00002cc0, - 0x2cc100002cc2, - 0x2cc300002cc4, - 0x2cc500002cc6, - 0x2cc700002cc8, - 0x2cc900002cca, - 0x2ccb00002ccc, - 0x2ccd00002cce, - 0x2ccf00002cd0, - 0x2cd100002cd2, - 0x2cd300002cd4, - 0x2cd500002cd6, - 0x2cd700002cd8, - 0x2cd900002cda, - 0x2cdb00002cdc, - 0x2cdd00002cde, - 0x2cdf00002ce0, - 0x2ce100002ce2, - 0x2ce300002ce5, - 0x2cec00002ced, - 0x2cee00002cf2, - 0x2cf300002cf4, - 0x2d0000002d26, - 0x2d2700002d28, - 0x2d2d00002d2e, - 0x2d3000002d68, - 0x2d7f00002d97, - 0x2da000002da7, - 0x2da800002daf, - 0x2db000002db7, - 0x2db800002dbf, - 0x2dc000002dc7, - 0x2dc800002dcf, - 0x2dd000002dd7, - 0x2dd800002ddf, - 0x2de000002e00, - 0x2e2f00002e30, - 0x300500003008, - 0x302a0000302e, - 0x303c0000303d, - 0x304100003097, - 0x30990000309b, - 0x309d0000309f, - 0x30a1000030fb, - 0x30fc000030ff, - 0x310500003130, - 0x31a0000031bb, - 0x31f000003200, - 0x340000004db6, - 0x4e0000009ff0, - 0xa0000000a48d, - 0xa4d00000a4fe, - 0xa5000000a60d, - 0xa6100000a62c, - 0xa6410000a642, - 0xa6430000a644, - 0xa6450000a646, - 0xa6470000a648, - 0xa6490000a64a, - 0xa64b0000a64c, - 0xa64d0000a64e, - 0xa64f0000a650, - 0xa6510000a652, - 0xa6530000a654, - 0xa6550000a656, - 0xa6570000a658, - 0xa6590000a65a, - 0xa65b0000a65c, - 0xa65d0000a65e, - 0xa65f0000a660, - 0xa6610000a662, - 0xa6630000a664, - 0xa6650000a666, - 0xa6670000a668, - 0xa6690000a66a, - 0xa66b0000a66c, - 0xa66d0000a670, - 0xa6740000a67e, - 0xa67f0000a680, - 0xa6810000a682, - 0xa6830000a684, - 0xa6850000a686, - 0xa6870000a688, - 0xa6890000a68a, - 0xa68b0000a68c, - 0xa68d0000a68e, - 0xa68f0000a690, - 0xa6910000a692, - 0xa6930000a694, - 0xa6950000a696, - 0xa6970000a698, - 0xa6990000a69a, - 0xa69b0000a69c, - 0xa69e0000a6e6, - 0xa6f00000a6f2, - 0xa7170000a720, - 0xa7230000a724, - 0xa7250000a726, - 0xa7270000a728, - 0xa7290000a72a, - 0xa72b0000a72c, - 0xa72d0000a72e, - 0xa72f0000a732, - 0xa7330000a734, - 0xa7350000a736, - 0xa7370000a738, - 0xa7390000a73a, - 0xa73b0000a73c, - 0xa73d0000a73e, - 0xa73f0000a740, - 0xa7410000a742, - 0xa7430000a744, - 0xa7450000a746, - 0xa7470000a748, - 0xa7490000a74a, - 0xa74b0000a74c, - 0xa74d0000a74e, - 0xa74f0000a750, - 0xa7510000a752, - 0xa7530000a754, - 0xa7550000a756, - 0xa7570000a758, - 0xa7590000a75a, - 0xa75b0000a75c, - 0xa75d0000a75e, - 0xa75f0000a760, - 0xa7610000a762, - 0xa7630000a764, - 0xa7650000a766, - 0xa7670000a768, - 0xa7690000a76a, - 0xa76b0000a76c, - 0xa76d0000a76e, - 0xa76f0000a770, - 0xa7710000a779, - 0xa77a0000a77b, - 0xa77c0000a77d, - 0xa77f0000a780, - 0xa7810000a782, - 0xa7830000a784, - 0xa7850000a786, - 0xa7870000a789, - 0xa78c0000a78d, - 0xa78e0000a790, - 0xa7910000a792, - 0xa7930000a796, - 0xa7970000a798, - 0xa7990000a79a, - 0xa79b0000a79c, - 0xa79d0000a79e, - 0xa79f0000a7a0, - 0xa7a10000a7a2, - 0xa7a30000a7a4, - 0xa7a50000a7a6, - 0xa7a70000a7a8, - 0xa7a90000a7aa, - 0xa7af0000a7b0, - 0xa7b50000a7b6, - 0xa7b70000a7b8, - 0xa7b90000a7ba, - 0xa7f70000a7f8, - 0xa7fa0000a828, - 0xa8400000a874, - 0xa8800000a8c6, - 0xa8d00000a8da, - 0xa8e00000a8f8, - 0xa8fb0000a8fc, - 0xa8fd0000a92e, - 0xa9300000a954, - 0xa9800000a9c1, - 0xa9cf0000a9da, - 0xa9e00000a9ff, - 0xaa000000aa37, - 0xaa400000aa4e, - 0xaa500000aa5a, - 0xaa600000aa77, - 0xaa7a0000aac3, - 0xaadb0000aade, - 0xaae00000aaf0, - 0xaaf20000aaf7, - 0xab010000ab07, - 0xab090000ab0f, - 0xab110000ab17, - 0xab200000ab27, - 0xab280000ab2f, - 0xab300000ab5b, - 0xab600000ab66, - 0xabc00000abeb, - 0xabec0000abee, - 0xabf00000abfa, - 0xac000000d7a4, - 0xfa0e0000fa10, - 0xfa110000fa12, - 0xfa130000fa15, - 0xfa1f0000fa20, - 0xfa210000fa22, - 0xfa230000fa25, - 0xfa270000fa2a, - 0xfb1e0000fb1f, - 0xfe200000fe30, - 0xfe730000fe74, - 0x100000001000c, - 0x1000d00010027, - 0x100280001003b, - 0x1003c0001003e, - 0x1003f0001004e, - 0x100500001005e, - 0x10080000100fb, - 0x101fd000101fe, - 0x102800001029d, - 0x102a0000102d1, - 0x102e0000102e1, - 0x1030000010320, - 0x1032d00010341, - 0x103420001034a, - 0x103500001037b, - 0x103800001039e, - 0x103a0000103c4, - 0x103c8000103d0, - 0x104280001049e, - 0x104a0000104aa, - 0x104d8000104fc, - 0x1050000010528, - 0x1053000010564, - 0x1060000010737, - 0x1074000010756, - 0x1076000010768, - 0x1080000010806, - 0x1080800010809, - 0x1080a00010836, - 0x1083700010839, - 0x1083c0001083d, - 0x1083f00010856, - 0x1086000010877, - 0x108800001089f, - 0x108e0000108f3, - 0x108f4000108f6, - 0x1090000010916, - 0x109200001093a, - 0x10980000109b8, - 0x109be000109c0, - 0x10a0000010a04, - 0x10a0500010a07, - 0x10a0c00010a14, - 0x10a1500010a18, - 0x10a1900010a36, - 0x10a3800010a3b, - 0x10a3f00010a40, - 0x10a6000010a7d, - 0x10a8000010a9d, - 0x10ac000010ac8, - 0x10ac900010ae7, - 0x10b0000010b36, - 0x10b4000010b56, - 0x10b6000010b73, - 0x10b8000010b92, - 0x10c0000010c49, - 0x10cc000010cf3, - 0x10d0000010d28, - 0x10d3000010d3a, - 0x10f0000010f1d, - 0x10f2700010f28, - 0x10f3000010f51, - 0x1100000011047, - 0x1106600011070, - 0x1107f000110bb, - 0x110d0000110e9, - 0x110f0000110fa, - 0x1110000011135, - 0x1113600011140, - 0x1114400011147, - 0x1115000011174, - 0x1117600011177, - 0x11180000111c5, - 0x111c9000111cd, - 0x111d0000111db, - 0x111dc000111dd, - 0x1120000011212, - 0x1121300011238, - 0x1123e0001123f, - 0x1128000011287, - 0x1128800011289, - 0x1128a0001128e, - 0x1128f0001129e, - 0x1129f000112a9, - 0x112b0000112eb, - 0x112f0000112fa, - 0x1130000011304, - 0x113050001130d, - 0x1130f00011311, - 0x1131300011329, - 0x1132a00011331, - 0x1133200011334, - 0x113350001133a, - 0x1133b00011345, - 0x1134700011349, - 0x1134b0001134e, - 0x1135000011351, - 0x1135700011358, - 0x1135d00011364, - 0x113660001136d, - 0x1137000011375, - 0x114000001144b, - 0x114500001145a, - 0x1145e0001145f, - 0x11480000114c6, - 0x114c7000114c8, - 0x114d0000114da, - 0x11580000115b6, - 0x115b8000115c1, - 0x115d8000115de, - 0x1160000011641, - 0x1164400011645, - 0x116500001165a, - 0x11680000116b8, - 0x116c0000116ca, - 0x117000001171b, - 0x1171d0001172c, - 0x117300001173a, - 0x118000001183b, - 0x118c0000118ea, - 0x118ff00011900, - 0x11a0000011a3f, - 0x11a4700011a48, - 0x11a5000011a84, - 0x11a8600011a9a, - 0x11a9d00011a9e, - 0x11ac000011af9, - 0x11c0000011c09, - 0x11c0a00011c37, - 0x11c3800011c41, - 0x11c5000011c5a, - 0x11c7200011c90, - 0x11c9200011ca8, - 0x11ca900011cb7, - 0x11d0000011d07, - 0x11d0800011d0a, - 0x11d0b00011d37, - 0x11d3a00011d3b, - 0x11d3c00011d3e, - 0x11d3f00011d48, - 0x11d5000011d5a, - 0x11d6000011d66, - 0x11d6700011d69, - 0x11d6a00011d8f, - 0x11d9000011d92, - 0x11d9300011d99, - 0x11da000011daa, - 0x11ee000011ef7, - 0x120000001239a, - 0x1248000012544, - 0x130000001342f, - 0x1440000014647, - 0x1680000016a39, - 0x16a4000016a5f, - 0x16a6000016a6a, - 0x16ad000016aee, - 0x16af000016af5, - 0x16b0000016b37, - 0x16b4000016b44, - 0x16b5000016b5a, - 0x16b6300016b78, - 0x16b7d00016b90, - 0x16e6000016e80, - 0x16f0000016f45, - 0x16f5000016f7f, - 0x16f8f00016fa0, - 0x16fe000016fe2, - 0x17000000187f2, - 0x1880000018af3, - 0x1b0000001b11f, - 0x1b1700001b2fc, - 0x1bc000001bc6b, - 0x1bc700001bc7d, - 0x1bc800001bc89, - 0x1bc900001bc9a, - 0x1bc9d0001bc9f, - 0x1da000001da37, - 0x1da3b0001da6d, - 0x1da750001da76, - 0x1da840001da85, - 0x1da9b0001daa0, - 0x1daa10001dab0, - 0x1e0000001e007, - 0x1e0080001e019, - 0x1e01b0001e022, - 0x1e0230001e025, - 0x1e0260001e02b, - 0x1e8000001e8c5, - 0x1e8d00001e8d7, - 0x1e9220001e94b, - 0x1e9500001e95a, - 0x200000002a6d7, - 0x2a7000002b735, - 0x2b7400002b81e, - 0x2b8200002cea2, - 0x2ceb00002ebe1, - ), - 'CONTEXTJ': ( - 0x200c0000200e, - ), - 'CONTEXTO': ( - 0xb7000000b8, - 0x37500000376, - 0x5f3000005f5, - 0x6600000066a, - 0x6f0000006fa, - 0x30fb000030fc, - ), -} diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/idna/idnadata.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/idna/idnadata.pyc deleted file mode 100644 index 6e248c422e8bf37824364765868e366152e04b63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35078 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 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/idna/intranges.py b/venv/lib/python2.7/site-packages/pip/_vendor/idna/intranges.py deleted file mode 100644 index fa8a735..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/idna/intranges.py +++ /dev/null @@ -1,53 +0,0 @@ -""" -Given a list of integers, made up of (hopefully) a small number of long runs -of consecutive integers, compute a representation of the form -((start1, end1), (start2, end2) ...). Then answer the question "was x present -in the original list?" in time O(log(# runs)). -""" - -import bisect - -def intranges_from_list(list_): - """Represent a list of integers as a sequence of ranges: - ((start_0, end_0), (start_1, end_1), ...), such that the original - integers are exactly those x such that start_i <= x < end_i for some i. - - Ranges are encoded as single integers (start << 32 | end), not as tuples. - """ - - sorted_list = sorted(list_) - ranges = [] - last_write = -1 - for i in range(len(sorted_list)): - if i+1 < len(sorted_list): - if sorted_list[i] == sorted_list[i+1]-1: - continue - current_range = sorted_list[last_write+1:i+1] - ranges.append(_encode_range(current_range[0], current_range[-1] + 1)) - last_write = i - - return tuple(ranges) - -def _encode_range(start, end): - return (start << 32) | end - -def _decode_range(r): - return (r >> 32), (r & ((1 << 32) - 1)) - - -def intranges_contain(int_, ranges): - """Determine if `int_` falls into one of the ranges in `ranges`.""" - tuple_ = _encode_range(int_, 0) - pos = bisect.bisect_left(ranges, tuple_) - # we could be immediately ahead of a tuple (start, end) - # with start < int_ <= end - if pos > 0: - left, right = _decode_range(ranges[pos-1]) - if left <= int_ < right: - return True - # or we could be immediately behind a tuple (int_, end) - if pos < len(ranges): - left, _ = _decode_range(ranges[pos]) - if left == int_: - return True - return False diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/idna/intranges.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/idna/intranges.pyc deleted file mode 100644 index 0a550deffdc87445feaeb8269c5db56165f0735d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2452 zcmc&#>uwx16t-tKNwcI}f_e!>!UPHJLb{uzD1s`z2r5v2(4yT)NEKx=nelF%%z7ra zCzmQgLgfi~2Y&DbJQxoE-#N3JEfW7TyY?L0$KRZrKR5oq-ump<w_m1W@<ez)M)UX4 zWkS3_FGUuKT#6SE8saxhMj~sn&=A=i3r&&DvoJ@>gZ2VpEJ`6--<e}=Ribj^gDQr~ z*q}$+`8738GOenTCfoZ(sfSgbpLL+>$4Q<mTaEX$qt(2yBjqaVTNtE;^*XHrVBf$> zi*Z>6jm=J%PJ3-b5=>!fd)U`%Sh#Vk-S#1IVPj2cn{9N~R6XA0@n%PLyWLJ#?d+4i z)}P?xwDqXco}pGx60c6x1iob~FBi^?j7@TO@X;!4Qo)S1dfv{9QTr3NyVL2m%s+UZ zr3i_bpR{i%NPnRVLYxcnT8axPMnYU5zK|Q@^mh@Y2$49Kw2J?em%oUMrZ`8uBXR3; z<xmKhlNJ_M>KCoApu2q-(c01H;wTpuAA%CnhSdqk#}{+rJQ4>D5de(*H2{H^6tw-; z>xjN9p$vn7@?&6i%njO2a^MbJ>Q96IKZ#a|8gi-;N1JL&h)e89`}-}0XOfe6os$r+ zUuGq)(-c#lC^2iwSLr@No`nCzol&Mmr4px=K26e)pFyke8VQ^2<MhWyZ9l;DHdO%z zC=KNcWXyD14Ay7!YABl)na;=sZ|o?amE5Fu)b_Tzx2etv3ntnkkZ!2TT>EZq8s*(k z+6|g$Q}P3KzHmWjh$eDJUknXMISQ8+ld=S2xDGK!*kD9lE0H?G*FZF+lNE=zAk~mD zO)yFw=+Gji1WG5)1dWP<EexGj&f$YKbQ{xxJ3ofhE1fw`g6<tBt~V_53}?3Y>a=%u z&+XZh!;P&YyT0YV*h;_jr(b2S+&Z37+1u%rro3w`LY?P#!^Zcc_y?Ne7J~}1!u3pM zlOA$b+t)46!uw>?bRr(QV$5EU<^Co*acxP?<F_Jj$`9qDydhU*D@uv3rj1Y25+-nz zP`nRO=wA=owED~_^tFF9=9qIWaLi%TRr=niQ}hv<C)<QfDL>R`o}F5TP&@UAUQO|M zNE}PKuU+HvdWs?MdrB2YgW4;C;+(sy^s+AHOwUSr6?RQsCeP{0xODkXGJ5JYC<v4Y z9}buaK~^-=U>=j=uqoVuKqfDl?e+@T=_jawvp`m0H6S+*r6_(Tf&*FFNJNr$HN}89 z5!?qwW>})qKW1=mK+R8}h)|(XZ^bzqwCUvf2k4&YpxxM5@WfE<qM+klHN-*ibX66q zz{2E0s!N}4i``n>?J_@bD*5{4y5M8HXK>>MKH;?(=Xx0W?^28?Vmq$V{ma7sHp#ta z1YRT~`qxO6nTMDu=CUsf&kBT9vyd6>2d<R(N-O0(7(3$v-1i|d_ESvOOc1>zmm5p+ z1Mt8?v<yC2k_)nCLn@&-&WbdS`-IXbI^Z~Ru=;l}oVmu*6>uFTV|!d=RjwcMML;Y! OA1y_THx?U<&3^&OpK3w? diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/idna/package_data.py b/venv/lib/python2.7/site-packages/pip/_vendor/idna/package_data.py deleted file mode 100644 index 257e898..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/idna/package_data.py +++ /dev/null @@ -1,2 +0,0 @@ -__version__ = '2.8' - diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/idna/package_data.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/idna/package_data.pyc deleted file mode 100644 index d7289ea82c96a87ffedc1edf5e656b1ca043b781..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 229 zcmYL@T?)c55QJ0vB8r})2<`eusUYG76hWT^39+dqG^R0$_2<nqdjU5hI56Kb!@_R( z?sW#Q{vjtn1vr;z+d*(b_Q-&2qn7VN#5l>;k>7G%1f@-3tf&>G5k~Td)fhn=(J)s) z!wj5i$#EH;cX&+9QQfLhdQrpFOw&BG_ZfehA*$4{11)qclyywX*o{^t-T3Njyr_6> gKybxCv%F$uK{<0Q(GS<gqw{mkud-P9CoP(M0EBTk`Tzg` diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/idna/uts46data.py b/venv/lib/python2.7/site-packages/pip/_vendor/idna/uts46data.py deleted file mode 100644 index a68ed4c..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/idna/uts46data.py +++ /dev/null @@ -1,8205 +0,0 @@ -# This file is automatically generated by tools/idna-data -# vim: set fileencoding=utf-8 : - -"""IDNA Mapping Table from UTS46.""" - - -__version__ = "11.0.0" -def _seg_0(): - return [ - (0x0, '3'), - (0x1, '3'), - (0x2, '3'), - (0x3, '3'), - (0x4, '3'), - (0x5, '3'), - (0x6, '3'), - (0x7, '3'), - (0x8, '3'), - (0x9, '3'), - (0xA, '3'), - (0xB, '3'), - (0xC, '3'), - (0xD, '3'), - (0xE, '3'), - (0xF, '3'), - (0x10, '3'), - (0x11, '3'), - (0x12, '3'), - (0x13, '3'), - (0x14, '3'), - (0x15, '3'), - (0x16, '3'), - (0x17, '3'), - (0x18, '3'), - (0x19, '3'), - (0x1A, '3'), - (0x1B, '3'), - (0x1C, '3'), - (0x1D, '3'), - (0x1E, '3'), - (0x1F, '3'), - (0x20, '3'), - (0x21, '3'), - (0x22, '3'), - (0x23, '3'), - (0x24, '3'), - (0x25, '3'), - (0x26, '3'), - (0x27, '3'), - (0x28, '3'), - (0x29, '3'), - (0x2A, '3'), - (0x2B, '3'), - (0x2C, '3'), - (0x2D, 'V'), - (0x2E, 'V'), - (0x2F, '3'), - (0x30, 'V'), - (0x31, 'V'), - (0x32, 'V'), - (0x33, 'V'), - (0x34, 'V'), - (0x35, 'V'), - (0x36, 'V'), - (0x37, 'V'), - (0x38, 'V'), - (0x39, 'V'), - (0x3A, '3'), - (0x3B, '3'), - (0x3C, '3'), - (0x3D, '3'), - (0x3E, '3'), - (0x3F, '3'), - (0x40, '3'), - (0x41, 'M', u'a'), - (0x42, 'M', u'b'), - (0x43, 'M', u'c'), - (0x44, 'M', u'd'), - (0x45, 'M', u'e'), - (0x46, 'M', u'f'), - (0x47, 'M', u'g'), - (0x48, 'M', u'h'), - (0x49, 'M', u'i'), - (0x4A, 'M', u'j'), - (0x4B, 'M', u'k'), - (0x4C, 'M', u'l'), - (0x4D, 'M', u'm'), - (0x4E, 'M', u'n'), - (0x4F, 'M', u'o'), - (0x50, 'M', u'p'), - (0x51, 'M', u'q'), - (0x52, 'M', u'r'), - (0x53, 'M', u's'), - (0x54, 'M', u't'), - (0x55, 'M', u'u'), - (0x56, 'M', u'v'), - (0x57, 'M', u'w'), - (0x58, 'M', u'x'), - (0x59, 'M', u'y'), - (0x5A, 'M', u'z'), - (0x5B, '3'), - (0x5C, '3'), - (0x5D, '3'), - (0x5E, '3'), - (0x5F, '3'), - (0x60, '3'), - (0x61, 'V'), - (0x62, 'V'), - (0x63, 'V'), - ] - -def _seg_1(): - return [ - (0x64, 'V'), - (0x65, 'V'), - (0x66, 'V'), - (0x67, 'V'), - (0x68, 'V'), - (0x69, 'V'), - (0x6A, 'V'), - (0x6B, 'V'), - (0x6C, 'V'), - (0x6D, 'V'), - (0x6E, 'V'), - (0x6F, 'V'), - (0x70, 'V'), - (0x71, 'V'), - (0x72, 'V'), - (0x73, 'V'), - (0x74, 'V'), - (0x75, 'V'), - (0x76, 'V'), - (0x77, 'V'), - (0x78, 'V'), - (0x79, 'V'), - (0x7A, 'V'), - (0x7B, '3'), - (0x7C, '3'), - (0x7D, '3'), - (0x7E, '3'), - (0x7F, '3'), - (0x80, 'X'), - (0x81, 'X'), - (0x82, 'X'), - (0x83, 'X'), - (0x84, 'X'), - (0x85, 'X'), - (0x86, 'X'), - (0x87, 'X'), - (0x88, 'X'), - (0x89, 'X'), - (0x8A, 'X'), - (0x8B, 'X'), - (0x8C, 'X'), - (0x8D, 'X'), - (0x8E, 'X'), - (0x8F, 'X'), - (0x90, 'X'), - (0x91, 'X'), - (0x92, 'X'), - (0x93, 'X'), - (0x94, 'X'), - (0x95, 'X'), - (0x96, 'X'), - (0x97, 'X'), - (0x98, 'X'), - (0x99, 'X'), - (0x9A, 'X'), - (0x9B, 'X'), - (0x9C, 'X'), - (0x9D, 'X'), - (0x9E, 'X'), - (0x9F, 'X'), - (0xA0, '3', u' '), - (0xA1, 'V'), - (0xA2, 'V'), - (0xA3, 'V'), - (0xA4, 'V'), - (0xA5, 'V'), - (0xA6, 'V'), - (0xA7, 'V'), - (0xA8, '3', u' ̈'), - (0xA9, 'V'), - (0xAA, 'M', u'a'), - (0xAB, 'V'), - (0xAC, 'V'), - (0xAD, 'I'), - (0xAE, 'V'), - (0xAF, '3', u' ̄'), - (0xB0, 'V'), - (0xB1, 'V'), - (0xB2, 'M', u'2'), - (0xB3, 'M', u'3'), - (0xB4, '3', u' ́'), - (0xB5, 'M', u'μ'), - (0xB6, 'V'), - (0xB7, 'V'), - (0xB8, '3', u' ̧'), - (0xB9, 'M', u'1'), - (0xBA, 'M', u'o'), - (0xBB, 'V'), - (0xBC, 'M', u'1⁄4'), - (0xBD, 'M', u'1⁄2'), - (0xBE, 'M', u'3⁄4'), - (0xBF, 'V'), - (0xC0, 'M', u'à'), - (0xC1, 'M', u'á'), - (0xC2, 'M', u'â'), - (0xC3, 'M', u'ã'), - (0xC4, 'M', u'ä'), - (0xC5, 'M', u'å'), - (0xC6, 'M', u'æ'), - (0xC7, 'M', u'ç'), - ] - -def _seg_2(): - return [ - (0xC8, 'M', u'è'), - (0xC9, 'M', u'é'), - (0xCA, 'M', u'ê'), - (0xCB, 'M', u'ë'), - (0xCC, 'M', u'ì'), - (0xCD, 'M', u'í'), - (0xCE, 'M', u'î'), - (0xCF, 'M', u'ï'), - (0xD0, 'M', u'ð'), - (0xD1, 'M', u'ñ'), - (0xD2, 'M', u'ò'), - (0xD3, 'M', u'ó'), - (0xD4, 'M', u'ô'), - (0xD5, 'M', u'õ'), - (0xD6, 'M', u'ö'), - (0xD7, 'V'), - (0xD8, 'M', u'ø'), - (0xD9, 'M', u'ù'), - (0xDA, 'M', u'ú'), - (0xDB, 'M', u'û'), - (0xDC, 'M', u'ü'), - (0xDD, 'M', u'ý'), - (0xDE, 'M', u'þ'), - (0xDF, 'D', u'ss'), - (0xE0, 'V'), - (0xE1, 'V'), - (0xE2, 'V'), - (0xE3, 'V'), - (0xE4, 'V'), - (0xE5, 'V'), - (0xE6, 'V'), - (0xE7, 'V'), - (0xE8, 'V'), - (0xE9, 'V'), - (0xEA, 'V'), - (0xEB, 'V'), - (0xEC, 'V'), - (0xED, 'V'), - (0xEE, 'V'), - (0xEF, 'V'), - (0xF0, 'V'), - (0xF1, 'V'), - (0xF2, 'V'), - (0xF3, 'V'), - (0xF4, 'V'), - (0xF5, 'V'), - (0xF6, 'V'), - (0xF7, 'V'), - (0xF8, 'V'), - (0xF9, 'V'), - (0xFA, 'V'), - (0xFB, 'V'), - (0xFC, 'V'), - (0xFD, 'V'), - (0xFE, 'V'), - (0xFF, 'V'), - (0x100, 'M', u'ā'), - (0x101, 'V'), - (0x102, 'M', u'ă'), - (0x103, 'V'), - (0x104, 'M', u'ą'), - (0x105, 'V'), - (0x106, 'M', u'ć'), - (0x107, 'V'), - (0x108, 'M', u'ĉ'), - (0x109, 'V'), - (0x10A, 'M', u'ċ'), - (0x10B, 'V'), - (0x10C, 'M', u'č'), - (0x10D, 'V'), - (0x10E, 'M', u'ď'), - (0x10F, 'V'), - (0x110, 'M', u'đ'), - (0x111, 'V'), - (0x112, 'M', u'ē'), - (0x113, 'V'), - (0x114, 'M', u'ĕ'), - (0x115, 'V'), - (0x116, 'M', u'ė'), - (0x117, 'V'), - (0x118, 'M', u'ę'), - (0x119, 'V'), - (0x11A, 'M', u'ě'), - (0x11B, 'V'), - (0x11C, 'M', u'ĝ'), - (0x11D, 'V'), - (0x11E, 'M', u'ğ'), - (0x11F, 'V'), - (0x120, 'M', u'ġ'), - (0x121, 'V'), - (0x122, 'M', u'ģ'), - (0x123, 'V'), - (0x124, 'M', u'ĥ'), - (0x125, 'V'), - (0x126, 'M', u'ħ'), - (0x127, 'V'), - (0x128, 'M', u'ĩ'), - (0x129, 'V'), - (0x12A, 'M', u'ī'), - (0x12B, 'V'), - ] - -def _seg_3(): - return [ - (0x12C, 'M', u'ĭ'), - (0x12D, 'V'), - (0x12E, 'M', u'į'), - (0x12F, 'V'), - (0x130, 'M', u'i̇'), - (0x131, 'V'), - (0x132, 'M', u'ij'), - (0x134, 'M', u'ĵ'), - (0x135, 'V'), - (0x136, 'M', u'ķ'), - (0x137, 'V'), - (0x139, 'M', u'ĺ'), - (0x13A, 'V'), - (0x13B, 'M', u'ļ'), - (0x13C, 'V'), - (0x13D, 'M', u'ľ'), - (0x13E, 'V'), - (0x13F, 'M', u'l·'), - (0x141, 'M', u'ł'), - (0x142, 'V'), - (0x143, 'M', u'ń'), - (0x144, 'V'), - (0x145, 'M', u'ņ'), - (0x146, 'V'), - (0x147, 'M', u'ň'), - (0x148, 'V'), - (0x149, 'M', u'ʼn'), - (0x14A, 'M', u'ŋ'), - (0x14B, 'V'), - (0x14C, 'M', u'ō'), - (0x14D, 'V'), - (0x14E, 'M', u'ŏ'), - (0x14F, 'V'), - (0x150, 'M', u'ő'), - (0x151, 'V'), - (0x152, 'M', u'œ'), - (0x153, 'V'), - (0x154, 'M', u'ŕ'), - (0x155, 'V'), - (0x156, 'M', u'ŗ'), - (0x157, 'V'), - (0x158, 'M', u'ř'), - (0x159, 'V'), - (0x15A, 'M', u'ś'), - (0x15B, 'V'), - (0x15C, 'M', u'ŝ'), - (0x15D, 'V'), - (0x15E, 'M', u'ş'), - (0x15F, 'V'), - (0x160, 'M', u'š'), - (0x161, 'V'), - (0x162, 'M', u'ţ'), - (0x163, 'V'), - (0x164, 'M', u'ť'), - (0x165, 'V'), - (0x166, 'M', u'ŧ'), - (0x167, 'V'), - (0x168, 'M', u'ũ'), - (0x169, 'V'), - (0x16A, 'M', u'ū'), - (0x16B, 'V'), - (0x16C, 'M', u'ŭ'), - (0x16D, 'V'), - (0x16E, 'M', u'ů'), - (0x16F, 'V'), - (0x170, 'M', u'ű'), - (0x171, 'V'), - (0x172, 'M', u'ų'), - (0x173, 'V'), - (0x174, 'M', u'ŵ'), - (0x175, 'V'), - (0x176, 'M', u'ŷ'), - (0x177, 'V'), - (0x178, 'M', u'ÿ'), - (0x179, 'M', u'ź'), - (0x17A, 'V'), - (0x17B, 'M', u'ż'), - (0x17C, 'V'), - (0x17D, 'M', u'ž'), - (0x17E, 'V'), - (0x17F, 'M', u's'), - (0x180, 'V'), - (0x181, 'M', u'ɓ'), - (0x182, 'M', u'ƃ'), - (0x183, 'V'), - (0x184, 'M', u'ƅ'), - (0x185, 'V'), - (0x186, 'M', u'ɔ'), - (0x187, 'M', u'ƈ'), - (0x188, 'V'), - (0x189, 'M', u'ɖ'), - (0x18A, 'M', u'ɗ'), - (0x18B, 'M', u'ƌ'), - (0x18C, 'V'), - (0x18E, 'M', u'ǝ'), - (0x18F, 'M', u'ə'), - (0x190, 'M', u'ɛ'), - (0x191, 'M', u'ƒ'), - (0x192, 'V'), - (0x193, 'M', u'ɠ'), - ] - -def _seg_4(): - return [ - (0x194, 'M', u'ɣ'), - (0x195, 'V'), - (0x196, 'M', u'ɩ'), - (0x197, 'M', u'ɨ'), - (0x198, 'M', u'ƙ'), - (0x199, 'V'), - (0x19C, 'M', u'ɯ'), - (0x19D, 'M', u'ɲ'), - (0x19E, 'V'), - (0x19F, 'M', u'ɵ'), - (0x1A0, 'M', u'ơ'), - (0x1A1, 'V'), - (0x1A2, 'M', u'ƣ'), - (0x1A3, 'V'), - (0x1A4, 'M', u'ƥ'), - (0x1A5, 'V'), - (0x1A6, 'M', u'ʀ'), - (0x1A7, 'M', u'ƨ'), - (0x1A8, 'V'), - (0x1A9, 'M', u'ʃ'), - (0x1AA, 'V'), - (0x1AC, 'M', u'ƭ'), - (0x1AD, 'V'), - (0x1AE, 'M', u'ʈ'), - (0x1AF, 'M', u'ư'), - (0x1B0, 'V'), - (0x1B1, 'M', u'ʊ'), - (0x1B2, 'M', u'ʋ'), - (0x1B3, 'M', u'ƴ'), - (0x1B4, 'V'), - (0x1B5, 'M', u'ƶ'), - (0x1B6, 'V'), - (0x1B7, 'M', u'ʒ'), - (0x1B8, 'M', u'ƹ'), - (0x1B9, 'V'), - (0x1BC, 'M', u'ƽ'), - (0x1BD, 'V'), - (0x1C4, 'M', u'dž'), - (0x1C7, 'M', u'lj'), - (0x1CA, 'M', u'nj'), - (0x1CD, 'M', u'ǎ'), - (0x1CE, 'V'), - (0x1CF, 'M', u'ǐ'), - (0x1D0, 'V'), - (0x1D1, 'M', u'ǒ'), - (0x1D2, 'V'), - (0x1D3, 'M', u'ǔ'), - (0x1D4, 'V'), - (0x1D5, 'M', u'ǖ'), - (0x1D6, 'V'), - (0x1D7, 'M', u'ǘ'), - (0x1D8, 'V'), - (0x1D9, 'M', u'ǚ'), - (0x1DA, 'V'), - (0x1DB, 'M', u'ǜ'), - (0x1DC, 'V'), - (0x1DE, 'M', u'ǟ'), - (0x1DF, 'V'), - (0x1E0, 'M', u'ǡ'), - (0x1E1, 'V'), - (0x1E2, 'M', u'ǣ'), - (0x1E3, 'V'), - (0x1E4, 'M', u'ǥ'), - (0x1E5, 'V'), - (0x1E6, 'M', u'ǧ'), - (0x1E7, 'V'), - (0x1E8, 'M', u'ǩ'), - (0x1E9, 'V'), - (0x1EA, 'M', u'ǫ'), - (0x1EB, 'V'), - (0x1EC, 'M', u'ǭ'), - (0x1ED, 'V'), - (0x1EE, 'M', u'ǯ'), - (0x1EF, 'V'), - (0x1F1, 'M', u'dz'), - (0x1F4, 'M', u'ǵ'), - (0x1F5, 'V'), - (0x1F6, 'M', u'ƕ'), - (0x1F7, 'M', u'ƿ'), - (0x1F8, 'M', u'ǹ'), - (0x1F9, 'V'), - (0x1FA, 'M', u'ǻ'), - (0x1FB, 'V'), - (0x1FC, 'M', u'ǽ'), - (0x1FD, 'V'), - (0x1FE, 'M', u'ǿ'), - (0x1FF, 'V'), - (0x200, 'M', u'ȁ'), - (0x201, 'V'), - (0x202, 'M', u'ȃ'), - (0x203, 'V'), - (0x204, 'M', u'ȅ'), - (0x205, 'V'), - (0x206, 'M', u'ȇ'), - (0x207, 'V'), - (0x208, 'M', u'ȉ'), - (0x209, 'V'), - (0x20A, 'M', u'ȋ'), - (0x20B, 'V'), - (0x20C, 'M', u'ȍ'), - ] - -def _seg_5(): - return [ - (0x20D, 'V'), - (0x20E, 'M', u'ȏ'), - (0x20F, 'V'), - (0x210, 'M', u'ȑ'), - (0x211, 'V'), - (0x212, 'M', u'ȓ'), - (0x213, 'V'), - (0x214, 'M', u'ȕ'), - (0x215, 'V'), - (0x216, 'M', u'ȗ'), - (0x217, 'V'), - (0x218, 'M', u'ș'), - (0x219, 'V'), - (0x21A, 'M', u'ț'), - (0x21B, 'V'), - (0x21C, 'M', u'ȝ'), - (0x21D, 'V'), - (0x21E, 'M', u'ȟ'), - (0x21F, 'V'), - (0x220, 'M', u'ƞ'), - (0x221, 'V'), - (0x222, 'M', u'ȣ'), - (0x223, 'V'), - (0x224, 'M', u'ȥ'), - (0x225, 'V'), - (0x226, 'M', u'ȧ'), - (0x227, 'V'), - (0x228, 'M', u'ȩ'), - (0x229, 'V'), - (0x22A, 'M', u'ȫ'), - (0x22B, 'V'), - (0x22C, 'M', u'ȭ'), - (0x22D, 'V'), - (0x22E, 'M', u'ȯ'), - (0x22F, 'V'), - (0x230, 'M', u'ȱ'), - (0x231, 'V'), - (0x232, 'M', u'ȳ'), - (0x233, 'V'), - (0x23A, 'M', u'ⱥ'), - (0x23B, 'M', u'ȼ'), - (0x23C, 'V'), - (0x23D, 'M', u'ƚ'), - (0x23E, 'M', u'ⱦ'), - (0x23F, 'V'), - (0x241, 'M', u'ɂ'), - (0x242, 'V'), - (0x243, 'M', u'ƀ'), - (0x244, 'M', u'ʉ'), - (0x245, 'M', u'ʌ'), - (0x246, 'M', u'ɇ'), - (0x247, 'V'), - (0x248, 'M', u'ɉ'), - (0x249, 'V'), - (0x24A, 'M', u'ɋ'), - (0x24B, 'V'), - (0x24C, 'M', u'ɍ'), - (0x24D, 'V'), - (0x24E, 'M', u'ɏ'), - (0x24F, 'V'), - (0x2B0, 'M', u'h'), - (0x2B1, 'M', u'ɦ'), - (0x2B2, 'M', u'j'), - (0x2B3, 'M', u'r'), - (0x2B4, 'M', u'ɹ'), - (0x2B5, 'M', u'ɻ'), - (0x2B6, 'M', u'ʁ'), - (0x2B7, 'M', u'w'), - (0x2B8, 'M', u'y'), - (0x2B9, 'V'), - (0x2D8, '3', u' ̆'), - (0x2D9, '3', u' ̇'), - (0x2DA, '3', u' ̊'), - (0x2DB, '3', u' ̨'), - (0x2DC, '3', u' ̃'), - (0x2DD, '3', u' ̋'), - (0x2DE, 'V'), - (0x2E0, 'M', u'ɣ'), - (0x2E1, 'M', u'l'), - (0x2E2, 'M', u's'), - (0x2E3, 'M', u'x'), - (0x2E4, 'M', u'ʕ'), - (0x2E5, 'V'), - (0x340, 'M', u'̀'), - (0x341, 'M', u'́'), - (0x342, 'V'), - (0x343, 'M', u'̓'), - (0x344, 'M', u'̈́'), - (0x345, 'M', u'ι'), - (0x346, 'V'), - (0x34F, 'I'), - (0x350, 'V'), - (0x370, 'M', u'ͱ'), - (0x371, 'V'), - (0x372, 'M', u'ͳ'), - (0x373, 'V'), - (0x374, 'M', u'ʹ'), - (0x375, 'V'), - (0x376, 'M', u'ͷ'), - (0x377, 'V'), - ] - -def _seg_6(): - return [ - (0x378, 'X'), - (0x37A, '3', u' ι'), - (0x37B, 'V'), - (0x37E, '3', u';'), - (0x37F, 'M', u'ϳ'), - (0x380, 'X'), - (0x384, '3', u' ́'), - (0x385, '3', u' ̈́'), - (0x386, 'M', u'ά'), - (0x387, 'M', u'·'), - (0x388, 'M', u'έ'), - (0x389, 'M', u'ή'), - (0x38A, 'M', u'ί'), - (0x38B, 'X'), - (0x38C, 'M', u'ό'), - (0x38D, 'X'), - (0x38E, 'M', u'ύ'), - (0x38F, 'M', u'ώ'), - (0x390, 'V'), - (0x391, 'M', u'α'), - (0x392, 'M', u'β'), - (0x393, 'M', u'γ'), - (0x394, 'M', u'δ'), - (0x395, 'M', u'ε'), - (0x396, 'M', u'ζ'), - (0x397, 'M', u'η'), - (0x398, 'M', u'θ'), - (0x399, 'M', u'ι'), - (0x39A, 'M', u'κ'), - (0x39B, 'M', u'λ'), - (0x39C, 'M', u'μ'), - (0x39D, 'M', u'ν'), - (0x39E, 'M', u'ξ'), - (0x39F, 'M', u'ο'), - (0x3A0, 'M', u'π'), - (0x3A1, 'M', u'ρ'), - (0x3A2, 'X'), - (0x3A3, 'M', u'σ'), - (0x3A4, 'M', u'τ'), - (0x3A5, 'M', u'υ'), - (0x3A6, 'M', u'φ'), - (0x3A7, 'M', u'χ'), - (0x3A8, 'M', u'ψ'), - (0x3A9, 'M', u'ω'), - (0x3AA, 'M', u'ϊ'), - (0x3AB, 'M', u'ϋ'), - (0x3AC, 'V'), - (0x3C2, 'D', u'σ'), - (0x3C3, 'V'), - (0x3CF, 'M', u'ϗ'), - (0x3D0, 'M', u'β'), - (0x3D1, 'M', u'θ'), - (0x3D2, 'M', u'υ'), - (0x3D3, 'M', u'ύ'), - (0x3D4, 'M', u'ϋ'), - (0x3D5, 'M', u'φ'), - (0x3D6, 'M', u'π'), - (0x3D7, 'V'), - (0x3D8, 'M', u'ϙ'), - (0x3D9, 'V'), - (0x3DA, 'M', u'ϛ'), - (0x3DB, 'V'), - (0x3DC, 'M', u'ϝ'), - (0x3DD, 'V'), - (0x3DE, 'M', u'ϟ'), - (0x3DF, 'V'), - (0x3E0, 'M', u'ϡ'), - (0x3E1, 'V'), - (0x3E2, 'M', u'ϣ'), - (0x3E3, 'V'), - (0x3E4, 'M', u'ϥ'), - (0x3E5, 'V'), - (0x3E6, 'M', u'ϧ'), - (0x3E7, 'V'), - (0x3E8, 'M', u'ϩ'), - (0x3E9, 'V'), - (0x3EA, 'M', u'ϫ'), - (0x3EB, 'V'), - (0x3EC, 'M', u'ϭ'), - (0x3ED, 'V'), - (0x3EE, 'M', u'ϯ'), - (0x3EF, 'V'), - (0x3F0, 'M', u'κ'), - (0x3F1, 'M', u'ρ'), - (0x3F2, 'M', u'σ'), - (0x3F3, 'V'), - (0x3F4, 'M', u'θ'), - (0x3F5, 'M', u'ε'), - (0x3F6, 'V'), - (0x3F7, 'M', u'ϸ'), - (0x3F8, 'V'), - (0x3F9, 'M', u'σ'), - (0x3FA, 'M', u'ϻ'), - (0x3FB, 'V'), - (0x3FD, 'M', u'ͻ'), - (0x3FE, 'M', u'ͼ'), - (0x3FF, 'M', u'ͽ'), - (0x400, 'M', u'ѐ'), - (0x401, 'M', u'ё'), - (0x402, 'M', u'ђ'), - ] - -def _seg_7(): - return [ - (0x403, 'M', u'ѓ'), - (0x404, 'M', u'є'), - (0x405, 'M', u'ѕ'), - (0x406, 'M', u'і'), - (0x407, 'M', u'ї'), - (0x408, 'M', u'ј'), - (0x409, 'M', u'љ'), - (0x40A, 'M', u'њ'), - (0x40B, 'M', u'ћ'), - (0x40C, 'M', u'ќ'), - (0x40D, 'M', u'ѝ'), - (0x40E, 'M', u'ў'), - (0x40F, 'M', u'џ'), - (0x410, 'M', u'а'), - (0x411, 'M', u'б'), - (0x412, 'M', u'в'), - (0x413, 'M', u'г'), - (0x414, 'M', u'д'), - (0x415, 'M', u'е'), - (0x416, 'M', u'ж'), - (0x417, 'M', u'з'), - (0x418, 'M', u'и'), - (0x419, 'M', u'й'), - (0x41A, 'M', u'к'), - (0x41B, 'M', u'л'), - (0x41C, 'M', u'м'), - (0x41D, 'M', u'н'), - (0x41E, 'M', u'о'), - (0x41F, 'M', u'п'), - (0x420, 'M', u'р'), - (0x421, 'M', u'с'), - (0x422, 'M', u'т'), - (0x423, 'M', u'у'), - (0x424, 'M', u'ф'), - (0x425, 'M', u'х'), - (0x426, 'M', u'ц'), - (0x427, 'M', u'ч'), - (0x428, 'M', u'ш'), - (0x429, 'M', u'щ'), - (0x42A, 'M', u'ъ'), - (0x42B, 'M', u'ы'), - (0x42C, 'M', u'ь'), - (0x42D, 'M', u'э'), - (0x42E, 'M', u'ю'), - (0x42F, 'M', u'я'), - (0x430, 'V'), - (0x460, 'M', u'ѡ'), - (0x461, 'V'), - (0x462, 'M', u'ѣ'), - (0x463, 'V'), - (0x464, 'M', u'ѥ'), - (0x465, 'V'), - (0x466, 'M', u'ѧ'), - (0x467, 'V'), - (0x468, 'M', u'ѩ'), - (0x469, 'V'), - (0x46A, 'M', u'ѫ'), - (0x46B, 'V'), - (0x46C, 'M', u'ѭ'), - (0x46D, 'V'), - (0x46E, 'M', u'ѯ'), - (0x46F, 'V'), - (0x470, 'M', u'ѱ'), - (0x471, 'V'), - (0x472, 'M', u'ѳ'), - (0x473, 'V'), - (0x474, 'M', u'ѵ'), - (0x475, 'V'), - (0x476, 'M', u'ѷ'), - (0x477, 'V'), - (0x478, 'M', u'ѹ'), - (0x479, 'V'), - (0x47A, 'M', u'ѻ'), - (0x47B, 'V'), - (0x47C, 'M', u'ѽ'), - (0x47D, 'V'), - (0x47E, 'M', u'ѿ'), - (0x47F, 'V'), - (0x480, 'M', u'ҁ'), - (0x481, 'V'), - (0x48A, 'M', u'ҋ'), - (0x48B, 'V'), - (0x48C, 'M', u'ҍ'), - (0x48D, 'V'), - (0x48E, 'M', u'ҏ'), - (0x48F, 'V'), - (0x490, 'M', u'ґ'), - (0x491, 'V'), - (0x492, 'M', u'ғ'), - (0x493, 'V'), - (0x494, 'M', u'ҕ'), - (0x495, 'V'), - (0x496, 'M', u'җ'), - (0x497, 'V'), - (0x498, 'M', u'ҙ'), - (0x499, 'V'), - (0x49A, 'M', u'қ'), - (0x49B, 'V'), - (0x49C, 'M', u'ҝ'), - (0x49D, 'V'), - ] - -def _seg_8(): - return [ - (0x49E, 'M', u'ҟ'), - (0x49F, 'V'), - (0x4A0, 'M', u'ҡ'), - (0x4A1, 'V'), - (0x4A2, 'M', u'ң'), - (0x4A3, 'V'), - (0x4A4, 'M', u'ҥ'), - (0x4A5, 'V'), - (0x4A6, 'M', u'ҧ'), - (0x4A7, 'V'), - (0x4A8, 'M', u'ҩ'), - (0x4A9, 'V'), - (0x4AA, 'M', u'ҫ'), - (0x4AB, 'V'), - (0x4AC, 'M', u'ҭ'), - (0x4AD, 'V'), - (0x4AE, 'M', u'ү'), - (0x4AF, 'V'), - (0x4B0, 'M', u'ұ'), - (0x4B1, 'V'), - (0x4B2, 'M', u'ҳ'), - (0x4B3, 'V'), - (0x4B4, 'M', u'ҵ'), - (0x4B5, 'V'), - (0x4B6, 'M', u'ҷ'), - (0x4B7, 'V'), - (0x4B8, 'M', u'ҹ'), - (0x4B9, 'V'), - (0x4BA, 'M', u'һ'), - (0x4BB, 'V'), - (0x4BC, 'M', u'ҽ'), - (0x4BD, 'V'), - (0x4BE, 'M', u'ҿ'), - (0x4BF, 'V'), - (0x4C0, 'X'), - (0x4C1, 'M', u'ӂ'), - (0x4C2, 'V'), - (0x4C3, 'M', u'ӄ'), - (0x4C4, 'V'), - (0x4C5, 'M', u'ӆ'), - (0x4C6, 'V'), - (0x4C7, 'M', u'ӈ'), - (0x4C8, 'V'), - (0x4C9, 'M', u'ӊ'), - (0x4CA, 'V'), - (0x4CB, 'M', u'ӌ'), - (0x4CC, 'V'), - (0x4CD, 'M', u'ӎ'), - (0x4CE, 'V'), - (0x4D0, 'M', u'ӑ'), - (0x4D1, 'V'), - (0x4D2, 'M', u'ӓ'), - (0x4D3, 'V'), - (0x4D4, 'M', u'ӕ'), - (0x4D5, 'V'), - (0x4D6, 'M', u'ӗ'), - (0x4D7, 'V'), - (0x4D8, 'M', u'ә'), - (0x4D9, 'V'), - (0x4DA, 'M', u'ӛ'), - (0x4DB, 'V'), - (0x4DC, 'M', u'ӝ'), - (0x4DD, 'V'), - (0x4DE, 'M', u'ӟ'), - (0x4DF, 'V'), - (0x4E0, 'M', u'ӡ'), - (0x4E1, 'V'), - (0x4E2, 'M', u'ӣ'), - (0x4E3, 'V'), - (0x4E4, 'M', u'ӥ'), - (0x4E5, 'V'), - (0x4E6, 'M', u'ӧ'), - (0x4E7, 'V'), - (0x4E8, 'M', u'ө'), - (0x4E9, 'V'), - (0x4EA, 'M', u'ӫ'), - (0x4EB, 'V'), - (0x4EC, 'M', u'ӭ'), - (0x4ED, 'V'), - (0x4EE, 'M', u'ӯ'), - (0x4EF, 'V'), - (0x4F0, 'M', u'ӱ'), - (0x4F1, 'V'), - (0x4F2, 'M', u'ӳ'), - (0x4F3, 'V'), - (0x4F4, 'M', u'ӵ'), - (0x4F5, 'V'), - (0x4F6, 'M', u'ӷ'), - (0x4F7, 'V'), - (0x4F8, 'M', u'ӹ'), - (0x4F9, 'V'), - (0x4FA, 'M', u'ӻ'), - (0x4FB, 'V'), - (0x4FC, 'M', u'ӽ'), - (0x4FD, 'V'), - (0x4FE, 'M', u'ӿ'), - (0x4FF, 'V'), - (0x500, 'M', u'ԁ'), - (0x501, 'V'), - (0x502, 'M', u'ԃ'), - ] - -def _seg_9(): - return [ - (0x503, 'V'), - (0x504, 'M', u'ԅ'), - (0x505, 'V'), - (0x506, 'M', u'ԇ'), - (0x507, 'V'), - (0x508, 'M', u'ԉ'), - (0x509, 'V'), - (0x50A, 'M', u'ԋ'), - (0x50B, 'V'), - (0x50C, 'M', u'ԍ'), - (0x50D, 'V'), - (0x50E, 'M', u'ԏ'), - (0x50F, 'V'), - (0x510, 'M', u'ԑ'), - (0x511, 'V'), - (0x512, 'M', u'ԓ'), - (0x513, 'V'), - (0x514, 'M', u'ԕ'), - (0x515, 'V'), - (0x516, 'M', u'ԗ'), - (0x517, 'V'), - (0x518, 'M', u'ԙ'), - (0x519, 'V'), - (0x51A, 'M', u'ԛ'), - (0x51B, 'V'), - (0x51C, 'M', u'ԝ'), - (0x51D, 'V'), - (0x51E, 'M', u'ԟ'), - (0x51F, 'V'), - (0x520, 'M', u'ԡ'), - (0x521, 'V'), - (0x522, 'M', u'ԣ'), - (0x523, 'V'), - (0x524, 'M', u'ԥ'), - (0x525, 'V'), - (0x526, 'M', u'ԧ'), - (0x527, 'V'), - (0x528, 'M', u'ԩ'), - (0x529, 'V'), - (0x52A, 'M', u'ԫ'), - (0x52B, 'V'), - (0x52C, 'M', u'ԭ'), - (0x52D, 'V'), - (0x52E, 'M', u'ԯ'), - (0x52F, 'V'), - (0x530, 'X'), - (0x531, 'M', u'ա'), - (0x532, 'M', u'բ'), - (0x533, 'M', u'գ'), - (0x534, 'M', u'դ'), - (0x535, 'M', u'ե'), - (0x536, 'M', u'զ'), - (0x537, 'M', u'է'), - (0x538, 'M', u'ը'), - (0x539, 'M', u'թ'), - (0x53A, 'M', u'ժ'), - (0x53B, 'M', u'ի'), - (0x53C, 'M', u'լ'), - (0x53D, 'M', u'խ'), - (0x53E, 'M', u'ծ'), - (0x53F, 'M', u'կ'), - (0x540, 'M', u'հ'), - (0x541, 'M', u'ձ'), - (0x542, 'M', u'ղ'), - (0x543, 'M', u'ճ'), - (0x544, 'M', u'մ'), - (0x545, 'M', u'յ'), - (0x546, 'M', u'ն'), - (0x547, 'M', u'շ'), - (0x548, 'M', u'ո'), - (0x549, 'M', u'չ'), - (0x54A, 'M', u'պ'), - (0x54B, 'M', u'ջ'), - (0x54C, 'M', u'ռ'), - (0x54D, 'M', u'ս'), - (0x54E, 'M', u'վ'), - (0x54F, 'M', u'տ'), - (0x550, 'M', u'ր'), - (0x551, 'M', u'ց'), - (0x552, 'M', u'ւ'), - (0x553, 'M', u'փ'), - (0x554, 'M', u'ք'), - (0x555, 'M', u'օ'), - (0x556, 'M', u'ֆ'), - (0x557, 'X'), - (0x559, 'V'), - (0x587, 'M', u'եւ'), - (0x588, 'V'), - (0x58B, 'X'), - (0x58D, 'V'), - (0x590, 'X'), - (0x591, 'V'), - (0x5C8, 'X'), - (0x5D0, 'V'), - (0x5EB, 'X'), - (0x5EF, 'V'), - (0x5F5, 'X'), - (0x606, 'V'), - (0x61C, 'X'), - (0x61E, 'V'), - ] - -def _seg_10(): - return [ - (0x675, 'M', u'اٴ'), - (0x676, 'M', u'وٴ'), - (0x677, 'M', u'ۇٴ'), - (0x678, 'M', u'يٴ'), - (0x679, 'V'), - (0x6DD, 'X'), - (0x6DE, 'V'), - (0x70E, 'X'), - (0x710, 'V'), - (0x74B, 'X'), - (0x74D, 'V'), - (0x7B2, 'X'), - (0x7C0, 'V'), - (0x7FB, 'X'), - (0x7FD, 'V'), - (0x82E, 'X'), - (0x830, 'V'), - (0x83F, 'X'), - (0x840, 'V'), - (0x85C, 'X'), - (0x85E, 'V'), - (0x85F, 'X'), - (0x860, 'V'), - (0x86B, 'X'), - (0x8A0, 'V'), - (0x8B5, 'X'), - (0x8B6, 'V'), - (0x8BE, 'X'), - (0x8D3, 'V'), - (0x8E2, 'X'), - (0x8E3, 'V'), - (0x958, 'M', u'क़'), - (0x959, 'M', u'ख़'), - (0x95A, 'M', u'ग़'), - (0x95B, 'M', u'ज़'), - (0x95C, 'M', u'ड़'), - (0x95D, 'M', u'ढ़'), - (0x95E, 'M', u'फ़'), - (0x95F, 'M', u'य़'), - (0x960, 'V'), - (0x984, 'X'), - (0x985, 'V'), - (0x98D, 'X'), - (0x98F, 'V'), - (0x991, 'X'), - (0x993, 'V'), - (0x9A9, 'X'), - (0x9AA, 'V'), - (0x9B1, 'X'), - (0x9B2, 'V'), - (0x9B3, 'X'), - (0x9B6, 'V'), - (0x9BA, 'X'), - (0x9BC, 'V'), - (0x9C5, 'X'), - (0x9C7, 'V'), - (0x9C9, 'X'), - (0x9CB, 'V'), - (0x9CF, 'X'), - (0x9D7, 'V'), - (0x9D8, 'X'), - (0x9DC, 'M', u'ড়'), - (0x9DD, 'M', u'ঢ়'), - (0x9DE, 'X'), - (0x9DF, 'M', u'য়'), - (0x9E0, 'V'), - (0x9E4, 'X'), - (0x9E6, 'V'), - (0x9FF, 'X'), - (0xA01, 'V'), - (0xA04, 'X'), - (0xA05, 'V'), - (0xA0B, 'X'), - (0xA0F, 'V'), - (0xA11, 'X'), - (0xA13, 'V'), - (0xA29, 'X'), - (0xA2A, 'V'), - (0xA31, 'X'), - (0xA32, 'V'), - (0xA33, 'M', u'ਲ਼'), - (0xA34, 'X'), - (0xA35, 'V'), - (0xA36, 'M', u'ਸ਼'), - (0xA37, 'X'), - (0xA38, 'V'), - (0xA3A, 'X'), - (0xA3C, 'V'), - (0xA3D, 'X'), - (0xA3E, 'V'), - (0xA43, 'X'), - (0xA47, 'V'), - (0xA49, 'X'), - (0xA4B, 'V'), - (0xA4E, 'X'), - (0xA51, 'V'), - (0xA52, 'X'), - (0xA59, 'M', u'ਖ਼'), - (0xA5A, 'M', u'ਗ਼'), - (0xA5B, 'M', u'ਜ਼'), - ] - -def _seg_11(): - return [ - (0xA5C, 'V'), - (0xA5D, 'X'), - (0xA5E, 'M', u'ਫ਼'), - (0xA5F, 'X'), - (0xA66, 'V'), - (0xA77, 'X'), - (0xA81, 'V'), - (0xA84, 'X'), - (0xA85, 'V'), - (0xA8E, 'X'), - (0xA8F, 'V'), - (0xA92, 'X'), - (0xA93, 'V'), - (0xAA9, 'X'), - (0xAAA, 'V'), - (0xAB1, 'X'), - (0xAB2, 'V'), - (0xAB4, 'X'), - (0xAB5, 'V'), - (0xABA, 'X'), - (0xABC, 'V'), - (0xAC6, 'X'), - (0xAC7, 'V'), - (0xACA, 'X'), - (0xACB, 'V'), - (0xACE, 'X'), - (0xAD0, 'V'), - (0xAD1, 'X'), - (0xAE0, 'V'), - (0xAE4, 'X'), - (0xAE6, 'V'), - (0xAF2, 'X'), - (0xAF9, 'V'), - (0xB00, 'X'), - (0xB01, 'V'), - (0xB04, 'X'), - (0xB05, 'V'), - (0xB0D, 'X'), - (0xB0F, 'V'), - (0xB11, 'X'), - (0xB13, 'V'), - (0xB29, 'X'), - (0xB2A, 'V'), - (0xB31, 'X'), - (0xB32, 'V'), - (0xB34, 'X'), - (0xB35, 'V'), - (0xB3A, 'X'), - (0xB3C, 'V'), - (0xB45, 'X'), - (0xB47, 'V'), - (0xB49, 'X'), - (0xB4B, 'V'), - (0xB4E, 'X'), - (0xB56, 'V'), - (0xB58, 'X'), - (0xB5C, 'M', u'ଡ଼'), - (0xB5D, 'M', u'ଢ଼'), - (0xB5E, 'X'), - (0xB5F, 'V'), - (0xB64, 'X'), - (0xB66, 'V'), - (0xB78, 'X'), - (0xB82, 'V'), - (0xB84, 'X'), - (0xB85, 'V'), - (0xB8B, 'X'), - (0xB8E, 'V'), - (0xB91, 'X'), - (0xB92, 'V'), - (0xB96, 'X'), - (0xB99, 'V'), - (0xB9B, 'X'), - (0xB9C, 'V'), - (0xB9D, 'X'), - (0xB9E, 'V'), - (0xBA0, 'X'), - (0xBA3, 'V'), - (0xBA5, 'X'), - (0xBA8, 'V'), - (0xBAB, 'X'), - (0xBAE, 'V'), - (0xBBA, 'X'), - (0xBBE, 'V'), - (0xBC3, 'X'), - (0xBC6, 'V'), - (0xBC9, 'X'), - (0xBCA, 'V'), - (0xBCE, 'X'), - (0xBD0, 'V'), - (0xBD1, 'X'), - (0xBD7, 'V'), - (0xBD8, 'X'), - (0xBE6, 'V'), - (0xBFB, 'X'), - (0xC00, 'V'), - (0xC0D, 'X'), - (0xC0E, 'V'), - (0xC11, 'X'), - (0xC12, 'V'), - ] - -def _seg_12(): - return [ - (0xC29, 'X'), - (0xC2A, 'V'), - (0xC3A, 'X'), - (0xC3D, 'V'), - (0xC45, 'X'), - (0xC46, 'V'), - (0xC49, 'X'), - (0xC4A, 'V'), - (0xC4E, 'X'), - (0xC55, 'V'), - (0xC57, 'X'), - (0xC58, 'V'), - (0xC5B, 'X'), - (0xC60, 'V'), - (0xC64, 'X'), - (0xC66, 'V'), - (0xC70, 'X'), - (0xC78, 'V'), - (0xC8D, 'X'), - (0xC8E, 'V'), - (0xC91, 'X'), - (0xC92, 'V'), - (0xCA9, 'X'), - (0xCAA, 'V'), - (0xCB4, 'X'), - (0xCB5, 'V'), - (0xCBA, 'X'), - (0xCBC, 'V'), - (0xCC5, 'X'), - (0xCC6, 'V'), - (0xCC9, 'X'), - (0xCCA, 'V'), - (0xCCE, 'X'), - (0xCD5, 'V'), - (0xCD7, 'X'), - (0xCDE, 'V'), - (0xCDF, 'X'), - (0xCE0, 'V'), - (0xCE4, 'X'), - (0xCE6, 'V'), - (0xCF0, 'X'), - (0xCF1, 'V'), - (0xCF3, 'X'), - (0xD00, 'V'), - (0xD04, 'X'), - (0xD05, 'V'), - (0xD0D, 'X'), - (0xD0E, 'V'), - (0xD11, 'X'), - (0xD12, 'V'), - (0xD45, 'X'), - (0xD46, 'V'), - (0xD49, 'X'), - (0xD4A, 'V'), - (0xD50, 'X'), - (0xD54, 'V'), - (0xD64, 'X'), - (0xD66, 'V'), - (0xD80, 'X'), - (0xD82, 'V'), - (0xD84, 'X'), - (0xD85, 'V'), - (0xD97, 'X'), - (0xD9A, 'V'), - (0xDB2, 'X'), - (0xDB3, 'V'), - (0xDBC, 'X'), - (0xDBD, 'V'), - (0xDBE, 'X'), - (0xDC0, 'V'), - (0xDC7, 'X'), - (0xDCA, 'V'), - (0xDCB, 'X'), - (0xDCF, 'V'), - (0xDD5, 'X'), - (0xDD6, 'V'), - (0xDD7, 'X'), - (0xDD8, 'V'), - (0xDE0, 'X'), - (0xDE6, 'V'), - (0xDF0, 'X'), - (0xDF2, 'V'), - (0xDF5, 'X'), - (0xE01, 'V'), - (0xE33, 'M', u'ํา'), - (0xE34, 'V'), - (0xE3B, 'X'), - (0xE3F, 'V'), - (0xE5C, 'X'), - (0xE81, 'V'), - (0xE83, 'X'), - (0xE84, 'V'), - (0xE85, 'X'), - (0xE87, 'V'), - (0xE89, 'X'), - (0xE8A, 'V'), - (0xE8B, 'X'), - (0xE8D, 'V'), - (0xE8E, 'X'), - (0xE94, 'V'), - ] - -def _seg_13(): - return [ - (0xE98, 'X'), - (0xE99, 'V'), - (0xEA0, 'X'), - (0xEA1, 'V'), - (0xEA4, 'X'), - (0xEA5, 'V'), - (0xEA6, 'X'), - (0xEA7, 'V'), - (0xEA8, 'X'), - (0xEAA, 'V'), - (0xEAC, 'X'), - (0xEAD, 'V'), - (0xEB3, 'M', u'ໍາ'), - (0xEB4, 'V'), - (0xEBA, 'X'), - (0xEBB, 'V'), - (0xEBE, 'X'), - (0xEC0, 'V'), - (0xEC5, 'X'), - (0xEC6, 'V'), - (0xEC7, 'X'), - (0xEC8, 'V'), - (0xECE, 'X'), - (0xED0, 'V'), - (0xEDA, 'X'), - (0xEDC, 'M', u'ຫນ'), - (0xEDD, 'M', u'ຫມ'), - (0xEDE, 'V'), - (0xEE0, 'X'), - (0xF00, 'V'), - (0xF0C, 'M', u'་'), - (0xF0D, 'V'), - (0xF43, 'M', u'གྷ'), - (0xF44, 'V'), - (0xF48, 'X'), - (0xF49, 'V'), - (0xF4D, 'M', u'ཌྷ'), - (0xF4E, 'V'), - (0xF52, 'M', u'དྷ'), - (0xF53, 'V'), - (0xF57, 'M', u'བྷ'), - (0xF58, 'V'), - (0xF5C, 'M', u'ཛྷ'), - (0xF5D, 'V'), - (0xF69, 'M', u'ཀྵ'), - (0xF6A, 'V'), - (0xF6D, 'X'), - (0xF71, 'V'), - (0xF73, 'M', u'ཱི'), - (0xF74, 'V'), - (0xF75, 'M', u'ཱུ'), - (0xF76, 'M', u'ྲྀ'), - (0xF77, 'M', u'ྲཱྀ'), - (0xF78, 'M', u'ླྀ'), - (0xF79, 'M', u'ླཱྀ'), - (0xF7A, 'V'), - (0xF81, 'M', u'ཱྀ'), - (0xF82, 'V'), - (0xF93, 'M', u'ྒྷ'), - (0xF94, 'V'), - (0xF98, 'X'), - (0xF99, 'V'), - (0xF9D, 'M', u'ྜྷ'), - (0xF9E, 'V'), - (0xFA2, 'M', u'ྡྷ'), - (0xFA3, 'V'), - (0xFA7, 'M', u'ྦྷ'), - (0xFA8, 'V'), - (0xFAC, 'M', u'ྫྷ'), - (0xFAD, 'V'), - (0xFB9, 'M', u'ྐྵ'), - (0xFBA, 'V'), - (0xFBD, 'X'), - (0xFBE, 'V'), - (0xFCD, 'X'), - (0xFCE, 'V'), - (0xFDB, 'X'), - (0x1000, 'V'), - (0x10A0, 'X'), - (0x10C7, 'M', u'ⴧ'), - (0x10C8, 'X'), - (0x10CD, 'M', u'ⴭ'), - (0x10CE, 'X'), - (0x10D0, 'V'), - (0x10FC, 'M', u'ნ'), - (0x10FD, 'V'), - (0x115F, 'X'), - (0x1161, 'V'), - (0x1249, 'X'), - (0x124A, 'V'), - (0x124E, 'X'), - (0x1250, 'V'), - (0x1257, 'X'), - (0x1258, 'V'), - (0x1259, 'X'), - (0x125A, 'V'), - (0x125E, 'X'), - (0x1260, 'V'), - (0x1289, 'X'), - (0x128A, 'V'), - ] - -def _seg_14(): - return [ - (0x128E, 'X'), - (0x1290, 'V'), - (0x12B1, 'X'), - (0x12B2, 'V'), - (0x12B6, 'X'), - (0x12B8, 'V'), - (0x12BF, 'X'), - (0x12C0, 'V'), - (0x12C1, 'X'), - (0x12C2, 'V'), - (0x12C6, 'X'), - (0x12C8, 'V'), - (0x12D7, 'X'), - (0x12D8, 'V'), - (0x1311, 'X'), - (0x1312, 'V'), - (0x1316, 'X'), - (0x1318, 'V'), - (0x135B, 'X'), - (0x135D, 'V'), - (0x137D, 'X'), - (0x1380, 'V'), - (0x139A, 'X'), - (0x13A0, 'V'), - (0x13F6, 'X'), - (0x13F8, 'M', u'Ᏸ'), - (0x13F9, 'M', u'Ᏹ'), - (0x13FA, 'M', u'Ᏺ'), - (0x13FB, 'M', u'Ᏻ'), - (0x13FC, 'M', u'Ᏼ'), - (0x13FD, 'M', u'Ᏽ'), - (0x13FE, 'X'), - (0x1400, 'V'), - (0x1680, 'X'), - (0x1681, 'V'), - (0x169D, 'X'), - (0x16A0, 'V'), - (0x16F9, 'X'), - (0x1700, 'V'), - (0x170D, 'X'), - (0x170E, 'V'), - (0x1715, 'X'), - (0x1720, 'V'), - (0x1737, 'X'), - (0x1740, 'V'), - (0x1754, 'X'), - (0x1760, 'V'), - (0x176D, 'X'), - (0x176E, 'V'), - (0x1771, 'X'), - (0x1772, 'V'), - (0x1774, 'X'), - (0x1780, 'V'), - (0x17B4, 'X'), - (0x17B6, 'V'), - (0x17DE, 'X'), - (0x17E0, 'V'), - (0x17EA, 'X'), - (0x17F0, 'V'), - (0x17FA, 'X'), - (0x1800, 'V'), - (0x1806, 'X'), - (0x1807, 'V'), - (0x180B, 'I'), - (0x180E, 'X'), - (0x1810, 'V'), - (0x181A, 'X'), - (0x1820, 'V'), - (0x1879, 'X'), - (0x1880, 'V'), - (0x18AB, 'X'), - (0x18B0, 'V'), - (0x18F6, 'X'), - (0x1900, 'V'), - (0x191F, 'X'), - (0x1920, 'V'), - (0x192C, 'X'), - (0x1930, 'V'), - (0x193C, 'X'), - (0x1940, 'V'), - (0x1941, 'X'), - (0x1944, 'V'), - (0x196E, 'X'), - (0x1970, 'V'), - (0x1975, 'X'), - (0x1980, 'V'), - (0x19AC, 'X'), - (0x19B0, 'V'), - (0x19CA, 'X'), - (0x19D0, 'V'), - (0x19DB, 'X'), - (0x19DE, 'V'), - (0x1A1C, 'X'), - (0x1A1E, 'V'), - (0x1A5F, 'X'), - (0x1A60, 'V'), - (0x1A7D, 'X'), - (0x1A7F, 'V'), - (0x1A8A, 'X'), - (0x1A90, 'V'), - ] - -def _seg_15(): - return [ - (0x1A9A, 'X'), - (0x1AA0, 'V'), - (0x1AAE, 'X'), - (0x1AB0, 'V'), - (0x1ABF, 'X'), - (0x1B00, 'V'), - (0x1B4C, 'X'), - (0x1B50, 'V'), - (0x1B7D, 'X'), - (0x1B80, 'V'), - (0x1BF4, 'X'), - (0x1BFC, 'V'), - (0x1C38, 'X'), - (0x1C3B, 'V'), - (0x1C4A, 'X'), - (0x1C4D, 'V'), - (0x1C80, 'M', u'в'), - (0x1C81, 'M', u'д'), - (0x1C82, 'M', u'о'), - (0x1C83, 'M', u'с'), - (0x1C84, 'M', u'т'), - (0x1C86, 'M', u'ъ'), - (0x1C87, 'M', u'ѣ'), - (0x1C88, 'M', u'ꙋ'), - (0x1C89, 'X'), - (0x1CC0, 'V'), - (0x1CC8, 'X'), - (0x1CD0, 'V'), - (0x1CFA, 'X'), - (0x1D00, 'V'), - (0x1D2C, 'M', u'a'), - (0x1D2D, 'M', u'æ'), - (0x1D2E, 'M', u'b'), - (0x1D2F, 'V'), - (0x1D30, 'M', u'd'), - (0x1D31, 'M', u'e'), - (0x1D32, 'M', u'ǝ'), - (0x1D33, 'M', u'g'), - (0x1D34, 'M', u'h'), - (0x1D35, 'M', u'i'), - (0x1D36, 'M', u'j'), - (0x1D37, 'M', u'k'), - (0x1D38, 'M', u'l'), - (0x1D39, 'M', u'm'), - (0x1D3A, 'M', u'n'), - (0x1D3B, 'V'), - (0x1D3C, 'M', u'o'), - (0x1D3D, 'M', u'ȣ'), - (0x1D3E, 'M', u'p'), - (0x1D3F, 'M', u'r'), - (0x1D40, 'M', u't'), - (0x1D41, 'M', u'u'), - (0x1D42, 'M', u'w'), - (0x1D43, 'M', u'a'), - (0x1D44, 'M', u'ɐ'), - (0x1D45, 'M', u'ɑ'), - (0x1D46, 'M', u'ᴂ'), - (0x1D47, 'M', u'b'), - (0x1D48, 'M', u'd'), - (0x1D49, 'M', u'e'), - (0x1D4A, 'M', u'ə'), - (0x1D4B, 'M', u'ɛ'), - (0x1D4C, 'M', u'ɜ'), - (0x1D4D, 'M', u'g'), - (0x1D4E, 'V'), - (0x1D4F, 'M', u'k'), - (0x1D50, 'M', u'm'), - (0x1D51, 'M', u'ŋ'), - (0x1D52, 'M', u'o'), - (0x1D53, 'M', u'ɔ'), - (0x1D54, 'M', u'ᴖ'), - (0x1D55, 'M', u'ᴗ'), - (0x1D56, 'M', u'p'), - (0x1D57, 'M', u't'), - (0x1D58, 'M', u'u'), - (0x1D59, 'M', u'ᴝ'), - (0x1D5A, 'M', u'ɯ'), - (0x1D5B, 'M', u'v'), - (0x1D5C, 'M', u'ᴥ'), - (0x1D5D, 'M', u'β'), - (0x1D5E, 'M', u'γ'), - (0x1D5F, 'M', u'δ'), - (0x1D60, 'M', u'φ'), - (0x1D61, 'M', u'χ'), - (0x1D62, 'M', u'i'), - (0x1D63, 'M', u'r'), - (0x1D64, 'M', u'u'), - (0x1D65, 'M', u'v'), - (0x1D66, 'M', u'β'), - (0x1D67, 'M', u'γ'), - (0x1D68, 'M', u'ρ'), - (0x1D69, 'M', u'φ'), - (0x1D6A, 'M', u'χ'), - (0x1D6B, 'V'), - (0x1D78, 'M', u'н'), - (0x1D79, 'V'), - (0x1D9B, 'M', u'ɒ'), - (0x1D9C, 'M', u'c'), - (0x1D9D, 'M', u'ɕ'), - (0x1D9E, 'M', u'ð'), - ] - -def _seg_16(): - return [ - (0x1D9F, 'M', u'ɜ'), - (0x1DA0, 'M', u'f'), - (0x1DA1, 'M', u'ɟ'), - (0x1DA2, 'M', u'ɡ'), - (0x1DA3, 'M', u'ɥ'), - (0x1DA4, 'M', u'ɨ'), - (0x1DA5, 'M', u'ɩ'), - (0x1DA6, 'M', u'ɪ'), - (0x1DA7, 'M', u'ᵻ'), - (0x1DA8, 'M', u'ʝ'), - (0x1DA9, 'M', u'ɭ'), - (0x1DAA, 'M', u'ᶅ'), - (0x1DAB, 'M', u'ʟ'), - (0x1DAC, 'M', u'ɱ'), - (0x1DAD, 'M', u'ɰ'), - (0x1DAE, 'M', u'ɲ'), - (0x1DAF, 'M', u'ɳ'), - (0x1DB0, 'M', u'ɴ'), - (0x1DB1, 'M', u'ɵ'), - (0x1DB2, 'M', u'ɸ'), - (0x1DB3, 'M', u'ʂ'), - (0x1DB4, 'M', u'ʃ'), - (0x1DB5, 'M', u'ƫ'), - (0x1DB6, 'M', u'ʉ'), - (0x1DB7, 'M', u'ʊ'), - (0x1DB8, 'M', u'ᴜ'), - (0x1DB9, 'M', u'ʋ'), - (0x1DBA, 'M', u'ʌ'), - (0x1DBB, 'M', u'z'), - (0x1DBC, 'M', u'ʐ'), - (0x1DBD, 'M', u'ʑ'), - (0x1DBE, 'M', u'ʒ'), - (0x1DBF, 'M', u'θ'), - (0x1DC0, 'V'), - (0x1DFA, 'X'), - (0x1DFB, 'V'), - (0x1E00, 'M', u'ḁ'), - (0x1E01, 'V'), - (0x1E02, 'M', u'ḃ'), - (0x1E03, 'V'), - (0x1E04, 'M', u'ḅ'), - (0x1E05, 'V'), - (0x1E06, 'M', u'ḇ'), - (0x1E07, 'V'), - (0x1E08, 'M', u'ḉ'), - (0x1E09, 'V'), - (0x1E0A, 'M', u'ḋ'), - (0x1E0B, 'V'), - (0x1E0C, 'M', u'ḍ'), - (0x1E0D, 'V'), - (0x1E0E, 'M', u'ḏ'), - (0x1E0F, 'V'), - (0x1E10, 'M', u'ḑ'), - (0x1E11, 'V'), - (0x1E12, 'M', u'ḓ'), - (0x1E13, 'V'), - (0x1E14, 'M', u'ḕ'), - (0x1E15, 'V'), - (0x1E16, 'M', u'ḗ'), - (0x1E17, 'V'), - (0x1E18, 'M', u'ḙ'), - (0x1E19, 'V'), - (0x1E1A, 'M', u'ḛ'), - (0x1E1B, 'V'), - (0x1E1C, 'M', u'ḝ'), - (0x1E1D, 'V'), - (0x1E1E, 'M', u'ḟ'), - (0x1E1F, 'V'), - (0x1E20, 'M', u'ḡ'), - (0x1E21, 'V'), - (0x1E22, 'M', u'ḣ'), - (0x1E23, 'V'), - (0x1E24, 'M', u'ḥ'), - (0x1E25, 'V'), - (0x1E26, 'M', u'ḧ'), - (0x1E27, 'V'), - (0x1E28, 'M', u'ḩ'), - (0x1E29, 'V'), - (0x1E2A, 'M', u'ḫ'), - (0x1E2B, 'V'), - (0x1E2C, 'M', u'ḭ'), - (0x1E2D, 'V'), - (0x1E2E, 'M', u'ḯ'), - (0x1E2F, 'V'), - (0x1E30, 'M', u'ḱ'), - (0x1E31, 'V'), - (0x1E32, 'M', u'ḳ'), - (0x1E33, 'V'), - (0x1E34, 'M', u'ḵ'), - (0x1E35, 'V'), - (0x1E36, 'M', u'ḷ'), - (0x1E37, 'V'), - (0x1E38, 'M', u'ḹ'), - (0x1E39, 'V'), - (0x1E3A, 'M', u'ḻ'), - (0x1E3B, 'V'), - (0x1E3C, 'M', u'ḽ'), - (0x1E3D, 'V'), - (0x1E3E, 'M', u'ḿ'), - (0x1E3F, 'V'), - ] - -def _seg_17(): - return [ - (0x1E40, 'M', u'ṁ'), - (0x1E41, 'V'), - (0x1E42, 'M', u'ṃ'), - (0x1E43, 'V'), - (0x1E44, 'M', u'ṅ'), - (0x1E45, 'V'), - (0x1E46, 'M', u'ṇ'), - (0x1E47, 'V'), - (0x1E48, 'M', u'ṉ'), - (0x1E49, 'V'), - (0x1E4A, 'M', u'ṋ'), - (0x1E4B, 'V'), - (0x1E4C, 'M', u'ṍ'), - (0x1E4D, 'V'), - (0x1E4E, 'M', u'ṏ'), - (0x1E4F, 'V'), - (0x1E50, 'M', u'ṑ'), - (0x1E51, 'V'), - (0x1E52, 'M', u'ṓ'), - (0x1E53, 'V'), - (0x1E54, 'M', u'ṕ'), - (0x1E55, 'V'), - (0x1E56, 'M', u'ṗ'), - (0x1E57, 'V'), - (0x1E58, 'M', u'ṙ'), - (0x1E59, 'V'), - (0x1E5A, 'M', u'ṛ'), - (0x1E5B, 'V'), - (0x1E5C, 'M', u'ṝ'), - (0x1E5D, 'V'), - (0x1E5E, 'M', u'ṟ'), - (0x1E5F, 'V'), - (0x1E60, 'M', u'ṡ'), - (0x1E61, 'V'), - (0x1E62, 'M', u'ṣ'), - (0x1E63, 'V'), - (0x1E64, 'M', u'ṥ'), - (0x1E65, 'V'), - (0x1E66, 'M', u'ṧ'), - (0x1E67, 'V'), - (0x1E68, 'M', u'ṩ'), - (0x1E69, 'V'), - (0x1E6A, 'M', u'ṫ'), - (0x1E6B, 'V'), - (0x1E6C, 'M', u'ṭ'), - (0x1E6D, 'V'), - (0x1E6E, 'M', u'ṯ'), - (0x1E6F, 'V'), - (0x1E70, 'M', u'ṱ'), - (0x1E71, 'V'), - (0x1E72, 'M', u'ṳ'), - (0x1E73, 'V'), - (0x1E74, 'M', u'ṵ'), - (0x1E75, 'V'), - (0x1E76, 'M', u'ṷ'), - (0x1E77, 'V'), - (0x1E78, 'M', u'ṹ'), - (0x1E79, 'V'), - (0x1E7A, 'M', u'ṻ'), - (0x1E7B, 'V'), - (0x1E7C, 'M', u'ṽ'), - (0x1E7D, 'V'), - (0x1E7E, 'M', u'ṿ'), - (0x1E7F, 'V'), - (0x1E80, 'M', u'ẁ'), - (0x1E81, 'V'), - (0x1E82, 'M', u'ẃ'), - (0x1E83, 'V'), - (0x1E84, 'M', u'ẅ'), - (0x1E85, 'V'), - (0x1E86, 'M', u'ẇ'), - (0x1E87, 'V'), - (0x1E88, 'M', u'ẉ'), - (0x1E89, 'V'), - (0x1E8A, 'M', u'ẋ'), - (0x1E8B, 'V'), - (0x1E8C, 'M', u'ẍ'), - (0x1E8D, 'V'), - (0x1E8E, 'M', u'ẏ'), - (0x1E8F, 'V'), - (0x1E90, 'M', u'ẑ'), - (0x1E91, 'V'), - (0x1E92, 'M', u'ẓ'), - (0x1E93, 'V'), - (0x1E94, 'M', u'ẕ'), - (0x1E95, 'V'), - (0x1E9A, 'M', u'aʾ'), - (0x1E9B, 'M', u'ṡ'), - (0x1E9C, 'V'), - (0x1E9E, 'M', u'ss'), - (0x1E9F, 'V'), - (0x1EA0, 'M', u'ạ'), - (0x1EA1, 'V'), - (0x1EA2, 'M', u'ả'), - (0x1EA3, 'V'), - (0x1EA4, 'M', u'ấ'), - (0x1EA5, 'V'), - (0x1EA6, 'M', u'ầ'), - (0x1EA7, 'V'), - (0x1EA8, 'M', u'ẩ'), - ] - -def _seg_18(): - return [ - (0x1EA9, 'V'), - (0x1EAA, 'M', u'ẫ'), - (0x1EAB, 'V'), - (0x1EAC, 'M', u'ậ'), - (0x1EAD, 'V'), - (0x1EAE, 'M', u'ắ'), - (0x1EAF, 'V'), - (0x1EB0, 'M', u'ằ'), - (0x1EB1, 'V'), - (0x1EB2, 'M', u'ẳ'), - (0x1EB3, 'V'), - (0x1EB4, 'M', u'ẵ'), - (0x1EB5, 'V'), - (0x1EB6, 'M', u'ặ'), - (0x1EB7, 'V'), - (0x1EB8, 'M', u'ẹ'), - (0x1EB9, 'V'), - (0x1EBA, 'M', u'ẻ'), - (0x1EBB, 'V'), - (0x1EBC, 'M', u'ẽ'), - (0x1EBD, 'V'), - (0x1EBE, 'M', u'ế'), - (0x1EBF, 'V'), - (0x1EC0, 'M', u'ề'), - (0x1EC1, 'V'), - (0x1EC2, 'M', u'ể'), - (0x1EC3, 'V'), - (0x1EC4, 'M', u'ễ'), - (0x1EC5, 'V'), - (0x1EC6, 'M', u'ệ'), - (0x1EC7, 'V'), - (0x1EC8, 'M', u'ỉ'), - (0x1EC9, 'V'), - (0x1ECA, 'M', u'ị'), - (0x1ECB, 'V'), - (0x1ECC, 'M', u'ọ'), - (0x1ECD, 'V'), - (0x1ECE, 'M', u'ỏ'), - (0x1ECF, 'V'), - (0x1ED0, 'M', u'ố'), - (0x1ED1, 'V'), - (0x1ED2, 'M', u'ồ'), - (0x1ED3, 'V'), - (0x1ED4, 'M', u'ổ'), - (0x1ED5, 'V'), - (0x1ED6, 'M', u'ỗ'), - (0x1ED7, 'V'), - (0x1ED8, 'M', u'ộ'), - (0x1ED9, 'V'), - (0x1EDA, 'M', u'ớ'), - (0x1EDB, 'V'), - (0x1EDC, 'M', u'ờ'), - (0x1EDD, 'V'), - (0x1EDE, 'M', u'ở'), - (0x1EDF, 'V'), - (0x1EE0, 'M', u'ỡ'), - (0x1EE1, 'V'), - (0x1EE2, 'M', u'ợ'), - (0x1EE3, 'V'), - (0x1EE4, 'M', u'ụ'), - (0x1EE5, 'V'), - (0x1EE6, 'M', u'ủ'), - (0x1EE7, 'V'), - (0x1EE8, 'M', u'ứ'), - (0x1EE9, 'V'), - (0x1EEA, 'M', u'ừ'), - (0x1EEB, 'V'), - (0x1EEC, 'M', u'ử'), - (0x1EED, 'V'), - (0x1EEE, 'M', u'ữ'), - (0x1EEF, 'V'), - (0x1EF0, 'M', u'ự'), - (0x1EF1, 'V'), - (0x1EF2, 'M', u'ỳ'), - (0x1EF3, 'V'), - (0x1EF4, 'M', u'ỵ'), - (0x1EF5, 'V'), - (0x1EF6, 'M', u'ỷ'), - (0x1EF7, 'V'), - (0x1EF8, 'M', u'ỹ'), - (0x1EF9, 'V'), - (0x1EFA, 'M', u'ỻ'), - (0x1EFB, 'V'), - (0x1EFC, 'M', u'ỽ'), - (0x1EFD, 'V'), - (0x1EFE, 'M', u'ỿ'), - (0x1EFF, 'V'), - (0x1F08, 'M', u'ἀ'), - (0x1F09, 'M', u'ἁ'), - (0x1F0A, 'M', u'ἂ'), - (0x1F0B, 'M', u'ἃ'), - (0x1F0C, 'M', u'ἄ'), - (0x1F0D, 'M', u'ἅ'), - (0x1F0E, 'M', u'ἆ'), - (0x1F0F, 'M', u'ἇ'), - (0x1F10, 'V'), - (0x1F16, 'X'), - (0x1F18, 'M', u'ἐ'), - (0x1F19, 'M', u'ἑ'), - (0x1F1A, 'M', u'ἒ'), - ] - -def _seg_19(): - return [ - (0x1F1B, 'M', u'ἓ'), - (0x1F1C, 'M', u'ἔ'), - (0x1F1D, 'M', u'ἕ'), - (0x1F1E, 'X'), - (0x1F20, 'V'), - (0x1F28, 'M', u'ἠ'), - (0x1F29, 'M', u'ἡ'), - (0x1F2A, 'M', u'ἢ'), - (0x1F2B, 'M', u'ἣ'), - (0x1F2C, 'M', u'ἤ'), - (0x1F2D, 'M', u'ἥ'), - (0x1F2E, 'M', u'ἦ'), - (0x1F2F, 'M', u'ἧ'), - (0x1F30, 'V'), - (0x1F38, 'M', u'ἰ'), - (0x1F39, 'M', u'ἱ'), - (0x1F3A, 'M', u'ἲ'), - (0x1F3B, 'M', u'ἳ'), - (0x1F3C, 'M', u'ἴ'), - (0x1F3D, 'M', u'ἵ'), - (0x1F3E, 'M', u'ἶ'), - (0x1F3F, 'M', u'ἷ'), - (0x1F40, 'V'), - (0x1F46, 'X'), - (0x1F48, 'M', u'ὀ'), - (0x1F49, 'M', u'ὁ'), - (0x1F4A, 'M', u'ὂ'), - (0x1F4B, 'M', u'ὃ'), - (0x1F4C, 'M', u'ὄ'), - (0x1F4D, 'M', u'ὅ'), - (0x1F4E, 'X'), - (0x1F50, 'V'), - (0x1F58, 'X'), - (0x1F59, 'M', u'ὑ'), - (0x1F5A, 'X'), - (0x1F5B, 'M', u'ὓ'), - (0x1F5C, 'X'), - (0x1F5D, 'M', u'ὕ'), - (0x1F5E, 'X'), - (0x1F5F, 'M', u'ὗ'), - (0x1F60, 'V'), - (0x1F68, 'M', u'ὠ'), - (0x1F69, 'M', u'ὡ'), - (0x1F6A, 'M', u'ὢ'), - (0x1F6B, 'M', u'ὣ'), - (0x1F6C, 'M', u'ὤ'), - (0x1F6D, 'M', u'ὥ'), - (0x1F6E, 'M', u'ὦ'), - (0x1F6F, 'M', u'ὧ'), - (0x1F70, 'V'), - (0x1F71, 'M', u'ά'), - (0x1F72, 'V'), - (0x1F73, 'M', u'έ'), - (0x1F74, 'V'), - (0x1F75, 'M', u'ή'), - (0x1F76, 'V'), - (0x1F77, 'M', u'ί'), - (0x1F78, 'V'), - (0x1F79, 'M', u'ό'), - (0x1F7A, 'V'), - (0x1F7B, 'M', u'ύ'), - (0x1F7C, 'V'), - (0x1F7D, 'M', u'ώ'), - (0x1F7E, 'X'), - (0x1F80, 'M', u'ἀι'), - (0x1F81, 'M', u'ἁι'), - (0x1F82, 'M', u'ἂι'), - (0x1F83, 'M', u'ἃι'), - (0x1F84, 'M', u'ἄι'), - (0x1F85, 'M', u'ἅι'), - (0x1F86, 'M', u'ἆι'), - (0x1F87, 'M', u'ἇι'), - (0x1F88, 'M', u'ἀι'), - (0x1F89, 'M', u'ἁι'), - (0x1F8A, 'M', u'ἂι'), - (0x1F8B, 'M', u'ἃι'), - (0x1F8C, 'M', u'ἄι'), - (0x1F8D, 'M', u'ἅι'), - (0x1F8E, 'M', u'ἆι'), - (0x1F8F, 'M', u'ἇι'), - (0x1F90, 'M', u'ἠι'), - (0x1F91, 'M', u'ἡι'), - (0x1F92, 'M', u'ἢι'), - (0x1F93, 'M', u'ἣι'), - (0x1F94, 'M', u'ἤι'), - (0x1F95, 'M', u'ἥι'), - (0x1F96, 'M', u'ἦι'), - (0x1F97, 'M', u'ἧι'), - (0x1F98, 'M', u'ἠι'), - (0x1F99, 'M', u'ἡι'), - (0x1F9A, 'M', u'ἢι'), - (0x1F9B, 'M', u'ἣι'), - (0x1F9C, 'M', u'ἤι'), - (0x1F9D, 'M', u'ἥι'), - (0x1F9E, 'M', u'ἦι'), - (0x1F9F, 'M', u'ἧι'), - (0x1FA0, 'M', u'ὠι'), - (0x1FA1, 'M', u'ὡι'), - (0x1FA2, 'M', u'ὢι'), - (0x1FA3, 'M', u'ὣι'), - ] - -def _seg_20(): - return [ - (0x1FA4, 'M', u'ὤι'), - (0x1FA5, 'M', u'ὥι'), - (0x1FA6, 'M', u'ὦι'), - (0x1FA7, 'M', u'ὧι'), - (0x1FA8, 'M', u'ὠι'), - (0x1FA9, 'M', u'ὡι'), - (0x1FAA, 'M', u'ὢι'), - (0x1FAB, 'M', u'ὣι'), - (0x1FAC, 'M', u'ὤι'), - (0x1FAD, 'M', u'ὥι'), - (0x1FAE, 'M', u'ὦι'), - (0x1FAF, 'M', u'ὧι'), - (0x1FB0, 'V'), - (0x1FB2, 'M', u'ὰι'), - (0x1FB3, 'M', u'αι'), - (0x1FB4, 'M', u'άι'), - (0x1FB5, 'X'), - (0x1FB6, 'V'), - (0x1FB7, 'M', u'ᾶι'), - (0x1FB8, 'M', u'ᾰ'), - (0x1FB9, 'M', u'ᾱ'), - (0x1FBA, 'M', u'ὰ'), - (0x1FBB, 'M', u'ά'), - (0x1FBC, 'M', u'αι'), - (0x1FBD, '3', u' ̓'), - (0x1FBE, 'M', u'ι'), - (0x1FBF, '3', u' ̓'), - (0x1FC0, '3', u' ͂'), - (0x1FC1, '3', u' ̈͂'), - (0x1FC2, 'M', u'ὴι'), - (0x1FC3, 'M', u'ηι'), - (0x1FC4, 'M', u'ήι'), - (0x1FC5, 'X'), - (0x1FC6, 'V'), - (0x1FC7, 'M', u'ῆι'), - (0x1FC8, 'M', u'ὲ'), - (0x1FC9, 'M', u'έ'), - (0x1FCA, 'M', u'ὴ'), - (0x1FCB, 'M', u'ή'), - (0x1FCC, 'M', u'ηι'), - (0x1FCD, '3', u' ̓̀'), - (0x1FCE, '3', u' ̓́'), - (0x1FCF, '3', u' ̓͂'), - (0x1FD0, 'V'), - (0x1FD3, 'M', u'ΐ'), - (0x1FD4, 'X'), - (0x1FD6, 'V'), - (0x1FD8, 'M', u'ῐ'), - (0x1FD9, 'M', u'ῑ'), - (0x1FDA, 'M', u'ὶ'), - (0x1FDB, 'M', u'ί'), - (0x1FDC, 'X'), - (0x1FDD, '3', u' ̔̀'), - (0x1FDE, '3', u' ̔́'), - (0x1FDF, '3', u' ̔͂'), - (0x1FE0, 'V'), - (0x1FE3, 'M', u'ΰ'), - (0x1FE4, 'V'), - (0x1FE8, 'M', u'ῠ'), - (0x1FE9, 'M', u'ῡ'), - (0x1FEA, 'M', u'ὺ'), - (0x1FEB, 'M', u'ύ'), - (0x1FEC, 'M', u'ῥ'), - (0x1FED, '3', u' ̈̀'), - (0x1FEE, '3', u' ̈́'), - (0x1FEF, '3', u'`'), - (0x1FF0, 'X'), - (0x1FF2, 'M', u'ὼι'), - (0x1FF3, 'M', u'ωι'), - (0x1FF4, 'M', u'ώι'), - (0x1FF5, 'X'), - (0x1FF6, 'V'), - (0x1FF7, 'M', u'ῶι'), - (0x1FF8, 'M', u'ὸ'), - (0x1FF9, 'M', u'ό'), - (0x1FFA, 'M', u'ὼ'), - (0x1FFB, 'M', u'ώ'), - (0x1FFC, 'M', u'ωι'), - (0x1FFD, '3', u' ́'), - (0x1FFE, '3', u' ̔'), - (0x1FFF, 'X'), - (0x2000, '3', u' '), - (0x200B, 'I'), - (0x200C, 'D', u''), - (0x200E, 'X'), - (0x2010, 'V'), - (0x2011, 'M', u'‐'), - (0x2012, 'V'), - (0x2017, '3', u' ̳'), - (0x2018, 'V'), - (0x2024, 'X'), - (0x2027, 'V'), - (0x2028, 'X'), - (0x202F, '3', u' '), - (0x2030, 'V'), - (0x2033, 'M', u'′′'), - (0x2034, 'M', u'′′′'), - (0x2035, 'V'), - (0x2036, 'M', u'‵‵'), - (0x2037, 'M', u'‵‵‵'), - ] - -def _seg_21(): - return [ - (0x2038, 'V'), - (0x203C, '3', u'!!'), - (0x203D, 'V'), - (0x203E, '3', u' ̅'), - (0x203F, 'V'), - (0x2047, '3', u'??'), - (0x2048, '3', u'?!'), - (0x2049, '3', u'!?'), - (0x204A, 'V'), - (0x2057, 'M', u'′′′′'), - (0x2058, 'V'), - (0x205F, '3', u' '), - (0x2060, 'I'), - (0x2061, 'X'), - (0x2064, 'I'), - (0x2065, 'X'), - (0x2070, 'M', u'0'), - (0x2071, 'M', u'i'), - (0x2072, 'X'), - (0x2074, 'M', u'4'), - (0x2075, 'M', u'5'), - (0x2076, 'M', u'6'), - (0x2077, 'M', u'7'), - (0x2078, 'M', u'8'), - (0x2079, 'M', u'9'), - (0x207A, '3', u'+'), - (0x207B, 'M', u'−'), - (0x207C, '3', u'='), - (0x207D, '3', u'('), - (0x207E, '3', u')'), - (0x207F, 'M', u'n'), - (0x2080, 'M', u'0'), - (0x2081, 'M', u'1'), - (0x2082, 'M', u'2'), - (0x2083, 'M', u'3'), - (0x2084, 'M', u'4'), - (0x2085, 'M', u'5'), - (0x2086, 'M', u'6'), - (0x2087, 'M', u'7'), - (0x2088, 'M', u'8'), - (0x2089, 'M', u'9'), - (0x208A, '3', u'+'), - (0x208B, 'M', u'−'), - (0x208C, '3', u'='), - (0x208D, '3', u'('), - (0x208E, '3', u')'), - (0x208F, 'X'), - (0x2090, 'M', u'a'), - (0x2091, 'M', u'e'), - (0x2092, 'M', u'o'), - (0x2093, 'M', u'x'), - (0x2094, 'M', u'ə'), - (0x2095, 'M', u'h'), - (0x2096, 'M', u'k'), - (0x2097, 'M', u'l'), - (0x2098, 'M', u'm'), - (0x2099, 'M', u'n'), - (0x209A, 'M', u'p'), - (0x209B, 'M', u's'), - (0x209C, 'M', u't'), - (0x209D, 'X'), - (0x20A0, 'V'), - (0x20A8, 'M', u'rs'), - (0x20A9, 'V'), - (0x20C0, 'X'), - (0x20D0, 'V'), - (0x20F1, 'X'), - (0x2100, '3', u'a/c'), - (0x2101, '3', u'a/s'), - (0x2102, 'M', u'c'), - (0x2103, 'M', u'°c'), - (0x2104, 'V'), - (0x2105, '3', u'c/o'), - (0x2106, '3', u'c/u'), - (0x2107, 'M', u'ɛ'), - (0x2108, 'V'), - (0x2109, 'M', u'°f'), - (0x210A, 'M', u'g'), - (0x210B, 'M', u'h'), - (0x210F, 'M', u'ħ'), - (0x2110, 'M', u'i'), - (0x2112, 'M', u'l'), - (0x2114, 'V'), - (0x2115, 'M', u'n'), - (0x2116, 'M', u'no'), - (0x2117, 'V'), - (0x2119, 'M', u'p'), - (0x211A, 'M', u'q'), - (0x211B, 'M', u'r'), - (0x211E, 'V'), - (0x2120, 'M', u'sm'), - (0x2121, 'M', u'tel'), - (0x2122, 'M', u'tm'), - (0x2123, 'V'), - (0x2124, 'M', u'z'), - (0x2125, 'V'), - (0x2126, 'M', u'ω'), - (0x2127, 'V'), - (0x2128, 'M', u'z'), - (0x2129, 'V'), - ] - -def _seg_22(): - return [ - (0x212A, 'M', u'k'), - (0x212B, 'M', u'å'), - (0x212C, 'M', u'b'), - (0x212D, 'M', u'c'), - (0x212E, 'V'), - (0x212F, 'M', u'e'), - (0x2131, 'M', u'f'), - (0x2132, 'X'), - (0x2133, 'M', u'm'), - (0x2134, 'M', u'o'), - (0x2135, 'M', u'א'), - (0x2136, 'M', u'ב'), - (0x2137, 'M', u'ג'), - (0x2138, 'M', u'ד'), - (0x2139, 'M', u'i'), - (0x213A, 'V'), - (0x213B, 'M', u'fax'), - (0x213C, 'M', u'π'), - (0x213D, 'M', u'γ'), - (0x213F, 'M', u'π'), - (0x2140, 'M', u'∑'), - (0x2141, 'V'), - (0x2145, 'M', u'd'), - (0x2147, 'M', u'e'), - (0x2148, 'M', u'i'), - (0x2149, 'M', u'j'), - (0x214A, 'V'), - (0x2150, 'M', u'1⁄7'), - (0x2151, 'M', u'1⁄9'), - (0x2152, 'M', u'1⁄10'), - (0x2153, 'M', u'1⁄3'), - (0x2154, 'M', u'2⁄3'), - (0x2155, 'M', u'1⁄5'), - (0x2156, 'M', u'2⁄5'), - (0x2157, 'M', u'3⁄5'), - (0x2158, 'M', u'4⁄5'), - (0x2159, 'M', u'1⁄6'), - (0x215A, 'M', u'5⁄6'), - (0x215B, 'M', u'1⁄8'), - (0x215C, 'M', u'3⁄8'), - (0x215D, 'M', u'5⁄8'), - (0x215E, 'M', u'7⁄8'), - (0x215F, 'M', u'1⁄'), - (0x2160, 'M', u'i'), - (0x2161, 'M', u'ii'), - (0x2162, 'M', u'iii'), - (0x2163, 'M', u'iv'), - (0x2164, 'M', u'v'), - (0x2165, 'M', u'vi'), - (0x2166, 'M', u'vii'), - (0x2167, 'M', u'viii'), - (0x2168, 'M', u'ix'), - (0x2169, 'M', u'x'), - (0x216A, 'M', u'xi'), - (0x216B, 'M', u'xii'), - (0x216C, 'M', u'l'), - (0x216D, 'M', u'c'), - (0x216E, 'M', u'd'), - (0x216F, 'M', u'm'), - (0x2170, 'M', u'i'), - (0x2171, 'M', u'ii'), - (0x2172, 'M', u'iii'), - (0x2173, 'M', u'iv'), - (0x2174, 'M', u'v'), - (0x2175, 'M', u'vi'), - (0x2176, 'M', u'vii'), - (0x2177, 'M', u'viii'), - (0x2178, 'M', u'ix'), - (0x2179, 'M', u'x'), - (0x217A, 'M', u'xi'), - (0x217B, 'M', u'xii'), - (0x217C, 'M', u'l'), - (0x217D, 'M', u'c'), - (0x217E, 'M', u'd'), - (0x217F, 'M', u'm'), - (0x2180, 'V'), - (0x2183, 'X'), - (0x2184, 'V'), - (0x2189, 'M', u'0⁄3'), - (0x218A, 'V'), - (0x218C, 'X'), - (0x2190, 'V'), - (0x222C, 'M', u'∫∫'), - (0x222D, 'M', u'∫∫∫'), - (0x222E, 'V'), - (0x222F, 'M', u'∮∮'), - (0x2230, 'M', u'∮∮∮'), - (0x2231, 'V'), - (0x2260, '3'), - (0x2261, 'V'), - (0x226E, '3'), - (0x2270, 'V'), - (0x2329, 'M', u'〈'), - (0x232A, 'M', u'〉'), - (0x232B, 'V'), - (0x2427, 'X'), - (0x2440, 'V'), - (0x244B, 'X'), - (0x2460, 'M', u'1'), - (0x2461, 'M', u'2'), - ] - -def _seg_23(): - return [ - (0x2462, 'M', u'3'), - (0x2463, 'M', u'4'), - (0x2464, 'M', u'5'), - (0x2465, 'M', u'6'), - (0x2466, 'M', u'7'), - (0x2467, 'M', u'8'), - (0x2468, 'M', u'9'), - (0x2469, 'M', u'10'), - (0x246A, 'M', u'11'), - (0x246B, 'M', u'12'), - (0x246C, 'M', u'13'), - (0x246D, 'M', u'14'), - (0x246E, 'M', u'15'), - (0x246F, 'M', u'16'), - (0x2470, 'M', u'17'), - (0x2471, 'M', u'18'), - (0x2472, 'M', u'19'), - (0x2473, 'M', u'20'), - (0x2474, '3', u'(1)'), - (0x2475, '3', u'(2)'), - (0x2476, '3', u'(3)'), - (0x2477, '3', u'(4)'), - (0x2478, '3', u'(5)'), - (0x2479, '3', u'(6)'), - (0x247A, '3', u'(7)'), - (0x247B, '3', u'(8)'), - (0x247C, '3', u'(9)'), - (0x247D, '3', u'(10)'), - (0x247E, '3', u'(11)'), - (0x247F, '3', u'(12)'), - (0x2480, '3', u'(13)'), - (0x2481, '3', u'(14)'), - (0x2482, '3', u'(15)'), - (0x2483, '3', u'(16)'), - (0x2484, '3', u'(17)'), - (0x2485, '3', u'(18)'), - (0x2486, '3', u'(19)'), - (0x2487, '3', u'(20)'), - (0x2488, 'X'), - (0x249C, '3', u'(a)'), - (0x249D, '3', u'(b)'), - (0x249E, '3', u'(c)'), - (0x249F, '3', u'(d)'), - (0x24A0, '3', u'(e)'), - (0x24A1, '3', u'(f)'), - (0x24A2, '3', u'(g)'), - (0x24A3, '3', u'(h)'), - (0x24A4, '3', u'(i)'), - (0x24A5, '3', u'(j)'), - (0x24A6, '3', u'(k)'), - (0x24A7, '3', u'(l)'), - (0x24A8, '3', u'(m)'), - (0x24A9, '3', u'(n)'), - (0x24AA, '3', u'(o)'), - (0x24AB, '3', u'(p)'), - (0x24AC, '3', u'(q)'), - (0x24AD, '3', u'(r)'), - (0x24AE, '3', u'(s)'), - (0x24AF, '3', u'(t)'), - (0x24B0, '3', u'(u)'), - (0x24B1, '3', u'(v)'), - (0x24B2, '3', u'(w)'), - (0x24B3, '3', u'(x)'), - (0x24B4, '3', u'(y)'), - (0x24B5, '3', u'(z)'), - (0x24B6, 'M', u'a'), - (0x24B7, 'M', u'b'), - (0x24B8, 'M', u'c'), - (0x24B9, 'M', u'd'), - (0x24BA, 'M', u'e'), - (0x24BB, 'M', u'f'), - (0x24BC, 'M', u'g'), - (0x24BD, 'M', u'h'), - (0x24BE, 'M', u'i'), - (0x24BF, 'M', u'j'), - (0x24C0, 'M', u'k'), - (0x24C1, 'M', u'l'), - (0x24C2, 'M', u'm'), - (0x24C3, 'M', u'n'), - (0x24C4, 'M', u'o'), - (0x24C5, 'M', u'p'), - (0x24C6, 'M', u'q'), - (0x24C7, 'M', u'r'), - (0x24C8, 'M', u's'), - (0x24C9, 'M', u't'), - (0x24CA, 'M', u'u'), - (0x24CB, 'M', u'v'), - (0x24CC, 'M', u'w'), - (0x24CD, 'M', u'x'), - (0x24CE, 'M', u'y'), - (0x24CF, 'M', u'z'), - (0x24D0, 'M', u'a'), - (0x24D1, 'M', u'b'), - (0x24D2, 'M', u'c'), - (0x24D3, 'M', u'd'), - (0x24D4, 'M', u'e'), - (0x24D5, 'M', u'f'), - (0x24D6, 'M', u'g'), - (0x24D7, 'M', u'h'), - (0x24D8, 'M', u'i'), - ] - -def _seg_24(): - return [ - (0x24D9, 'M', u'j'), - (0x24DA, 'M', u'k'), - (0x24DB, 'M', u'l'), - (0x24DC, 'M', u'm'), - (0x24DD, 'M', u'n'), - (0x24DE, 'M', u'o'), - (0x24DF, 'M', u'p'), - (0x24E0, 'M', u'q'), - (0x24E1, 'M', u'r'), - (0x24E2, 'M', u's'), - (0x24E3, 'M', u't'), - (0x24E4, 'M', u'u'), - (0x24E5, 'M', u'v'), - (0x24E6, 'M', u'w'), - (0x24E7, 'M', u'x'), - (0x24E8, 'M', u'y'), - (0x24E9, 'M', u'z'), - (0x24EA, 'M', u'0'), - (0x24EB, 'V'), - (0x2A0C, 'M', u'∫∫∫∫'), - (0x2A0D, 'V'), - (0x2A74, '3', u'::='), - (0x2A75, '3', u'=='), - (0x2A76, '3', u'==='), - (0x2A77, 'V'), - (0x2ADC, 'M', u'⫝̸'), - (0x2ADD, 'V'), - (0x2B74, 'X'), - (0x2B76, 'V'), - (0x2B96, 'X'), - (0x2B98, 'V'), - (0x2BC9, 'X'), - (0x2BCA, 'V'), - (0x2BFF, 'X'), - (0x2C00, 'M', u'ⰰ'), - (0x2C01, 'M', u'ⰱ'), - (0x2C02, 'M', u'ⰲ'), - (0x2C03, 'M', u'ⰳ'), - (0x2C04, 'M', u'ⰴ'), - (0x2C05, 'M', u'ⰵ'), - (0x2C06, 'M', u'ⰶ'), - (0x2C07, 'M', u'ⰷ'), - (0x2C08, 'M', u'ⰸ'), - (0x2C09, 'M', u'ⰹ'), - (0x2C0A, 'M', u'ⰺ'), - (0x2C0B, 'M', u'ⰻ'), - (0x2C0C, 'M', u'ⰼ'), - (0x2C0D, 'M', u'ⰽ'), - (0x2C0E, 'M', u'ⰾ'), - (0x2C0F, 'M', u'ⰿ'), - (0x2C10, 'M', u'ⱀ'), - (0x2C11, 'M', u'ⱁ'), - (0x2C12, 'M', u'ⱂ'), - (0x2C13, 'M', u'ⱃ'), - (0x2C14, 'M', u'ⱄ'), - (0x2C15, 'M', u'ⱅ'), - (0x2C16, 'M', u'ⱆ'), - (0x2C17, 'M', u'ⱇ'), - (0x2C18, 'M', u'ⱈ'), - (0x2C19, 'M', u'ⱉ'), - (0x2C1A, 'M', u'ⱊ'), - (0x2C1B, 'M', u'ⱋ'), - (0x2C1C, 'M', u'ⱌ'), - (0x2C1D, 'M', u'ⱍ'), - (0x2C1E, 'M', u'ⱎ'), - (0x2C1F, 'M', u'ⱏ'), - (0x2C20, 'M', u'ⱐ'), - (0x2C21, 'M', u'ⱑ'), - (0x2C22, 'M', u'ⱒ'), - (0x2C23, 'M', u'ⱓ'), - (0x2C24, 'M', u'ⱔ'), - (0x2C25, 'M', u'ⱕ'), - (0x2C26, 'M', u'ⱖ'), - (0x2C27, 'M', u'ⱗ'), - (0x2C28, 'M', u'ⱘ'), - (0x2C29, 'M', u'ⱙ'), - (0x2C2A, 'M', u'ⱚ'), - (0x2C2B, 'M', u'ⱛ'), - (0x2C2C, 'M', u'ⱜ'), - (0x2C2D, 'M', u'ⱝ'), - (0x2C2E, 'M', u'ⱞ'), - (0x2C2F, 'X'), - (0x2C30, 'V'), - (0x2C5F, 'X'), - (0x2C60, 'M', u'ⱡ'), - (0x2C61, 'V'), - (0x2C62, 'M', u'ɫ'), - (0x2C63, 'M', u'ᵽ'), - (0x2C64, 'M', u'ɽ'), - (0x2C65, 'V'), - (0x2C67, 'M', u'ⱨ'), - (0x2C68, 'V'), - (0x2C69, 'M', u'ⱪ'), - (0x2C6A, 'V'), - (0x2C6B, 'M', u'ⱬ'), - (0x2C6C, 'V'), - (0x2C6D, 'M', u'ɑ'), - (0x2C6E, 'M', u'ɱ'), - (0x2C6F, 'M', u'ɐ'), - (0x2C70, 'M', u'ɒ'), - ] - -def _seg_25(): - return [ - (0x2C71, 'V'), - (0x2C72, 'M', u'ⱳ'), - (0x2C73, 'V'), - (0x2C75, 'M', u'ⱶ'), - (0x2C76, 'V'), - (0x2C7C, 'M', u'j'), - (0x2C7D, 'M', u'v'), - (0x2C7E, 'M', u'ȿ'), - (0x2C7F, 'M', u'ɀ'), - (0x2C80, 'M', u'ⲁ'), - (0x2C81, 'V'), - (0x2C82, 'M', u'ⲃ'), - (0x2C83, 'V'), - (0x2C84, 'M', u'ⲅ'), - (0x2C85, 'V'), - (0x2C86, 'M', u'ⲇ'), - (0x2C87, 'V'), - (0x2C88, 'M', u'ⲉ'), - (0x2C89, 'V'), - (0x2C8A, 'M', u'ⲋ'), - (0x2C8B, 'V'), - (0x2C8C, 'M', u'ⲍ'), - (0x2C8D, 'V'), - (0x2C8E, 'M', u'ⲏ'), - (0x2C8F, 'V'), - (0x2C90, 'M', u'ⲑ'), - (0x2C91, 'V'), - (0x2C92, 'M', u'ⲓ'), - (0x2C93, 'V'), - (0x2C94, 'M', u'ⲕ'), - (0x2C95, 'V'), - (0x2C96, 'M', u'ⲗ'), - (0x2C97, 'V'), - (0x2C98, 'M', u'ⲙ'), - (0x2C99, 'V'), - (0x2C9A, 'M', u'ⲛ'), - (0x2C9B, 'V'), - (0x2C9C, 'M', u'ⲝ'), - (0x2C9D, 'V'), - (0x2C9E, 'M', u'ⲟ'), - (0x2C9F, 'V'), - (0x2CA0, 'M', u'ⲡ'), - (0x2CA1, 'V'), - (0x2CA2, 'M', u'ⲣ'), - (0x2CA3, 'V'), - (0x2CA4, 'M', u'ⲥ'), - (0x2CA5, 'V'), - (0x2CA6, 'M', u'ⲧ'), - (0x2CA7, 'V'), - (0x2CA8, 'M', u'ⲩ'), - (0x2CA9, 'V'), - (0x2CAA, 'M', u'ⲫ'), - (0x2CAB, 'V'), - (0x2CAC, 'M', u'ⲭ'), - (0x2CAD, 'V'), - (0x2CAE, 'M', u'ⲯ'), - (0x2CAF, 'V'), - (0x2CB0, 'M', u'ⲱ'), - (0x2CB1, 'V'), - (0x2CB2, 'M', u'ⲳ'), - (0x2CB3, 'V'), - (0x2CB4, 'M', u'ⲵ'), - (0x2CB5, 'V'), - (0x2CB6, 'M', u'ⲷ'), - (0x2CB7, 'V'), - (0x2CB8, 'M', u'ⲹ'), - (0x2CB9, 'V'), - (0x2CBA, 'M', u'ⲻ'), - (0x2CBB, 'V'), - (0x2CBC, 'M', u'ⲽ'), - (0x2CBD, 'V'), - (0x2CBE, 'M', u'ⲿ'), - (0x2CBF, 'V'), - (0x2CC0, 'M', u'ⳁ'), - (0x2CC1, 'V'), - (0x2CC2, 'M', u'ⳃ'), - (0x2CC3, 'V'), - (0x2CC4, 'M', u'ⳅ'), - (0x2CC5, 'V'), - (0x2CC6, 'M', u'ⳇ'), - (0x2CC7, 'V'), - (0x2CC8, 'M', u'ⳉ'), - (0x2CC9, 'V'), - (0x2CCA, 'M', u'ⳋ'), - (0x2CCB, 'V'), - (0x2CCC, 'M', u'ⳍ'), - (0x2CCD, 'V'), - (0x2CCE, 'M', u'ⳏ'), - (0x2CCF, 'V'), - (0x2CD0, 'M', u'ⳑ'), - (0x2CD1, 'V'), - (0x2CD2, 'M', u'ⳓ'), - (0x2CD3, 'V'), - (0x2CD4, 'M', u'ⳕ'), - (0x2CD5, 'V'), - (0x2CD6, 'M', u'ⳗ'), - (0x2CD7, 'V'), - (0x2CD8, 'M', u'ⳙ'), - (0x2CD9, 'V'), - (0x2CDA, 'M', u'ⳛ'), - ] - -def _seg_26(): - return [ - (0x2CDB, 'V'), - (0x2CDC, 'M', u'ⳝ'), - (0x2CDD, 'V'), - (0x2CDE, 'M', u'ⳟ'), - (0x2CDF, 'V'), - (0x2CE0, 'M', u'ⳡ'), - (0x2CE1, 'V'), - (0x2CE2, 'M', u'ⳣ'), - (0x2CE3, 'V'), - (0x2CEB, 'M', u'ⳬ'), - (0x2CEC, 'V'), - (0x2CED, 'M', u'ⳮ'), - (0x2CEE, 'V'), - (0x2CF2, 'M', u'ⳳ'), - (0x2CF3, 'V'), - (0x2CF4, 'X'), - (0x2CF9, 'V'), - (0x2D26, 'X'), - (0x2D27, 'V'), - (0x2D28, 'X'), - (0x2D2D, 'V'), - (0x2D2E, 'X'), - (0x2D30, 'V'), - (0x2D68, 'X'), - (0x2D6F, 'M', u'ⵡ'), - (0x2D70, 'V'), - (0x2D71, 'X'), - (0x2D7F, 'V'), - (0x2D97, 'X'), - (0x2DA0, 'V'), - (0x2DA7, 'X'), - (0x2DA8, 'V'), - (0x2DAF, 'X'), - (0x2DB0, 'V'), - (0x2DB7, 'X'), - (0x2DB8, 'V'), - (0x2DBF, 'X'), - (0x2DC0, 'V'), - (0x2DC7, 'X'), - (0x2DC8, 'V'), - (0x2DCF, 'X'), - (0x2DD0, 'V'), - (0x2DD7, 'X'), - (0x2DD8, 'V'), - (0x2DDF, 'X'), - (0x2DE0, 'V'), - (0x2E4F, 'X'), - (0x2E80, 'V'), - (0x2E9A, 'X'), - (0x2E9B, 'V'), - (0x2E9F, 'M', u'母'), - (0x2EA0, 'V'), - (0x2EF3, 'M', u'龟'), - (0x2EF4, 'X'), - (0x2F00, 'M', u'一'), - (0x2F01, 'M', u'丨'), - (0x2F02, 'M', u'丶'), - (0x2F03, 'M', u'丿'), - (0x2F04, 'M', u'乙'), - (0x2F05, 'M', u'亅'), - (0x2F06, 'M', u'二'), - (0x2F07, 'M', u'亠'), - (0x2F08, 'M', u'人'), - (0x2F09, 'M', u'儿'), - (0x2F0A, 'M', u'入'), - (0x2F0B, 'M', u'八'), - (0x2F0C, 'M', u'冂'), - (0x2F0D, 'M', u'冖'), - (0x2F0E, 'M', u'冫'), - (0x2F0F, 'M', u'几'), - (0x2F10, 'M', u'凵'), - (0x2F11, 'M', u'刀'), - (0x2F12, 'M', u'力'), - (0x2F13, 'M', u'勹'), - (0x2F14, 'M', u'匕'), - (0x2F15, 'M', u'匚'), - (0x2F16, 'M', u'匸'), - (0x2F17, 'M', u'十'), - (0x2F18, 'M', u'卜'), - (0x2F19, 'M', u'卩'), - (0x2F1A, 'M', u'厂'), - (0x2F1B, 'M', u'厶'), - (0x2F1C, 'M', u'又'), - (0x2F1D, 'M', u'口'), - (0x2F1E, 'M', u'囗'), - (0x2F1F, 'M', u'土'), - (0x2F20, 'M', u'士'), - (0x2F21, 'M', u'夂'), - (0x2F22, 'M', u'夊'), - (0x2F23, 'M', u'夕'), - (0x2F24, 'M', u'大'), - (0x2F25, 'M', u'女'), - (0x2F26, 'M', u'子'), - (0x2F27, 'M', u'宀'), - (0x2F28, 'M', u'寸'), - (0x2F29, 'M', u'小'), - (0x2F2A, 'M', u'尢'), - (0x2F2B, 'M', u'尸'), - (0x2F2C, 'M', u'屮'), - (0x2F2D, 'M', u'山'), - ] - -def _seg_27(): - return [ - (0x2F2E, 'M', u'巛'), - (0x2F2F, 'M', u'工'), - (0x2F30, 'M', u'己'), - (0x2F31, 'M', u'巾'), - (0x2F32, 'M', u'干'), - (0x2F33, 'M', u'幺'), - (0x2F34, 'M', u'广'), - (0x2F35, 'M', u'廴'), - (0x2F36, 'M', u'廾'), - (0x2F37, 'M', u'弋'), - (0x2F38, 'M', u'弓'), - (0x2F39, 'M', u'彐'), - (0x2F3A, 'M', u'彡'), - (0x2F3B, 'M', u'彳'), - (0x2F3C, 'M', u'心'), - (0x2F3D, 'M', u'戈'), - (0x2F3E, 'M', u'戶'), - (0x2F3F, 'M', u'手'), - (0x2F40, 'M', u'支'), - (0x2F41, 'M', u'攴'), - (0x2F42, 'M', u'文'), - (0x2F43, 'M', u'斗'), - (0x2F44, 'M', u'斤'), - (0x2F45, 'M', u'方'), - (0x2F46, 'M', u'无'), - (0x2F47, 'M', u'日'), - (0x2F48, 'M', u'曰'), - (0x2F49, 'M', u'月'), - (0x2F4A, 'M', u'木'), - (0x2F4B, 'M', u'欠'), - (0x2F4C, 'M', u'止'), - (0x2F4D, 'M', u'歹'), - (0x2F4E, 'M', u'殳'), - (0x2F4F, 'M', u'毋'), - (0x2F50, 'M', u'比'), - (0x2F51, 'M', u'毛'), - (0x2F52, 'M', u'氏'), - (0x2F53, 'M', u'气'), - (0x2F54, 'M', u'水'), - (0x2F55, 'M', u'火'), - (0x2F56, 'M', u'爪'), - (0x2F57, 'M', u'父'), - (0x2F58, 'M', u'爻'), - (0x2F59, 'M', u'爿'), - (0x2F5A, 'M', u'片'), - (0x2F5B, 'M', u'牙'), - (0x2F5C, 'M', u'牛'), - (0x2F5D, 'M', u'犬'), - (0x2F5E, 'M', u'玄'), - (0x2F5F, 'M', u'玉'), - (0x2F60, 'M', u'瓜'), - (0x2F61, 'M', u'瓦'), - (0x2F62, 'M', u'甘'), - (0x2F63, 'M', u'生'), - (0x2F64, 'M', u'用'), - (0x2F65, 'M', u'田'), - (0x2F66, 'M', u'疋'), - (0x2F67, 'M', u'疒'), - (0x2F68, 'M', u'癶'), - (0x2F69, 'M', u'白'), - (0x2F6A, 'M', u'皮'), - (0x2F6B, 'M', u'皿'), - (0x2F6C, 'M', u'目'), - (0x2F6D, 'M', u'矛'), - (0x2F6E, 'M', u'矢'), - (0x2F6F, 'M', u'石'), - (0x2F70, 'M', u'示'), - (0x2F71, 'M', u'禸'), - (0x2F72, 'M', u'禾'), - (0x2F73, 'M', u'穴'), - (0x2F74, 'M', u'立'), - (0x2F75, 'M', u'竹'), - (0x2F76, 'M', u'米'), - (0x2F77, 'M', u'糸'), - (0x2F78, 'M', u'缶'), - (0x2F79, 'M', u'网'), - (0x2F7A, 'M', u'羊'), - (0x2F7B, 'M', u'羽'), - (0x2F7C, 'M', u'老'), - (0x2F7D, 'M', u'而'), - (0x2F7E, 'M', u'耒'), - (0x2F7F, 'M', u'耳'), - (0x2F80, 'M', u'聿'), - (0x2F81, 'M', u'肉'), - (0x2F82, 'M', u'臣'), - (0x2F83, 'M', u'自'), - (0x2F84, 'M', u'至'), - (0x2F85, 'M', u'臼'), - (0x2F86, 'M', u'舌'), - (0x2F87, 'M', u'舛'), - (0x2F88, 'M', u'舟'), - (0x2F89, 'M', u'艮'), - (0x2F8A, 'M', u'色'), - (0x2F8B, 'M', u'艸'), - (0x2F8C, 'M', u'虍'), - (0x2F8D, 'M', u'虫'), - (0x2F8E, 'M', u'血'), - (0x2F8F, 'M', u'行'), - (0x2F90, 'M', u'衣'), - (0x2F91, 'M', u'襾'), - ] - -def _seg_28(): - return [ - (0x2F92, 'M', u'見'), - (0x2F93, 'M', u'角'), - (0x2F94, 'M', u'言'), - (0x2F95, 'M', u'谷'), - (0x2F96, 'M', u'豆'), - (0x2F97, 'M', u'豕'), - (0x2F98, 'M', u'豸'), - (0x2F99, 'M', u'貝'), - (0x2F9A, 'M', u'赤'), - (0x2F9B, 'M', u'走'), - (0x2F9C, 'M', u'足'), - (0x2F9D, 'M', u'身'), - (0x2F9E, 'M', u'車'), - (0x2F9F, 'M', u'辛'), - (0x2FA0, 'M', u'辰'), - (0x2FA1, 'M', u'辵'), - (0x2FA2, 'M', u'邑'), - (0x2FA3, 'M', u'酉'), - (0x2FA4, 'M', u'釆'), - (0x2FA5, 'M', u'里'), - (0x2FA6, 'M', u'金'), - (0x2FA7, 'M', u'長'), - (0x2FA8, 'M', u'門'), - (0x2FA9, 'M', u'阜'), - (0x2FAA, 'M', u'隶'), - (0x2FAB, 'M', u'隹'), - (0x2FAC, 'M', u'雨'), - (0x2FAD, 'M', u'靑'), - (0x2FAE, 'M', u'非'), - (0x2FAF, 'M', u'面'), - (0x2FB0, 'M', u'革'), - (0x2FB1, 'M', u'韋'), - (0x2FB2, 'M', u'韭'), - (0x2FB3, 'M', u'音'), - (0x2FB4, 'M', u'頁'), - (0x2FB5, 'M', u'風'), - (0x2FB6, 'M', u'飛'), - (0x2FB7, 'M', u'食'), - (0x2FB8, 'M', u'首'), - (0x2FB9, 'M', u'香'), - (0x2FBA, 'M', u'馬'), - (0x2FBB, 'M', u'骨'), - (0x2FBC, 'M', u'高'), - (0x2FBD, 'M', u'髟'), - (0x2FBE, 'M', u'鬥'), - (0x2FBF, 'M', u'鬯'), - (0x2FC0, 'M', u'鬲'), - (0x2FC1, 'M', u'鬼'), - (0x2FC2, 'M', u'魚'), - (0x2FC3, 'M', u'鳥'), - (0x2FC4, 'M', u'鹵'), - (0x2FC5, 'M', u'鹿'), - (0x2FC6, 'M', u'麥'), - (0x2FC7, 'M', u'麻'), - (0x2FC8, 'M', u'黃'), - (0x2FC9, 'M', u'黍'), - (0x2FCA, 'M', u'黑'), - (0x2FCB, 'M', u'黹'), - (0x2FCC, 'M', u'黽'), - (0x2FCD, 'M', u'鼎'), - (0x2FCE, 'M', u'鼓'), - (0x2FCF, 'M', u'鼠'), - (0x2FD0, 'M', u'鼻'), - (0x2FD1, 'M', u'齊'), - (0x2FD2, 'M', u'齒'), - (0x2FD3, 'M', u'龍'), - (0x2FD4, 'M', u'龜'), - (0x2FD5, 'M', u'龠'), - (0x2FD6, 'X'), - (0x3000, '3', u' '), - (0x3001, 'V'), - (0x3002, 'M', u'.'), - (0x3003, 'V'), - (0x3036, 'M', u'〒'), - (0x3037, 'V'), - (0x3038, 'M', u'十'), - (0x3039, 'M', u'卄'), - (0x303A, 'M', u'卅'), - (0x303B, 'V'), - (0x3040, 'X'), - (0x3041, 'V'), - (0x3097, 'X'), - (0x3099, 'V'), - (0x309B, '3', u' ゙'), - (0x309C, '3', u' ゚'), - (0x309D, 'V'), - (0x309F, 'M', u'より'), - (0x30A0, 'V'), - (0x30FF, 'M', u'コト'), - (0x3100, 'X'), - (0x3105, 'V'), - (0x3130, 'X'), - (0x3131, 'M', u'ᄀ'), - (0x3132, 'M', u'ᄁ'), - (0x3133, 'M', u'ᆪ'), - (0x3134, 'M', u'ᄂ'), - (0x3135, 'M', u'ᆬ'), - (0x3136, 'M', u'ᆭ'), - (0x3137, 'M', u'ᄃ'), - (0x3138, 'M', u'ᄄ'), - ] - -def _seg_29(): - return [ - (0x3139, 'M', u'ᄅ'), - (0x313A, 'M', u'ᆰ'), - (0x313B, 'M', u'ᆱ'), - (0x313C, 'M', u'ᆲ'), - (0x313D, 'M', u'ᆳ'), - (0x313E, 'M', u'ᆴ'), - (0x313F, 'M', u'ᆵ'), - (0x3140, 'M', u'ᄚ'), - (0x3141, 'M', u'ᄆ'), - (0x3142, 'M', u'ᄇ'), - (0x3143, 'M', u'ᄈ'), - (0x3144, 'M', u'ᄡ'), - (0x3145, 'M', u'ᄉ'), - (0x3146, 'M', u'ᄊ'), - (0x3147, 'M', u'ᄋ'), - (0x3148, 'M', u'ᄌ'), - (0x3149, 'M', u'ᄍ'), - (0x314A, 'M', u'ᄎ'), - (0x314B, 'M', u'ᄏ'), - (0x314C, 'M', u'ᄐ'), - (0x314D, 'M', u'ᄑ'), - (0x314E, 'M', u'ᄒ'), - (0x314F, 'M', u'ᅡ'), - (0x3150, 'M', u'ᅢ'), - (0x3151, 'M', u'ᅣ'), - (0x3152, 'M', u'ᅤ'), - (0x3153, 'M', u'ᅥ'), - (0x3154, 'M', u'ᅦ'), - (0x3155, 'M', u'ᅧ'), - (0x3156, 'M', u'ᅨ'), - (0x3157, 'M', u'ᅩ'), - (0x3158, 'M', u'ᅪ'), - (0x3159, 'M', u'ᅫ'), - (0x315A, 'M', u'ᅬ'), - (0x315B, 'M', u'ᅭ'), - (0x315C, 'M', u'ᅮ'), - (0x315D, 'M', u'ᅯ'), - (0x315E, 'M', u'ᅰ'), - (0x315F, 'M', u'ᅱ'), - (0x3160, 'M', u'ᅲ'), - (0x3161, 'M', u'ᅳ'), - (0x3162, 'M', u'ᅴ'), - (0x3163, 'M', u'ᅵ'), - (0x3164, 'X'), - (0x3165, 'M', u'ᄔ'), - (0x3166, 'M', u'ᄕ'), - (0x3167, 'M', u'ᇇ'), - (0x3168, 'M', u'ᇈ'), - (0x3169, 'M', u'ᇌ'), - (0x316A, 'M', u'ᇎ'), - (0x316B, 'M', u'ᇓ'), - (0x316C, 'M', u'ᇗ'), - (0x316D, 'M', u'ᇙ'), - (0x316E, 'M', u'ᄜ'), - (0x316F, 'M', u'ᇝ'), - (0x3170, 'M', u'ᇟ'), - (0x3171, 'M', u'ᄝ'), - (0x3172, 'M', u'ᄞ'), - (0x3173, 'M', u'ᄠ'), - (0x3174, 'M', u'ᄢ'), - (0x3175, 'M', u'ᄣ'), - (0x3176, 'M', u'ᄧ'), - (0x3177, 'M', u'ᄩ'), - (0x3178, 'M', u'ᄫ'), - (0x3179, 'M', u'ᄬ'), - (0x317A, 'M', u'ᄭ'), - (0x317B, 'M', u'ᄮ'), - (0x317C, 'M', u'ᄯ'), - (0x317D, 'M', u'ᄲ'), - (0x317E, 'M', u'ᄶ'), - (0x317F, 'M', u'ᅀ'), - (0x3180, 'M', u'ᅇ'), - (0x3181, 'M', u'ᅌ'), - (0x3182, 'M', u'ᇱ'), - (0x3183, 'M', u'ᇲ'), - (0x3184, 'M', u'ᅗ'), - (0x3185, 'M', u'ᅘ'), - (0x3186, 'M', u'ᅙ'), - (0x3187, 'M', u'ᆄ'), - (0x3188, 'M', u'ᆅ'), - (0x3189, 'M', u'ᆈ'), - (0x318A, 'M', u'ᆑ'), - (0x318B, 'M', u'ᆒ'), - (0x318C, 'M', u'ᆔ'), - (0x318D, 'M', u'ᆞ'), - (0x318E, 'M', u'ᆡ'), - (0x318F, 'X'), - (0x3190, 'V'), - (0x3192, 'M', u'一'), - (0x3193, 'M', u'二'), - (0x3194, 'M', u'三'), - (0x3195, 'M', u'四'), - (0x3196, 'M', u'上'), - (0x3197, 'M', u'中'), - (0x3198, 'M', u'下'), - (0x3199, 'M', u'甲'), - (0x319A, 'M', u'乙'), - (0x319B, 'M', u'丙'), - (0x319C, 'M', u'丁'), - (0x319D, 'M', u'天'), - ] - -def _seg_30(): - return [ - (0x319E, 'M', u'地'), - (0x319F, 'M', u'人'), - (0x31A0, 'V'), - (0x31BB, 'X'), - (0x31C0, 'V'), - (0x31E4, 'X'), - (0x31F0, 'V'), - (0x3200, '3', u'(ᄀ)'), - (0x3201, '3', u'(ᄂ)'), - (0x3202, '3', u'(ᄃ)'), - (0x3203, '3', u'(ᄅ)'), - (0x3204, '3', u'(ᄆ)'), - (0x3205, '3', u'(ᄇ)'), - (0x3206, '3', u'(ᄉ)'), - (0x3207, '3', u'(ᄋ)'), - (0x3208, '3', u'(ᄌ)'), - (0x3209, '3', u'(ᄎ)'), - (0x320A, '3', u'(ᄏ)'), - (0x320B, '3', u'(ᄐ)'), - (0x320C, '3', u'(ᄑ)'), - (0x320D, '3', u'(ᄒ)'), - (0x320E, '3', u'(가)'), - (0x320F, '3', u'(나)'), - (0x3210, '3', u'(다)'), - (0x3211, '3', u'(라)'), - (0x3212, '3', u'(마)'), - (0x3213, '3', u'(바)'), - (0x3214, '3', u'(사)'), - (0x3215, '3', u'(아)'), - (0x3216, '3', u'(자)'), - (0x3217, '3', u'(차)'), - (0x3218, '3', u'(카)'), - (0x3219, '3', u'(타)'), - (0x321A, '3', u'(파)'), - (0x321B, '3', u'(하)'), - (0x321C, '3', u'(주)'), - (0x321D, '3', u'(오전)'), - (0x321E, '3', u'(오후)'), - (0x321F, 'X'), - (0x3220, '3', u'(一)'), - (0x3221, '3', u'(二)'), - (0x3222, '3', u'(三)'), - (0x3223, '3', u'(四)'), - (0x3224, '3', u'(五)'), - (0x3225, '3', u'(六)'), - (0x3226, '3', u'(七)'), - (0x3227, '3', u'(八)'), - (0x3228, '3', u'(九)'), - (0x3229, '3', u'(十)'), - (0x322A, '3', u'(月)'), - (0x322B, '3', u'(火)'), - (0x322C, '3', u'(水)'), - (0x322D, '3', u'(木)'), - (0x322E, '3', u'(金)'), - (0x322F, '3', u'(土)'), - (0x3230, '3', u'(日)'), - (0x3231, '3', u'(株)'), - (0x3232, '3', u'(有)'), - (0x3233, '3', u'(社)'), - (0x3234, '3', u'(名)'), - (0x3235, '3', u'(特)'), - (0x3236, '3', u'(財)'), - (0x3237, '3', u'(祝)'), - (0x3238, '3', u'(労)'), - (0x3239, '3', u'(代)'), - (0x323A, '3', u'(呼)'), - (0x323B, '3', u'(学)'), - (0x323C, '3', u'(監)'), - (0x323D, '3', u'(企)'), - (0x323E, '3', u'(資)'), - (0x323F, '3', u'(協)'), - (0x3240, '3', u'(祭)'), - (0x3241, '3', u'(休)'), - (0x3242, '3', u'(自)'), - (0x3243, '3', u'(至)'), - (0x3244, 'M', u'問'), - (0x3245, 'M', u'幼'), - (0x3246, 'M', u'文'), - (0x3247, 'M', u'箏'), - (0x3248, 'V'), - (0x3250, 'M', u'pte'), - (0x3251, 'M', u'21'), - (0x3252, 'M', u'22'), - (0x3253, 'M', u'23'), - (0x3254, 'M', u'24'), - (0x3255, 'M', u'25'), - (0x3256, 'M', u'26'), - (0x3257, 'M', u'27'), - (0x3258, 'M', u'28'), - (0x3259, 'M', u'29'), - (0x325A, 'M', u'30'), - (0x325B, 'M', u'31'), - (0x325C, 'M', u'32'), - (0x325D, 'M', u'33'), - (0x325E, 'M', u'34'), - (0x325F, 'M', u'35'), - (0x3260, 'M', u'ᄀ'), - (0x3261, 'M', u'ᄂ'), - (0x3262, 'M', u'ᄃ'), - (0x3263, 'M', u'ᄅ'), - ] - -def _seg_31(): - return [ - (0x3264, 'M', u'ᄆ'), - (0x3265, 'M', u'ᄇ'), - (0x3266, 'M', u'ᄉ'), - (0x3267, 'M', u'ᄋ'), - (0x3268, 'M', u'ᄌ'), - (0x3269, 'M', u'ᄎ'), - (0x326A, 'M', u'ᄏ'), - (0x326B, 'M', u'ᄐ'), - (0x326C, 'M', u'ᄑ'), - (0x326D, 'M', u'ᄒ'), - (0x326E, 'M', u'가'), - (0x326F, 'M', u'나'), - (0x3270, 'M', u'다'), - (0x3271, 'M', u'라'), - (0x3272, 'M', u'마'), - (0x3273, 'M', u'바'), - (0x3274, 'M', u'사'), - (0x3275, 'M', u'아'), - (0x3276, 'M', u'자'), - (0x3277, 'M', u'차'), - (0x3278, 'M', u'카'), - (0x3279, 'M', u'타'), - (0x327A, 'M', u'파'), - (0x327B, 'M', u'하'), - (0x327C, 'M', u'참고'), - (0x327D, 'M', u'주의'), - (0x327E, 'M', u'우'), - (0x327F, 'V'), - (0x3280, 'M', u'一'), - (0x3281, 'M', u'二'), - (0x3282, 'M', u'三'), - (0x3283, 'M', u'四'), - (0x3284, 'M', u'五'), - (0x3285, 'M', u'六'), - (0x3286, 'M', u'七'), - (0x3287, 'M', u'八'), - (0x3288, 'M', u'九'), - (0x3289, 'M', u'十'), - (0x328A, 'M', u'月'), - (0x328B, 'M', u'火'), - (0x328C, 'M', u'水'), - (0x328D, 'M', u'木'), - (0x328E, 'M', u'金'), - (0x328F, 'M', u'土'), - (0x3290, 'M', u'日'), - (0x3291, 'M', u'株'), - (0x3292, 'M', u'有'), - (0x3293, 'M', u'社'), - (0x3294, 'M', u'名'), - (0x3295, 'M', u'特'), - (0x3296, 'M', u'財'), - (0x3297, 'M', u'祝'), - (0x3298, 'M', u'労'), - (0x3299, 'M', u'秘'), - (0x329A, 'M', u'男'), - (0x329B, 'M', u'女'), - (0x329C, 'M', u'適'), - (0x329D, 'M', u'優'), - (0x329E, 'M', u'印'), - (0x329F, 'M', u'注'), - (0x32A0, 'M', u'項'), - (0x32A1, 'M', u'休'), - (0x32A2, 'M', u'写'), - (0x32A3, 'M', u'正'), - (0x32A4, 'M', u'上'), - (0x32A5, 'M', u'中'), - (0x32A6, 'M', u'下'), - (0x32A7, 'M', u'左'), - (0x32A8, 'M', u'右'), - (0x32A9, 'M', u'医'), - (0x32AA, 'M', u'宗'), - (0x32AB, 'M', u'学'), - (0x32AC, 'M', u'監'), - (0x32AD, 'M', u'企'), - (0x32AE, 'M', u'資'), - (0x32AF, 'M', u'協'), - (0x32B0, 'M', u'夜'), - (0x32B1, 'M', u'36'), - (0x32B2, 'M', u'37'), - (0x32B3, 'M', u'38'), - (0x32B4, 'M', u'39'), - (0x32B5, 'M', u'40'), - (0x32B6, 'M', u'41'), - (0x32B7, 'M', u'42'), - (0x32B8, 'M', u'43'), - (0x32B9, 'M', u'44'), - (0x32BA, 'M', u'45'), - (0x32BB, 'M', u'46'), - (0x32BC, 'M', u'47'), - (0x32BD, 'M', u'48'), - (0x32BE, 'M', u'49'), - (0x32BF, 'M', u'50'), - (0x32C0, 'M', u'1月'), - (0x32C1, 'M', u'2月'), - (0x32C2, 'M', u'3月'), - (0x32C3, 'M', u'4月'), - (0x32C4, 'M', u'5月'), - (0x32C5, 'M', u'6月'), - (0x32C6, 'M', u'7月'), - (0x32C7, 'M', u'8月'), - ] - -def _seg_32(): - return [ - (0x32C8, 'M', u'9月'), - (0x32C9, 'M', u'10月'), - (0x32CA, 'M', u'11月'), - (0x32CB, 'M', u'12月'), - (0x32CC, 'M', u'hg'), - (0x32CD, 'M', u'erg'), - (0x32CE, 'M', u'ev'), - (0x32CF, 'M', u'ltd'), - (0x32D0, 'M', u'ア'), - (0x32D1, 'M', u'イ'), - (0x32D2, 'M', u'ウ'), - (0x32D3, 'M', u'エ'), - (0x32D4, 'M', u'オ'), - (0x32D5, 'M', u'カ'), - (0x32D6, 'M', u'キ'), - (0x32D7, 'M', u'ク'), - (0x32D8, 'M', u'ケ'), - (0x32D9, 'M', u'コ'), - (0x32DA, 'M', u'サ'), - (0x32DB, 'M', u'シ'), - (0x32DC, 'M', u'ス'), - (0x32DD, 'M', u'セ'), - (0x32DE, 'M', u'ソ'), - (0x32DF, 'M', u'タ'), - (0x32E0, 'M', u'チ'), - (0x32E1, 'M', u'ツ'), - (0x32E2, 'M', u'テ'), - (0x32E3, 'M', u'ト'), - (0x32E4, 'M', u'ナ'), - (0x32E5, 'M', u'ニ'), - (0x32E6, 'M', u'ヌ'), - (0x32E7, 'M', u'ネ'), - (0x32E8, 'M', u'ノ'), - (0x32E9, 'M', u'ハ'), - (0x32EA, 'M', u'ヒ'), - (0x32EB, 'M', u'フ'), - (0x32EC, 'M', u'ヘ'), - (0x32ED, 'M', u'ホ'), - (0x32EE, 'M', u'マ'), - (0x32EF, 'M', u'ミ'), - (0x32F0, 'M', u'ム'), - (0x32F1, 'M', u'メ'), - (0x32F2, 'M', u'モ'), - (0x32F3, 'M', u'ヤ'), - (0x32F4, 'M', u'ユ'), - (0x32F5, 'M', u'ヨ'), - (0x32F6, 'M', u'ラ'), - (0x32F7, 'M', u'リ'), - (0x32F8, 'M', u'ル'), - (0x32F9, 'M', u'レ'), - (0x32FA, 'M', u'ロ'), - (0x32FB, 'M', u'ワ'), - (0x32FC, 'M', u'ヰ'), - (0x32FD, 'M', u'ヱ'), - (0x32FE, 'M', u'ヲ'), - (0x32FF, 'X'), - (0x3300, 'M', u'アパート'), - (0x3301, 'M', u'アルファ'), - (0x3302, 'M', u'アンペア'), - (0x3303, 'M', u'アール'), - (0x3304, 'M', u'イニング'), - (0x3305, 'M', u'インチ'), - (0x3306, 'M', u'ウォン'), - (0x3307, 'M', u'エスクード'), - (0x3308, 'M', u'エーカー'), - (0x3309, 'M', u'オンス'), - (0x330A, 'M', u'オーム'), - (0x330B, 'M', u'カイリ'), - (0x330C, 'M', u'カラット'), - (0x330D, 'M', u'カロリー'), - (0x330E, 'M', u'ガロン'), - (0x330F, 'M', u'ガンマ'), - (0x3310, 'M', u'ギガ'), - (0x3311, 'M', u'ギニー'), - (0x3312, 'M', u'キュリー'), - (0x3313, 'M', u'ギルダー'), - (0x3314, 'M', u'キロ'), - (0x3315, 'M', u'キログラム'), - (0x3316, 'M', u'キロメートル'), - (0x3317, 'M', u'キロワット'), - (0x3318, 'M', u'グラム'), - (0x3319, 'M', u'グラムトン'), - (0x331A, 'M', u'クルゼイロ'), - (0x331B, 'M', u'クローネ'), - (0x331C, 'M', u'ケース'), - (0x331D, 'M', u'コルナ'), - (0x331E, 'M', u'コーポ'), - (0x331F, 'M', u'サイクル'), - (0x3320, 'M', u'サンチーム'), - (0x3321, 'M', u'シリング'), - (0x3322, 'M', u'センチ'), - (0x3323, 'M', u'セント'), - (0x3324, 'M', u'ダース'), - (0x3325, 'M', u'デシ'), - (0x3326, 'M', u'ドル'), - (0x3327, 'M', u'トン'), - (0x3328, 'M', u'ナノ'), - (0x3329, 'M', u'ノット'), - (0x332A, 'M', u'ハイツ'), - (0x332B, 'M', u'パーセント'), - ] - -def _seg_33(): - return [ - (0x332C, 'M', u'パーツ'), - (0x332D, 'M', u'バーレル'), - (0x332E, 'M', u'ピアストル'), - (0x332F, 'M', u'ピクル'), - (0x3330, 'M', u'ピコ'), - (0x3331, 'M', u'ビル'), - (0x3332, 'M', u'ファラッド'), - (0x3333, 'M', u'フィート'), - (0x3334, 'M', u'ブッシェル'), - (0x3335, 'M', u'フラン'), - (0x3336, 'M', u'ヘクタール'), - (0x3337, 'M', u'ペソ'), - (0x3338, 'M', u'ペニヒ'), - (0x3339, 'M', u'ヘルツ'), - (0x333A, 'M', u'ペンス'), - (0x333B, 'M', u'ページ'), - (0x333C, 'M', u'ベータ'), - (0x333D, 'M', u'ポイント'), - (0x333E, 'M', u'ボルト'), - (0x333F, 'M', u'ホン'), - (0x3340, 'M', u'ポンド'), - (0x3341, 'M', u'ホール'), - (0x3342, 'M', u'ホーン'), - (0x3343, 'M', u'マイクロ'), - (0x3344, 'M', u'マイル'), - (0x3345, 'M', u'マッハ'), - (0x3346, 'M', u'マルク'), - (0x3347, 'M', u'マンション'), - (0x3348, 'M', u'ミクロン'), - (0x3349, 'M', u'ミリ'), - (0x334A, 'M', u'ミリバール'), - (0x334B, 'M', u'メガ'), - (0x334C, 'M', u'メガトン'), - (0x334D, 'M', u'メートル'), - (0x334E, 'M', u'ヤード'), - (0x334F, 'M', u'ヤール'), - (0x3350, 'M', u'ユアン'), - (0x3351, 'M', u'リットル'), - (0x3352, 'M', u'リラ'), - (0x3353, 'M', u'ルピー'), - (0x3354, 'M', u'ルーブル'), - (0x3355, 'M', u'レム'), - (0x3356, 'M', u'レントゲン'), - (0x3357, 'M', u'ワット'), - (0x3358, 'M', u'0点'), - (0x3359, 'M', u'1点'), - (0x335A, 'M', u'2点'), - (0x335B, 'M', u'3点'), - (0x335C, 'M', u'4点'), - (0x335D, 'M', u'5点'), - (0x335E, 'M', u'6点'), - (0x335F, 'M', u'7点'), - (0x3360, 'M', u'8点'), - (0x3361, 'M', u'9点'), - (0x3362, 'M', u'10点'), - (0x3363, 'M', u'11点'), - (0x3364, 'M', u'12点'), - (0x3365, 'M', u'13点'), - (0x3366, 'M', u'14点'), - (0x3367, 'M', u'15点'), - (0x3368, 'M', u'16点'), - (0x3369, 'M', u'17点'), - (0x336A, 'M', u'18点'), - (0x336B, 'M', u'19点'), - (0x336C, 'M', u'20点'), - (0x336D, 'M', u'21点'), - (0x336E, 'M', u'22点'), - (0x336F, 'M', u'23点'), - (0x3370, 'M', u'24点'), - (0x3371, 'M', u'hpa'), - (0x3372, 'M', u'da'), - (0x3373, 'M', u'au'), - (0x3374, 'M', u'bar'), - (0x3375, 'M', u'ov'), - (0x3376, 'M', u'pc'), - (0x3377, 'M', u'dm'), - (0x3378, 'M', u'dm2'), - (0x3379, 'M', u'dm3'), - (0x337A, 'M', u'iu'), - (0x337B, 'M', u'平成'), - (0x337C, 'M', u'昭和'), - (0x337D, 'M', u'大正'), - (0x337E, 'M', u'明治'), - (0x337F, 'M', u'株式会社'), - (0x3380, 'M', u'pa'), - (0x3381, 'M', u'na'), - (0x3382, 'M', u'μa'), - (0x3383, 'M', u'ma'), - (0x3384, 'M', u'ka'), - (0x3385, 'M', u'kb'), - (0x3386, 'M', u'mb'), - (0x3387, 'M', u'gb'), - (0x3388, 'M', u'cal'), - (0x3389, 'M', u'kcal'), - (0x338A, 'M', u'pf'), - (0x338B, 'M', u'nf'), - (0x338C, 'M', u'μf'), - (0x338D, 'M', u'μg'), - (0x338E, 'M', u'mg'), - (0x338F, 'M', u'kg'), - ] - -def _seg_34(): - return [ - (0x3390, 'M', u'hz'), - (0x3391, 'M', u'khz'), - (0x3392, 'M', u'mhz'), - (0x3393, 'M', u'ghz'), - (0x3394, 'M', u'thz'), - (0x3395, 'M', u'μl'), - (0x3396, 'M', u'ml'), - (0x3397, 'M', u'dl'), - (0x3398, 'M', u'kl'), - (0x3399, 'M', u'fm'), - (0x339A, 'M', u'nm'), - (0x339B, 'M', u'μm'), - (0x339C, 'M', u'mm'), - (0x339D, 'M', u'cm'), - (0x339E, 'M', u'km'), - (0x339F, 'M', u'mm2'), - (0x33A0, 'M', u'cm2'), - (0x33A1, 'M', u'm2'), - (0x33A2, 'M', u'km2'), - (0x33A3, 'M', u'mm3'), - (0x33A4, 'M', u'cm3'), - (0x33A5, 'M', u'm3'), - (0x33A6, 'M', u'km3'), - (0x33A7, 'M', u'm∕s'), - (0x33A8, 'M', u'm∕s2'), - (0x33A9, 'M', u'pa'), - (0x33AA, 'M', u'kpa'), - (0x33AB, 'M', u'mpa'), - (0x33AC, 'M', u'gpa'), - (0x33AD, 'M', u'rad'), - (0x33AE, 'M', u'rad∕s'), - (0x33AF, 'M', u'rad∕s2'), - (0x33B0, 'M', u'ps'), - (0x33B1, 'M', u'ns'), - (0x33B2, 'M', u'μs'), - (0x33B3, 'M', u'ms'), - (0x33B4, 'M', u'pv'), - (0x33B5, 'M', u'nv'), - (0x33B6, 'M', u'μv'), - (0x33B7, 'M', u'mv'), - (0x33B8, 'M', u'kv'), - (0x33B9, 'M', u'mv'), - (0x33BA, 'M', u'pw'), - (0x33BB, 'M', u'nw'), - (0x33BC, 'M', u'μw'), - (0x33BD, 'M', u'mw'), - (0x33BE, 'M', u'kw'), - (0x33BF, 'M', u'mw'), - (0x33C0, 'M', u'kω'), - (0x33C1, 'M', u'mω'), - (0x33C2, 'X'), - (0x33C3, 'M', u'bq'), - (0x33C4, 'M', u'cc'), - (0x33C5, 'M', u'cd'), - (0x33C6, 'M', u'c∕kg'), - (0x33C7, 'X'), - (0x33C8, 'M', u'db'), - (0x33C9, 'M', u'gy'), - (0x33CA, 'M', u'ha'), - (0x33CB, 'M', u'hp'), - (0x33CC, 'M', u'in'), - (0x33CD, 'M', u'kk'), - (0x33CE, 'M', u'km'), - (0x33CF, 'M', u'kt'), - (0x33D0, 'M', u'lm'), - (0x33D1, 'M', u'ln'), - (0x33D2, 'M', u'log'), - (0x33D3, 'M', u'lx'), - (0x33D4, 'M', u'mb'), - (0x33D5, 'M', u'mil'), - (0x33D6, 'M', u'mol'), - (0x33D7, 'M', u'ph'), - (0x33D8, 'X'), - (0x33D9, 'M', u'ppm'), - (0x33DA, 'M', u'pr'), - (0x33DB, 'M', u'sr'), - (0x33DC, 'M', u'sv'), - (0x33DD, 'M', u'wb'), - (0x33DE, 'M', u'v∕m'), - (0x33DF, 'M', u'a∕m'), - (0x33E0, 'M', u'1日'), - (0x33E1, 'M', u'2日'), - (0x33E2, 'M', u'3日'), - (0x33E3, 'M', u'4日'), - (0x33E4, 'M', u'5日'), - (0x33E5, 'M', u'6日'), - (0x33E6, 'M', u'7日'), - (0x33E7, 'M', u'8日'), - (0x33E8, 'M', u'9日'), - (0x33E9, 'M', u'10日'), - (0x33EA, 'M', u'11日'), - (0x33EB, 'M', u'12日'), - (0x33EC, 'M', u'13日'), - (0x33ED, 'M', u'14日'), - (0x33EE, 'M', u'15日'), - (0x33EF, 'M', u'16日'), - (0x33F0, 'M', u'17日'), - (0x33F1, 'M', u'18日'), - (0x33F2, 'M', u'19日'), - (0x33F3, 'M', u'20日'), - ] - -def _seg_35(): - return [ - (0x33F4, 'M', u'21日'), - (0x33F5, 'M', u'22日'), - (0x33F6, 'M', u'23日'), - (0x33F7, 'M', u'24日'), - (0x33F8, 'M', u'25日'), - (0x33F9, 'M', u'26日'), - (0x33FA, 'M', u'27日'), - (0x33FB, 'M', u'28日'), - (0x33FC, 'M', u'29日'), - (0x33FD, 'M', u'30日'), - (0x33FE, 'M', u'31日'), - (0x33FF, 'M', u'gal'), - (0x3400, 'V'), - (0x4DB6, 'X'), - (0x4DC0, 'V'), - (0x9FF0, 'X'), - (0xA000, 'V'), - (0xA48D, 'X'), - (0xA490, 'V'), - (0xA4C7, 'X'), - (0xA4D0, 'V'), - (0xA62C, 'X'), - (0xA640, 'M', u'ꙁ'), - (0xA641, 'V'), - (0xA642, 'M', u'ꙃ'), - (0xA643, 'V'), - (0xA644, 'M', u'ꙅ'), - (0xA645, 'V'), - (0xA646, 'M', u'ꙇ'), - (0xA647, 'V'), - (0xA648, 'M', u'ꙉ'), - (0xA649, 'V'), - (0xA64A, 'M', u'ꙋ'), - (0xA64B, 'V'), - (0xA64C, 'M', u'ꙍ'), - (0xA64D, 'V'), - (0xA64E, 'M', u'ꙏ'), - (0xA64F, 'V'), - (0xA650, 'M', u'ꙑ'), - (0xA651, 'V'), - (0xA652, 'M', u'ꙓ'), - (0xA653, 'V'), - (0xA654, 'M', u'ꙕ'), - (0xA655, 'V'), - (0xA656, 'M', u'ꙗ'), - (0xA657, 'V'), - (0xA658, 'M', u'ꙙ'), - (0xA659, 'V'), - (0xA65A, 'M', u'ꙛ'), - (0xA65B, 'V'), - (0xA65C, 'M', u'ꙝ'), - (0xA65D, 'V'), - (0xA65E, 'M', u'ꙟ'), - (0xA65F, 'V'), - (0xA660, 'M', u'ꙡ'), - (0xA661, 'V'), - (0xA662, 'M', u'ꙣ'), - (0xA663, 'V'), - (0xA664, 'M', u'ꙥ'), - (0xA665, 'V'), - (0xA666, 'M', u'ꙧ'), - (0xA667, 'V'), - (0xA668, 'M', u'ꙩ'), - (0xA669, 'V'), - (0xA66A, 'M', u'ꙫ'), - (0xA66B, 'V'), - (0xA66C, 'M', u'ꙭ'), - (0xA66D, 'V'), - (0xA680, 'M', u'ꚁ'), - (0xA681, 'V'), - (0xA682, 'M', u'ꚃ'), - (0xA683, 'V'), - (0xA684, 'M', u'ꚅ'), - (0xA685, 'V'), - (0xA686, 'M', u'ꚇ'), - (0xA687, 'V'), - (0xA688, 'M', u'ꚉ'), - (0xA689, 'V'), - (0xA68A, 'M', u'ꚋ'), - (0xA68B, 'V'), - (0xA68C, 'M', u'ꚍ'), - (0xA68D, 'V'), - (0xA68E, 'M', u'ꚏ'), - (0xA68F, 'V'), - (0xA690, 'M', u'ꚑ'), - (0xA691, 'V'), - (0xA692, 'M', u'ꚓ'), - (0xA693, 'V'), - (0xA694, 'M', u'ꚕ'), - (0xA695, 'V'), - (0xA696, 'M', u'ꚗ'), - (0xA697, 'V'), - (0xA698, 'M', u'ꚙ'), - (0xA699, 'V'), - (0xA69A, 'M', u'ꚛ'), - (0xA69B, 'V'), - (0xA69C, 'M', u'ъ'), - (0xA69D, 'M', u'ь'), - (0xA69E, 'V'), - (0xA6F8, 'X'), - ] - -def _seg_36(): - return [ - (0xA700, 'V'), - (0xA722, 'M', u'ꜣ'), - (0xA723, 'V'), - (0xA724, 'M', u'ꜥ'), - (0xA725, 'V'), - (0xA726, 'M', u'ꜧ'), - (0xA727, 'V'), - (0xA728, 'M', u'ꜩ'), - (0xA729, 'V'), - (0xA72A, 'M', u'ꜫ'), - (0xA72B, 'V'), - (0xA72C, 'M', u'ꜭ'), - (0xA72D, 'V'), - (0xA72E, 'M', u'ꜯ'), - (0xA72F, 'V'), - (0xA732, 'M', u'ꜳ'), - (0xA733, 'V'), - (0xA734, 'M', u'ꜵ'), - (0xA735, 'V'), - (0xA736, 'M', u'ꜷ'), - (0xA737, 'V'), - (0xA738, 'M', u'ꜹ'), - (0xA739, 'V'), - (0xA73A, 'M', u'ꜻ'), - (0xA73B, 'V'), - (0xA73C, 'M', u'ꜽ'), - (0xA73D, 'V'), - (0xA73E, 'M', u'ꜿ'), - (0xA73F, 'V'), - (0xA740, 'M', u'ꝁ'), - (0xA741, 'V'), - (0xA742, 'M', u'ꝃ'), - (0xA743, 'V'), - (0xA744, 'M', u'ꝅ'), - (0xA745, 'V'), - (0xA746, 'M', u'ꝇ'), - (0xA747, 'V'), - (0xA748, 'M', u'ꝉ'), - (0xA749, 'V'), - (0xA74A, 'M', u'ꝋ'), - (0xA74B, 'V'), - (0xA74C, 'M', u'ꝍ'), - (0xA74D, 'V'), - (0xA74E, 'M', u'ꝏ'), - (0xA74F, 'V'), - (0xA750, 'M', u'ꝑ'), - (0xA751, 'V'), - (0xA752, 'M', u'ꝓ'), - (0xA753, 'V'), - (0xA754, 'M', u'ꝕ'), - (0xA755, 'V'), - (0xA756, 'M', u'ꝗ'), - (0xA757, 'V'), - (0xA758, 'M', u'ꝙ'), - (0xA759, 'V'), - (0xA75A, 'M', u'ꝛ'), - (0xA75B, 'V'), - (0xA75C, 'M', u'ꝝ'), - (0xA75D, 'V'), - (0xA75E, 'M', u'ꝟ'), - (0xA75F, 'V'), - (0xA760, 'M', u'ꝡ'), - (0xA761, 'V'), - (0xA762, 'M', u'ꝣ'), - (0xA763, 'V'), - (0xA764, 'M', u'ꝥ'), - (0xA765, 'V'), - (0xA766, 'M', u'ꝧ'), - (0xA767, 'V'), - (0xA768, 'M', u'ꝩ'), - (0xA769, 'V'), - (0xA76A, 'M', u'ꝫ'), - (0xA76B, 'V'), - (0xA76C, 'M', u'ꝭ'), - (0xA76D, 'V'), - (0xA76E, 'M', u'ꝯ'), - (0xA76F, 'V'), - (0xA770, 'M', u'ꝯ'), - (0xA771, 'V'), - (0xA779, 'M', u'ꝺ'), - (0xA77A, 'V'), - (0xA77B, 'M', u'ꝼ'), - (0xA77C, 'V'), - (0xA77D, 'M', u'ᵹ'), - (0xA77E, 'M', u'ꝿ'), - (0xA77F, 'V'), - (0xA780, 'M', u'ꞁ'), - (0xA781, 'V'), - (0xA782, 'M', u'ꞃ'), - (0xA783, 'V'), - (0xA784, 'M', u'ꞅ'), - (0xA785, 'V'), - (0xA786, 'M', u'ꞇ'), - (0xA787, 'V'), - (0xA78B, 'M', u'ꞌ'), - (0xA78C, 'V'), - (0xA78D, 'M', u'ɥ'), - (0xA78E, 'V'), - (0xA790, 'M', u'ꞑ'), - (0xA791, 'V'), - ] - -def _seg_37(): - return [ - (0xA792, 'M', u'ꞓ'), - (0xA793, 'V'), - (0xA796, 'M', u'ꞗ'), - (0xA797, 'V'), - (0xA798, 'M', u'ꞙ'), - (0xA799, 'V'), - (0xA79A, 'M', u'ꞛ'), - (0xA79B, 'V'), - (0xA79C, 'M', u'ꞝ'), - (0xA79D, 'V'), - (0xA79E, 'M', u'ꞟ'), - (0xA79F, 'V'), - (0xA7A0, 'M', u'ꞡ'), - (0xA7A1, 'V'), - (0xA7A2, 'M', u'ꞣ'), - (0xA7A3, 'V'), - (0xA7A4, 'M', u'ꞥ'), - (0xA7A5, 'V'), - (0xA7A6, 'M', u'ꞧ'), - (0xA7A7, 'V'), - (0xA7A8, 'M', u'ꞩ'), - (0xA7A9, 'V'), - (0xA7AA, 'M', u'ɦ'), - (0xA7AB, 'M', u'ɜ'), - (0xA7AC, 'M', u'ɡ'), - (0xA7AD, 'M', u'ɬ'), - (0xA7AE, 'M', u'ɪ'), - (0xA7AF, 'V'), - (0xA7B0, 'M', u'ʞ'), - (0xA7B1, 'M', u'ʇ'), - (0xA7B2, 'M', u'ʝ'), - (0xA7B3, 'M', u'ꭓ'), - (0xA7B4, 'M', u'ꞵ'), - (0xA7B5, 'V'), - (0xA7B6, 'M', u'ꞷ'), - (0xA7B7, 'V'), - (0xA7B8, 'X'), - (0xA7B9, 'V'), - (0xA7BA, 'X'), - (0xA7F7, 'V'), - (0xA7F8, 'M', u'ħ'), - (0xA7F9, 'M', u'œ'), - (0xA7FA, 'V'), - (0xA82C, 'X'), - (0xA830, 'V'), - (0xA83A, 'X'), - (0xA840, 'V'), - (0xA878, 'X'), - (0xA880, 'V'), - (0xA8C6, 'X'), - (0xA8CE, 'V'), - (0xA8DA, 'X'), - (0xA8E0, 'V'), - (0xA954, 'X'), - (0xA95F, 'V'), - (0xA97D, 'X'), - (0xA980, 'V'), - (0xA9CE, 'X'), - (0xA9CF, 'V'), - (0xA9DA, 'X'), - (0xA9DE, 'V'), - (0xA9FF, 'X'), - (0xAA00, 'V'), - (0xAA37, 'X'), - (0xAA40, 'V'), - (0xAA4E, 'X'), - (0xAA50, 'V'), - (0xAA5A, 'X'), - (0xAA5C, 'V'), - (0xAAC3, 'X'), - (0xAADB, 'V'), - (0xAAF7, 'X'), - (0xAB01, 'V'), - (0xAB07, 'X'), - (0xAB09, 'V'), - (0xAB0F, 'X'), - (0xAB11, 'V'), - (0xAB17, 'X'), - (0xAB20, 'V'), - (0xAB27, 'X'), - (0xAB28, 'V'), - (0xAB2F, 'X'), - (0xAB30, 'V'), - (0xAB5C, 'M', u'ꜧ'), - (0xAB5D, 'M', u'ꬷ'), - (0xAB5E, 'M', u'ɫ'), - (0xAB5F, 'M', u'ꭒ'), - (0xAB60, 'V'), - (0xAB66, 'X'), - (0xAB70, 'M', u'Ꭰ'), - (0xAB71, 'M', u'Ꭱ'), - (0xAB72, 'M', u'Ꭲ'), - (0xAB73, 'M', u'Ꭳ'), - (0xAB74, 'M', u'Ꭴ'), - (0xAB75, 'M', u'Ꭵ'), - (0xAB76, 'M', u'Ꭶ'), - (0xAB77, 'M', u'Ꭷ'), - (0xAB78, 'M', u'Ꭸ'), - (0xAB79, 'M', u'Ꭹ'), - (0xAB7A, 'M', u'Ꭺ'), - ] - -def _seg_38(): - return [ - (0xAB7B, 'M', u'Ꭻ'), - (0xAB7C, 'M', u'Ꭼ'), - (0xAB7D, 'M', u'Ꭽ'), - (0xAB7E, 'M', u'Ꭾ'), - (0xAB7F, 'M', u'Ꭿ'), - (0xAB80, 'M', u'Ꮀ'), - (0xAB81, 'M', u'Ꮁ'), - (0xAB82, 'M', u'Ꮂ'), - (0xAB83, 'M', u'Ꮃ'), - (0xAB84, 'M', u'Ꮄ'), - (0xAB85, 'M', u'Ꮅ'), - (0xAB86, 'M', u'Ꮆ'), - (0xAB87, 'M', u'Ꮇ'), - (0xAB88, 'M', u'Ꮈ'), - (0xAB89, 'M', u'Ꮉ'), - (0xAB8A, 'M', u'Ꮊ'), - (0xAB8B, 'M', u'Ꮋ'), - (0xAB8C, 'M', u'Ꮌ'), - (0xAB8D, 'M', u'Ꮍ'), - (0xAB8E, 'M', u'Ꮎ'), - (0xAB8F, 'M', u'Ꮏ'), - (0xAB90, 'M', u'Ꮐ'), - (0xAB91, 'M', u'Ꮑ'), - (0xAB92, 'M', u'Ꮒ'), - (0xAB93, 'M', u'Ꮓ'), - (0xAB94, 'M', u'Ꮔ'), - (0xAB95, 'M', u'Ꮕ'), - (0xAB96, 'M', u'Ꮖ'), - (0xAB97, 'M', u'Ꮗ'), - (0xAB98, 'M', u'Ꮘ'), - (0xAB99, 'M', u'Ꮙ'), - (0xAB9A, 'M', u'Ꮚ'), - (0xAB9B, 'M', u'Ꮛ'), - (0xAB9C, 'M', u'Ꮜ'), - (0xAB9D, 'M', u'Ꮝ'), - (0xAB9E, 'M', u'Ꮞ'), - (0xAB9F, 'M', u'Ꮟ'), - (0xABA0, 'M', u'Ꮠ'), - (0xABA1, 'M', u'Ꮡ'), - (0xABA2, 'M', u'Ꮢ'), - (0xABA3, 'M', u'Ꮣ'), - (0xABA4, 'M', u'Ꮤ'), - (0xABA5, 'M', u'Ꮥ'), - (0xABA6, 'M', u'Ꮦ'), - (0xABA7, 'M', u'Ꮧ'), - (0xABA8, 'M', u'Ꮨ'), - (0xABA9, 'M', u'Ꮩ'), - (0xABAA, 'M', u'Ꮪ'), - (0xABAB, 'M', u'Ꮫ'), - (0xABAC, 'M', u'Ꮬ'), - (0xABAD, 'M', u'Ꮭ'), - (0xABAE, 'M', u'Ꮮ'), - (0xABAF, 'M', u'Ꮯ'), - (0xABB0, 'M', u'Ꮰ'), - (0xABB1, 'M', u'Ꮱ'), - (0xABB2, 'M', u'Ꮲ'), - (0xABB3, 'M', u'Ꮳ'), - (0xABB4, 'M', u'Ꮴ'), - (0xABB5, 'M', u'Ꮵ'), - (0xABB6, 'M', u'Ꮶ'), - (0xABB7, 'M', u'Ꮷ'), - (0xABB8, 'M', u'Ꮸ'), - (0xABB9, 'M', u'Ꮹ'), - (0xABBA, 'M', u'Ꮺ'), - (0xABBB, 'M', u'Ꮻ'), - (0xABBC, 'M', u'Ꮼ'), - (0xABBD, 'M', u'Ꮽ'), - (0xABBE, 'M', u'Ꮾ'), - (0xABBF, 'M', u'Ꮿ'), - (0xABC0, 'V'), - (0xABEE, 'X'), - (0xABF0, 'V'), - (0xABFA, 'X'), - (0xAC00, 'V'), - (0xD7A4, 'X'), - (0xD7B0, 'V'), - (0xD7C7, 'X'), - (0xD7CB, 'V'), - (0xD7FC, 'X'), - (0xF900, 'M', u'豈'), - (0xF901, 'M', u'更'), - (0xF902, 'M', u'車'), - (0xF903, 'M', u'賈'), - (0xF904, 'M', u'滑'), - (0xF905, 'M', u'串'), - (0xF906, 'M', u'句'), - (0xF907, 'M', u'龜'), - (0xF909, 'M', u'契'), - (0xF90A, 'M', u'金'), - (0xF90B, 'M', u'喇'), - (0xF90C, 'M', u'奈'), - (0xF90D, 'M', u'懶'), - (0xF90E, 'M', u'癩'), - (0xF90F, 'M', u'羅'), - (0xF910, 'M', u'蘿'), - (0xF911, 'M', u'螺'), - (0xF912, 'M', u'裸'), - (0xF913, 'M', u'邏'), - (0xF914, 'M', u'樂'), - (0xF915, 'M', u'洛'), - ] - -def _seg_39(): - return [ - (0xF916, 'M', u'烙'), - (0xF917, 'M', u'珞'), - (0xF918, 'M', u'落'), - (0xF919, 'M', u'酪'), - (0xF91A, 'M', u'駱'), - (0xF91B, 'M', u'亂'), - (0xF91C, 'M', u'卵'), - (0xF91D, 'M', u'欄'), - (0xF91E, 'M', u'爛'), - (0xF91F, 'M', u'蘭'), - (0xF920, 'M', u'鸞'), - (0xF921, 'M', u'嵐'), - (0xF922, 'M', u'濫'), - (0xF923, 'M', u'藍'), - (0xF924, 'M', u'襤'), - (0xF925, 'M', u'拉'), - (0xF926, 'M', u'臘'), - (0xF927, 'M', u'蠟'), - (0xF928, 'M', u'廊'), - (0xF929, 'M', u'朗'), - (0xF92A, 'M', u'浪'), - (0xF92B, 'M', u'狼'), - (0xF92C, 'M', u'郎'), - (0xF92D, 'M', u'來'), - (0xF92E, 'M', u'冷'), - (0xF92F, 'M', u'勞'), - (0xF930, 'M', u'擄'), - (0xF931, 'M', u'櫓'), - (0xF932, 'M', u'爐'), - (0xF933, 'M', u'盧'), - (0xF934, 'M', u'老'), - (0xF935, 'M', u'蘆'), - (0xF936, 'M', u'虜'), - (0xF937, 'M', u'路'), - (0xF938, 'M', u'露'), - (0xF939, 'M', u'魯'), - (0xF93A, 'M', u'鷺'), - (0xF93B, 'M', u'碌'), - (0xF93C, 'M', u'祿'), - (0xF93D, 'M', u'綠'), - (0xF93E, 'M', u'菉'), - (0xF93F, 'M', u'錄'), - (0xF940, 'M', u'鹿'), - (0xF941, 'M', u'論'), - (0xF942, 'M', u'壟'), - (0xF943, 'M', u'弄'), - (0xF944, 'M', u'籠'), - (0xF945, 'M', u'聾'), - (0xF946, 'M', u'牢'), - (0xF947, 'M', u'磊'), - (0xF948, 'M', u'賂'), - (0xF949, 'M', u'雷'), - (0xF94A, 'M', u'壘'), - (0xF94B, 'M', u'屢'), - (0xF94C, 'M', u'樓'), - (0xF94D, 'M', u'淚'), - (0xF94E, 'M', u'漏'), - (0xF94F, 'M', u'累'), - (0xF950, 'M', u'縷'), - (0xF951, 'M', u'陋'), - (0xF952, 'M', u'勒'), - (0xF953, 'M', u'肋'), - (0xF954, 'M', u'凜'), - (0xF955, 'M', u'凌'), - (0xF956, 'M', u'稜'), - (0xF957, 'M', u'綾'), - (0xF958, 'M', u'菱'), - (0xF959, 'M', u'陵'), - (0xF95A, 'M', u'讀'), - (0xF95B, 'M', u'拏'), - (0xF95C, 'M', u'樂'), - (0xF95D, 'M', u'諾'), - (0xF95E, 'M', u'丹'), - (0xF95F, 'M', u'寧'), - (0xF960, 'M', u'怒'), - (0xF961, 'M', u'率'), - (0xF962, 'M', u'異'), - (0xF963, 'M', u'北'), - (0xF964, 'M', u'磻'), - (0xF965, 'M', u'便'), - (0xF966, 'M', u'復'), - (0xF967, 'M', u'不'), - (0xF968, 'M', u'泌'), - (0xF969, 'M', u'數'), - (0xF96A, 'M', u'索'), - (0xF96B, 'M', u'參'), - (0xF96C, 'M', u'塞'), - (0xF96D, 'M', u'省'), - (0xF96E, 'M', u'葉'), - (0xF96F, 'M', u'說'), - (0xF970, 'M', u'殺'), - (0xF971, 'M', u'辰'), - (0xF972, 'M', u'沈'), - (0xF973, 'M', u'拾'), - (0xF974, 'M', u'若'), - (0xF975, 'M', u'掠'), - (0xF976, 'M', u'略'), - (0xF977, 'M', u'亮'), - (0xF978, 'M', u'兩'), - (0xF979, 'M', u'凉'), - ] - -def _seg_40(): - return [ - (0xF97A, 'M', u'梁'), - (0xF97B, 'M', u'糧'), - (0xF97C, 'M', u'良'), - (0xF97D, 'M', u'諒'), - (0xF97E, 'M', u'量'), - (0xF97F, 'M', u'勵'), - (0xF980, 'M', u'呂'), - (0xF981, 'M', u'女'), - (0xF982, 'M', u'廬'), - (0xF983, 'M', u'旅'), - (0xF984, 'M', u'濾'), - (0xF985, 'M', u'礪'), - (0xF986, 'M', u'閭'), - (0xF987, 'M', u'驪'), - (0xF988, 'M', u'麗'), - (0xF989, 'M', u'黎'), - (0xF98A, 'M', u'力'), - (0xF98B, 'M', u'曆'), - (0xF98C, 'M', u'歷'), - (0xF98D, 'M', u'轢'), - (0xF98E, 'M', u'年'), - (0xF98F, 'M', u'憐'), - (0xF990, 'M', u'戀'), - (0xF991, 'M', u'撚'), - (0xF992, 'M', u'漣'), - (0xF993, 'M', u'煉'), - (0xF994, 'M', u'璉'), - (0xF995, 'M', u'秊'), - (0xF996, 'M', u'練'), - (0xF997, 'M', u'聯'), - (0xF998, 'M', u'輦'), - (0xF999, 'M', u'蓮'), - (0xF99A, 'M', u'連'), - (0xF99B, 'M', u'鍊'), - (0xF99C, 'M', u'列'), - (0xF99D, 'M', u'劣'), - (0xF99E, 'M', u'咽'), - (0xF99F, 'M', u'烈'), - (0xF9A0, 'M', u'裂'), - (0xF9A1, 'M', u'說'), - (0xF9A2, 'M', u'廉'), - (0xF9A3, 'M', u'念'), - (0xF9A4, 'M', u'捻'), - (0xF9A5, 'M', u'殮'), - (0xF9A6, 'M', u'簾'), - (0xF9A7, 'M', u'獵'), - (0xF9A8, 'M', u'令'), - (0xF9A9, 'M', u'囹'), - (0xF9AA, 'M', u'寧'), - (0xF9AB, 'M', u'嶺'), - (0xF9AC, 'M', u'怜'), - (0xF9AD, 'M', u'玲'), - (0xF9AE, 'M', u'瑩'), - (0xF9AF, 'M', u'羚'), - (0xF9B0, 'M', u'聆'), - (0xF9B1, 'M', u'鈴'), - (0xF9B2, 'M', u'零'), - (0xF9B3, 'M', u'靈'), - (0xF9B4, 'M', u'領'), - (0xF9B5, 'M', u'例'), - (0xF9B6, 'M', u'禮'), - (0xF9B7, 'M', u'醴'), - (0xF9B8, 'M', u'隸'), - (0xF9B9, 'M', u'惡'), - (0xF9BA, 'M', u'了'), - (0xF9BB, 'M', u'僚'), - (0xF9BC, 'M', u'寮'), - (0xF9BD, 'M', u'尿'), - (0xF9BE, 'M', u'料'), - (0xF9BF, 'M', u'樂'), - (0xF9C0, 'M', u'燎'), - (0xF9C1, 'M', u'療'), - (0xF9C2, 'M', u'蓼'), - (0xF9C3, 'M', u'遼'), - (0xF9C4, 'M', u'龍'), - (0xF9C5, 'M', u'暈'), - (0xF9C6, 'M', u'阮'), - (0xF9C7, 'M', u'劉'), - (0xF9C8, 'M', u'杻'), - (0xF9C9, 'M', u'柳'), - (0xF9CA, 'M', u'流'), - (0xF9CB, 'M', u'溜'), - (0xF9CC, 'M', u'琉'), - (0xF9CD, 'M', u'留'), - (0xF9CE, 'M', u'硫'), - (0xF9CF, 'M', u'紐'), - (0xF9D0, 'M', u'類'), - (0xF9D1, 'M', u'六'), - (0xF9D2, 'M', u'戮'), - (0xF9D3, 'M', u'陸'), - (0xF9D4, 'M', u'倫'), - (0xF9D5, 'M', u'崙'), - (0xF9D6, 'M', u'淪'), - (0xF9D7, 'M', u'輪'), - (0xF9D8, 'M', u'律'), - (0xF9D9, 'M', u'慄'), - (0xF9DA, 'M', u'栗'), - (0xF9DB, 'M', u'率'), - (0xF9DC, 'M', u'隆'), - (0xF9DD, 'M', u'利'), - ] - -def _seg_41(): - return [ - (0xF9DE, 'M', u'吏'), - (0xF9DF, 'M', u'履'), - (0xF9E0, 'M', u'易'), - (0xF9E1, 'M', u'李'), - (0xF9E2, 'M', u'梨'), - (0xF9E3, 'M', u'泥'), - (0xF9E4, 'M', u'理'), - (0xF9E5, 'M', u'痢'), - (0xF9E6, 'M', u'罹'), - (0xF9E7, 'M', u'裏'), - (0xF9E8, 'M', u'裡'), - (0xF9E9, 'M', u'里'), - (0xF9EA, 'M', u'離'), - (0xF9EB, 'M', u'匿'), - (0xF9EC, 'M', u'溺'), - (0xF9ED, 'M', u'吝'), - (0xF9EE, 'M', u'燐'), - (0xF9EF, 'M', u'璘'), - (0xF9F0, 'M', u'藺'), - (0xF9F1, 'M', u'隣'), - (0xF9F2, 'M', u'鱗'), - (0xF9F3, 'M', u'麟'), - (0xF9F4, 'M', u'林'), - (0xF9F5, 'M', u'淋'), - (0xF9F6, 'M', u'臨'), - (0xF9F7, 'M', u'立'), - (0xF9F8, 'M', u'笠'), - (0xF9F9, 'M', u'粒'), - (0xF9FA, 'M', u'狀'), - (0xF9FB, 'M', u'炙'), - (0xF9FC, 'M', u'識'), - (0xF9FD, 'M', u'什'), - (0xF9FE, 'M', u'茶'), - (0xF9FF, 'M', u'刺'), - (0xFA00, 'M', u'切'), - (0xFA01, 'M', u'度'), - (0xFA02, 'M', u'拓'), - (0xFA03, 'M', u'糖'), - (0xFA04, 'M', u'宅'), - (0xFA05, 'M', u'洞'), - (0xFA06, 'M', u'暴'), - (0xFA07, 'M', u'輻'), - (0xFA08, 'M', u'行'), - (0xFA09, 'M', u'降'), - (0xFA0A, 'M', u'見'), - (0xFA0B, 'M', u'廓'), - (0xFA0C, 'M', u'兀'), - (0xFA0D, 'M', u'嗀'), - (0xFA0E, 'V'), - (0xFA10, 'M', u'塚'), - (0xFA11, 'V'), - (0xFA12, 'M', u'晴'), - (0xFA13, 'V'), - (0xFA15, 'M', u'凞'), - (0xFA16, 'M', u'猪'), - (0xFA17, 'M', u'益'), - (0xFA18, 'M', u'礼'), - (0xFA19, 'M', u'神'), - (0xFA1A, 'M', u'祥'), - (0xFA1B, 'M', u'福'), - (0xFA1C, 'M', u'靖'), - (0xFA1D, 'M', u'精'), - (0xFA1E, 'M', u'羽'), - (0xFA1F, 'V'), - (0xFA20, 'M', u'蘒'), - (0xFA21, 'V'), - (0xFA22, 'M', u'諸'), - (0xFA23, 'V'), - (0xFA25, 'M', u'逸'), - (0xFA26, 'M', u'都'), - (0xFA27, 'V'), - (0xFA2A, 'M', u'飯'), - (0xFA2B, 'M', u'飼'), - (0xFA2C, 'M', u'館'), - (0xFA2D, 'M', u'鶴'), - (0xFA2E, 'M', u'郞'), - (0xFA2F, 'M', u'隷'), - (0xFA30, 'M', u'侮'), - (0xFA31, 'M', u'僧'), - (0xFA32, 'M', u'免'), - (0xFA33, 'M', u'勉'), - (0xFA34, 'M', u'勤'), - (0xFA35, 'M', u'卑'), - (0xFA36, 'M', u'喝'), - (0xFA37, 'M', u'嘆'), - (0xFA38, 'M', u'器'), - (0xFA39, 'M', u'塀'), - (0xFA3A, 'M', u'墨'), - (0xFA3B, 'M', u'層'), - (0xFA3C, 'M', u'屮'), - (0xFA3D, 'M', u'悔'), - (0xFA3E, 'M', u'慨'), - (0xFA3F, 'M', u'憎'), - (0xFA40, 'M', u'懲'), - (0xFA41, 'M', u'敏'), - (0xFA42, 'M', u'既'), - (0xFA43, 'M', u'暑'), - (0xFA44, 'M', u'梅'), - (0xFA45, 'M', u'海'), - (0xFA46, 'M', u'渚'), - ] - -def _seg_42(): - return [ - (0xFA47, 'M', u'漢'), - (0xFA48, 'M', u'煮'), - (0xFA49, 'M', u'爫'), - (0xFA4A, 'M', u'琢'), - (0xFA4B, 'M', u'碑'), - (0xFA4C, 'M', u'社'), - (0xFA4D, 'M', u'祉'), - (0xFA4E, 'M', u'祈'), - (0xFA4F, 'M', u'祐'), - (0xFA50, 'M', u'祖'), - (0xFA51, 'M', u'祝'), - (0xFA52, 'M', u'禍'), - (0xFA53, 'M', u'禎'), - (0xFA54, 'M', u'穀'), - (0xFA55, 'M', u'突'), - (0xFA56, 'M', u'節'), - (0xFA57, 'M', u'練'), - (0xFA58, 'M', u'縉'), - (0xFA59, 'M', u'繁'), - (0xFA5A, 'M', u'署'), - (0xFA5B, 'M', u'者'), - (0xFA5C, 'M', u'臭'), - (0xFA5D, 'M', u'艹'), - (0xFA5F, 'M', u'著'), - (0xFA60, 'M', u'褐'), - (0xFA61, 'M', u'視'), - (0xFA62, 'M', u'謁'), - (0xFA63, 'M', u'謹'), - (0xFA64, 'M', u'賓'), - (0xFA65, 'M', u'贈'), - (0xFA66, 'M', u'辶'), - (0xFA67, 'M', u'逸'), - (0xFA68, 'M', u'難'), - (0xFA69, 'M', u'響'), - (0xFA6A, 'M', u'頻'), - (0xFA6B, 'M', u'恵'), - (0xFA6C, 'M', u'𤋮'), - (0xFA6D, 'M', u'舘'), - (0xFA6E, 'X'), - (0xFA70, 'M', u'並'), - (0xFA71, 'M', u'况'), - (0xFA72, 'M', u'全'), - (0xFA73, 'M', u'侀'), - (0xFA74, 'M', u'充'), - (0xFA75, 'M', u'冀'), - (0xFA76, 'M', u'勇'), - (0xFA77, 'M', u'勺'), - (0xFA78, 'M', u'喝'), - (0xFA79, 'M', u'啕'), - (0xFA7A, 'M', u'喙'), - (0xFA7B, 'M', u'嗢'), - (0xFA7C, 'M', u'塚'), - (0xFA7D, 'M', u'墳'), - (0xFA7E, 'M', u'奄'), - (0xFA7F, 'M', u'奔'), - (0xFA80, 'M', u'婢'), - (0xFA81, 'M', u'嬨'), - (0xFA82, 'M', u'廒'), - (0xFA83, 'M', u'廙'), - (0xFA84, 'M', u'彩'), - (0xFA85, 'M', u'徭'), - (0xFA86, 'M', u'惘'), - (0xFA87, 'M', u'慎'), - (0xFA88, 'M', u'愈'), - (0xFA89, 'M', u'憎'), - (0xFA8A, 'M', u'慠'), - (0xFA8B, 'M', u'懲'), - (0xFA8C, 'M', u'戴'), - (0xFA8D, 'M', u'揄'), - (0xFA8E, 'M', u'搜'), - (0xFA8F, 'M', u'摒'), - (0xFA90, 'M', u'敖'), - (0xFA91, 'M', u'晴'), - (0xFA92, 'M', u'朗'), - (0xFA93, 'M', u'望'), - (0xFA94, 'M', u'杖'), - (0xFA95, 'M', u'歹'), - (0xFA96, 'M', u'殺'), - (0xFA97, 'M', u'流'), - (0xFA98, 'M', u'滛'), - (0xFA99, 'M', u'滋'), - (0xFA9A, 'M', u'漢'), - (0xFA9B, 'M', u'瀞'), - (0xFA9C, 'M', u'煮'), - (0xFA9D, 'M', u'瞧'), - (0xFA9E, 'M', u'爵'), - (0xFA9F, 'M', u'犯'), - (0xFAA0, 'M', u'猪'), - (0xFAA1, 'M', u'瑱'), - (0xFAA2, 'M', u'甆'), - (0xFAA3, 'M', u'画'), - (0xFAA4, 'M', u'瘝'), - (0xFAA5, 'M', u'瘟'), - (0xFAA6, 'M', u'益'), - (0xFAA7, 'M', u'盛'), - (0xFAA8, 'M', u'直'), - (0xFAA9, 'M', u'睊'), - (0xFAAA, 'M', u'着'), - (0xFAAB, 'M', u'磌'), - (0xFAAC, 'M', u'窱'), - ] - -def _seg_43(): - return [ - (0xFAAD, 'M', u'節'), - (0xFAAE, 'M', u'类'), - (0xFAAF, 'M', u'絛'), - (0xFAB0, 'M', u'練'), - (0xFAB1, 'M', u'缾'), - (0xFAB2, 'M', u'者'), - (0xFAB3, 'M', u'荒'), - (0xFAB4, 'M', u'華'), - (0xFAB5, 'M', u'蝹'), - (0xFAB6, 'M', u'襁'), - (0xFAB7, 'M', u'覆'), - (0xFAB8, 'M', u'視'), - (0xFAB9, 'M', u'調'), - (0xFABA, 'M', u'諸'), - (0xFABB, 'M', u'請'), - (0xFABC, 'M', u'謁'), - (0xFABD, 'M', u'諾'), - (0xFABE, 'M', u'諭'), - (0xFABF, 'M', u'謹'), - (0xFAC0, 'M', u'變'), - (0xFAC1, 'M', u'贈'), - (0xFAC2, 'M', u'輸'), - (0xFAC3, 'M', u'遲'), - (0xFAC4, 'M', u'醙'), - (0xFAC5, 'M', u'鉶'), - (0xFAC6, 'M', u'陼'), - (0xFAC7, 'M', u'難'), - (0xFAC8, 'M', u'靖'), - (0xFAC9, 'M', u'韛'), - (0xFACA, 'M', u'響'), - (0xFACB, 'M', u'頋'), - (0xFACC, 'M', u'頻'), - (0xFACD, 'M', u'鬒'), - (0xFACE, 'M', u'龜'), - (0xFACF, 'M', u'𢡊'), - (0xFAD0, 'M', u'𢡄'), - (0xFAD1, 'M', u'𣏕'), - (0xFAD2, 'M', u'㮝'), - (0xFAD3, 'M', u'䀘'), - (0xFAD4, 'M', u'䀹'), - (0xFAD5, 'M', u'𥉉'), - (0xFAD6, 'M', u'𥳐'), - (0xFAD7, 'M', u'𧻓'), - (0xFAD8, 'M', u'齃'), - (0xFAD9, 'M', u'龎'), - (0xFADA, 'X'), - (0xFB00, 'M', u'ff'), - (0xFB01, 'M', u'fi'), - (0xFB02, 'M', u'fl'), - (0xFB03, 'M', u'ffi'), - (0xFB04, 'M', u'ffl'), - (0xFB05, 'M', u'st'), - (0xFB07, 'X'), - (0xFB13, 'M', u'մն'), - (0xFB14, 'M', u'մե'), - (0xFB15, 'M', u'մի'), - (0xFB16, 'M', u'վն'), - (0xFB17, 'M', u'մխ'), - (0xFB18, 'X'), - (0xFB1D, 'M', u'יִ'), - (0xFB1E, 'V'), - (0xFB1F, 'M', u'ײַ'), - (0xFB20, 'M', u'ע'), - (0xFB21, 'M', u'א'), - (0xFB22, 'M', u'ד'), - (0xFB23, 'M', u'ה'), - (0xFB24, 'M', u'כ'), - (0xFB25, 'M', u'ל'), - (0xFB26, 'M', u'ם'), - (0xFB27, 'M', u'ר'), - (0xFB28, 'M', u'ת'), - (0xFB29, '3', u'+'), - (0xFB2A, 'M', u'שׁ'), - (0xFB2B, 'M', u'שׂ'), - (0xFB2C, 'M', u'שּׁ'), - (0xFB2D, 'M', u'שּׂ'), - (0xFB2E, 'M', u'אַ'), - (0xFB2F, 'M', u'אָ'), - (0xFB30, 'M', u'אּ'), - (0xFB31, 'M', u'בּ'), - (0xFB32, 'M', u'גּ'), - (0xFB33, 'M', u'דּ'), - (0xFB34, 'M', u'הּ'), - (0xFB35, 'M', u'וּ'), - (0xFB36, 'M', u'זּ'), - (0xFB37, 'X'), - (0xFB38, 'M', u'טּ'), - (0xFB39, 'M', u'יּ'), - (0xFB3A, 'M', u'ךּ'), - (0xFB3B, 'M', u'כּ'), - (0xFB3C, 'M', u'לּ'), - (0xFB3D, 'X'), - (0xFB3E, 'M', u'מּ'), - (0xFB3F, 'X'), - (0xFB40, 'M', u'נּ'), - (0xFB41, 'M', u'סּ'), - (0xFB42, 'X'), - (0xFB43, 'M', u'ףּ'), - (0xFB44, 'M', u'פּ'), - (0xFB45, 'X'), - ] - -def _seg_44(): - return [ - (0xFB46, 'M', u'צּ'), - (0xFB47, 'M', u'קּ'), - (0xFB48, 'M', u'רּ'), - (0xFB49, 'M', u'שּ'), - (0xFB4A, 'M', u'תּ'), - (0xFB4B, 'M', u'וֹ'), - (0xFB4C, 'M', u'בֿ'), - (0xFB4D, 'M', u'כֿ'), - (0xFB4E, 'M', u'פֿ'), - (0xFB4F, 'M', u'אל'), - (0xFB50, 'M', u'ٱ'), - (0xFB52, 'M', u'ٻ'), - (0xFB56, 'M', u'پ'), - (0xFB5A, 'M', u'ڀ'), - (0xFB5E, 'M', u'ٺ'), - (0xFB62, 'M', u'ٿ'), - (0xFB66, 'M', u'ٹ'), - (0xFB6A, 'M', u'ڤ'), - (0xFB6E, 'M', u'ڦ'), - (0xFB72, 'M', u'ڄ'), - (0xFB76, 'M', u'ڃ'), - (0xFB7A, 'M', u'چ'), - (0xFB7E, 'M', u'ڇ'), - (0xFB82, 'M', u'ڍ'), - (0xFB84, 'M', u'ڌ'), - (0xFB86, 'M', u'ڎ'), - (0xFB88, 'M', u'ڈ'), - (0xFB8A, 'M', u'ژ'), - (0xFB8C, 'M', u'ڑ'), - (0xFB8E, 'M', u'ک'), - (0xFB92, 'M', u'گ'), - (0xFB96, 'M', u'ڳ'), - (0xFB9A, 'M', u'ڱ'), - (0xFB9E, 'M', u'ں'), - (0xFBA0, 'M', u'ڻ'), - (0xFBA4, 'M', u'ۀ'), - (0xFBA6, 'M', u'ہ'), - (0xFBAA, 'M', u'ھ'), - (0xFBAE, 'M', u'ے'), - (0xFBB0, 'M', u'ۓ'), - (0xFBB2, 'V'), - (0xFBC2, 'X'), - (0xFBD3, 'M', u'ڭ'), - (0xFBD7, 'M', u'ۇ'), - (0xFBD9, 'M', u'ۆ'), - (0xFBDB, 'M', u'ۈ'), - (0xFBDD, 'M', u'ۇٴ'), - (0xFBDE, 'M', u'ۋ'), - (0xFBE0, 'M', u'ۅ'), - (0xFBE2, 'M', u'ۉ'), - (0xFBE4, 'M', u'ې'), - (0xFBE8, 'M', u'ى'), - (0xFBEA, 'M', u'ئا'), - (0xFBEC, 'M', u'ئە'), - (0xFBEE, 'M', u'ئو'), - (0xFBF0, 'M', u'ئۇ'), - (0xFBF2, 'M', u'ئۆ'), - (0xFBF4, 'M', u'ئۈ'), - (0xFBF6, 'M', u'ئې'), - (0xFBF9, 'M', u'ئى'), - (0xFBFC, 'M', u'ی'), - (0xFC00, 'M', u'ئج'), - (0xFC01, 'M', u'ئح'), - (0xFC02, 'M', u'ئم'), - (0xFC03, 'M', u'ئى'), - (0xFC04, 'M', u'ئي'), - (0xFC05, 'M', u'بج'), - (0xFC06, 'M', u'بح'), - (0xFC07, 'M', u'بخ'), - (0xFC08, 'M', u'بم'), - (0xFC09, 'M', u'بى'), - (0xFC0A, 'M', u'بي'), - (0xFC0B, 'M', u'تج'), - (0xFC0C, 'M', u'تح'), - (0xFC0D, 'M', u'تخ'), - (0xFC0E, 'M', u'تم'), - (0xFC0F, 'M', u'تى'), - (0xFC10, 'M', u'تي'), - (0xFC11, 'M', u'ثج'), - (0xFC12, 'M', u'ثم'), - (0xFC13, 'M', u'ثى'), - (0xFC14, 'M', u'ثي'), - (0xFC15, 'M', u'جح'), - (0xFC16, 'M', u'جم'), - (0xFC17, 'M', u'حج'), - (0xFC18, 'M', u'حم'), - (0xFC19, 'M', u'خج'), - (0xFC1A, 'M', u'خح'), - (0xFC1B, 'M', u'خم'), - (0xFC1C, 'M', u'سج'), - (0xFC1D, 'M', u'سح'), - (0xFC1E, 'M', u'سخ'), - (0xFC1F, 'M', u'سم'), - (0xFC20, 'M', u'صح'), - (0xFC21, 'M', u'صم'), - (0xFC22, 'M', u'ضج'), - (0xFC23, 'M', u'ضح'), - (0xFC24, 'M', u'ضخ'), - (0xFC25, 'M', u'ضم'), - (0xFC26, 'M', u'طح'), - ] - -def _seg_45(): - return [ - (0xFC27, 'M', u'طم'), - (0xFC28, 'M', u'ظم'), - (0xFC29, 'M', u'عج'), - (0xFC2A, 'M', u'عم'), - (0xFC2B, 'M', u'غج'), - (0xFC2C, 'M', u'غم'), - (0xFC2D, 'M', u'فج'), - (0xFC2E, 'M', u'فح'), - (0xFC2F, 'M', u'فخ'), - (0xFC30, 'M', u'فم'), - (0xFC31, 'M', u'فى'), - (0xFC32, 'M', u'في'), - (0xFC33, 'M', u'قح'), - (0xFC34, 'M', u'قم'), - (0xFC35, 'M', u'قى'), - (0xFC36, 'M', u'قي'), - (0xFC37, 'M', u'كا'), - (0xFC38, 'M', u'كج'), - (0xFC39, 'M', u'كح'), - (0xFC3A, 'M', u'كخ'), - (0xFC3B, 'M', u'كل'), - (0xFC3C, 'M', u'كم'), - (0xFC3D, 'M', u'كى'), - (0xFC3E, 'M', u'كي'), - (0xFC3F, 'M', u'لج'), - (0xFC40, 'M', u'لح'), - (0xFC41, 'M', u'لخ'), - (0xFC42, 'M', u'لم'), - (0xFC43, 'M', u'لى'), - (0xFC44, 'M', u'لي'), - (0xFC45, 'M', u'مج'), - (0xFC46, 'M', u'مح'), - (0xFC47, 'M', u'مخ'), - (0xFC48, 'M', u'مم'), - (0xFC49, 'M', u'مى'), - (0xFC4A, 'M', u'مي'), - (0xFC4B, 'M', u'نج'), - (0xFC4C, 'M', u'نح'), - (0xFC4D, 'M', u'نخ'), - (0xFC4E, 'M', u'نم'), - (0xFC4F, 'M', u'نى'), - (0xFC50, 'M', u'ني'), - (0xFC51, 'M', u'هج'), - (0xFC52, 'M', u'هم'), - (0xFC53, 'M', u'هى'), - (0xFC54, 'M', u'هي'), - (0xFC55, 'M', u'يج'), - (0xFC56, 'M', u'يح'), - (0xFC57, 'M', u'يخ'), - (0xFC58, 'M', u'يم'), - (0xFC59, 'M', u'يى'), - (0xFC5A, 'M', u'يي'), - (0xFC5B, 'M', u'ذٰ'), - (0xFC5C, 'M', u'رٰ'), - (0xFC5D, 'M', u'ىٰ'), - (0xFC5E, '3', u' ٌّ'), - (0xFC5F, '3', u' ٍّ'), - (0xFC60, '3', u' َّ'), - (0xFC61, '3', u' ُّ'), - (0xFC62, '3', u' ِّ'), - (0xFC63, '3', u' ّٰ'), - (0xFC64, 'M', u'ئر'), - (0xFC65, 'M', u'ئز'), - (0xFC66, 'M', u'ئم'), - (0xFC67, 'M', u'ئن'), - (0xFC68, 'M', u'ئى'), - (0xFC69, 'M', u'ئي'), - (0xFC6A, 'M', u'بر'), - (0xFC6B, 'M', u'بز'), - (0xFC6C, 'M', u'بم'), - (0xFC6D, 'M', u'بن'), - (0xFC6E, 'M', u'بى'), - (0xFC6F, 'M', u'بي'), - (0xFC70, 'M', u'تر'), - (0xFC71, 'M', u'تز'), - (0xFC72, 'M', u'تم'), - (0xFC73, 'M', u'تن'), - (0xFC74, 'M', u'تى'), - (0xFC75, 'M', u'تي'), - (0xFC76, 'M', u'ثر'), - (0xFC77, 'M', u'ثز'), - (0xFC78, 'M', u'ثم'), - (0xFC79, 'M', u'ثن'), - (0xFC7A, 'M', u'ثى'), - (0xFC7B, 'M', u'ثي'), - (0xFC7C, 'M', u'فى'), - (0xFC7D, 'M', u'في'), - (0xFC7E, 'M', u'قى'), - (0xFC7F, 'M', u'قي'), - (0xFC80, 'M', u'كا'), - (0xFC81, 'M', u'كل'), - (0xFC82, 'M', u'كم'), - (0xFC83, 'M', u'كى'), - (0xFC84, 'M', u'كي'), - (0xFC85, 'M', u'لم'), - (0xFC86, 'M', u'لى'), - (0xFC87, 'M', u'لي'), - (0xFC88, 'M', u'ما'), - (0xFC89, 'M', u'مم'), - (0xFC8A, 'M', u'نر'), - ] - -def _seg_46(): - return [ - (0xFC8B, 'M', u'نز'), - (0xFC8C, 'M', u'نم'), - (0xFC8D, 'M', u'نن'), - (0xFC8E, 'M', u'نى'), - (0xFC8F, 'M', u'ني'), - (0xFC90, 'M', u'ىٰ'), - (0xFC91, 'M', u'ير'), - (0xFC92, 'M', u'يز'), - (0xFC93, 'M', u'يم'), - (0xFC94, 'M', u'ين'), - (0xFC95, 'M', u'يى'), - (0xFC96, 'M', u'يي'), - (0xFC97, 'M', u'ئج'), - (0xFC98, 'M', u'ئح'), - (0xFC99, 'M', u'ئخ'), - (0xFC9A, 'M', u'ئم'), - (0xFC9B, 'M', u'ئه'), - (0xFC9C, 'M', u'بج'), - (0xFC9D, 'M', u'بح'), - (0xFC9E, 'M', u'بخ'), - (0xFC9F, 'M', u'بم'), - (0xFCA0, 'M', u'به'), - (0xFCA1, 'M', u'تج'), - (0xFCA2, 'M', u'تح'), - (0xFCA3, 'M', u'تخ'), - (0xFCA4, 'M', u'تم'), - (0xFCA5, 'M', u'ته'), - (0xFCA6, 'M', u'ثم'), - (0xFCA7, 'M', u'جح'), - (0xFCA8, 'M', u'جم'), - (0xFCA9, 'M', u'حج'), - (0xFCAA, 'M', u'حم'), - (0xFCAB, 'M', u'خج'), - (0xFCAC, 'M', u'خم'), - (0xFCAD, 'M', u'سج'), - (0xFCAE, 'M', u'سح'), - (0xFCAF, 'M', u'سخ'), - (0xFCB0, 'M', u'سم'), - (0xFCB1, 'M', u'صح'), - (0xFCB2, 'M', u'صخ'), - (0xFCB3, 'M', u'صم'), - (0xFCB4, 'M', u'ضج'), - (0xFCB5, 'M', u'ضح'), - (0xFCB6, 'M', u'ضخ'), - (0xFCB7, 'M', u'ضم'), - (0xFCB8, 'M', u'طح'), - (0xFCB9, 'M', u'ظم'), - (0xFCBA, 'M', u'عج'), - (0xFCBB, 'M', u'عم'), - (0xFCBC, 'M', u'غج'), - (0xFCBD, 'M', u'غم'), - (0xFCBE, 'M', u'فج'), - (0xFCBF, 'M', u'فح'), - (0xFCC0, 'M', u'فخ'), - (0xFCC1, 'M', u'فم'), - (0xFCC2, 'M', u'قح'), - (0xFCC3, 'M', u'قم'), - (0xFCC4, 'M', u'كج'), - (0xFCC5, 'M', u'كح'), - (0xFCC6, 'M', u'كخ'), - (0xFCC7, 'M', u'كل'), - (0xFCC8, 'M', u'كم'), - (0xFCC9, 'M', u'لج'), - (0xFCCA, 'M', u'لح'), - (0xFCCB, 'M', u'لخ'), - (0xFCCC, 'M', u'لم'), - (0xFCCD, 'M', u'له'), - (0xFCCE, 'M', u'مج'), - (0xFCCF, 'M', u'مح'), - (0xFCD0, 'M', u'مخ'), - (0xFCD1, 'M', u'مم'), - (0xFCD2, 'M', u'نج'), - (0xFCD3, 'M', u'نح'), - (0xFCD4, 'M', u'نخ'), - (0xFCD5, 'M', u'نم'), - (0xFCD6, 'M', u'نه'), - (0xFCD7, 'M', u'هج'), - (0xFCD8, 'M', u'هم'), - (0xFCD9, 'M', u'هٰ'), - (0xFCDA, 'M', u'يج'), - (0xFCDB, 'M', u'يح'), - (0xFCDC, 'M', u'يخ'), - (0xFCDD, 'M', u'يم'), - (0xFCDE, 'M', u'يه'), - (0xFCDF, 'M', u'ئم'), - (0xFCE0, 'M', u'ئه'), - (0xFCE1, 'M', u'بم'), - (0xFCE2, 'M', u'به'), - (0xFCE3, 'M', u'تم'), - (0xFCE4, 'M', u'ته'), - (0xFCE5, 'M', u'ثم'), - (0xFCE6, 'M', u'ثه'), - (0xFCE7, 'M', u'سم'), - (0xFCE8, 'M', u'سه'), - (0xFCE9, 'M', u'شم'), - (0xFCEA, 'M', u'شه'), - (0xFCEB, 'M', u'كل'), - (0xFCEC, 'M', u'كم'), - (0xFCED, 'M', u'لم'), - (0xFCEE, 'M', u'نم'), - ] - -def _seg_47(): - return [ - (0xFCEF, 'M', u'نه'), - (0xFCF0, 'M', u'يم'), - (0xFCF1, 'M', u'يه'), - (0xFCF2, 'M', u'ـَّ'), - (0xFCF3, 'M', u'ـُّ'), - (0xFCF4, 'M', u'ـِّ'), - (0xFCF5, 'M', u'طى'), - (0xFCF6, 'M', u'طي'), - (0xFCF7, 'M', u'عى'), - (0xFCF8, 'M', u'عي'), - (0xFCF9, 'M', u'غى'), - (0xFCFA, 'M', u'غي'), - (0xFCFB, 'M', u'سى'), - (0xFCFC, 'M', u'سي'), - (0xFCFD, 'M', u'شى'), - (0xFCFE, 'M', u'شي'), - (0xFCFF, 'M', u'حى'), - (0xFD00, 'M', u'حي'), - (0xFD01, 'M', u'جى'), - (0xFD02, 'M', u'جي'), - (0xFD03, 'M', u'خى'), - (0xFD04, 'M', u'خي'), - (0xFD05, 'M', u'صى'), - (0xFD06, 'M', u'صي'), - (0xFD07, 'M', u'ضى'), - (0xFD08, 'M', u'ضي'), - (0xFD09, 'M', u'شج'), - (0xFD0A, 'M', u'شح'), - (0xFD0B, 'M', u'شخ'), - (0xFD0C, 'M', u'شم'), - (0xFD0D, 'M', u'شر'), - (0xFD0E, 'M', u'سر'), - (0xFD0F, 'M', u'صر'), - (0xFD10, 'M', u'ضر'), - (0xFD11, 'M', u'طى'), - (0xFD12, 'M', u'طي'), - (0xFD13, 'M', u'عى'), - (0xFD14, 'M', u'عي'), - (0xFD15, 'M', u'غى'), - (0xFD16, 'M', u'غي'), - (0xFD17, 'M', u'سى'), - (0xFD18, 'M', u'سي'), - (0xFD19, 'M', u'شى'), - (0xFD1A, 'M', u'شي'), - (0xFD1B, 'M', u'حى'), - (0xFD1C, 'M', u'حي'), - (0xFD1D, 'M', u'جى'), - (0xFD1E, 'M', u'جي'), - (0xFD1F, 'M', u'خى'), - (0xFD20, 'M', u'خي'), - (0xFD21, 'M', u'صى'), - (0xFD22, 'M', u'صي'), - (0xFD23, 'M', u'ضى'), - (0xFD24, 'M', u'ضي'), - (0xFD25, 'M', u'شج'), - (0xFD26, 'M', u'شح'), - (0xFD27, 'M', u'شخ'), - (0xFD28, 'M', u'شم'), - (0xFD29, 'M', u'شر'), - (0xFD2A, 'M', u'سر'), - (0xFD2B, 'M', u'صر'), - (0xFD2C, 'M', u'ضر'), - (0xFD2D, 'M', u'شج'), - (0xFD2E, 'M', u'شح'), - (0xFD2F, 'M', u'شخ'), - (0xFD30, 'M', u'شم'), - (0xFD31, 'M', u'سه'), - (0xFD32, 'M', u'شه'), - (0xFD33, 'M', u'طم'), - (0xFD34, 'M', u'سج'), - (0xFD35, 'M', u'سح'), - (0xFD36, 'M', u'سخ'), - (0xFD37, 'M', u'شج'), - (0xFD38, 'M', u'شح'), - (0xFD39, 'M', u'شخ'), - (0xFD3A, 'M', u'طم'), - (0xFD3B, 'M', u'ظم'), - (0xFD3C, 'M', u'اً'), - (0xFD3E, 'V'), - (0xFD40, 'X'), - (0xFD50, 'M', u'تجم'), - (0xFD51, 'M', u'تحج'), - (0xFD53, 'M', u'تحم'), - (0xFD54, 'M', u'تخم'), - (0xFD55, 'M', u'تمج'), - (0xFD56, 'M', u'تمح'), - (0xFD57, 'M', u'تمخ'), - (0xFD58, 'M', u'جمح'), - (0xFD5A, 'M', u'حمي'), - (0xFD5B, 'M', u'حمى'), - (0xFD5C, 'M', u'سحج'), - (0xFD5D, 'M', u'سجح'), - (0xFD5E, 'M', u'سجى'), - (0xFD5F, 'M', u'سمح'), - (0xFD61, 'M', u'سمج'), - (0xFD62, 'M', u'سمم'), - (0xFD64, 'M', u'صحح'), - (0xFD66, 'M', u'صمم'), - (0xFD67, 'M', u'شحم'), - (0xFD69, 'M', u'شجي'), - ] - -def _seg_48(): - return [ - (0xFD6A, 'M', u'شمخ'), - (0xFD6C, 'M', u'شمم'), - (0xFD6E, 'M', u'ضحى'), - (0xFD6F, 'M', u'ضخم'), - (0xFD71, 'M', u'طمح'), - (0xFD73, 'M', u'طمم'), - (0xFD74, 'M', u'طمي'), - (0xFD75, 'M', u'عجم'), - (0xFD76, 'M', u'عمم'), - (0xFD78, 'M', u'عمى'), - (0xFD79, 'M', u'غمم'), - (0xFD7A, 'M', u'غمي'), - (0xFD7B, 'M', u'غمى'), - (0xFD7C, 'M', u'فخم'), - (0xFD7E, 'M', u'قمح'), - (0xFD7F, 'M', u'قمم'), - (0xFD80, 'M', u'لحم'), - (0xFD81, 'M', u'لحي'), - (0xFD82, 'M', u'لحى'), - (0xFD83, 'M', u'لجج'), - (0xFD85, 'M', u'لخم'), - (0xFD87, 'M', u'لمح'), - (0xFD89, 'M', u'محج'), - (0xFD8A, 'M', u'محم'), - (0xFD8B, 'M', u'محي'), - (0xFD8C, 'M', u'مجح'), - (0xFD8D, 'M', u'مجم'), - (0xFD8E, 'M', u'مخج'), - (0xFD8F, 'M', u'مخم'), - (0xFD90, 'X'), - (0xFD92, 'M', u'مجخ'), - (0xFD93, 'M', u'همج'), - (0xFD94, 'M', u'همم'), - (0xFD95, 'M', u'نحم'), - (0xFD96, 'M', u'نحى'), - (0xFD97, 'M', u'نجم'), - (0xFD99, 'M', u'نجى'), - (0xFD9A, 'M', u'نمي'), - (0xFD9B, 'M', u'نمى'), - (0xFD9C, 'M', u'يمم'), - (0xFD9E, 'M', u'بخي'), - (0xFD9F, 'M', u'تجي'), - (0xFDA0, 'M', u'تجى'), - (0xFDA1, 'M', u'تخي'), - (0xFDA2, 'M', u'تخى'), - (0xFDA3, 'M', u'تمي'), - (0xFDA4, 'M', u'تمى'), - (0xFDA5, 'M', u'جمي'), - (0xFDA6, 'M', u'جحى'), - (0xFDA7, 'M', u'جمى'), - (0xFDA8, 'M', u'سخى'), - (0xFDA9, 'M', u'صحي'), - (0xFDAA, 'M', u'شحي'), - (0xFDAB, 'M', u'ضحي'), - (0xFDAC, 'M', u'لجي'), - (0xFDAD, 'M', u'لمي'), - (0xFDAE, 'M', u'يحي'), - (0xFDAF, 'M', u'يجي'), - (0xFDB0, 'M', u'يمي'), - (0xFDB1, 'M', u'ممي'), - (0xFDB2, 'M', u'قمي'), - (0xFDB3, 'M', u'نحي'), - (0xFDB4, 'M', u'قمح'), - (0xFDB5, 'M', u'لحم'), - (0xFDB6, 'M', u'عمي'), - (0xFDB7, 'M', u'كمي'), - (0xFDB8, 'M', u'نجح'), - (0xFDB9, 'M', u'مخي'), - (0xFDBA, 'M', u'لجم'), - (0xFDBB, 'M', u'كمم'), - (0xFDBC, 'M', u'لجم'), - (0xFDBD, 'M', u'نجح'), - (0xFDBE, 'M', u'جحي'), - (0xFDBF, 'M', u'حجي'), - (0xFDC0, 'M', u'مجي'), - (0xFDC1, 'M', u'فمي'), - (0xFDC2, 'M', u'بحي'), - (0xFDC3, 'M', u'كمم'), - (0xFDC4, 'M', u'عجم'), - (0xFDC5, 'M', u'صمم'), - (0xFDC6, 'M', u'سخي'), - (0xFDC7, 'M', u'نجي'), - (0xFDC8, 'X'), - (0xFDF0, 'M', u'صلے'), - (0xFDF1, 'M', u'قلے'), - (0xFDF2, 'M', u'الله'), - (0xFDF3, 'M', u'اكبر'), - (0xFDF4, 'M', u'محمد'), - (0xFDF5, 'M', u'صلعم'), - (0xFDF6, 'M', u'رسول'), - (0xFDF7, 'M', u'عليه'), - (0xFDF8, 'M', u'وسلم'), - (0xFDF9, 'M', u'صلى'), - (0xFDFA, '3', u'صلى الله عليه وسلم'), - (0xFDFB, '3', u'جل جلاله'), - (0xFDFC, 'M', u'ریال'), - (0xFDFD, 'V'), - (0xFDFE, 'X'), - (0xFE00, 'I'), - (0xFE10, '3', u','), - ] - -def _seg_49(): - return [ - (0xFE11, 'M', u'、'), - (0xFE12, 'X'), - (0xFE13, '3', u':'), - (0xFE14, '3', u';'), - (0xFE15, '3', u'!'), - (0xFE16, '3', u'?'), - (0xFE17, 'M', u'〖'), - (0xFE18, 'M', u'〗'), - (0xFE19, 'X'), - (0xFE20, 'V'), - (0xFE30, 'X'), - (0xFE31, 'M', u'—'), - (0xFE32, 'M', u'–'), - (0xFE33, '3', u'_'), - (0xFE35, '3', u'('), - (0xFE36, '3', u')'), - (0xFE37, '3', u'{'), - (0xFE38, '3', u'}'), - (0xFE39, 'M', u'〔'), - (0xFE3A, 'M', u'〕'), - (0xFE3B, 'M', u'【'), - (0xFE3C, 'M', u'】'), - (0xFE3D, 'M', u'《'), - (0xFE3E, 'M', u'》'), - (0xFE3F, 'M', u'〈'), - (0xFE40, 'M', u'〉'), - (0xFE41, 'M', u'「'), - (0xFE42, 'M', u'」'), - (0xFE43, 'M', u'『'), - (0xFE44, 'M', u'』'), - (0xFE45, 'V'), - (0xFE47, '3', u'['), - (0xFE48, '3', u']'), - (0xFE49, '3', u' ̅'), - (0xFE4D, '3', u'_'), - (0xFE50, '3', u','), - (0xFE51, 'M', u'、'), - (0xFE52, 'X'), - (0xFE54, '3', u';'), - (0xFE55, '3', u':'), - (0xFE56, '3', u'?'), - (0xFE57, '3', u'!'), - (0xFE58, 'M', u'—'), - (0xFE59, '3', u'('), - (0xFE5A, '3', u')'), - (0xFE5B, '3', u'{'), - (0xFE5C, '3', u'}'), - (0xFE5D, 'M', u'〔'), - (0xFE5E, 'M', u'〕'), - (0xFE5F, '3', u'#'), - (0xFE60, '3', u'&'), - (0xFE61, '3', u'*'), - (0xFE62, '3', u'+'), - (0xFE63, 'M', u'-'), - (0xFE64, '3', u'<'), - (0xFE65, '3', u'>'), - (0xFE66, '3', u'='), - (0xFE67, 'X'), - (0xFE68, '3', u'\\'), - (0xFE69, '3', u'$'), - (0xFE6A, '3', u'%'), - (0xFE6B, '3', u'@'), - (0xFE6C, 'X'), - (0xFE70, '3', u' ً'), - (0xFE71, 'M', u'ـً'), - (0xFE72, '3', u' ٌ'), - (0xFE73, 'V'), - (0xFE74, '3', u' ٍ'), - (0xFE75, 'X'), - (0xFE76, '3', u' َ'), - (0xFE77, 'M', u'ـَ'), - (0xFE78, '3', u' ُ'), - (0xFE79, 'M', u'ـُ'), - (0xFE7A, '3', u' ِ'), - (0xFE7B, 'M', u'ـِ'), - (0xFE7C, '3', u' ّ'), - (0xFE7D, 'M', u'ـّ'), - (0xFE7E, '3', u' ْ'), - (0xFE7F, 'M', u'ـْ'), - (0xFE80, 'M', u'ء'), - (0xFE81, 'M', u'آ'), - (0xFE83, 'M', u'أ'), - (0xFE85, 'M', u'ؤ'), - (0xFE87, 'M', u'إ'), - (0xFE89, 'M', u'ئ'), - (0xFE8D, 'M', u'ا'), - (0xFE8F, 'M', u'ب'), - (0xFE93, 'M', u'ة'), - (0xFE95, 'M', u'ت'), - (0xFE99, 'M', u'ث'), - (0xFE9D, 'M', u'ج'), - (0xFEA1, 'M', u'ح'), - (0xFEA5, 'M', u'خ'), - (0xFEA9, 'M', u'د'), - (0xFEAB, 'M', u'ذ'), - (0xFEAD, 'M', u'ر'), - (0xFEAF, 'M', u'ز'), - (0xFEB1, 'M', u'س'), - (0xFEB5, 'M', u'ش'), - (0xFEB9, 'M', u'ص'), - ] - -def _seg_50(): - return [ - (0xFEBD, 'M', u'ض'), - (0xFEC1, 'M', u'ط'), - (0xFEC5, 'M', u'ظ'), - (0xFEC9, 'M', u'ع'), - (0xFECD, 'M', u'غ'), - (0xFED1, 'M', u'ف'), - (0xFED5, 'M', u'ق'), - (0xFED9, 'M', u'ك'), - (0xFEDD, 'M', u'ل'), - (0xFEE1, 'M', u'م'), - (0xFEE5, 'M', u'ن'), - (0xFEE9, 'M', u'ه'), - (0xFEED, 'M', u'و'), - (0xFEEF, 'M', u'ى'), - (0xFEF1, 'M', u'ي'), - (0xFEF5, 'M', u'لآ'), - (0xFEF7, 'M', u'لأ'), - (0xFEF9, 'M', u'لإ'), - (0xFEFB, 'M', u'لا'), - (0xFEFD, 'X'), - (0xFEFF, 'I'), - (0xFF00, 'X'), - (0xFF01, '3', u'!'), - (0xFF02, '3', u'"'), - (0xFF03, '3', u'#'), - (0xFF04, '3', u'$'), - (0xFF05, '3', u'%'), - (0xFF06, '3', u'&'), - (0xFF07, '3', u'\''), - (0xFF08, '3', u'('), - (0xFF09, '3', u')'), - (0xFF0A, '3', u'*'), - (0xFF0B, '3', u'+'), - (0xFF0C, '3', u','), - (0xFF0D, 'M', u'-'), - (0xFF0E, 'M', u'.'), - (0xFF0F, '3', u'/'), - (0xFF10, 'M', u'0'), - (0xFF11, 'M', u'1'), - (0xFF12, 'M', u'2'), - (0xFF13, 'M', u'3'), - (0xFF14, 'M', u'4'), - (0xFF15, 'M', u'5'), - (0xFF16, 'M', u'6'), - (0xFF17, 'M', u'7'), - (0xFF18, 'M', u'8'), - (0xFF19, 'M', u'9'), - (0xFF1A, '3', u':'), - (0xFF1B, '3', u';'), - (0xFF1C, '3', u'<'), - (0xFF1D, '3', u'='), - (0xFF1E, '3', u'>'), - (0xFF1F, '3', u'?'), - (0xFF20, '3', u'@'), - (0xFF21, 'M', u'a'), - (0xFF22, 'M', u'b'), - (0xFF23, 'M', u'c'), - (0xFF24, 'M', u'd'), - (0xFF25, 'M', u'e'), - (0xFF26, 'M', u'f'), - (0xFF27, 'M', u'g'), - (0xFF28, 'M', u'h'), - (0xFF29, 'M', u'i'), - (0xFF2A, 'M', u'j'), - (0xFF2B, 'M', u'k'), - (0xFF2C, 'M', u'l'), - (0xFF2D, 'M', u'm'), - (0xFF2E, 'M', u'n'), - (0xFF2F, 'M', u'o'), - (0xFF30, 'M', u'p'), - (0xFF31, 'M', u'q'), - (0xFF32, 'M', u'r'), - (0xFF33, 'M', u's'), - (0xFF34, 'M', u't'), - (0xFF35, 'M', u'u'), - (0xFF36, 'M', u'v'), - (0xFF37, 'M', u'w'), - (0xFF38, 'M', u'x'), - (0xFF39, 'M', u'y'), - (0xFF3A, 'M', u'z'), - (0xFF3B, '3', u'['), - (0xFF3C, '3', u'\\'), - (0xFF3D, '3', u']'), - (0xFF3E, '3', u'^'), - (0xFF3F, '3', u'_'), - (0xFF40, '3', u'`'), - (0xFF41, 'M', u'a'), - (0xFF42, 'M', u'b'), - (0xFF43, 'M', u'c'), - (0xFF44, 'M', u'd'), - (0xFF45, 'M', u'e'), - (0xFF46, 'M', u'f'), - (0xFF47, 'M', u'g'), - (0xFF48, 'M', u'h'), - (0xFF49, 'M', u'i'), - (0xFF4A, 'M', u'j'), - (0xFF4B, 'M', u'k'), - (0xFF4C, 'M', u'l'), - (0xFF4D, 'M', u'm'), - (0xFF4E, 'M', u'n'), - ] - -def _seg_51(): - return [ - (0xFF4F, 'M', u'o'), - (0xFF50, 'M', u'p'), - (0xFF51, 'M', u'q'), - (0xFF52, 'M', u'r'), - (0xFF53, 'M', u's'), - (0xFF54, 'M', u't'), - (0xFF55, 'M', u'u'), - (0xFF56, 'M', u'v'), - (0xFF57, 'M', u'w'), - (0xFF58, 'M', u'x'), - (0xFF59, 'M', u'y'), - (0xFF5A, 'M', u'z'), - (0xFF5B, '3', u'{'), - (0xFF5C, '3', u'|'), - (0xFF5D, '3', u'}'), - (0xFF5E, '3', u'~'), - (0xFF5F, 'M', u'⦅'), - (0xFF60, 'M', u'⦆'), - (0xFF61, 'M', u'.'), - (0xFF62, 'M', u'「'), - (0xFF63, 'M', u'」'), - (0xFF64, 'M', u'、'), - (0xFF65, 'M', u'・'), - (0xFF66, 'M', u'ヲ'), - (0xFF67, 'M', u'ァ'), - (0xFF68, 'M', u'ィ'), - (0xFF69, 'M', u'ゥ'), - (0xFF6A, 'M', u'ェ'), - (0xFF6B, 'M', u'ォ'), - (0xFF6C, 'M', u'ャ'), - (0xFF6D, 'M', u'ュ'), - (0xFF6E, 'M', u'ョ'), - (0xFF6F, 'M', u'ッ'), - (0xFF70, 'M', u'ー'), - (0xFF71, 'M', u'ア'), - (0xFF72, 'M', u'イ'), - (0xFF73, 'M', u'ウ'), - (0xFF74, 'M', u'エ'), - (0xFF75, 'M', u'オ'), - (0xFF76, 'M', u'カ'), - (0xFF77, 'M', u'キ'), - (0xFF78, 'M', u'ク'), - (0xFF79, 'M', u'ケ'), - (0xFF7A, 'M', u'コ'), - (0xFF7B, 'M', u'サ'), - (0xFF7C, 'M', u'シ'), - (0xFF7D, 'M', u'ス'), - (0xFF7E, 'M', u'セ'), - (0xFF7F, 'M', u'ソ'), - (0xFF80, 'M', u'タ'), - (0xFF81, 'M', u'チ'), - (0xFF82, 'M', u'ツ'), - (0xFF83, 'M', u'テ'), - (0xFF84, 'M', u'ト'), - (0xFF85, 'M', u'ナ'), - (0xFF86, 'M', u'ニ'), - (0xFF87, 'M', u'ヌ'), - (0xFF88, 'M', u'ネ'), - (0xFF89, 'M', u'ノ'), - (0xFF8A, 'M', u'ハ'), - (0xFF8B, 'M', u'ヒ'), - (0xFF8C, 'M', u'フ'), - (0xFF8D, 'M', u'ヘ'), - (0xFF8E, 'M', u'ホ'), - (0xFF8F, 'M', u'マ'), - (0xFF90, 'M', u'ミ'), - (0xFF91, 'M', u'ム'), - (0xFF92, 'M', u'メ'), - (0xFF93, 'M', u'モ'), - (0xFF94, 'M', u'ヤ'), - (0xFF95, 'M', u'ユ'), - (0xFF96, 'M', u'ヨ'), - (0xFF97, 'M', u'ラ'), - (0xFF98, 'M', u'リ'), - (0xFF99, 'M', u'ル'), - (0xFF9A, 'M', u'レ'), - (0xFF9B, 'M', u'ロ'), - (0xFF9C, 'M', u'ワ'), - (0xFF9D, 'M', u'ン'), - (0xFF9E, 'M', u'゙'), - (0xFF9F, 'M', u'゚'), - (0xFFA0, 'X'), - (0xFFA1, 'M', u'ᄀ'), - (0xFFA2, 'M', u'ᄁ'), - (0xFFA3, 'M', u'ᆪ'), - (0xFFA4, 'M', u'ᄂ'), - (0xFFA5, 'M', u'ᆬ'), - (0xFFA6, 'M', u'ᆭ'), - (0xFFA7, 'M', u'ᄃ'), - (0xFFA8, 'M', u'ᄄ'), - (0xFFA9, 'M', u'ᄅ'), - (0xFFAA, 'M', u'ᆰ'), - (0xFFAB, 'M', u'ᆱ'), - (0xFFAC, 'M', u'ᆲ'), - (0xFFAD, 'M', u'ᆳ'), - (0xFFAE, 'M', u'ᆴ'), - (0xFFAF, 'M', u'ᆵ'), - (0xFFB0, 'M', u'ᄚ'), - (0xFFB1, 'M', u'ᄆ'), - (0xFFB2, 'M', u'ᄇ'), - ] - -def _seg_52(): - return [ - (0xFFB3, 'M', u'ᄈ'), - (0xFFB4, 'M', u'ᄡ'), - (0xFFB5, 'M', u'ᄉ'), - (0xFFB6, 'M', u'ᄊ'), - (0xFFB7, 'M', u'ᄋ'), - (0xFFB8, 'M', u'ᄌ'), - (0xFFB9, 'M', u'ᄍ'), - (0xFFBA, 'M', u'ᄎ'), - (0xFFBB, 'M', u'ᄏ'), - (0xFFBC, 'M', u'ᄐ'), - (0xFFBD, 'M', u'ᄑ'), - (0xFFBE, 'M', u'ᄒ'), - (0xFFBF, 'X'), - (0xFFC2, 'M', u'ᅡ'), - (0xFFC3, 'M', u'ᅢ'), - (0xFFC4, 'M', u'ᅣ'), - (0xFFC5, 'M', u'ᅤ'), - (0xFFC6, 'M', u'ᅥ'), - (0xFFC7, 'M', u'ᅦ'), - (0xFFC8, 'X'), - (0xFFCA, 'M', u'ᅧ'), - (0xFFCB, 'M', u'ᅨ'), - (0xFFCC, 'M', u'ᅩ'), - (0xFFCD, 'M', u'ᅪ'), - (0xFFCE, 'M', u'ᅫ'), - (0xFFCF, 'M', u'ᅬ'), - (0xFFD0, 'X'), - (0xFFD2, 'M', u'ᅭ'), - (0xFFD3, 'M', u'ᅮ'), - (0xFFD4, 'M', u'ᅯ'), - (0xFFD5, 'M', u'ᅰ'), - (0xFFD6, 'M', u'ᅱ'), - (0xFFD7, 'M', u'ᅲ'), - (0xFFD8, 'X'), - (0xFFDA, 'M', u'ᅳ'), - (0xFFDB, 'M', u'ᅴ'), - (0xFFDC, 'M', u'ᅵ'), - (0xFFDD, 'X'), - (0xFFE0, 'M', u'¢'), - (0xFFE1, 'M', u'£'), - (0xFFE2, 'M', u'¬'), - (0xFFE3, '3', u' ̄'), - (0xFFE4, 'M', u'¦'), - (0xFFE5, 'M', u'¥'), - (0xFFE6, 'M', u'₩'), - (0xFFE7, 'X'), - (0xFFE8, 'M', u'│'), - (0xFFE9, 'M', u'←'), - (0xFFEA, 'M', u'↑'), - (0xFFEB, 'M', u'→'), - (0xFFEC, 'M', u'↓'), - (0xFFED, 'M', u'■'), - (0xFFEE, 'M', u'○'), - (0xFFEF, 'X'), - (0x10000, 'V'), - (0x1000C, 'X'), - (0x1000D, 'V'), - (0x10027, 'X'), - (0x10028, 'V'), - (0x1003B, 'X'), - (0x1003C, 'V'), - (0x1003E, 'X'), - (0x1003F, 'V'), - (0x1004E, 'X'), - (0x10050, 'V'), - (0x1005E, 'X'), - (0x10080, 'V'), - (0x100FB, 'X'), - (0x10100, 'V'), - (0x10103, 'X'), - (0x10107, 'V'), - (0x10134, 'X'), - (0x10137, 'V'), - (0x1018F, 'X'), - (0x10190, 'V'), - (0x1019C, 'X'), - (0x101A0, 'V'), - (0x101A1, 'X'), - (0x101D0, 'V'), - (0x101FE, 'X'), - (0x10280, 'V'), - (0x1029D, 'X'), - (0x102A0, 'V'), - (0x102D1, 'X'), - (0x102E0, 'V'), - (0x102FC, 'X'), - (0x10300, 'V'), - (0x10324, 'X'), - (0x1032D, 'V'), - (0x1034B, 'X'), - (0x10350, 'V'), - (0x1037B, 'X'), - (0x10380, 'V'), - (0x1039E, 'X'), - (0x1039F, 'V'), - (0x103C4, 'X'), - (0x103C8, 'V'), - (0x103D6, 'X'), - (0x10400, 'M', u'𐐨'), - (0x10401, 'M', u'𐐩'), - ] - -def _seg_53(): - return [ - (0x10402, 'M', u'𐐪'), - (0x10403, 'M', u'𐐫'), - (0x10404, 'M', u'𐐬'), - (0x10405, 'M', u'𐐭'), - (0x10406, 'M', u'𐐮'), - (0x10407, 'M', u'𐐯'), - (0x10408, 'M', u'𐐰'), - (0x10409, 'M', u'𐐱'), - (0x1040A, 'M', u'𐐲'), - (0x1040B, 'M', u'𐐳'), - (0x1040C, 'M', u'𐐴'), - (0x1040D, 'M', u'𐐵'), - (0x1040E, 'M', u'𐐶'), - (0x1040F, 'M', u'𐐷'), - (0x10410, 'M', u'𐐸'), - (0x10411, 'M', u'𐐹'), - (0x10412, 'M', u'𐐺'), - (0x10413, 'M', u'𐐻'), - (0x10414, 'M', u'𐐼'), - (0x10415, 'M', u'𐐽'), - (0x10416, 'M', u'𐐾'), - (0x10417, 'M', u'𐐿'), - (0x10418, 'M', u'𐑀'), - (0x10419, 'M', u'𐑁'), - (0x1041A, 'M', u'𐑂'), - (0x1041B, 'M', u'𐑃'), - (0x1041C, 'M', u'𐑄'), - (0x1041D, 'M', u'𐑅'), - (0x1041E, 'M', u'𐑆'), - (0x1041F, 'M', u'𐑇'), - (0x10420, 'M', u'𐑈'), - (0x10421, 'M', u'𐑉'), - (0x10422, 'M', u'𐑊'), - (0x10423, 'M', u'𐑋'), - (0x10424, 'M', u'𐑌'), - (0x10425, 'M', u'𐑍'), - (0x10426, 'M', u'𐑎'), - (0x10427, 'M', u'𐑏'), - (0x10428, 'V'), - (0x1049E, 'X'), - (0x104A0, 'V'), - (0x104AA, 'X'), - (0x104B0, 'M', u'𐓘'), - (0x104B1, 'M', u'𐓙'), - (0x104B2, 'M', u'𐓚'), - (0x104B3, 'M', u'𐓛'), - (0x104B4, 'M', u'𐓜'), - (0x104B5, 'M', u'𐓝'), - (0x104B6, 'M', u'𐓞'), - (0x104B7, 'M', u'𐓟'), - (0x104B8, 'M', u'𐓠'), - (0x104B9, 'M', u'𐓡'), - (0x104BA, 'M', u'𐓢'), - (0x104BB, 'M', u'𐓣'), - (0x104BC, 'M', u'𐓤'), - (0x104BD, 'M', u'𐓥'), - (0x104BE, 'M', u'𐓦'), - (0x104BF, 'M', u'𐓧'), - (0x104C0, 'M', u'𐓨'), - (0x104C1, 'M', u'𐓩'), - (0x104C2, 'M', u'𐓪'), - (0x104C3, 'M', u'𐓫'), - (0x104C4, 'M', u'𐓬'), - (0x104C5, 'M', u'𐓭'), - (0x104C6, 'M', u'𐓮'), - (0x104C7, 'M', u'𐓯'), - (0x104C8, 'M', u'𐓰'), - (0x104C9, 'M', u'𐓱'), - (0x104CA, 'M', u'𐓲'), - (0x104CB, 'M', u'𐓳'), - (0x104CC, 'M', u'𐓴'), - (0x104CD, 'M', u'𐓵'), - (0x104CE, 'M', u'𐓶'), - (0x104CF, 'M', u'𐓷'), - (0x104D0, 'M', u'𐓸'), - (0x104D1, 'M', u'𐓹'), - (0x104D2, 'M', u'𐓺'), - (0x104D3, 'M', u'𐓻'), - (0x104D4, 'X'), - (0x104D8, 'V'), - (0x104FC, 'X'), - (0x10500, 'V'), - (0x10528, 'X'), - (0x10530, 'V'), - (0x10564, 'X'), - (0x1056F, 'V'), - (0x10570, 'X'), - (0x10600, 'V'), - (0x10737, 'X'), - (0x10740, 'V'), - (0x10756, 'X'), - (0x10760, 'V'), - (0x10768, 'X'), - (0x10800, 'V'), - (0x10806, 'X'), - (0x10808, 'V'), - (0x10809, 'X'), - (0x1080A, 'V'), - (0x10836, 'X'), - (0x10837, 'V'), - ] - -def _seg_54(): - return [ - (0x10839, 'X'), - (0x1083C, 'V'), - (0x1083D, 'X'), - (0x1083F, 'V'), - (0x10856, 'X'), - (0x10857, 'V'), - (0x1089F, 'X'), - (0x108A7, 'V'), - (0x108B0, 'X'), - (0x108E0, 'V'), - (0x108F3, 'X'), - (0x108F4, 'V'), - (0x108F6, 'X'), - (0x108FB, 'V'), - (0x1091C, 'X'), - (0x1091F, 'V'), - (0x1093A, 'X'), - (0x1093F, 'V'), - (0x10940, 'X'), - (0x10980, 'V'), - (0x109B8, 'X'), - (0x109BC, 'V'), - (0x109D0, 'X'), - (0x109D2, 'V'), - (0x10A04, 'X'), - (0x10A05, 'V'), - (0x10A07, 'X'), - (0x10A0C, 'V'), - (0x10A14, 'X'), - (0x10A15, 'V'), - (0x10A18, 'X'), - (0x10A19, 'V'), - (0x10A36, 'X'), - (0x10A38, 'V'), - (0x10A3B, 'X'), - (0x10A3F, 'V'), - (0x10A49, 'X'), - (0x10A50, 'V'), - (0x10A59, 'X'), - (0x10A60, 'V'), - (0x10AA0, 'X'), - (0x10AC0, 'V'), - (0x10AE7, 'X'), - (0x10AEB, 'V'), - (0x10AF7, 'X'), - (0x10B00, 'V'), - (0x10B36, 'X'), - (0x10B39, 'V'), - (0x10B56, 'X'), - (0x10B58, 'V'), - (0x10B73, 'X'), - (0x10B78, 'V'), - (0x10B92, 'X'), - (0x10B99, 'V'), - (0x10B9D, 'X'), - (0x10BA9, 'V'), - (0x10BB0, 'X'), - (0x10C00, 'V'), - (0x10C49, 'X'), - (0x10C80, 'M', u'𐳀'), - (0x10C81, 'M', u'𐳁'), - (0x10C82, 'M', u'𐳂'), - (0x10C83, 'M', u'𐳃'), - (0x10C84, 'M', u'𐳄'), - (0x10C85, 'M', u'𐳅'), - (0x10C86, 'M', u'𐳆'), - (0x10C87, 'M', u'𐳇'), - (0x10C88, 'M', u'𐳈'), - (0x10C89, 'M', u'𐳉'), - (0x10C8A, 'M', u'𐳊'), - (0x10C8B, 'M', u'𐳋'), - (0x10C8C, 'M', u'𐳌'), - (0x10C8D, 'M', u'𐳍'), - (0x10C8E, 'M', u'𐳎'), - (0x10C8F, 'M', u'𐳏'), - (0x10C90, 'M', u'𐳐'), - (0x10C91, 'M', u'𐳑'), - (0x10C92, 'M', u'𐳒'), - (0x10C93, 'M', u'𐳓'), - (0x10C94, 'M', u'𐳔'), - (0x10C95, 'M', u'𐳕'), - (0x10C96, 'M', u'𐳖'), - (0x10C97, 'M', u'𐳗'), - (0x10C98, 'M', u'𐳘'), - (0x10C99, 'M', u'𐳙'), - (0x10C9A, 'M', u'𐳚'), - (0x10C9B, 'M', u'𐳛'), - (0x10C9C, 'M', u'𐳜'), - (0x10C9D, 'M', u'𐳝'), - (0x10C9E, 'M', u'𐳞'), - (0x10C9F, 'M', u'𐳟'), - (0x10CA0, 'M', u'𐳠'), - (0x10CA1, 'M', u'𐳡'), - (0x10CA2, 'M', u'𐳢'), - (0x10CA3, 'M', u'𐳣'), - (0x10CA4, 'M', u'𐳤'), - (0x10CA5, 'M', u'𐳥'), - (0x10CA6, 'M', u'𐳦'), - (0x10CA7, 'M', u'𐳧'), - (0x10CA8, 'M', u'𐳨'), - ] - -def _seg_55(): - return [ - (0x10CA9, 'M', u'𐳩'), - (0x10CAA, 'M', u'𐳪'), - (0x10CAB, 'M', u'𐳫'), - (0x10CAC, 'M', u'𐳬'), - (0x10CAD, 'M', u'𐳭'), - (0x10CAE, 'M', u'𐳮'), - (0x10CAF, 'M', u'𐳯'), - (0x10CB0, 'M', u'𐳰'), - (0x10CB1, 'M', u'𐳱'), - (0x10CB2, 'M', u'𐳲'), - (0x10CB3, 'X'), - (0x10CC0, 'V'), - (0x10CF3, 'X'), - (0x10CFA, 'V'), - (0x10D28, 'X'), - (0x10D30, 'V'), - (0x10D3A, 'X'), - (0x10E60, 'V'), - (0x10E7F, 'X'), - (0x10F00, 'V'), - (0x10F28, 'X'), - (0x10F30, 'V'), - (0x10F5A, 'X'), - (0x11000, 'V'), - (0x1104E, 'X'), - (0x11052, 'V'), - (0x11070, 'X'), - (0x1107F, 'V'), - (0x110BD, 'X'), - (0x110BE, 'V'), - (0x110C2, 'X'), - (0x110D0, 'V'), - (0x110E9, 'X'), - (0x110F0, 'V'), - (0x110FA, 'X'), - (0x11100, 'V'), - (0x11135, 'X'), - (0x11136, 'V'), - (0x11147, 'X'), - (0x11150, 'V'), - (0x11177, 'X'), - (0x11180, 'V'), - (0x111CE, 'X'), - (0x111D0, 'V'), - (0x111E0, 'X'), - (0x111E1, 'V'), - (0x111F5, 'X'), - (0x11200, 'V'), - (0x11212, 'X'), - (0x11213, 'V'), - (0x1123F, 'X'), - (0x11280, 'V'), - (0x11287, 'X'), - (0x11288, 'V'), - (0x11289, 'X'), - (0x1128A, 'V'), - (0x1128E, 'X'), - (0x1128F, 'V'), - (0x1129E, 'X'), - (0x1129F, 'V'), - (0x112AA, 'X'), - (0x112B0, 'V'), - (0x112EB, 'X'), - (0x112F0, 'V'), - (0x112FA, 'X'), - (0x11300, 'V'), - (0x11304, 'X'), - (0x11305, 'V'), - (0x1130D, 'X'), - (0x1130F, 'V'), - (0x11311, 'X'), - (0x11313, 'V'), - (0x11329, 'X'), - (0x1132A, 'V'), - (0x11331, 'X'), - (0x11332, 'V'), - (0x11334, 'X'), - (0x11335, 'V'), - (0x1133A, 'X'), - (0x1133B, 'V'), - (0x11345, 'X'), - (0x11347, 'V'), - (0x11349, 'X'), - (0x1134B, 'V'), - (0x1134E, 'X'), - (0x11350, 'V'), - (0x11351, 'X'), - (0x11357, 'V'), - (0x11358, 'X'), - (0x1135D, 'V'), - (0x11364, 'X'), - (0x11366, 'V'), - (0x1136D, 'X'), - (0x11370, 'V'), - (0x11375, 'X'), - (0x11400, 'V'), - (0x1145A, 'X'), - (0x1145B, 'V'), - (0x1145C, 'X'), - (0x1145D, 'V'), - ] - -def _seg_56(): - return [ - (0x1145F, 'X'), - (0x11480, 'V'), - (0x114C8, 'X'), - (0x114D0, 'V'), - (0x114DA, 'X'), - (0x11580, 'V'), - (0x115B6, 'X'), - (0x115B8, 'V'), - (0x115DE, 'X'), - (0x11600, 'V'), - (0x11645, 'X'), - (0x11650, 'V'), - (0x1165A, 'X'), - (0x11660, 'V'), - (0x1166D, 'X'), - (0x11680, 'V'), - (0x116B8, 'X'), - (0x116C0, 'V'), - (0x116CA, 'X'), - (0x11700, 'V'), - (0x1171B, 'X'), - (0x1171D, 'V'), - (0x1172C, 'X'), - (0x11730, 'V'), - (0x11740, 'X'), - (0x11800, 'V'), - (0x1183C, 'X'), - (0x118A0, 'M', u'𑣀'), - (0x118A1, 'M', u'𑣁'), - (0x118A2, 'M', u'𑣂'), - (0x118A3, 'M', u'𑣃'), - (0x118A4, 'M', u'𑣄'), - (0x118A5, 'M', u'𑣅'), - (0x118A6, 'M', u'𑣆'), - (0x118A7, 'M', u'𑣇'), - (0x118A8, 'M', u'𑣈'), - (0x118A9, 'M', u'𑣉'), - (0x118AA, 'M', u'𑣊'), - (0x118AB, 'M', u'𑣋'), - (0x118AC, 'M', u'𑣌'), - (0x118AD, 'M', u'𑣍'), - (0x118AE, 'M', u'𑣎'), - (0x118AF, 'M', u'𑣏'), - (0x118B0, 'M', u'𑣐'), - (0x118B1, 'M', u'𑣑'), - (0x118B2, 'M', u'𑣒'), - (0x118B3, 'M', u'𑣓'), - (0x118B4, 'M', u'𑣔'), - (0x118B5, 'M', u'𑣕'), - (0x118B6, 'M', u'𑣖'), - (0x118B7, 'M', u'𑣗'), - (0x118B8, 'M', u'𑣘'), - (0x118B9, 'M', u'𑣙'), - (0x118BA, 'M', u'𑣚'), - (0x118BB, 'M', u'𑣛'), - (0x118BC, 'M', u'𑣜'), - (0x118BD, 'M', u'𑣝'), - (0x118BE, 'M', u'𑣞'), - (0x118BF, 'M', u'𑣟'), - (0x118C0, 'V'), - (0x118F3, 'X'), - (0x118FF, 'V'), - (0x11900, 'X'), - (0x11A00, 'V'), - (0x11A48, 'X'), - (0x11A50, 'V'), - (0x11A84, 'X'), - (0x11A86, 'V'), - (0x11AA3, 'X'), - (0x11AC0, 'V'), - (0x11AF9, 'X'), - (0x11C00, 'V'), - (0x11C09, 'X'), - (0x11C0A, 'V'), - (0x11C37, 'X'), - (0x11C38, 'V'), - (0x11C46, 'X'), - (0x11C50, 'V'), - (0x11C6D, 'X'), - (0x11C70, 'V'), - (0x11C90, 'X'), - (0x11C92, 'V'), - (0x11CA8, 'X'), - (0x11CA9, 'V'), - (0x11CB7, 'X'), - (0x11D00, 'V'), - (0x11D07, 'X'), - (0x11D08, 'V'), - (0x11D0A, 'X'), - (0x11D0B, 'V'), - (0x11D37, 'X'), - (0x11D3A, 'V'), - (0x11D3B, 'X'), - (0x11D3C, 'V'), - (0x11D3E, 'X'), - (0x11D3F, 'V'), - (0x11D48, 'X'), - (0x11D50, 'V'), - (0x11D5A, 'X'), - (0x11D60, 'V'), - ] - -def _seg_57(): - return [ - (0x11D66, 'X'), - (0x11D67, 'V'), - (0x11D69, 'X'), - (0x11D6A, 'V'), - (0x11D8F, 'X'), - (0x11D90, 'V'), - (0x11D92, 'X'), - (0x11D93, 'V'), - (0x11D99, 'X'), - (0x11DA0, 'V'), - (0x11DAA, 'X'), - (0x11EE0, 'V'), - (0x11EF9, 'X'), - (0x12000, 'V'), - (0x1239A, 'X'), - (0x12400, 'V'), - (0x1246F, 'X'), - (0x12470, 'V'), - (0x12475, 'X'), - (0x12480, 'V'), - (0x12544, 'X'), - (0x13000, 'V'), - (0x1342F, 'X'), - (0x14400, 'V'), - (0x14647, 'X'), - (0x16800, 'V'), - (0x16A39, 'X'), - (0x16A40, 'V'), - (0x16A5F, 'X'), - (0x16A60, 'V'), - (0x16A6A, 'X'), - (0x16A6E, 'V'), - (0x16A70, 'X'), - (0x16AD0, 'V'), - (0x16AEE, 'X'), - (0x16AF0, 'V'), - (0x16AF6, 'X'), - (0x16B00, 'V'), - (0x16B46, 'X'), - (0x16B50, 'V'), - (0x16B5A, 'X'), - (0x16B5B, 'V'), - (0x16B62, 'X'), - (0x16B63, 'V'), - (0x16B78, 'X'), - (0x16B7D, 'V'), - (0x16B90, 'X'), - (0x16E60, 'V'), - (0x16E9B, 'X'), - (0x16F00, 'V'), - (0x16F45, 'X'), - (0x16F50, 'V'), - (0x16F7F, 'X'), - (0x16F8F, 'V'), - (0x16FA0, 'X'), - (0x16FE0, 'V'), - (0x16FE2, 'X'), - (0x17000, 'V'), - (0x187F2, 'X'), - (0x18800, 'V'), - (0x18AF3, 'X'), - (0x1B000, 'V'), - (0x1B11F, 'X'), - (0x1B170, 'V'), - (0x1B2FC, 'X'), - (0x1BC00, 'V'), - (0x1BC6B, 'X'), - (0x1BC70, 'V'), - (0x1BC7D, 'X'), - (0x1BC80, 'V'), - (0x1BC89, 'X'), - (0x1BC90, 'V'), - (0x1BC9A, 'X'), - (0x1BC9C, 'V'), - (0x1BCA0, 'I'), - (0x1BCA4, 'X'), - (0x1D000, 'V'), - (0x1D0F6, 'X'), - (0x1D100, 'V'), - (0x1D127, 'X'), - (0x1D129, 'V'), - (0x1D15E, 'M', u'𝅗𝅥'), - (0x1D15F, 'M', u'𝅘𝅥'), - (0x1D160, 'M', u'𝅘𝅥𝅮'), - (0x1D161, 'M', u'𝅘𝅥𝅯'), - (0x1D162, 'M', u'𝅘𝅥𝅰'), - (0x1D163, 'M', u'𝅘𝅥𝅱'), - (0x1D164, 'M', u'𝅘𝅥𝅲'), - (0x1D165, 'V'), - (0x1D173, 'X'), - (0x1D17B, 'V'), - (0x1D1BB, 'M', u'𝆹𝅥'), - (0x1D1BC, 'M', u'𝆺𝅥'), - (0x1D1BD, 'M', u'𝆹𝅥𝅮'), - (0x1D1BE, 'M', u'𝆺𝅥𝅮'), - (0x1D1BF, 'M', u'𝆹𝅥𝅯'), - (0x1D1C0, 'M', u'𝆺𝅥𝅯'), - (0x1D1C1, 'V'), - (0x1D1E9, 'X'), - (0x1D200, 'V'), - ] - -def _seg_58(): - return [ - (0x1D246, 'X'), - (0x1D2E0, 'V'), - (0x1D2F4, 'X'), - (0x1D300, 'V'), - (0x1D357, 'X'), - (0x1D360, 'V'), - (0x1D379, 'X'), - (0x1D400, 'M', u'a'), - (0x1D401, 'M', u'b'), - (0x1D402, 'M', u'c'), - (0x1D403, 'M', u'd'), - (0x1D404, 'M', u'e'), - (0x1D405, 'M', u'f'), - (0x1D406, 'M', u'g'), - (0x1D407, 'M', u'h'), - (0x1D408, 'M', u'i'), - (0x1D409, 'M', u'j'), - (0x1D40A, 'M', u'k'), - (0x1D40B, 'M', u'l'), - (0x1D40C, 'M', u'm'), - (0x1D40D, 'M', u'n'), - (0x1D40E, 'M', u'o'), - (0x1D40F, 'M', u'p'), - (0x1D410, 'M', u'q'), - (0x1D411, 'M', u'r'), - (0x1D412, 'M', u's'), - (0x1D413, 'M', u't'), - (0x1D414, 'M', u'u'), - (0x1D415, 'M', u'v'), - (0x1D416, 'M', u'w'), - (0x1D417, 'M', u'x'), - (0x1D418, 'M', u'y'), - (0x1D419, 'M', u'z'), - (0x1D41A, 'M', u'a'), - (0x1D41B, 'M', u'b'), - (0x1D41C, 'M', u'c'), - (0x1D41D, 'M', u'd'), - (0x1D41E, 'M', u'e'), - (0x1D41F, 'M', u'f'), - (0x1D420, 'M', u'g'), - (0x1D421, 'M', u'h'), - (0x1D422, 'M', u'i'), - (0x1D423, 'M', u'j'), - (0x1D424, 'M', u'k'), - (0x1D425, 'M', u'l'), - (0x1D426, 'M', u'm'), - (0x1D427, 'M', u'n'), - (0x1D428, 'M', u'o'), - (0x1D429, 'M', u'p'), - (0x1D42A, 'M', u'q'), - (0x1D42B, 'M', u'r'), - (0x1D42C, 'M', u's'), - (0x1D42D, 'M', u't'), - (0x1D42E, 'M', u'u'), - (0x1D42F, 'M', u'v'), - (0x1D430, 'M', u'w'), - (0x1D431, 'M', u'x'), - (0x1D432, 'M', u'y'), - (0x1D433, 'M', u'z'), - (0x1D434, 'M', u'a'), - (0x1D435, 'M', u'b'), - (0x1D436, 'M', u'c'), - (0x1D437, 'M', u'd'), - (0x1D438, 'M', u'e'), - (0x1D439, 'M', u'f'), - (0x1D43A, 'M', u'g'), - (0x1D43B, 'M', u'h'), - (0x1D43C, 'M', u'i'), - (0x1D43D, 'M', u'j'), - (0x1D43E, 'M', u'k'), - (0x1D43F, 'M', u'l'), - (0x1D440, 'M', u'm'), - (0x1D441, 'M', u'n'), - (0x1D442, 'M', u'o'), - (0x1D443, 'M', u'p'), - (0x1D444, 'M', u'q'), - (0x1D445, 'M', u'r'), - (0x1D446, 'M', u's'), - (0x1D447, 'M', u't'), - (0x1D448, 'M', u'u'), - (0x1D449, 'M', u'v'), - (0x1D44A, 'M', u'w'), - (0x1D44B, 'M', u'x'), - (0x1D44C, 'M', u'y'), - (0x1D44D, 'M', u'z'), - (0x1D44E, 'M', u'a'), - (0x1D44F, 'M', u'b'), - (0x1D450, 'M', u'c'), - (0x1D451, 'M', u'd'), - (0x1D452, 'M', u'e'), - (0x1D453, 'M', u'f'), - (0x1D454, 'M', u'g'), - (0x1D455, 'X'), - (0x1D456, 'M', u'i'), - (0x1D457, 'M', u'j'), - (0x1D458, 'M', u'k'), - (0x1D459, 'M', u'l'), - (0x1D45A, 'M', u'm'), - (0x1D45B, 'M', u'n'), - (0x1D45C, 'M', u'o'), - ] - -def _seg_59(): - return [ - (0x1D45D, 'M', u'p'), - (0x1D45E, 'M', u'q'), - (0x1D45F, 'M', u'r'), - (0x1D460, 'M', u's'), - (0x1D461, 'M', u't'), - (0x1D462, 'M', u'u'), - (0x1D463, 'M', u'v'), - (0x1D464, 'M', u'w'), - (0x1D465, 'M', u'x'), - (0x1D466, 'M', u'y'), - (0x1D467, 'M', u'z'), - (0x1D468, 'M', u'a'), - (0x1D469, 'M', u'b'), - (0x1D46A, 'M', u'c'), - (0x1D46B, 'M', u'd'), - (0x1D46C, 'M', u'e'), - (0x1D46D, 'M', u'f'), - (0x1D46E, 'M', u'g'), - (0x1D46F, 'M', u'h'), - (0x1D470, 'M', u'i'), - (0x1D471, 'M', u'j'), - (0x1D472, 'M', u'k'), - (0x1D473, 'M', u'l'), - (0x1D474, 'M', u'm'), - (0x1D475, 'M', u'n'), - (0x1D476, 'M', u'o'), - (0x1D477, 'M', u'p'), - (0x1D478, 'M', u'q'), - (0x1D479, 'M', u'r'), - (0x1D47A, 'M', u's'), - (0x1D47B, 'M', u't'), - (0x1D47C, 'M', u'u'), - (0x1D47D, 'M', u'v'), - (0x1D47E, 'M', u'w'), - (0x1D47F, 'M', u'x'), - (0x1D480, 'M', u'y'), - (0x1D481, 'M', u'z'), - (0x1D482, 'M', u'a'), - (0x1D483, 'M', u'b'), - (0x1D484, 'M', u'c'), - (0x1D485, 'M', u'd'), - (0x1D486, 'M', u'e'), - (0x1D487, 'M', u'f'), - (0x1D488, 'M', u'g'), - (0x1D489, 'M', u'h'), - (0x1D48A, 'M', u'i'), - (0x1D48B, 'M', u'j'), - (0x1D48C, 'M', u'k'), - (0x1D48D, 'M', u'l'), - (0x1D48E, 'M', u'm'), - (0x1D48F, 'M', u'n'), - (0x1D490, 'M', u'o'), - (0x1D491, 'M', u'p'), - (0x1D492, 'M', u'q'), - (0x1D493, 'M', u'r'), - (0x1D494, 'M', u's'), - (0x1D495, 'M', u't'), - (0x1D496, 'M', u'u'), - (0x1D497, 'M', u'v'), - (0x1D498, 'M', u'w'), - (0x1D499, 'M', u'x'), - (0x1D49A, 'M', u'y'), - (0x1D49B, 'M', u'z'), - (0x1D49C, 'M', u'a'), - (0x1D49D, 'X'), - (0x1D49E, 'M', u'c'), - (0x1D49F, 'M', u'd'), - (0x1D4A0, 'X'), - (0x1D4A2, 'M', u'g'), - (0x1D4A3, 'X'), - (0x1D4A5, 'M', u'j'), - (0x1D4A6, 'M', u'k'), - (0x1D4A7, 'X'), - (0x1D4A9, 'M', u'n'), - (0x1D4AA, 'M', u'o'), - (0x1D4AB, 'M', u'p'), - (0x1D4AC, 'M', u'q'), - (0x1D4AD, 'X'), - (0x1D4AE, 'M', u's'), - (0x1D4AF, 'M', u't'), - (0x1D4B0, 'M', u'u'), - (0x1D4B1, 'M', u'v'), - (0x1D4B2, 'M', u'w'), - (0x1D4B3, 'M', u'x'), - (0x1D4B4, 'M', u'y'), - (0x1D4B5, 'M', u'z'), - (0x1D4B6, 'M', u'a'), - (0x1D4B7, 'M', u'b'), - (0x1D4B8, 'M', u'c'), - (0x1D4B9, 'M', u'd'), - (0x1D4BA, 'X'), - (0x1D4BB, 'M', u'f'), - (0x1D4BC, 'X'), - (0x1D4BD, 'M', u'h'), - (0x1D4BE, 'M', u'i'), - (0x1D4BF, 'M', u'j'), - (0x1D4C0, 'M', u'k'), - (0x1D4C1, 'M', u'l'), - (0x1D4C2, 'M', u'm'), - (0x1D4C3, 'M', u'n'), - ] - -def _seg_60(): - return [ - (0x1D4C4, 'X'), - (0x1D4C5, 'M', u'p'), - (0x1D4C6, 'M', u'q'), - (0x1D4C7, 'M', u'r'), - (0x1D4C8, 'M', u's'), - (0x1D4C9, 'M', u't'), - (0x1D4CA, 'M', u'u'), - (0x1D4CB, 'M', u'v'), - (0x1D4CC, 'M', u'w'), - (0x1D4CD, 'M', u'x'), - (0x1D4CE, 'M', u'y'), - (0x1D4CF, 'M', u'z'), - (0x1D4D0, 'M', u'a'), - (0x1D4D1, 'M', u'b'), - (0x1D4D2, 'M', u'c'), - (0x1D4D3, 'M', u'd'), - (0x1D4D4, 'M', u'e'), - (0x1D4D5, 'M', u'f'), - (0x1D4D6, 'M', u'g'), - (0x1D4D7, 'M', u'h'), - (0x1D4D8, 'M', u'i'), - (0x1D4D9, 'M', u'j'), - (0x1D4DA, 'M', u'k'), - (0x1D4DB, 'M', u'l'), - (0x1D4DC, 'M', u'm'), - (0x1D4DD, 'M', u'n'), - (0x1D4DE, 'M', u'o'), - (0x1D4DF, 'M', u'p'), - (0x1D4E0, 'M', u'q'), - (0x1D4E1, 'M', u'r'), - (0x1D4E2, 'M', u's'), - (0x1D4E3, 'M', u't'), - (0x1D4E4, 'M', u'u'), - (0x1D4E5, 'M', u'v'), - (0x1D4E6, 'M', u'w'), - (0x1D4E7, 'M', u'x'), - (0x1D4E8, 'M', u'y'), - (0x1D4E9, 'M', u'z'), - (0x1D4EA, 'M', u'a'), - (0x1D4EB, 'M', u'b'), - (0x1D4EC, 'M', u'c'), - (0x1D4ED, 'M', u'd'), - (0x1D4EE, 'M', u'e'), - (0x1D4EF, 'M', u'f'), - (0x1D4F0, 'M', u'g'), - (0x1D4F1, 'M', u'h'), - (0x1D4F2, 'M', u'i'), - (0x1D4F3, 'M', u'j'), - (0x1D4F4, 'M', u'k'), - (0x1D4F5, 'M', u'l'), - (0x1D4F6, 'M', u'm'), - (0x1D4F7, 'M', u'n'), - (0x1D4F8, 'M', u'o'), - (0x1D4F9, 'M', u'p'), - (0x1D4FA, 'M', u'q'), - (0x1D4FB, 'M', u'r'), - (0x1D4FC, 'M', u's'), - (0x1D4FD, 'M', u't'), - (0x1D4FE, 'M', u'u'), - (0x1D4FF, 'M', u'v'), - (0x1D500, 'M', u'w'), - (0x1D501, 'M', u'x'), - (0x1D502, 'M', u'y'), - (0x1D503, 'M', u'z'), - (0x1D504, 'M', u'a'), - (0x1D505, 'M', u'b'), - (0x1D506, 'X'), - (0x1D507, 'M', u'd'), - (0x1D508, 'M', u'e'), - (0x1D509, 'M', u'f'), - (0x1D50A, 'M', u'g'), - (0x1D50B, 'X'), - (0x1D50D, 'M', u'j'), - (0x1D50E, 'M', u'k'), - (0x1D50F, 'M', u'l'), - (0x1D510, 'M', u'm'), - (0x1D511, 'M', u'n'), - (0x1D512, 'M', u'o'), - (0x1D513, 'M', u'p'), - (0x1D514, 'M', u'q'), - (0x1D515, 'X'), - (0x1D516, 'M', u's'), - (0x1D517, 'M', u't'), - (0x1D518, 'M', u'u'), - (0x1D519, 'M', u'v'), - (0x1D51A, 'M', u'w'), - (0x1D51B, 'M', u'x'), - (0x1D51C, 'M', u'y'), - (0x1D51D, 'X'), - (0x1D51E, 'M', u'a'), - (0x1D51F, 'M', u'b'), - (0x1D520, 'M', u'c'), - (0x1D521, 'M', u'd'), - (0x1D522, 'M', u'e'), - (0x1D523, 'M', u'f'), - (0x1D524, 'M', u'g'), - (0x1D525, 'M', u'h'), - (0x1D526, 'M', u'i'), - (0x1D527, 'M', u'j'), - (0x1D528, 'M', u'k'), - ] - -def _seg_61(): - return [ - (0x1D529, 'M', u'l'), - (0x1D52A, 'M', u'm'), - (0x1D52B, 'M', u'n'), - (0x1D52C, 'M', u'o'), - (0x1D52D, 'M', u'p'), - (0x1D52E, 'M', u'q'), - (0x1D52F, 'M', u'r'), - (0x1D530, 'M', u's'), - (0x1D531, 'M', u't'), - (0x1D532, 'M', u'u'), - (0x1D533, 'M', u'v'), - (0x1D534, 'M', u'w'), - (0x1D535, 'M', u'x'), - (0x1D536, 'M', u'y'), - (0x1D537, 'M', u'z'), - (0x1D538, 'M', u'a'), - (0x1D539, 'M', u'b'), - (0x1D53A, 'X'), - (0x1D53B, 'M', u'd'), - (0x1D53C, 'M', u'e'), - (0x1D53D, 'M', u'f'), - (0x1D53E, 'M', u'g'), - (0x1D53F, 'X'), - (0x1D540, 'M', u'i'), - (0x1D541, 'M', u'j'), - (0x1D542, 'M', u'k'), - (0x1D543, 'M', u'l'), - (0x1D544, 'M', u'm'), - (0x1D545, 'X'), - (0x1D546, 'M', u'o'), - (0x1D547, 'X'), - (0x1D54A, 'M', u's'), - (0x1D54B, 'M', u't'), - (0x1D54C, 'M', u'u'), - (0x1D54D, 'M', u'v'), - (0x1D54E, 'M', u'w'), - (0x1D54F, 'M', u'x'), - (0x1D550, 'M', u'y'), - (0x1D551, 'X'), - (0x1D552, 'M', u'a'), - (0x1D553, 'M', u'b'), - (0x1D554, 'M', u'c'), - (0x1D555, 'M', u'd'), - (0x1D556, 'M', u'e'), - (0x1D557, 'M', u'f'), - (0x1D558, 'M', u'g'), - (0x1D559, 'M', u'h'), - (0x1D55A, 'M', u'i'), - (0x1D55B, 'M', u'j'), - (0x1D55C, 'M', u'k'), - (0x1D55D, 'M', u'l'), - (0x1D55E, 'M', u'm'), - (0x1D55F, 'M', u'n'), - (0x1D560, 'M', u'o'), - (0x1D561, 'M', u'p'), - (0x1D562, 'M', u'q'), - (0x1D563, 'M', u'r'), - (0x1D564, 'M', u's'), - (0x1D565, 'M', u't'), - (0x1D566, 'M', u'u'), - (0x1D567, 'M', u'v'), - (0x1D568, 'M', u'w'), - (0x1D569, 'M', u'x'), - (0x1D56A, 'M', u'y'), - (0x1D56B, 'M', u'z'), - (0x1D56C, 'M', u'a'), - (0x1D56D, 'M', u'b'), - (0x1D56E, 'M', u'c'), - (0x1D56F, 'M', u'd'), - (0x1D570, 'M', u'e'), - (0x1D571, 'M', u'f'), - (0x1D572, 'M', u'g'), - (0x1D573, 'M', u'h'), - (0x1D574, 'M', u'i'), - (0x1D575, 'M', u'j'), - (0x1D576, 'M', u'k'), - (0x1D577, 'M', u'l'), - (0x1D578, 'M', u'm'), - (0x1D579, 'M', u'n'), - (0x1D57A, 'M', u'o'), - (0x1D57B, 'M', u'p'), - (0x1D57C, 'M', u'q'), - (0x1D57D, 'M', u'r'), - (0x1D57E, 'M', u's'), - (0x1D57F, 'M', u't'), - (0x1D580, 'M', u'u'), - (0x1D581, 'M', u'v'), - (0x1D582, 'M', u'w'), - (0x1D583, 'M', u'x'), - (0x1D584, 'M', u'y'), - (0x1D585, 'M', u'z'), - (0x1D586, 'M', u'a'), - (0x1D587, 'M', u'b'), - (0x1D588, 'M', u'c'), - (0x1D589, 'M', u'd'), - (0x1D58A, 'M', u'e'), - (0x1D58B, 'M', u'f'), - (0x1D58C, 'M', u'g'), - (0x1D58D, 'M', u'h'), - (0x1D58E, 'M', u'i'), - ] - -def _seg_62(): - return [ - (0x1D58F, 'M', u'j'), - (0x1D590, 'M', u'k'), - (0x1D591, 'M', u'l'), - (0x1D592, 'M', u'm'), - (0x1D593, 'M', u'n'), - (0x1D594, 'M', u'o'), - (0x1D595, 'M', u'p'), - (0x1D596, 'M', u'q'), - (0x1D597, 'M', u'r'), - (0x1D598, 'M', u's'), - (0x1D599, 'M', u't'), - (0x1D59A, 'M', u'u'), - (0x1D59B, 'M', u'v'), - (0x1D59C, 'M', u'w'), - (0x1D59D, 'M', u'x'), - (0x1D59E, 'M', u'y'), - (0x1D59F, 'M', u'z'), - (0x1D5A0, 'M', u'a'), - (0x1D5A1, 'M', u'b'), - (0x1D5A2, 'M', u'c'), - (0x1D5A3, 'M', u'd'), - (0x1D5A4, 'M', u'e'), - (0x1D5A5, 'M', u'f'), - (0x1D5A6, 'M', u'g'), - (0x1D5A7, 'M', u'h'), - (0x1D5A8, 'M', u'i'), - (0x1D5A9, 'M', u'j'), - (0x1D5AA, 'M', u'k'), - (0x1D5AB, 'M', u'l'), - (0x1D5AC, 'M', u'm'), - (0x1D5AD, 'M', u'n'), - (0x1D5AE, 'M', u'o'), - (0x1D5AF, 'M', u'p'), - (0x1D5B0, 'M', u'q'), - (0x1D5B1, 'M', u'r'), - (0x1D5B2, 'M', u's'), - (0x1D5B3, 'M', u't'), - (0x1D5B4, 'M', u'u'), - (0x1D5B5, 'M', u'v'), - (0x1D5B6, 'M', u'w'), - (0x1D5B7, 'M', u'x'), - (0x1D5B8, 'M', u'y'), - (0x1D5B9, 'M', u'z'), - (0x1D5BA, 'M', u'a'), - (0x1D5BB, 'M', u'b'), - (0x1D5BC, 'M', u'c'), - (0x1D5BD, 'M', u'd'), - (0x1D5BE, 'M', u'e'), - (0x1D5BF, 'M', u'f'), - (0x1D5C0, 'M', u'g'), - (0x1D5C1, 'M', u'h'), - (0x1D5C2, 'M', u'i'), - (0x1D5C3, 'M', u'j'), - (0x1D5C4, 'M', u'k'), - (0x1D5C5, 'M', u'l'), - (0x1D5C6, 'M', u'm'), - (0x1D5C7, 'M', u'n'), - (0x1D5C8, 'M', u'o'), - (0x1D5C9, 'M', u'p'), - (0x1D5CA, 'M', u'q'), - (0x1D5CB, 'M', u'r'), - (0x1D5CC, 'M', u's'), - (0x1D5CD, 'M', u't'), - (0x1D5CE, 'M', u'u'), - (0x1D5CF, 'M', u'v'), - (0x1D5D0, 'M', u'w'), - (0x1D5D1, 'M', u'x'), - (0x1D5D2, 'M', u'y'), - (0x1D5D3, 'M', u'z'), - (0x1D5D4, 'M', u'a'), - (0x1D5D5, 'M', u'b'), - (0x1D5D6, 'M', u'c'), - (0x1D5D7, 'M', u'd'), - (0x1D5D8, 'M', u'e'), - (0x1D5D9, 'M', u'f'), - (0x1D5DA, 'M', u'g'), - (0x1D5DB, 'M', u'h'), - (0x1D5DC, 'M', u'i'), - (0x1D5DD, 'M', u'j'), - (0x1D5DE, 'M', u'k'), - (0x1D5DF, 'M', u'l'), - (0x1D5E0, 'M', u'm'), - (0x1D5E1, 'M', u'n'), - (0x1D5E2, 'M', u'o'), - (0x1D5E3, 'M', u'p'), - (0x1D5E4, 'M', u'q'), - (0x1D5E5, 'M', u'r'), - (0x1D5E6, 'M', u's'), - (0x1D5E7, 'M', u't'), - (0x1D5E8, 'M', u'u'), - (0x1D5E9, 'M', u'v'), - (0x1D5EA, 'M', u'w'), - (0x1D5EB, 'M', u'x'), - (0x1D5EC, 'M', u'y'), - (0x1D5ED, 'M', u'z'), - (0x1D5EE, 'M', u'a'), - (0x1D5EF, 'M', u'b'), - (0x1D5F0, 'M', u'c'), - (0x1D5F1, 'M', u'd'), - (0x1D5F2, 'M', u'e'), - ] - -def _seg_63(): - return [ - (0x1D5F3, 'M', u'f'), - (0x1D5F4, 'M', u'g'), - (0x1D5F5, 'M', u'h'), - (0x1D5F6, 'M', u'i'), - (0x1D5F7, 'M', u'j'), - (0x1D5F8, 'M', u'k'), - (0x1D5F9, 'M', u'l'), - (0x1D5FA, 'M', u'm'), - (0x1D5FB, 'M', u'n'), - (0x1D5FC, 'M', u'o'), - (0x1D5FD, 'M', u'p'), - (0x1D5FE, 'M', u'q'), - (0x1D5FF, 'M', u'r'), - (0x1D600, 'M', u's'), - (0x1D601, 'M', u't'), - (0x1D602, 'M', u'u'), - (0x1D603, 'M', u'v'), - (0x1D604, 'M', u'w'), - (0x1D605, 'M', u'x'), - (0x1D606, 'M', u'y'), - (0x1D607, 'M', u'z'), - (0x1D608, 'M', u'a'), - (0x1D609, 'M', u'b'), - (0x1D60A, 'M', u'c'), - (0x1D60B, 'M', u'd'), - (0x1D60C, 'M', u'e'), - (0x1D60D, 'M', u'f'), - (0x1D60E, 'M', u'g'), - (0x1D60F, 'M', u'h'), - (0x1D610, 'M', u'i'), - (0x1D611, 'M', u'j'), - (0x1D612, 'M', u'k'), - (0x1D613, 'M', u'l'), - (0x1D614, 'M', u'm'), - (0x1D615, 'M', u'n'), - (0x1D616, 'M', u'o'), - (0x1D617, 'M', u'p'), - (0x1D618, 'M', u'q'), - (0x1D619, 'M', u'r'), - (0x1D61A, 'M', u's'), - (0x1D61B, 'M', u't'), - (0x1D61C, 'M', u'u'), - (0x1D61D, 'M', u'v'), - (0x1D61E, 'M', u'w'), - (0x1D61F, 'M', u'x'), - (0x1D620, 'M', u'y'), - (0x1D621, 'M', u'z'), - (0x1D622, 'M', u'a'), - (0x1D623, 'M', u'b'), - (0x1D624, 'M', u'c'), - (0x1D625, 'M', u'd'), - (0x1D626, 'M', u'e'), - (0x1D627, 'M', u'f'), - (0x1D628, 'M', u'g'), - (0x1D629, 'M', u'h'), - (0x1D62A, 'M', u'i'), - (0x1D62B, 'M', u'j'), - (0x1D62C, 'M', u'k'), - (0x1D62D, 'M', u'l'), - (0x1D62E, 'M', u'm'), - (0x1D62F, 'M', u'n'), - (0x1D630, 'M', u'o'), - (0x1D631, 'M', u'p'), - (0x1D632, 'M', u'q'), - (0x1D633, 'M', u'r'), - (0x1D634, 'M', u's'), - (0x1D635, 'M', u't'), - (0x1D636, 'M', u'u'), - (0x1D637, 'M', u'v'), - (0x1D638, 'M', u'w'), - (0x1D639, 'M', u'x'), - (0x1D63A, 'M', u'y'), - (0x1D63B, 'M', u'z'), - (0x1D63C, 'M', u'a'), - (0x1D63D, 'M', u'b'), - (0x1D63E, 'M', u'c'), - (0x1D63F, 'M', u'd'), - (0x1D640, 'M', u'e'), - (0x1D641, 'M', u'f'), - (0x1D642, 'M', u'g'), - (0x1D643, 'M', u'h'), - (0x1D644, 'M', u'i'), - (0x1D645, 'M', u'j'), - (0x1D646, 'M', u'k'), - (0x1D647, 'M', u'l'), - (0x1D648, 'M', u'm'), - (0x1D649, 'M', u'n'), - (0x1D64A, 'M', u'o'), - (0x1D64B, 'M', u'p'), - (0x1D64C, 'M', u'q'), - (0x1D64D, 'M', u'r'), - (0x1D64E, 'M', u's'), - (0x1D64F, 'M', u't'), - (0x1D650, 'M', u'u'), - (0x1D651, 'M', u'v'), - (0x1D652, 'M', u'w'), - (0x1D653, 'M', u'x'), - (0x1D654, 'M', u'y'), - (0x1D655, 'M', u'z'), - (0x1D656, 'M', u'a'), - ] - -def _seg_64(): - return [ - (0x1D657, 'M', u'b'), - (0x1D658, 'M', u'c'), - (0x1D659, 'M', u'd'), - (0x1D65A, 'M', u'e'), - (0x1D65B, 'M', u'f'), - (0x1D65C, 'M', u'g'), - (0x1D65D, 'M', u'h'), - (0x1D65E, 'M', u'i'), - (0x1D65F, 'M', u'j'), - (0x1D660, 'M', u'k'), - (0x1D661, 'M', u'l'), - (0x1D662, 'M', u'm'), - (0x1D663, 'M', u'n'), - (0x1D664, 'M', u'o'), - (0x1D665, 'M', u'p'), - (0x1D666, 'M', u'q'), - (0x1D667, 'M', u'r'), - (0x1D668, 'M', u's'), - (0x1D669, 'M', u't'), - (0x1D66A, 'M', u'u'), - (0x1D66B, 'M', u'v'), - (0x1D66C, 'M', u'w'), - (0x1D66D, 'M', u'x'), - (0x1D66E, 'M', u'y'), - (0x1D66F, 'M', u'z'), - (0x1D670, 'M', u'a'), - (0x1D671, 'M', u'b'), - (0x1D672, 'M', u'c'), - (0x1D673, 'M', u'd'), - (0x1D674, 'M', u'e'), - (0x1D675, 'M', u'f'), - (0x1D676, 'M', u'g'), - (0x1D677, 'M', u'h'), - (0x1D678, 'M', u'i'), - (0x1D679, 'M', u'j'), - (0x1D67A, 'M', u'k'), - (0x1D67B, 'M', u'l'), - (0x1D67C, 'M', u'm'), - (0x1D67D, 'M', u'n'), - (0x1D67E, 'M', u'o'), - (0x1D67F, 'M', u'p'), - (0x1D680, 'M', u'q'), - (0x1D681, 'M', u'r'), - (0x1D682, 'M', u's'), - (0x1D683, 'M', u't'), - (0x1D684, 'M', u'u'), - (0x1D685, 'M', u'v'), - (0x1D686, 'M', u'w'), - (0x1D687, 'M', u'x'), - (0x1D688, 'M', u'y'), - (0x1D689, 'M', u'z'), - (0x1D68A, 'M', u'a'), - (0x1D68B, 'M', u'b'), - (0x1D68C, 'M', u'c'), - (0x1D68D, 'M', u'd'), - (0x1D68E, 'M', u'e'), - (0x1D68F, 'M', u'f'), - (0x1D690, 'M', u'g'), - (0x1D691, 'M', u'h'), - (0x1D692, 'M', u'i'), - (0x1D693, 'M', u'j'), - (0x1D694, 'M', u'k'), - (0x1D695, 'M', u'l'), - (0x1D696, 'M', u'm'), - (0x1D697, 'M', u'n'), - (0x1D698, 'M', u'o'), - (0x1D699, 'M', u'p'), - (0x1D69A, 'M', u'q'), - (0x1D69B, 'M', u'r'), - (0x1D69C, 'M', u's'), - (0x1D69D, 'M', u't'), - (0x1D69E, 'M', u'u'), - (0x1D69F, 'M', u'v'), - (0x1D6A0, 'M', u'w'), - (0x1D6A1, 'M', u'x'), - (0x1D6A2, 'M', u'y'), - (0x1D6A3, 'M', u'z'), - (0x1D6A4, 'M', u'ı'), - (0x1D6A5, 'M', u'ȷ'), - (0x1D6A6, 'X'), - (0x1D6A8, 'M', u'α'), - (0x1D6A9, 'M', u'β'), - (0x1D6AA, 'M', u'γ'), - (0x1D6AB, 'M', u'δ'), - (0x1D6AC, 'M', u'ε'), - (0x1D6AD, 'M', u'ζ'), - (0x1D6AE, 'M', u'η'), - (0x1D6AF, 'M', u'θ'), - (0x1D6B0, 'M', u'ι'), - (0x1D6B1, 'M', u'κ'), - (0x1D6B2, 'M', u'λ'), - (0x1D6B3, 'M', u'μ'), - (0x1D6B4, 'M', u'ν'), - (0x1D6B5, 'M', u'ξ'), - (0x1D6B6, 'M', u'ο'), - (0x1D6B7, 'M', u'π'), - (0x1D6B8, 'M', u'ρ'), - (0x1D6B9, 'M', u'θ'), - (0x1D6BA, 'M', u'σ'), - (0x1D6BB, 'M', u'τ'), - ] - -def _seg_65(): - return [ - (0x1D6BC, 'M', u'υ'), - (0x1D6BD, 'M', u'φ'), - (0x1D6BE, 'M', u'χ'), - (0x1D6BF, 'M', u'ψ'), - (0x1D6C0, 'M', u'ω'), - (0x1D6C1, 'M', u'∇'), - (0x1D6C2, 'M', u'α'), - (0x1D6C3, 'M', u'β'), - (0x1D6C4, 'M', u'γ'), - (0x1D6C5, 'M', u'δ'), - (0x1D6C6, 'M', u'ε'), - (0x1D6C7, 'M', u'ζ'), - (0x1D6C8, 'M', u'η'), - (0x1D6C9, 'M', u'θ'), - (0x1D6CA, 'M', u'ι'), - (0x1D6CB, 'M', u'κ'), - (0x1D6CC, 'M', u'λ'), - (0x1D6CD, 'M', u'μ'), - (0x1D6CE, 'M', u'ν'), - (0x1D6CF, 'M', u'ξ'), - (0x1D6D0, 'M', u'ο'), - (0x1D6D1, 'M', u'π'), - (0x1D6D2, 'M', u'ρ'), - (0x1D6D3, 'M', u'σ'), - (0x1D6D5, 'M', u'τ'), - (0x1D6D6, 'M', u'υ'), - (0x1D6D7, 'M', u'φ'), - (0x1D6D8, 'M', u'χ'), - (0x1D6D9, 'M', u'ψ'), - (0x1D6DA, 'M', u'ω'), - (0x1D6DB, 'M', u'∂'), - (0x1D6DC, 'M', u'ε'), - (0x1D6DD, 'M', u'θ'), - (0x1D6DE, 'M', u'κ'), - (0x1D6DF, 'M', u'φ'), - (0x1D6E0, 'M', u'ρ'), - (0x1D6E1, 'M', u'π'), - (0x1D6E2, 'M', u'α'), - (0x1D6E3, 'M', u'β'), - (0x1D6E4, 'M', u'γ'), - (0x1D6E5, 'M', u'δ'), - (0x1D6E6, 'M', u'ε'), - (0x1D6E7, 'M', u'ζ'), - (0x1D6E8, 'M', u'η'), - (0x1D6E9, 'M', u'θ'), - (0x1D6EA, 'M', u'ι'), - (0x1D6EB, 'M', u'κ'), - (0x1D6EC, 'M', u'λ'), - (0x1D6ED, 'M', u'μ'), - (0x1D6EE, 'M', u'ν'), - (0x1D6EF, 'M', u'ξ'), - (0x1D6F0, 'M', u'ο'), - (0x1D6F1, 'M', u'π'), - (0x1D6F2, 'M', u'ρ'), - (0x1D6F3, 'M', u'θ'), - (0x1D6F4, 'M', u'σ'), - (0x1D6F5, 'M', u'τ'), - (0x1D6F6, 'M', u'υ'), - (0x1D6F7, 'M', u'φ'), - (0x1D6F8, 'M', u'χ'), - (0x1D6F9, 'M', u'ψ'), - (0x1D6FA, 'M', u'ω'), - (0x1D6FB, 'M', u'∇'), - (0x1D6FC, 'M', u'α'), - (0x1D6FD, 'M', u'β'), - (0x1D6FE, 'M', u'γ'), - (0x1D6FF, 'M', u'δ'), - (0x1D700, 'M', u'ε'), - (0x1D701, 'M', u'ζ'), - (0x1D702, 'M', u'η'), - (0x1D703, 'M', u'θ'), - (0x1D704, 'M', u'ι'), - (0x1D705, 'M', u'κ'), - (0x1D706, 'M', u'λ'), - (0x1D707, 'M', u'μ'), - (0x1D708, 'M', u'ν'), - (0x1D709, 'M', u'ξ'), - (0x1D70A, 'M', u'ο'), - (0x1D70B, 'M', u'π'), - (0x1D70C, 'M', u'ρ'), - (0x1D70D, 'M', u'σ'), - (0x1D70F, 'M', u'τ'), - (0x1D710, 'M', u'υ'), - (0x1D711, 'M', u'φ'), - (0x1D712, 'M', u'χ'), - (0x1D713, 'M', u'ψ'), - (0x1D714, 'M', u'ω'), - (0x1D715, 'M', u'∂'), - (0x1D716, 'M', u'ε'), - (0x1D717, 'M', u'θ'), - (0x1D718, 'M', u'κ'), - (0x1D719, 'M', u'φ'), - (0x1D71A, 'M', u'ρ'), - (0x1D71B, 'M', u'π'), - (0x1D71C, 'M', u'α'), - (0x1D71D, 'M', u'β'), - (0x1D71E, 'M', u'γ'), - (0x1D71F, 'M', u'δ'), - (0x1D720, 'M', u'ε'), - (0x1D721, 'M', u'ζ'), - ] - -def _seg_66(): - return [ - (0x1D722, 'M', u'η'), - (0x1D723, 'M', u'θ'), - (0x1D724, 'M', u'ι'), - (0x1D725, 'M', u'κ'), - (0x1D726, 'M', u'λ'), - (0x1D727, 'M', u'μ'), - (0x1D728, 'M', u'ν'), - (0x1D729, 'M', u'ξ'), - (0x1D72A, 'M', u'ο'), - (0x1D72B, 'M', u'π'), - (0x1D72C, 'M', u'ρ'), - (0x1D72D, 'M', u'θ'), - (0x1D72E, 'M', u'σ'), - (0x1D72F, 'M', u'τ'), - (0x1D730, 'M', u'υ'), - (0x1D731, 'M', u'φ'), - (0x1D732, 'M', u'χ'), - (0x1D733, 'M', u'ψ'), - (0x1D734, 'M', u'ω'), - (0x1D735, 'M', u'∇'), - (0x1D736, 'M', u'α'), - (0x1D737, 'M', u'β'), - (0x1D738, 'M', u'γ'), - (0x1D739, 'M', u'δ'), - (0x1D73A, 'M', u'ε'), - (0x1D73B, 'M', u'ζ'), - (0x1D73C, 'M', u'η'), - (0x1D73D, 'M', u'θ'), - (0x1D73E, 'M', u'ι'), - (0x1D73F, 'M', u'κ'), - (0x1D740, 'M', u'λ'), - (0x1D741, 'M', u'μ'), - (0x1D742, 'M', u'ν'), - (0x1D743, 'M', u'ξ'), - (0x1D744, 'M', u'ο'), - (0x1D745, 'M', u'π'), - (0x1D746, 'M', u'ρ'), - (0x1D747, 'M', u'σ'), - (0x1D749, 'M', u'τ'), - (0x1D74A, 'M', u'υ'), - (0x1D74B, 'M', u'φ'), - (0x1D74C, 'M', u'χ'), - (0x1D74D, 'M', u'ψ'), - (0x1D74E, 'M', u'ω'), - (0x1D74F, 'M', u'∂'), - (0x1D750, 'M', u'ε'), - (0x1D751, 'M', u'θ'), - (0x1D752, 'M', u'κ'), - (0x1D753, 'M', u'φ'), - (0x1D754, 'M', u'ρ'), - (0x1D755, 'M', u'π'), - (0x1D756, 'M', u'α'), - (0x1D757, 'M', u'β'), - (0x1D758, 'M', u'γ'), - (0x1D759, 'M', u'δ'), - (0x1D75A, 'M', u'ε'), - (0x1D75B, 'M', u'ζ'), - (0x1D75C, 'M', u'η'), - (0x1D75D, 'M', u'θ'), - (0x1D75E, 'M', u'ι'), - (0x1D75F, 'M', u'κ'), - (0x1D760, 'M', u'λ'), - (0x1D761, 'M', u'μ'), - (0x1D762, 'M', u'ν'), - (0x1D763, 'M', u'ξ'), - (0x1D764, 'M', u'ο'), - (0x1D765, 'M', u'π'), - (0x1D766, 'M', u'ρ'), - (0x1D767, 'M', u'θ'), - (0x1D768, 'M', u'σ'), - (0x1D769, 'M', u'τ'), - (0x1D76A, 'M', u'υ'), - (0x1D76B, 'M', u'φ'), - (0x1D76C, 'M', u'χ'), - (0x1D76D, 'M', u'ψ'), - (0x1D76E, 'M', u'ω'), - (0x1D76F, 'M', u'∇'), - (0x1D770, 'M', u'α'), - (0x1D771, 'M', u'β'), - (0x1D772, 'M', u'γ'), - (0x1D773, 'M', u'δ'), - (0x1D774, 'M', u'ε'), - (0x1D775, 'M', u'ζ'), - (0x1D776, 'M', u'η'), - (0x1D777, 'M', u'θ'), - (0x1D778, 'M', u'ι'), - (0x1D779, 'M', u'κ'), - (0x1D77A, 'M', u'λ'), - (0x1D77B, 'M', u'μ'), - (0x1D77C, 'M', u'ν'), - (0x1D77D, 'M', u'ξ'), - (0x1D77E, 'M', u'ο'), - (0x1D77F, 'M', u'π'), - (0x1D780, 'M', u'ρ'), - (0x1D781, 'M', u'σ'), - (0x1D783, 'M', u'τ'), - (0x1D784, 'M', u'υ'), - (0x1D785, 'M', u'φ'), - (0x1D786, 'M', u'χ'), - (0x1D787, 'M', u'ψ'), - ] - -def _seg_67(): - return [ - (0x1D788, 'M', u'ω'), - (0x1D789, 'M', u'∂'), - (0x1D78A, 'M', u'ε'), - (0x1D78B, 'M', u'θ'), - (0x1D78C, 'M', u'κ'), - (0x1D78D, 'M', u'φ'), - (0x1D78E, 'M', u'ρ'), - (0x1D78F, 'M', u'π'), - (0x1D790, 'M', u'α'), - (0x1D791, 'M', u'β'), - (0x1D792, 'M', u'γ'), - (0x1D793, 'M', u'δ'), - (0x1D794, 'M', u'ε'), - (0x1D795, 'M', u'ζ'), - (0x1D796, 'M', u'η'), - (0x1D797, 'M', u'θ'), - (0x1D798, 'M', u'ι'), - (0x1D799, 'M', u'κ'), - (0x1D79A, 'M', u'λ'), - (0x1D79B, 'M', u'μ'), - (0x1D79C, 'M', u'ν'), - (0x1D79D, 'M', u'ξ'), - (0x1D79E, 'M', u'ο'), - (0x1D79F, 'M', u'π'), - (0x1D7A0, 'M', u'ρ'), - (0x1D7A1, 'M', u'θ'), - (0x1D7A2, 'M', u'σ'), - (0x1D7A3, 'M', u'τ'), - (0x1D7A4, 'M', u'υ'), - (0x1D7A5, 'M', u'φ'), - (0x1D7A6, 'M', u'χ'), - (0x1D7A7, 'M', u'ψ'), - (0x1D7A8, 'M', u'ω'), - (0x1D7A9, 'M', u'∇'), - (0x1D7AA, 'M', u'α'), - (0x1D7AB, 'M', u'β'), - (0x1D7AC, 'M', u'γ'), - (0x1D7AD, 'M', u'δ'), - (0x1D7AE, 'M', u'ε'), - (0x1D7AF, 'M', u'ζ'), - (0x1D7B0, 'M', u'η'), - (0x1D7B1, 'M', u'θ'), - (0x1D7B2, 'M', u'ι'), - (0x1D7B3, 'M', u'κ'), - (0x1D7B4, 'M', u'λ'), - (0x1D7B5, 'M', u'μ'), - (0x1D7B6, 'M', u'ν'), - (0x1D7B7, 'M', u'ξ'), - (0x1D7B8, 'M', u'ο'), - (0x1D7B9, 'M', u'π'), - (0x1D7BA, 'M', u'ρ'), - (0x1D7BB, 'M', u'σ'), - (0x1D7BD, 'M', u'τ'), - (0x1D7BE, 'M', u'υ'), - (0x1D7BF, 'M', u'φ'), - (0x1D7C0, 'M', u'χ'), - (0x1D7C1, 'M', u'ψ'), - (0x1D7C2, 'M', u'ω'), - (0x1D7C3, 'M', u'∂'), - (0x1D7C4, 'M', u'ε'), - (0x1D7C5, 'M', u'θ'), - (0x1D7C6, 'M', u'κ'), - (0x1D7C7, 'M', u'φ'), - (0x1D7C8, 'M', u'ρ'), - (0x1D7C9, 'M', u'π'), - (0x1D7CA, 'M', u'ϝ'), - (0x1D7CC, 'X'), - (0x1D7CE, 'M', u'0'), - (0x1D7CF, 'M', u'1'), - (0x1D7D0, 'M', u'2'), - (0x1D7D1, 'M', u'3'), - (0x1D7D2, 'M', u'4'), - (0x1D7D3, 'M', u'5'), - (0x1D7D4, 'M', u'6'), - (0x1D7D5, 'M', u'7'), - (0x1D7D6, 'M', u'8'), - (0x1D7D7, 'M', u'9'), - (0x1D7D8, 'M', u'0'), - (0x1D7D9, 'M', u'1'), - (0x1D7DA, 'M', u'2'), - (0x1D7DB, 'M', u'3'), - (0x1D7DC, 'M', u'4'), - (0x1D7DD, 'M', u'5'), - (0x1D7DE, 'M', u'6'), - (0x1D7DF, 'M', u'7'), - (0x1D7E0, 'M', u'8'), - (0x1D7E1, 'M', u'9'), - (0x1D7E2, 'M', u'0'), - (0x1D7E3, 'M', u'1'), - (0x1D7E4, 'M', u'2'), - (0x1D7E5, 'M', u'3'), - (0x1D7E6, 'M', u'4'), - (0x1D7E7, 'M', u'5'), - (0x1D7E8, 'M', u'6'), - (0x1D7E9, 'M', u'7'), - (0x1D7EA, 'M', u'8'), - (0x1D7EB, 'M', u'9'), - (0x1D7EC, 'M', u'0'), - (0x1D7ED, 'M', u'1'), - (0x1D7EE, 'M', u'2'), - ] - -def _seg_68(): - return [ - (0x1D7EF, 'M', u'3'), - (0x1D7F0, 'M', u'4'), - (0x1D7F1, 'M', u'5'), - (0x1D7F2, 'M', u'6'), - (0x1D7F3, 'M', u'7'), - (0x1D7F4, 'M', u'8'), - (0x1D7F5, 'M', u'9'), - (0x1D7F6, 'M', u'0'), - (0x1D7F7, 'M', u'1'), - (0x1D7F8, 'M', u'2'), - (0x1D7F9, 'M', u'3'), - (0x1D7FA, 'M', u'4'), - (0x1D7FB, 'M', u'5'), - (0x1D7FC, 'M', u'6'), - (0x1D7FD, 'M', u'7'), - (0x1D7FE, 'M', u'8'), - (0x1D7FF, 'M', u'9'), - (0x1D800, 'V'), - (0x1DA8C, 'X'), - (0x1DA9B, 'V'), - (0x1DAA0, 'X'), - (0x1DAA1, 'V'), - (0x1DAB0, 'X'), - (0x1E000, 'V'), - (0x1E007, 'X'), - (0x1E008, 'V'), - (0x1E019, 'X'), - (0x1E01B, 'V'), - (0x1E022, 'X'), - (0x1E023, 'V'), - (0x1E025, 'X'), - (0x1E026, 'V'), - (0x1E02B, 'X'), - (0x1E800, 'V'), - (0x1E8C5, 'X'), - (0x1E8C7, 'V'), - (0x1E8D7, 'X'), - (0x1E900, 'M', u'𞤢'), - (0x1E901, 'M', u'𞤣'), - (0x1E902, 'M', u'𞤤'), - (0x1E903, 'M', u'𞤥'), - (0x1E904, 'M', u'𞤦'), - (0x1E905, 'M', u'𞤧'), - (0x1E906, 'M', u'𞤨'), - (0x1E907, 'M', u'𞤩'), - (0x1E908, 'M', u'𞤪'), - (0x1E909, 'M', u'𞤫'), - (0x1E90A, 'M', u'𞤬'), - (0x1E90B, 'M', u'𞤭'), - (0x1E90C, 'M', u'𞤮'), - (0x1E90D, 'M', u'𞤯'), - (0x1E90E, 'M', u'𞤰'), - (0x1E90F, 'M', u'𞤱'), - (0x1E910, 'M', u'𞤲'), - (0x1E911, 'M', u'𞤳'), - (0x1E912, 'M', u'𞤴'), - (0x1E913, 'M', u'𞤵'), - (0x1E914, 'M', u'𞤶'), - (0x1E915, 'M', u'𞤷'), - (0x1E916, 'M', u'𞤸'), - (0x1E917, 'M', u'𞤹'), - (0x1E918, 'M', u'𞤺'), - (0x1E919, 'M', u'𞤻'), - (0x1E91A, 'M', u'𞤼'), - (0x1E91B, 'M', u'𞤽'), - (0x1E91C, 'M', u'𞤾'), - (0x1E91D, 'M', u'𞤿'), - (0x1E91E, 'M', u'𞥀'), - (0x1E91F, 'M', u'𞥁'), - (0x1E920, 'M', u'𞥂'), - (0x1E921, 'M', u'𞥃'), - (0x1E922, 'V'), - (0x1E94B, 'X'), - (0x1E950, 'V'), - (0x1E95A, 'X'), - (0x1E95E, 'V'), - (0x1E960, 'X'), - (0x1EC71, 'V'), - (0x1ECB5, 'X'), - (0x1EE00, 'M', u'ا'), - (0x1EE01, 'M', u'ب'), - (0x1EE02, 'M', u'ج'), - (0x1EE03, 'M', u'د'), - (0x1EE04, 'X'), - (0x1EE05, 'M', u'و'), - (0x1EE06, 'M', u'ز'), - (0x1EE07, 'M', u'ح'), - (0x1EE08, 'M', u'ط'), - (0x1EE09, 'M', u'ي'), - (0x1EE0A, 'M', u'ك'), - (0x1EE0B, 'M', u'ل'), - (0x1EE0C, 'M', u'م'), - (0x1EE0D, 'M', u'ن'), - (0x1EE0E, 'M', u'س'), - (0x1EE0F, 'M', u'ع'), - (0x1EE10, 'M', u'ف'), - (0x1EE11, 'M', u'ص'), - (0x1EE12, 'M', u'ق'), - (0x1EE13, 'M', u'ر'), - (0x1EE14, 'M', u'ش'), - ] - -def _seg_69(): - return [ - (0x1EE15, 'M', u'ت'), - (0x1EE16, 'M', u'ث'), - (0x1EE17, 'M', u'خ'), - (0x1EE18, 'M', u'ذ'), - (0x1EE19, 'M', u'ض'), - (0x1EE1A, 'M', u'ظ'), - (0x1EE1B, 'M', u'غ'), - (0x1EE1C, 'M', u'ٮ'), - (0x1EE1D, 'M', u'ں'), - (0x1EE1E, 'M', u'ڡ'), - (0x1EE1F, 'M', u'ٯ'), - (0x1EE20, 'X'), - (0x1EE21, 'M', u'ب'), - (0x1EE22, 'M', u'ج'), - (0x1EE23, 'X'), - (0x1EE24, 'M', u'ه'), - (0x1EE25, 'X'), - (0x1EE27, 'M', u'ح'), - (0x1EE28, 'X'), - (0x1EE29, 'M', u'ي'), - (0x1EE2A, 'M', u'ك'), - (0x1EE2B, 'M', u'ل'), - (0x1EE2C, 'M', u'م'), - (0x1EE2D, 'M', u'ن'), - (0x1EE2E, 'M', u'س'), - (0x1EE2F, 'M', u'ع'), - (0x1EE30, 'M', u'ف'), - (0x1EE31, 'M', u'ص'), - (0x1EE32, 'M', u'ق'), - (0x1EE33, 'X'), - (0x1EE34, 'M', u'ش'), - (0x1EE35, 'M', u'ت'), - (0x1EE36, 'M', u'ث'), - (0x1EE37, 'M', u'خ'), - (0x1EE38, 'X'), - (0x1EE39, 'M', u'ض'), - (0x1EE3A, 'X'), - (0x1EE3B, 'M', u'غ'), - (0x1EE3C, 'X'), - (0x1EE42, 'M', u'ج'), - (0x1EE43, 'X'), - (0x1EE47, 'M', u'ح'), - (0x1EE48, 'X'), - (0x1EE49, 'M', u'ي'), - (0x1EE4A, 'X'), - (0x1EE4B, 'M', u'ل'), - (0x1EE4C, 'X'), - (0x1EE4D, 'M', u'ن'), - (0x1EE4E, 'M', u'س'), - (0x1EE4F, 'M', u'ع'), - (0x1EE50, 'X'), - (0x1EE51, 'M', u'ص'), - (0x1EE52, 'M', u'ق'), - (0x1EE53, 'X'), - (0x1EE54, 'M', u'ش'), - (0x1EE55, 'X'), - (0x1EE57, 'M', u'خ'), - (0x1EE58, 'X'), - (0x1EE59, 'M', u'ض'), - (0x1EE5A, 'X'), - (0x1EE5B, 'M', u'غ'), - (0x1EE5C, 'X'), - (0x1EE5D, 'M', u'ں'), - (0x1EE5E, 'X'), - (0x1EE5F, 'M', u'ٯ'), - (0x1EE60, 'X'), - (0x1EE61, 'M', u'ب'), - (0x1EE62, 'M', u'ج'), - (0x1EE63, 'X'), - (0x1EE64, 'M', u'ه'), - (0x1EE65, 'X'), - (0x1EE67, 'M', u'ح'), - (0x1EE68, 'M', u'ط'), - (0x1EE69, 'M', u'ي'), - (0x1EE6A, 'M', u'ك'), - (0x1EE6B, 'X'), - (0x1EE6C, 'M', u'م'), - (0x1EE6D, 'M', u'ن'), - (0x1EE6E, 'M', u'س'), - (0x1EE6F, 'M', u'ع'), - (0x1EE70, 'M', u'ف'), - (0x1EE71, 'M', u'ص'), - (0x1EE72, 'M', u'ق'), - (0x1EE73, 'X'), - (0x1EE74, 'M', u'ش'), - (0x1EE75, 'M', u'ت'), - (0x1EE76, 'M', u'ث'), - (0x1EE77, 'M', u'خ'), - (0x1EE78, 'X'), - (0x1EE79, 'M', u'ض'), - (0x1EE7A, 'M', u'ظ'), - (0x1EE7B, 'M', u'غ'), - (0x1EE7C, 'M', u'ٮ'), - (0x1EE7D, 'X'), - (0x1EE7E, 'M', u'ڡ'), - (0x1EE7F, 'X'), - (0x1EE80, 'M', u'ا'), - (0x1EE81, 'M', u'ب'), - (0x1EE82, 'M', u'ج'), - (0x1EE83, 'M', u'د'), - ] - -def _seg_70(): - return [ - (0x1EE84, 'M', u'ه'), - (0x1EE85, 'M', u'و'), - (0x1EE86, 'M', u'ز'), - (0x1EE87, 'M', u'ح'), - (0x1EE88, 'M', u'ط'), - (0x1EE89, 'M', u'ي'), - (0x1EE8A, 'X'), - (0x1EE8B, 'M', u'ل'), - (0x1EE8C, 'M', u'م'), - (0x1EE8D, 'M', u'ن'), - (0x1EE8E, 'M', u'س'), - (0x1EE8F, 'M', u'ع'), - (0x1EE90, 'M', u'ف'), - (0x1EE91, 'M', u'ص'), - (0x1EE92, 'M', u'ق'), - (0x1EE93, 'M', u'ر'), - (0x1EE94, 'M', u'ش'), - (0x1EE95, 'M', u'ت'), - (0x1EE96, 'M', u'ث'), - (0x1EE97, 'M', u'خ'), - (0x1EE98, 'M', u'ذ'), - (0x1EE99, 'M', u'ض'), - (0x1EE9A, 'M', u'ظ'), - (0x1EE9B, 'M', u'غ'), - (0x1EE9C, 'X'), - (0x1EEA1, 'M', u'ب'), - (0x1EEA2, 'M', u'ج'), - (0x1EEA3, 'M', u'د'), - (0x1EEA4, 'X'), - (0x1EEA5, 'M', u'و'), - (0x1EEA6, 'M', u'ز'), - (0x1EEA7, 'M', u'ح'), - (0x1EEA8, 'M', u'ط'), - (0x1EEA9, 'M', u'ي'), - (0x1EEAA, 'X'), - (0x1EEAB, 'M', u'ل'), - (0x1EEAC, 'M', u'م'), - (0x1EEAD, 'M', u'ن'), - (0x1EEAE, 'M', u'س'), - (0x1EEAF, 'M', u'ع'), - (0x1EEB0, 'M', u'ف'), - (0x1EEB1, 'M', u'ص'), - (0x1EEB2, 'M', u'ق'), - (0x1EEB3, 'M', u'ر'), - (0x1EEB4, 'M', u'ش'), - (0x1EEB5, 'M', u'ت'), - (0x1EEB6, 'M', u'ث'), - (0x1EEB7, 'M', u'خ'), - (0x1EEB8, 'M', u'ذ'), - (0x1EEB9, 'M', u'ض'), - (0x1EEBA, 'M', u'ظ'), - (0x1EEBB, 'M', u'غ'), - (0x1EEBC, 'X'), - (0x1EEF0, 'V'), - (0x1EEF2, 'X'), - (0x1F000, 'V'), - (0x1F02C, 'X'), - (0x1F030, 'V'), - (0x1F094, 'X'), - (0x1F0A0, 'V'), - (0x1F0AF, 'X'), - (0x1F0B1, 'V'), - (0x1F0C0, 'X'), - (0x1F0C1, 'V'), - (0x1F0D0, 'X'), - (0x1F0D1, 'V'), - (0x1F0F6, 'X'), - (0x1F101, '3', u'0,'), - (0x1F102, '3', u'1,'), - (0x1F103, '3', u'2,'), - (0x1F104, '3', u'3,'), - (0x1F105, '3', u'4,'), - (0x1F106, '3', u'5,'), - (0x1F107, '3', u'6,'), - (0x1F108, '3', u'7,'), - (0x1F109, '3', u'8,'), - (0x1F10A, '3', u'9,'), - (0x1F10B, 'V'), - (0x1F10D, 'X'), - (0x1F110, '3', u'(a)'), - (0x1F111, '3', u'(b)'), - (0x1F112, '3', u'(c)'), - (0x1F113, '3', u'(d)'), - (0x1F114, '3', u'(e)'), - (0x1F115, '3', u'(f)'), - (0x1F116, '3', u'(g)'), - (0x1F117, '3', u'(h)'), - (0x1F118, '3', u'(i)'), - (0x1F119, '3', u'(j)'), - (0x1F11A, '3', u'(k)'), - (0x1F11B, '3', u'(l)'), - (0x1F11C, '3', u'(m)'), - (0x1F11D, '3', u'(n)'), - (0x1F11E, '3', u'(o)'), - (0x1F11F, '3', u'(p)'), - (0x1F120, '3', u'(q)'), - (0x1F121, '3', u'(r)'), - (0x1F122, '3', u'(s)'), - (0x1F123, '3', u'(t)'), - (0x1F124, '3', u'(u)'), - ] - -def _seg_71(): - return [ - (0x1F125, '3', u'(v)'), - (0x1F126, '3', u'(w)'), - (0x1F127, '3', u'(x)'), - (0x1F128, '3', u'(y)'), - (0x1F129, '3', u'(z)'), - (0x1F12A, 'M', u'〔s〕'), - (0x1F12B, 'M', u'c'), - (0x1F12C, 'M', u'r'), - (0x1F12D, 'M', u'cd'), - (0x1F12E, 'M', u'wz'), - (0x1F12F, 'V'), - (0x1F130, 'M', u'a'), - (0x1F131, 'M', u'b'), - (0x1F132, 'M', u'c'), - (0x1F133, 'M', u'd'), - (0x1F134, 'M', u'e'), - (0x1F135, 'M', u'f'), - (0x1F136, 'M', u'g'), - (0x1F137, 'M', u'h'), - (0x1F138, 'M', u'i'), - (0x1F139, 'M', u'j'), - (0x1F13A, 'M', u'k'), - (0x1F13B, 'M', u'l'), - (0x1F13C, 'M', u'm'), - (0x1F13D, 'M', u'n'), - (0x1F13E, 'M', u'o'), - (0x1F13F, 'M', u'p'), - (0x1F140, 'M', u'q'), - (0x1F141, 'M', u'r'), - (0x1F142, 'M', u's'), - (0x1F143, 'M', u't'), - (0x1F144, 'M', u'u'), - (0x1F145, 'M', u'v'), - (0x1F146, 'M', u'w'), - (0x1F147, 'M', u'x'), - (0x1F148, 'M', u'y'), - (0x1F149, 'M', u'z'), - (0x1F14A, 'M', u'hv'), - (0x1F14B, 'M', u'mv'), - (0x1F14C, 'M', u'sd'), - (0x1F14D, 'M', u'ss'), - (0x1F14E, 'M', u'ppv'), - (0x1F14F, 'M', u'wc'), - (0x1F150, 'V'), - (0x1F16A, 'M', u'mc'), - (0x1F16B, 'M', u'md'), - (0x1F16C, 'X'), - (0x1F170, 'V'), - (0x1F190, 'M', u'dj'), - (0x1F191, 'V'), - (0x1F1AD, 'X'), - (0x1F1E6, 'V'), - (0x1F200, 'M', u'ほか'), - (0x1F201, 'M', u'ココ'), - (0x1F202, 'M', u'サ'), - (0x1F203, 'X'), - (0x1F210, 'M', u'手'), - (0x1F211, 'M', u'字'), - (0x1F212, 'M', u'双'), - (0x1F213, 'M', u'デ'), - (0x1F214, 'M', u'二'), - (0x1F215, 'M', u'多'), - (0x1F216, 'M', u'解'), - (0x1F217, 'M', u'天'), - (0x1F218, 'M', u'交'), - (0x1F219, 'M', u'映'), - (0x1F21A, 'M', u'無'), - (0x1F21B, 'M', u'料'), - (0x1F21C, 'M', u'前'), - (0x1F21D, 'M', u'後'), - (0x1F21E, 'M', u'再'), - (0x1F21F, 'M', u'新'), - (0x1F220, 'M', u'初'), - (0x1F221, 'M', u'終'), - (0x1F222, 'M', u'生'), - (0x1F223, 'M', u'販'), - (0x1F224, 'M', u'声'), - (0x1F225, 'M', u'吹'), - (0x1F226, 'M', u'演'), - (0x1F227, 'M', u'投'), - (0x1F228, 'M', u'捕'), - (0x1F229, 'M', u'一'), - (0x1F22A, 'M', u'三'), - (0x1F22B, 'M', u'遊'), - (0x1F22C, 'M', u'左'), - (0x1F22D, 'M', u'中'), - (0x1F22E, 'M', u'右'), - (0x1F22F, 'M', u'指'), - (0x1F230, 'M', u'走'), - (0x1F231, 'M', u'打'), - (0x1F232, 'M', u'禁'), - (0x1F233, 'M', u'空'), - (0x1F234, 'M', u'合'), - (0x1F235, 'M', u'満'), - (0x1F236, 'M', u'有'), - (0x1F237, 'M', u'月'), - (0x1F238, 'M', u'申'), - (0x1F239, 'M', u'割'), - (0x1F23A, 'M', u'営'), - (0x1F23B, 'M', u'配'), - ] - -def _seg_72(): - return [ - (0x1F23C, 'X'), - (0x1F240, 'M', u'〔本〕'), - (0x1F241, 'M', u'〔三〕'), - (0x1F242, 'M', u'〔二〕'), - (0x1F243, 'M', u'〔安〕'), - (0x1F244, 'M', u'〔点〕'), - (0x1F245, 'M', u'〔打〕'), - (0x1F246, 'M', u'〔盗〕'), - (0x1F247, 'M', u'〔勝〕'), - (0x1F248, 'M', u'〔敗〕'), - (0x1F249, 'X'), - (0x1F250, 'M', u'得'), - (0x1F251, 'M', u'可'), - (0x1F252, 'X'), - (0x1F260, 'V'), - (0x1F266, 'X'), - (0x1F300, 'V'), - (0x1F6D5, 'X'), - (0x1F6E0, 'V'), - (0x1F6ED, 'X'), - (0x1F6F0, 'V'), - (0x1F6FA, 'X'), - (0x1F700, 'V'), - (0x1F774, 'X'), - (0x1F780, 'V'), - (0x1F7D9, 'X'), - (0x1F800, 'V'), - (0x1F80C, 'X'), - (0x1F810, 'V'), - (0x1F848, 'X'), - (0x1F850, 'V'), - (0x1F85A, 'X'), - (0x1F860, 'V'), - (0x1F888, 'X'), - (0x1F890, 'V'), - (0x1F8AE, 'X'), - (0x1F900, 'V'), - (0x1F90C, 'X'), - (0x1F910, 'V'), - (0x1F93F, 'X'), - (0x1F940, 'V'), - (0x1F971, 'X'), - (0x1F973, 'V'), - (0x1F977, 'X'), - (0x1F97A, 'V'), - (0x1F97B, 'X'), - (0x1F97C, 'V'), - (0x1F9A3, 'X'), - (0x1F9B0, 'V'), - (0x1F9BA, 'X'), - (0x1F9C0, 'V'), - (0x1F9C3, 'X'), - (0x1F9D0, 'V'), - (0x1FA00, 'X'), - (0x1FA60, 'V'), - (0x1FA6E, 'X'), - (0x20000, 'V'), - (0x2A6D7, 'X'), - (0x2A700, 'V'), - (0x2B735, 'X'), - (0x2B740, 'V'), - (0x2B81E, 'X'), - (0x2B820, 'V'), - (0x2CEA2, 'X'), - (0x2CEB0, 'V'), - (0x2EBE1, 'X'), - (0x2F800, 'M', u'丽'), - (0x2F801, 'M', u'丸'), - (0x2F802, 'M', u'乁'), - (0x2F803, 'M', u'𠄢'), - (0x2F804, 'M', u'你'), - (0x2F805, 'M', u'侮'), - (0x2F806, 'M', u'侻'), - (0x2F807, 'M', u'倂'), - (0x2F808, 'M', u'偺'), - (0x2F809, 'M', u'備'), - (0x2F80A, 'M', u'僧'), - (0x2F80B, 'M', u'像'), - (0x2F80C, 'M', u'㒞'), - (0x2F80D, 'M', u'𠘺'), - (0x2F80E, 'M', u'免'), - (0x2F80F, 'M', u'兔'), - (0x2F810, 'M', u'兤'), - (0x2F811, 'M', u'具'), - (0x2F812, 'M', u'𠔜'), - (0x2F813, 'M', u'㒹'), - (0x2F814, 'M', u'內'), - (0x2F815, 'M', u'再'), - (0x2F816, 'M', u'𠕋'), - (0x2F817, 'M', u'冗'), - (0x2F818, 'M', u'冤'), - (0x2F819, 'M', u'仌'), - (0x2F81A, 'M', u'冬'), - (0x2F81B, 'M', u'况'), - (0x2F81C, 'M', u'𩇟'), - (0x2F81D, 'M', u'凵'), - (0x2F81E, 'M', u'刃'), - (0x2F81F, 'M', u'㓟'), - (0x2F820, 'M', u'刻'), - (0x2F821, 'M', u'剆'), - ] - -def _seg_73(): - return [ - (0x2F822, 'M', u'割'), - (0x2F823, 'M', u'剷'), - (0x2F824, 'M', u'㔕'), - (0x2F825, 'M', u'勇'), - (0x2F826, 'M', u'勉'), - (0x2F827, 'M', u'勤'), - (0x2F828, 'M', u'勺'), - (0x2F829, 'M', u'包'), - (0x2F82A, 'M', u'匆'), - (0x2F82B, 'M', u'北'), - (0x2F82C, 'M', u'卉'), - (0x2F82D, 'M', u'卑'), - (0x2F82E, 'M', u'博'), - (0x2F82F, 'M', u'即'), - (0x2F830, 'M', u'卽'), - (0x2F831, 'M', u'卿'), - (0x2F834, 'M', u'𠨬'), - (0x2F835, 'M', u'灰'), - (0x2F836, 'M', u'及'), - (0x2F837, 'M', u'叟'), - (0x2F838, 'M', u'𠭣'), - (0x2F839, 'M', u'叫'), - (0x2F83A, 'M', u'叱'), - (0x2F83B, 'M', u'吆'), - (0x2F83C, 'M', u'咞'), - (0x2F83D, 'M', u'吸'), - (0x2F83E, 'M', u'呈'), - (0x2F83F, 'M', u'周'), - (0x2F840, 'M', u'咢'), - (0x2F841, 'M', u'哶'), - (0x2F842, 'M', u'唐'), - (0x2F843, 'M', u'啓'), - (0x2F844, 'M', u'啣'), - (0x2F845, 'M', u'善'), - (0x2F847, 'M', u'喙'), - (0x2F848, 'M', u'喫'), - (0x2F849, 'M', u'喳'), - (0x2F84A, 'M', u'嗂'), - (0x2F84B, 'M', u'圖'), - (0x2F84C, 'M', u'嘆'), - (0x2F84D, 'M', u'圗'), - (0x2F84E, 'M', u'噑'), - (0x2F84F, 'M', u'噴'), - (0x2F850, 'M', u'切'), - (0x2F851, 'M', u'壮'), - (0x2F852, 'M', u'城'), - (0x2F853, 'M', u'埴'), - (0x2F854, 'M', u'堍'), - (0x2F855, 'M', u'型'), - (0x2F856, 'M', u'堲'), - (0x2F857, 'M', u'報'), - (0x2F858, 'M', u'墬'), - (0x2F859, 'M', u'𡓤'), - (0x2F85A, 'M', u'売'), - (0x2F85B, 'M', u'壷'), - (0x2F85C, 'M', u'夆'), - (0x2F85D, 'M', u'多'), - (0x2F85E, 'M', u'夢'), - (0x2F85F, 'M', u'奢'), - (0x2F860, 'M', u'𡚨'), - (0x2F861, 'M', u'𡛪'), - (0x2F862, 'M', u'姬'), - (0x2F863, 'M', u'娛'), - (0x2F864, 'M', u'娧'), - (0x2F865, 'M', u'姘'), - (0x2F866, 'M', u'婦'), - (0x2F867, 'M', u'㛮'), - (0x2F868, 'X'), - (0x2F869, 'M', u'嬈'), - (0x2F86A, 'M', u'嬾'), - (0x2F86C, 'M', u'𡧈'), - (0x2F86D, 'M', u'寃'), - (0x2F86E, 'M', u'寘'), - (0x2F86F, 'M', u'寧'), - (0x2F870, 'M', u'寳'), - (0x2F871, 'M', u'𡬘'), - (0x2F872, 'M', u'寿'), - (0x2F873, 'M', u'将'), - (0x2F874, 'X'), - (0x2F875, 'M', u'尢'), - (0x2F876, 'M', u'㞁'), - (0x2F877, 'M', u'屠'), - (0x2F878, 'M', u'屮'), - (0x2F879, 'M', u'峀'), - (0x2F87A, 'M', u'岍'), - (0x2F87B, 'M', u'𡷤'), - (0x2F87C, 'M', u'嵃'), - (0x2F87D, 'M', u'𡷦'), - (0x2F87E, 'M', u'嵮'), - (0x2F87F, 'M', u'嵫'), - (0x2F880, 'M', u'嵼'), - (0x2F881, 'M', u'巡'), - (0x2F882, 'M', u'巢'), - (0x2F883, 'M', u'㠯'), - (0x2F884, 'M', u'巽'), - (0x2F885, 'M', u'帨'), - (0x2F886, 'M', u'帽'), - (0x2F887, 'M', u'幩'), - (0x2F888, 'M', u'㡢'), - (0x2F889, 'M', u'𢆃'), - ] - -def _seg_74(): - return [ - (0x2F88A, 'M', u'㡼'), - (0x2F88B, 'M', u'庰'), - (0x2F88C, 'M', u'庳'), - (0x2F88D, 'M', u'庶'), - (0x2F88E, 'M', u'廊'), - (0x2F88F, 'M', u'𪎒'), - (0x2F890, 'M', u'廾'), - (0x2F891, 'M', u'𢌱'), - (0x2F893, 'M', u'舁'), - (0x2F894, 'M', u'弢'), - (0x2F896, 'M', u'㣇'), - (0x2F897, 'M', u'𣊸'), - (0x2F898, 'M', u'𦇚'), - (0x2F899, 'M', u'形'), - (0x2F89A, 'M', u'彫'), - (0x2F89B, 'M', u'㣣'), - (0x2F89C, 'M', u'徚'), - (0x2F89D, 'M', u'忍'), - (0x2F89E, 'M', u'志'), - (0x2F89F, 'M', u'忹'), - (0x2F8A0, 'M', u'悁'), - (0x2F8A1, 'M', u'㤺'), - (0x2F8A2, 'M', u'㤜'), - (0x2F8A3, 'M', u'悔'), - (0x2F8A4, 'M', u'𢛔'), - (0x2F8A5, 'M', u'惇'), - (0x2F8A6, 'M', u'慈'), - (0x2F8A7, 'M', u'慌'), - (0x2F8A8, 'M', u'慎'), - (0x2F8A9, 'M', u'慌'), - (0x2F8AA, 'M', u'慺'), - (0x2F8AB, 'M', u'憎'), - (0x2F8AC, 'M', u'憲'), - (0x2F8AD, 'M', u'憤'), - (0x2F8AE, 'M', u'憯'), - (0x2F8AF, 'M', u'懞'), - (0x2F8B0, 'M', u'懲'), - (0x2F8B1, 'M', u'懶'), - (0x2F8B2, 'M', u'成'), - (0x2F8B3, 'M', u'戛'), - (0x2F8B4, 'M', u'扝'), - (0x2F8B5, 'M', u'抱'), - (0x2F8B6, 'M', u'拔'), - (0x2F8B7, 'M', u'捐'), - (0x2F8B8, 'M', u'𢬌'), - (0x2F8B9, 'M', u'挽'), - (0x2F8BA, 'M', u'拼'), - (0x2F8BB, 'M', u'捨'), - (0x2F8BC, 'M', u'掃'), - (0x2F8BD, 'M', u'揤'), - (0x2F8BE, 'M', u'𢯱'), - (0x2F8BF, 'M', u'搢'), - (0x2F8C0, 'M', u'揅'), - (0x2F8C1, 'M', u'掩'), - (0x2F8C2, 'M', u'㨮'), - (0x2F8C3, 'M', u'摩'), - (0x2F8C4, 'M', u'摾'), - (0x2F8C5, 'M', u'撝'), - (0x2F8C6, 'M', u'摷'), - (0x2F8C7, 'M', u'㩬'), - (0x2F8C8, 'M', u'敏'), - (0x2F8C9, 'M', u'敬'), - (0x2F8CA, 'M', u'𣀊'), - (0x2F8CB, 'M', u'旣'), - (0x2F8CC, 'M', u'書'), - (0x2F8CD, 'M', u'晉'), - (0x2F8CE, 'M', u'㬙'), - (0x2F8CF, 'M', u'暑'), - (0x2F8D0, 'M', u'㬈'), - (0x2F8D1, 'M', u'㫤'), - (0x2F8D2, 'M', u'冒'), - (0x2F8D3, 'M', u'冕'), - (0x2F8D4, 'M', u'最'), - (0x2F8D5, 'M', u'暜'), - (0x2F8D6, 'M', u'肭'), - (0x2F8D7, 'M', u'䏙'), - (0x2F8D8, 'M', u'朗'), - (0x2F8D9, 'M', u'望'), - (0x2F8DA, 'M', u'朡'), - (0x2F8DB, 'M', u'杞'), - (0x2F8DC, 'M', u'杓'), - (0x2F8DD, 'M', u'𣏃'), - (0x2F8DE, 'M', u'㭉'), - (0x2F8DF, 'M', u'柺'), - (0x2F8E0, 'M', u'枅'), - (0x2F8E1, 'M', u'桒'), - (0x2F8E2, 'M', u'梅'), - (0x2F8E3, 'M', u'𣑭'), - (0x2F8E4, 'M', u'梎'), - (0x2F8E5, 'M', u'栟'), - (0x2F8E6, 'M', u'椔'), - (0x2F8E7, 'M', u'㮝'), - (0x2F8E8, 'M', u'楂'), - (0x2F8E9, 'M', u'榣'), - (0x2F8EA, 'M', u'槪'), - (0x2F8EB, 'M', u'檨'), - (0x2F8EC, 'M', u'𣚣'), - (0x2F8ED, 'M', u'櫛'), - (0x2F8EE, 'M', u'㰘'), - (0x2F8EF, 'M', u'次'), - ] - -def _seg_75(): - return [ - (0x2F8F0, 'M', u'𣢧'), - (0x2F8F1, 'M', u'歔'), - (0x2F8F2, 'M', u'㱎'), - (0x2F8F3, 'M', u'歲'), - (0x2F8F4, 'M', u'殟'), - (0x2F8F5, 'M', u'殺'), - (0x2F8F6, 'M', u'殻'), - (0x2F8F7, 'M', u'𣪍'), - (0x2F8F8, 'M', u'𡴋'), - (0x2F8F9, 'M', u'𣫺'), - (0x2F8FA, 'M', u'汎'), - (0x2F8FB, 'M', u'𣲼'), - (0x2F8FC, 'M', u'沿'), - (0x2F8FD, 'M', u'泍'), - (0x2F8FE, 'M', u'汧'), - (0x2F8FF, 'M', u'洖'), - (0x2F900, 'M', u'派'), - (0x2F901, 'M', u'海'), - (0x2F902, 'M', u'流'), - (0x2F903, 'M', u'浩'), - (0x2F904, 'M', u'浸'), - (0x2F905, 'M', u'涅'), - (0x2F906, 'M', u'𣴞'), - (0x2F907, 'M', u'洴'), - (0x2F908, 'M', u'港'), - (0x2F909, 'M', u'湮'), - (0x2F90A, 'M', u'㴳'), - (0x2F90B, 'M', u'滋'), - (0x2F90C, 'M', u'滇'), - (0x2F90D, 'M', u'𣻑'), - (0x2F90E, 'M', u'淹'), - (0x2F90F, 'M', u'潮'), - (0x2F910, 'M', u'𣽞'), - (0x2F911, 'M', u'𣾎'), - (0x2F912, 'M', u'濆'), - (0x2F913, 'M', u'瀹'), - (0x2F914, 'M', u'瀞'), - (0x2F915, 'M', u'瀛'), - (0x2F916, 'M', u'㶖'), - (0x2F917, 'M', u'灊'), - (0x2F918, 'M', u'災'), - (0x2F919, 'M', u'灷'), - (0x2F91A, 'M', u'炭'), - (0x2F91B, 'M', u'𠔥'), - (0x2F91C, 'M', u'煅'), - (0x2F91D, 'M', u'𤉣'), - (0x2F91E, 'M', u'熜'), - (0x2F91F, 'X'), - (0x2F920, 'M', u'爨'), - (0x2F921, 'M', u'爵'), - (0x2F922, 'M', u'牐'), - (0x2F923, 'M', u'𤘈'), - (0x2F924, 'M', u'犀'), - (0x2F925, 'M', u'犕'), - (0x2F926, 'M', u'𤜵'), - (0x2F927, 'M', u'𤠔'), - (0x2F928, 'M', u'獺'), - (0x2F929, 'M', u'王'), - (0x2F92A, 'M', u'㺬'), - (0x2F92B, 'M', u'玥'), - (0x2F92C, 'M', u'㺸'), - (0x2F92E, 'M', u'瑇'), - (0x2F92F, 'M', u'瑜'), - (0x2F930, 'M', u'瑱'), - (0x2F931, 'M', u'璅'), - (0x2F932, 'M', u'瓊'), - (0x2F933, 'M', u'㼛'), - (0x2F934, 'M', u'甤'), - (0x2F935, 'M', u'𤰶'), - (0x2F936, 'M', u'甾'), - (0x2F937, 'M', u'𤲒'), - (0x2F938, 'M', u'異'), - (0x2F939, 'M', u'𢆟'), - (0x2F93A, 'M', u'瘐'), - (0x2F93B, 'M', u'𤾡'), - (0x2F93C, 'M', u'𤾸'), - (0x2F93D, 'M', u'𥁄'), - (0x2F93E, 'M', u'㿼'), - (0x2F93F, 'M', u'䀈'), - (0x2F940, 'M', u'直'), - (0x2F941, 'M', u'𥃳'), - (0x2F942, 'M', u'𥃲'), - (0x2F943, 'M', u'𥄙'), - (0x2F944, 'M', u'𥄳'), - (0x2F945, 'M', u'眞'), - (0x2F946, 'M', u'真'), - (0x2F948, 'M', u'睊'), - (0x2F949, 'M', u'䀹'), - (0x2F94A, 'M', u'瞋'), - (0x2F94B, 'M', u'䁆'), - (0x2F94C, 'M', u'䂖'), - (0x2F94D, 'M', u'𥐝'), - (0x2F94E, 'M', u'硎'), - (0x2F94F, 'M', u'碌'), - (0x2F950, 'M', u'磌'), - (0x2F951, 'M', u'䃣'), - (0x2F952, 'M', u'𥘦'), - (0x2F953, 'M', u'祖'), - (0x2F954, 'M', u'𥚚'), - (0x2F955, 'M', u'𥛅'), - ] - -def _seg_76(): - return [ - (0x2F956, 'M', u'福'), - (0x2F957, 'M', u'秫'), - (0x2F958, 'M', u'䄯'), - (0x2F959, 'M', u'穀'), - (0x2F95A, 'M', u'穊'), - (0x2F95B, 'M', u'穏'), - (0x2F95C, 'M', u'𥥼'), - (0x2F95D, 'M', u'𥪧'), - (0x2F95F, 'X'), - (0x2F960, 'M', u'䈂'), - (0x2F961, 'M', u'𥮫'), - (0x2F962, 'M', u'篆'), - (0x2F963, 'M', u'築'), - (0x2F964, 'M', u'䈧'), - (0x2F965, 'M', u'𥲀'), - (0x2F966, 'M', u'糒'), - (0x2F967, 'M', u'䊠'), - (0x2F968, 'M', u'糨'), - (0x2F969, 'M', u'糣'), - (0x2F96A, 'M', u'紀'), - (0x2F96B, 'M', u'𥾆'), - (0x2F96C, 'M', u'絣'), - (0x2F96D, 'M', u'䌁'), - (0x2F96E, 'M', u'緇'), - (0x2F96F, 'M', u'縂'), - (0x2F970, 'M', u'繅'), - (0x2F971, 'M', u'䌴'), - (0x2F972, 'M', u'𦈨'), - (0x2F973, 'M', u'𦉇'), - (0x2F974, 'M', u'䍙'), - (0x2F975, 'M', u'𦋙'), - (0x2F976, 'M', u'罺'), - (0x2F977, 'M', u'𦌾'), - (0x2F978, 'M', u'羕'), - (0x2F979, 'M', u'翺'), - (0x2F97A, 'M', u'者'), - (0x2F97B, 'M', u'𦓚'), - (0x2F97C, 'M', u'𦔣'), - (0x2F97D, 'M', u'聠'), - (0x2F97E, 'M', u'𦖨'), - (0x2F97F, 'M', u'聰'), - (0x2F980, 'M', u'𣍟'), - (0x2F981, 'M', u'䏕'), - (0x2F982, 'M', u'育'), - (0x2F983, 'M', u'脃'), - (0x2F984, 'M', u'䐋'), - (0x2F985, 'M', u'脾'), - (0x2F986, 'M', u'媵'), - (0x2F987, 'M', u'𦞧'), - (0x2F988, 'M', u'𦞵'), - (0x2F989, 'M', u'𣎓'), - (0x2F98A, 'M', u'𣎜'), - (0x2F98B, 'M', u'舁'), - (0x2F98C, 'M', u'舄'), - (0x2F98D, 'M', u'辞'), - (0x2F98E, 'M', u'䑫'), - (0x2F98F, 'M', u'芑'), - (0x2F990, 'M', u'芋'), - (0x2F991, 'M', u'芝'), - (0x2F992, 'M', u'劳'), - (0x2F993, 'M', u'花'), - (0x2F994, 'M', u'芳'), - (0x2F995, 'M', u'芽'), - (0x2F996, 'M', u'苦'), - (0x2F997, 'M', u'𦬼'), - (0x2F998, 'M', u'若'), - (0x2F999, 'M', u'茝'), - (0x2F99A, 'M', u'荣'), - (0x2F99B, 'M', u'莭'), - (0x2F99C, 'M', u'茣'), - (0x2F99D, 'M', u'莽'), - (0x2F99E, 'M', u'菧'), - (0x2F99F, 'M', u'著'), - (0x2F9A0, 'M', u'荓'), - (0x2F9A1, 'M', u'菊'), - (0x2F9A2, 'M', u'菌'), - (0x2F9A3, 'M', u'菜'), - (0x2F9A4, 'M', u'𦰶'), - (0x2F9A5, 'M', u'𦵫'), - (0x2F9A6, 'M', u'𦳕'), - (0x2F9A7, 'M', u'䔫'), - (0x2F9A8, 'M', u'蓱'), - (0x2F9A9, 'M', u'蓳'), - (0x2F9AA, 'M', u'蔖'), - (0x2F9AB, 'M', u'𧏊'), - (0x2F9AC, 'M', u'蕤'), - (0x2F9AD, 'M', u'𦼬'), - (0x2F9AE, 'M', u'䕝'), - (0x2F9AF, 'M', u'䕡'), - (0x2F9B0, 'M', u'𦾱'), - (0x2F9B1, 'M', u'𧃒'), - (0x2F9B2, 'M', u'䕫'), - (0x2F9B3, 'M', u'虐'), - (0x2F9B4, 'M', u'虜'), - (0x2F9B5, 'M', u'虧'), - (0x2F9B6, 'M', u'虩'), - (0x2F9B7, 'M', u'蚩'), - (0x2F9B8, 'M', u'蚈'), - (0x2F9B9, 'M', u'蜎'), - (0x2F9BA, 'M', u'蛢'), - ] - -def _seg_77(): - return [ - (0x2F9BB, 'M', u'蝹'), - (0x2F9BC, 'M', u'蜨'), - (0x2F9BD, 'M', u'蝫'), - (0x2F9BE, 'M', u'螆'), - (0x2F9BF, 'X'), - (0x2F9C0, 'M', u'蟡'), - (0x2F9C1, 'M', u'蠁'), - (0x2F9C2, 'M', u'䗹'), - (0x2F9C3, 'M', u'衠'), - (0x2F9C4, 'M', u'衣'), - (0x2F9C5, 'M', u'𧙧'), - (0x2F9C6, 'M', u'裗'), - (0x2F9C7, 'M', u'裞'), - (0x2F9C8, 'M', u'䘵'), - (0x2F9C9, 'M', u'裺'), - (0x2F9CA, 'M', u'㒻'), - (0x2F9CB, 'M', u'𧢮'), - (0x2F9CC, 'M', u'𧥦'), - (0x2F9CD, 'M', u'䚾'), - (0x2F9CE, 'M', u'䛇'), - (0x2F9CF, 'M', u'誠'), - (0x2F9D0, 'M', u'諭'), - (0x2F9D1, 'M', u'變'), - (0x2F9D2, 'M', u'豕'), - (0x2F9D3, 'M', u'𧲨'), - (0x2F9D4, 'M', u'貫'), - (0x2F9D5, 'M', u'賁'), - (0x2F9D6, 'M', u'贛'), - (0x2F9D7, 'M', u'起'), - (0x2F9D8, 'M', u'𧼯'), - (0x2F9D9, 'M', u'𠠄'), - (0x2F9DA, 'M', u'跋'), - (0x2F9DB, 'M', u'趼'), - (0x2F9DC, 'M', u'跰'), - (0x2F9DD, 'M', u'𠣞'), - (0x2F9DE, 'M', u'軔'), - (0x2F9DF, 'M', u'輸'), - (0x2F9E0, 'M', u'𨗒'), - (0x2F9E1, 'M', u'𨗭'), - (0x2F9E2, 'M', u'邔'), - (0x2F9E3, 'M', u'郱'), - (0x2F9E4, 'M', u'鄑'), - (0x2F9E5, 'M', u'𨜮'), - (0x2F9E6, 'M', u'鄛'), - (0x2F9E7, 'M', u'鈸'), - (0x2F9E8, 'M', u'鋗'), - (0x2F9E9, 'M', u'鋘'), - (0x2F9EA, 'M', u'鉼'), - (0x2F9EB, 'M', u'鏹'), - (0x2F9EC, 'M', u'鐕'), - (0x2F9ED, 'M', u'𨯺'), - (0x2F9EE, 'M', u'開'), - (0x2F9EF, 'M', u'䦕'), - (0x2F9F0, 'M', u'閷'), - (0x2F9F1, 'M', u'𨵷'), - (0x2F9F2, 'M', u'䧦'), - (0x2F9F3, 'M', u'雃'), - (0x2F9F4, 'M', u'嶲'), - (0x2F9F5, 'M', u'霣'), - (0x2F9F6, 'M', u'𩅅'), - (0x2F9F7, 'M', u'𩈚'), - (0x2F9F8, 'M', u'䩮'), - (0x2F9F9, 'M', u'䩶'), - (0x2F9FA, 'M', u'韠'), - (0x2F9FB, 'M', u'𩐊'), - (0x2F9FC, 'M', u'䪲'), - (0x2F9FD, 'M', u'𩒖'), - (0x2F9FE, 'M', u'頋'), - (0x2FA00, 'M', u'頩'), - (0x2FA01, 'M', u'𩖶'), - (0x2FA02, 'M', u'飢'), - (0x2FA03, 'M', u'䬳'), - (0x2FA04, 'M', u'餩'), - (0x2FA05, 'M', u'馧'), - (0x2FA06, 'M', u'駂'), - (0x2FA07, 'M', u'駾'), - (0x2FA08, 'M', u'䯎'), - (0x2FA09, 'M', u'𩬰'), - (0x2FA0A, 'M', u'鬒'), - (0x2FA0B, 'M', u'鱀'), - (0x2FA0C, 'M', u'鳽'), - (0x2FA0D, 'M', u'䳎'), - (0x2FA0E, 'M', u'䳭'), - (0x2FA0F, 'M', u'鵧'), - (0x2FA10, 'M', u'𪃎'), - (0x2FA11, 'M', u'䳸'), - (0x2FA12, 'M', u'𪄅'), - (0x2FA13, 'M', u'𪈎'), - (0x2FA14, 'M', u'𪊑'), - (0x2FA15, 'M', u'麻'), - (0x2FA16, 'M', u'䵖'), - (0x2FA17, 'M', u'黹'), - (0x2FA18, 'M', u'黾'), - (0x2FA19, 'M', u'鼅'), - (0x2FA1A, 'M', u'鼏'), - (0x2FA1B, 'M', u'鼖'), - (0x2FA1C, 'M', u'鼻'), - (0x2FA1D, 'M', u'𪘀'), - (0x2FA1E, 'X'), - (0xE0100, 'I'), - ] - -def _seg_78(): - return [ - (0xE01F0, 'X'), - ] - -uts46data = tuple( - _seg_0() - + _seg_1() - + _seg_2() - + _seg_3() - + _seg_4() - + _seg_5() - + _seg_6() - + _seg_7() - + _seg_8() - + _seg_9() - + _seg_10() - + _seg_11() - + _seg_12() - + _seg_13() - + _seg_14() - + _seg_15() - + _seg_16() - + _seg_17() - + _seg_18() - + _seg_19() - + _seg_20() - + _seg_21() - + _seg_22() - + _seg_23() - + _seg_24() - + _seg_25() - + _seg_26() - + _seg_27() - + _seg_28() - + _seg_29() - + _seg_30() - + _seg_31() - + _seg_32() - + _seg_33() - + _seg_34() - + _seg_35() - + _seg_36() - + _seg_37() - + _seg_38() - + _seg_39() - + _seg_40() - + _seg_41() - + _seg_42() - + _seg_43() - + _seg_44() - + _seg_45() - + _seg_46() - + _seg_47() - + _seg_48() - + _seg_49() - + _seg_50() - + _seg_51() - + _seg_52() - + _seg_53() - + _seg_54() - + _seg_55() - + _seg_56() - + _seg_57() - + _seg_58() - + _seg_59() - + _seg_60() - + _seg_61() - + _seg_62() - + _seg_63() - + _seg_64() - + _seg_65() - + _seg_66() - + _seg_67() - + _seg_68() - + _seg_69() - + _seg_70() - + _seg_71() - + _seg_72() - + _seg_73() - + _seg_74() - + _seg_75() - + _seg_76() - + _seg_77() - + _seg_78() -) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/idna/uts46data.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/idna/uts46data.pyc deleted file mode 100644 index effbfd66e529201b59f5093ad8a36825782cec84..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 296556 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 O^z>2u-{X$`@c#oganGUv diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/ipaddress.py b/venv/lib/python2.7/site-packages/pip/_vendor/ipaddress.py deleted file mode 100644 index f2d0766..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/ipaddress.py +++ /dev/null @@ -1,2419 +0,0 @@ -# Copyright 2007 Google Inc. -# Licensed to PSF under a Contributor Agreement. - -"""A fast, lightweight IPv4/IPv6 manipulation library in Python. - -This library is used to create/poke/manipulate IPv4 and IPv6 addresses -and networks. - -""" - -from __future__ import unicode_literals - - -import itertools -import struct - -__version__ = '1.0.22' - -# Compatibility functions -_compat_int_types = (int,) -try: - _compat_int_types = (int, long) -except NameError: - pass -try: - _compat_str = unicode -except NameError: - _compat_str = str - assert bytes != str -if b'\0'[0] == 0: # Python 3 semantics - def _compat_bytes_to_byte_vals(byt): - return byt -else: - def _compat_bytes_to_byte_vals(byt): - return [struct.unpack(b'!B', b)[0] for b in byt] -try: - _compat_int_from_byte_vals = int.from_bytes -except AttributeError: - def _compat_int_from_byte_vals(bytvals, endianess): - assert endianess == 'big' - res = 0 - for bv in bytvals: - assert isinstance(bv, _compat_int_types) - res = (res << 8) + bv - return res - - -def _compat_to_bytes(intval, length, endianess): - assert isinstance(intval, _compat_int_types) - assert endianess == 'big' - if length == 4: - if intval < 0 or intval >= 2 ** 32: - raise struct.error("integer out of range for 'I' format code") - return struct.pack(b'!I', intval) - elif length == 16: - if intval < 0 or intval >= 2 ** 128: - raise struct.error("integer out of range for 'QQ' format code") - return struct.pack(b'!QQ', intval >> 64, intval & 0xffffffffffffffff) - else: - raise NotImplementedError() - - -if hasattr(int, 'bit_length'): - # Not int.bit_length , since that won't work in 2.7 where long exists - def _compat_bit_length(i): - return i.bit_length() -else: - def _compat_bit_length(i): - for res in itertools.count(): - if i >> res == 0: - return res - - -def _compat_range(start, end, step=1): - assert step > 0 - i = start - while i < end: - yield i - i += step - - -class _TotalOrderingMixin(object): - __slots__ = () - - # Helper that derives the other comparison operations from - # __lt__ and __eq__ - # We avoid functools.total_ordering because it doesn't handle - # NotImplemented correctly yet (http://bugs.python.org/issue10042) - def __eq__(self, other): - raise NotImplementedError - - def __ne__(self, other): - equal = self.__eq__(other) - if equal is NotImplemented: - return NotImplemented - return not equal - - def __lt__(self, other): - raise NotImplementedError - - def __le__(self, other): - less = self.__lt__(other) - if less is NotImplemented or not less: - return self.__eq__(other) - return less - - def __gt__(self, other): - less = self.__lt__(other) - if less is NotImplemented: - return NotImplemented - equal = self.__eq__(other) - if equal is NotImplemented: - return NotImplemented - return not (less or equal) - - def __ge__(self, other): - less = self.__lt__(other) - if less is NotImplemented: - return NotImplemented - return not less - - -IPV4LENGTH = 32 -IPV6LENGTH = 128 - - -class AddressValueError(ValueError): - """A Value Error related to the address.""" - - -class NetmaskValueError(ValueError): - """A Value Error related to the netmask.""" - - -def ip_address(address): - """Take an IP string/int and return an object of the correct type. - - Args: - address: A string or integer, the IP address. Either IPv4 or - IPv6 addresses may be supplied; integers less than 2**32 will - be considered to be IPv4 by default. - - Returns: - An IPv4Address or IPv6Address object. - - Raises: - ValueError: if the *address* passed isn't either a v4 or a v6 - address - - """ - try: - return IPv4Address(address) - except (AddressValueError, NetmaskValueError): - pass - - try: - return IPv6Address(address) - except (AddressValueError, NetmaskValueError): - pass - - if isinstance(address, bytes): - raise AddressValueError( - '%r does not appear to be an IPv4 or IPv6 address. ' - 'Did you pass in a bytes (str in Python 2) instead of' - ' a unicode object?' % address) - - raise ValueError('%r does not appear to be an IPv4 or IPv6 address' % - address) - - -def ip_network(address, strict=True): - """Take an IP string/int and return an object of the correct type. - - Args: - address: A string or integer, the IP network. Either IPv4 or - IPv6 networks may be supplied; integers less than 2**32 will - be considered to be IPv4 by default. - - Returns: - An IPv4Network or IPv6Network object. - - Raises: - ValueError: if the string passed isn't either a v4 or a v6 - address. Or if the network has host bits set. - - """ - try: - return IPv4Network(address, strict) - except (AddressValueError, NetmaskValueError): - pass - - try: - return IPv6Network(address, strict) - except (AddressValueError, NetmaskValueError): - pass - - if isinstance(address, bytes): - raise AddressValueError( - '%r does not appear to be an IPv4 or IPv6 network. ' - 'Did you pass in a bytes (str in Python 2) instead of' - ' a unicode object?' % address) - - raise ValueError('%r does not appear to be an IPv4 or IPv6 network' % - address) - - -def ip_interface(address): - """Take an IP string/int and return an object of the correct type. - - Args: - address: A string or integer, the IP address. Either IPv4 or - IPv6 addresses may be supplied; integers less than 2**32 will - be considered to be IPv4 by default. - - Returns: - An IPv4Interface or IPv6Interface object. - - Raises: - ValueError: if the string passed isn't either a v4 or a v6 - address. - - Notes: - The IPv?Interface classes describe an Address on a particular - Network, so they're basically a combination of both the Address - and Network classes. - - """ - try: - return IPv4Interface(address) - except (AddressValueError, NetmaskValueError): - pass - - try: - return IPv6Interface(address) - except (AddressValueError, NetmaskValueError): - pass - - raise ValueError('%r does not appear to be an IPv4 or IPv6 interface' % - address) - - -def v4_int_to_packed(address): - """Represent an address as 4 packed bytes in network (big-endian) order. - - Args: - address: An integer representation of an IPv4 IP address. - - Returns: - The integer address packed as 4 bytes in network (big-endian) order. - - Raises: - ValueError: If the integer is negative or too large to be an - IPv4 IP address. - - """ - try: - return _compat_to_bytes(address, 4, 'big') - except (struct.error, OverflowError): - raise ValueError("Address negative or too large for IPv4") - - -def v6_int_to_packed(address): - """Represent an address as 16 packed bytes in network (big-endian) order. - - Args: - address: An integer representation of an IPv6 IP address. - - Returns: - The integer address packed as 16 bytes in network (big-endian) order. - - """ - try: - return _compat_to_bytes(address, 16, 'big') - except (struct.error, OverflowError): - raise ValueError("Address negative or too large for IPv6") - - -def _split_optional_netmask(address): - """Helper to split the netmask and raise AddressValueError if needed""" - addr = _compat_str(address).split('/') - if len(addr) > 2: - raise AddressValueError("Only one '/' permitted in %r" % address) - return addr - - -def _find_address_range(addresses): - """Find a sequence of sorted deduplicated IPv#Address. - - Args: - addresses: a list of IPv#Address objects. - - Yields: - A tuple containing the first and last IP addresses in the sequence. - - """ - it = iter(addresses) - first = last = next(it) - for ip in it: - if ip._ip != last._ip + 1: - yield first, last - first = ip - last = ip - yield first, last - - -def _count_righthand_zero_bits(number, bits): - """Count the number of zero bits on the right hand side. - - Args: - number: an integer. - bits: maximum number of bits to count. - - Returns: - The number of zero bits on the right hand side of the number. - - """ - if number == 0: - return bits - return min(bits, _compat_bit_length(~number & (number - 1))) - - -def summarize_address_range(first, last): - """Summarize a network range given the first and last IP addresses. - - Example: - >>> list(summarize_address_range(IPv4Address('192.0.2.0'), - ... IPv4Address('192.0.2.130'))) - ... #doctest: +NORMALIZE_WHITESPACE - [IPv4Network('192.0.2.0/25'), IPv4Network('192.0.2.128/31'), - IPv4Network('192.0.2.130/32')] - - Args: - first: the first IPv4Address or IPv6Address in the range. - last: the last IPv4Address or IPv6Address in the range. - - Returns: - An iterator of the summarized IPv(4|6) network objects. - - Raise: - TypeError: - If the first and last objects are not IP addresses. - If the first and last objects are not the same version. - ValueError: - If the last object is not greater than the first. - If the version of the first address is not 4 or 6. - - """ - if (not (isinstance(first, _BaseAddress) and - isinstance(last, _BaseAddress))): - raise TypeError('first and last must be IP addresses, not networks') - if first.version != last.version: - raise TypeError("%s and %s are not of the same version" % ( - first, last)) - if first > last: - raise ValueError('last IP address must be greater than first') - - if first.version == 4: - ip = IPv4Network - elif first.version == 6: - ip = IPv6Network - else: - raise ValueError('unknown IP version') - - ip_bits = first._max_prefixlen - first_int = first._ip - last_int = last._ip - while first_int <= last_int: - nbits = min(_count_righthand_zero_bits(first_int, ip_bits), - _compat_bit_length(last_int - first_int + 1) - 1) - net = ip((first_int, ip_bits - nbits)) - yield net - first_int += 1 << nbits - if first_int - 1 == ip._ALL_ONES: - break - - -def _collapse_addresses_internal(addresses): - """Loops through the addresses, collapsing concurrent netblocks. - - Example: - - ip1 = IPv4Network('192.0.2.0/26') - ip2 = IPv4Network('192.0.2.64/26') - ip3 = IPv4Network('192.0.2.128/26') - ip4 = IPv4Network('192.0.2.192/26') - - _collapse_addresses_internal([ip1, ip2, ip3, ip4]) -> - [IPv4Network('192.0.2.0/24')] - - This shouldn't be called directly; it is called via - collapse_addresses([]). - - Args: - addresses: A list of IPv4Network's or IPv6Network's - - Returns: - A list of IPv4Network's or IPv6Network's depending on what we were - passed. - - """ - # First merge - to_merge = list(addresses) - subnets = {} - while to_merge: - net = to_merge.pop() - supernet = net.supernet() - existing = subnets.get(supernet) - if existing is None: - subnets[supernet] = net - elif existing != net: - # Merge consecutive subnets - del subnets[supernet] - to_merge.append(supernet) - # Then iterate over resulting networks, skipping subsumed subnets - last = None - for net in sorted(subnets.values()): - if last is not None: - # Since they are sorted, - # last.network_address <= net.network_address is a given. - if last.broadcast_address >= net.broadcast_address: - continue - yield net - last = net - - -def collapse_addresses(addresses): - """Collapse a list of IP objects. - - Example: - collapse_addresses([IPv4Network('192.0.2.0/25'), - IPv4Network('192.0.2.128/25')]) -> - [IPv4Network('192.0.2.0/24')] - - Args: - addresses: An iterator of IPv4Network or IPv6Network objects. - - Returns: - An iterator of the collapsed IPv(4|6)Network objects. - - Raises: - TypeError: If passed a list of mixed version objects. - - """ - addrs = [] - ips = [] - nets = [] - - # split IP addresses and networks - for ip in addresses: - if isinstance(ip, _BaseAddress): - if ips and ips[-1]._version != ip._version: - raise TypeError("%s and %s are not of the same version" % ( - ip, ips[-1])) - ips.append(ip) - elif ip._prefixlen == ip._max_prefixlen: - if ips and ips[-1]._version != ip._version: - raise TypeError("%s and %s are not of the same version" % ( - ip, ips[-1])) - try: - ips.append(ip.ip) - except AttributeError: - ips.append(ip.network_address) - else: - if nets and nets[-1]._version != ip._version: - raise TypeError("%s and %s are not of the same version" % ( - ip, nets[-1])) - nets.append(ip) - - # sort and dedup - ips = sorted(set(ips)) - - # find consecutive address ranges in the sorted sequence and summarize them - if ips: - for first, last in _find_address_range(ips): - addrs.extend(summarize_address_range(first, last)) - - return _collapse_addresses_internal(addrs + nets) - - -def get_mixed_type_key(obj): - """Return a key suitable for sorting between networks and addresses. - - Address and Network objects are not sortable by default; they're - fundamentally different so the expression - - IPv4Address('192.0.2.0') <= IPv4Network('192.0.2.0/24') - - doesn't make any sense. There are some times however, where you may wish - to have ipaddress sort these for you anyway. If you need to do this, you - can use this function as the key= argument to sorted(). - - Args: - obj: either a Network or Address object. - Returns: - appropriate key. - - """ - if isinstance(obj, _BaseNetwork): - return obj._get_networks_key() - elif isinstance(obj, _BaseAddress): - return obj._get_address_key() - return NotImplemented - - -class _IPAddressBase(_TotalOrderingMixin): - - """The mother class.""" - - __slots__ = () - - @property - def exploded(self): - """Return the longhand version of the IP address as a string.""" - return self._explode_shorthand_ip_string() - - @property - def compressed(self): - """Return the shorthand version of the IP address as a string.""" - return _compat_str(self) - - @property - def reverse_pointer(self): - """The name of the reverse DNS pointer for the IP address, e.g.: - >>> ipaddress.ip_address("127.0.0.1").reverse_pointer - '1.0.0.127.in-addr.arpa' - >>> ipaddress.ip_address("2001:db8::1").reverse_pointer - '1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa' - - """ - return self._reverse_pointer() - - @property - def version(self): - msg = '%200s has no version specified' % (type(self),) - raise NotImplementedError(msg) - - def _check_int_address(self, address): - if address < 0: - msg = "%d (< 0) is not permitted as an IPv%d address" - raise AddressValueError(msg % (address, self._version)) - if address > self._ALL_ONES: - msg = "%d (>= 2**%d) is not permitted as an IPv%d address" - raise AddressValueError(msg % (address, self._max_prefixlen, - self._version)) - - def _check_packed_address(self, address, expected_len): - address_len = len(address) - if address_len != expected_len: - msg = ( - '%r (len %d != %d) is not permitted as an IPv%d address. ' - 'Did you pass in a bytes (str in Python 2) instead of' - ' a unicode object?') - raise AddressValueError(msg % (address, address_len, - expected_len, self._version)) - - @classmethod - def _ip_int_from_prefix(cls, prefixlen): - """Turn the prefix length into a bitwise netmask - - Args: - prefixlen: An integer, the prefix length. - - Returns: - An integer. - - """ - return cls._ALL_ONES ^ (cls._ALL_ONES >> prefixlen) - - @classmethod - def _prefix_from_ip_int(cls, ip_int): - """Return prefix length from the bitwise netmask. - - Args: - ip_int: An integer, the netmask in expanded bitwise format - - Returns: - An integer, the prefix length. - - Raises: - ValueError: If the input intermingles zeroes & ones - """ - trailing_zeroes = _count_righthand_zero_bits(ip_int, - cls._max_prefixlen) - prefixlen = cls._max_prefixlen - trailing_zeroes - leading_ones = ip_int >> trailing_zeroes - all_ones = (1 << prefixlen) - 1 - if leading_ones != all_ones: - byteslen = cls._max_prefixlen // 8 - details = _compat_to_bytes(ip_int, byteslen, 'big') - msg = 'Netmask pattern %r mixes zeroes & ones' - raise ValueError(msg % details) - return prefixlen - - @classmethod - def _report_invalid_netmask(cls, netmask_str): - msg = '%r is not a valid netmask' % netmask_str - raise NetmaskValueError(msg) - - @classmethod - def _prefix_from_prefix_string(cls, prefixlen_str): - """Return prefix length from a numeric string - - Args: - prefixlen_str: The string to be converted - - Returns: - An integer, the prefix length. - - Raises: - NetmaskValueError: If the input is not a valid netmask - """ - # int allows a leading +/- as well as surrounding whitespace, - # so we ensure that isn't the case - if not _BaseV4._DECIMAL_DIGITS.issuperset(prefixlen_str): - cls._report_invalid_netmask(prefixlen_str) - try: - prefixlen = int(prefixlen_str) - except ValueError: - cls._report_invalid_netmask(prefixlen_str) - if not (0 <= prefixlen <= cls._max_prefixlen): - cls._report_invalid_netmask(prefixlen_str) - return prefixlen - - @classmethod - def _prefix_from_ip_string(cls, ip_str): - """Turn a netmask/hostmask string into a prefix length - - Args: - ip_str: The netmask/hostmask to be converted - - Returns: - An integer, the prefix length. - - Raises: - NetmaskValueError: If the input is not a valid netmask/hostmask - """ - # Parse the netmask/hostmask like an IP address. - try: - ip_int = cls._ip_int_from_string(ip_str) - except AddressValueError: - cls._report_invalid_netmask(ip_str) - - # Try matching a netmask (this would be /1*0*/ as a bitwise regexp). - # Note that the two ambiguous cases (all-ones and all-zeroes) are - # treated as netmasks. - try: - return cls._prefix_from_ip_int(ip_int) - except ValueError: - pass - - # Invert the bits, and try matching a /0+1+/ hostmask instead. - ip_int ^= cls._ALL_ONES - try: - return cls._prefix_from_ip_int(ip_int) - except ValueError: - cls._report_invalid_netmask(ip_str) - - def __reduce__(self): - return self.__class__, (_compat_str(self),) - - -class _BaseAddress(_IPAddressBase): - - """A generic IP object. - - This IP class contains the version independent methods which are - used by single IP addresses. - """ - - __slots__ = () - - def __int__(self): - return self._ip - - def __eq__(self, other): - try: - return (self._ip == other._ip and - self._version == other._version) - except AttributeError: - return NotImplemented - - def __lt__(self, other): - if not isinstance(other, _IPAddressBase): - return NotImplemented - if not isinstance(other, _BaseAddress): - raise TypeError('%s and %s are not of the same type' % ( - self, other)) - if self._version != other._version: - raise TypeError('%s and %s are not of the same version' % ( - self, other)) - if self._ip != other._ip: - return self._ip < other._ip - return False - - # Shorthand for Integer addition and subtraction. This is not - # meant to ever support addition/subtraction of addresses. - def __add__(self, other): - if not isinstance(other, _compat_int_types): - return NotImplemented - return self.__class__(int(self) + other) - - def __sub__(self, other): - if not isinstance(other, _compat_int_types): - return NotImplemented - return self.__class__(int(self) - other) - - def __repr__(self): - return '%s(%r)' % (self.__class__.__name__, _compat_str(self)) - - def __str__(self): - return _compat_str(self._string_from_ip_int(self._ip)) - - def __hash__(self): - return hash(hex(int(self._ip))) - - def _get_address_key(self): - return (self._version, self) - - def __reduce__(self): - return self.__class__, (self._ip,) - - -class _BaseNetwork(_IPAddressBase): - - """A generic IP network object. - - This IP class contains the version independent methods which are - used by networks. - - """ - def __init__(self, address): - self._cache = {} - - def __repr__(self): - return '%s(%r)' % (self.__class__.__name__, _compat_str(self)) - - def __str__(self): - return '%s/%d' % (self.network_address, self.prefixlen) - - def hosts(self): - """Generate Iterator over usable hosts in a network. - - This is like __iter__ except it doesn't return the network - or broadcast addresses. - - """ - network = int(self.network_address) - broadcast = int(self.broadcast_address) - for x in _compat_range(network + 1, broadcast): - yield self._address_class(x) - - def __iter__(self): - network = int(self.network_address) - broadcast = int(self.broadcast_address) - for x in _compat_range(network, broadcast + 1): - yield self._address_class(x) - - def __getitem__(self, n): - network = int(self.network_address) - broadcast = int(self.broadcast_address) - if n >= 0: - if network + n > broadcast: - raise IndexError('address out of range') - return self._address_class(network + n) - else: - n += 1 - if broadcast + n < network: - raise IndexError('address out of range') - return self._address_class(broadcast + n) - - def __lt__(self, other): - if not isinstance(other, _IPAddressBase): - return NotImplemented - if not isinstance(other, _BaseNetwork): - raise TypeError('%s and %s are not of the same type' % ( - self, other)) - if self._version != other._version: - raise TypeError('%s and %s are not of the same version' % ( - self, other)) - if self.network_address != other.network_address: - return self.network_address < other.network_address - if self.netmask != other.netmask: - return self.netmask < other.netmask - return False - - def __eq__(self, other): - try: - return (self._version == other._version and - self.network_address == other.network_address and - int(self.netmask) == int(other.netmask)) - except AttributeError: - return NotImplemented - - def __hash__(self): - return hash(int(self.network_address) ^ int(self.netmask)) - - def __contains__(self, other): - # always false if one is v4 and the other is v6. - if self._version != other._version: - return False - # dealing with another network. - if isinstance(other, _BaseNetwork): - return False - # dealing with another address - else: - # address - return (int(self.network_address) <= int(other._ip) <= - int(self.broadcast_address)) - - def overlaps(self, other): - """Tell if self is partly contained in other.""" - return self.network_address in other or ( - self.broadcast_address in other or ( - other.network_address in self or ( - other.broadcast_address in self))) - - @property - def broadcast_address(self): - x = self._cache.get('broadcast_address') - if x is None: - x = self._address_class(int(self.network_address) | - int(self.hostmask)) - self._cache['broadcast_address'] = x - return x - - @property - def hostmask(self): - x = self._cache.get('hostmask') - if x is None: - x = self._address_class(int(self.netmask) ^ self._ALL_ONES) - self._cache['hostmask'] = x - return x - - @property - def with_prefixlen(self): - return '%s/%d' % (self.network_address, self._prefixlen) - - @property - def with_netmask(self): - return '%s/%s' % (self.network_address, self.netmask) - - @property - def with_hostmask(self): - return '%s/%s' % (self.network_address, self.hostmask) - - @property - def num_addresses(self): - """Number of hosts in the current subnet.""" - return int(self.broadcast_address) - int(self.network_address) + 1 - - @property - def _address_class(self): - # Returning bare address objects (rather than interfaces) allows for - # more consistent behaviour across the network address, broadcast - # address and individual host addresses. - msg = '%200s has no associated address class' % (type(self),) - raise NotImplementedError(msg) - - @property - def prefixlen(self): - return self._prefixlen - - def address_exclude(self, other): - """Remove an address from a larger block. - - For example: - - addr1 = ip_network('192.0.2.0/28') - addr2 = ip_network('192.0.2.1/32') - list(addr1.address_exclude(addr2)) = - [IPv4Network('192.0.2.0/32'), IPv4Network('192.0.2.2/31'), - IPv4Network('192.0.2.4/30'), IPv4Network('192.0.2.8/29')] - - or IPv6: - - addr1 = ip_network('2001:db8::1/32') - addr2 = ip_network('2001:db8::1/128') - list(addr1.address_exclude(addr2)) = - [ip_network('2001:db8::1/128'), - ip_network('2001:db8::2/127'), - ip_network('2001:db8::4/126'), - ip_network('2001:db8::8/125'), - ... - ip_network('2001:db8:8000::/33')] - - Args: - other: An IPv4Network or IPv6Network object of the same type. - - Returns: - An iterator of the IPv(4|6)Network objects which is self - minus other. - - Raises: - TypeError: If self and other are of differing address - versions, or if other is not a network object. - ValueError: If other is not completely contained by self. - - """ - if not self._version == other._version: - raise TypeError("%s and %s are not of the same version" % ( - self, other)) - - if not isinstance(other, _BaseNetwork): - raise TypeError("%s is not a network object" % other) - - if not other.subnet_of(self): - raise ValueError('%s not contained in %s' % (other, self)) - if other == self: - return - - # Make sure we're comparing the network of other. - other = other.__class__('%s/%s' % (other.network_address, - other.prefixlen)) - - s1, s2 = self.subnets() - while s1 != other and s2 != other: - if other.subnet_of(s1): - yield s2 - s1, s2 = s1.subnets() - elif other.subnet_of(s2): - yield s1 - s1, s2 = s2.subnets() - else: - # If we got here, there's a bug somewhere. - raise AssertionError('Error performing exclusion: ' - 's1: %s s2: %s other: %s' % - (s1, s2, other)) - if s1 == other: - yield s2 - elif s2 == other: - yield s1 - else: - # If we got here, there's a bug somewhere. - raise AssertionError('Error performing exclusion: ' - 's1: %s s2: %s other: %s' % - (s1, s2, other)) - - def compare_networks(self, other): - """Compare two IP objects. - - This is only concerned about the comparison of the integer - representation of the network addresses. This means that the - host bits aren't considered at all in this method. If you want - to compare host bits, you can easily enough do a - 'HostA._ip < HostB._ip' - - Args: - other: An IP object. - - Returns: - If the IP versions of self and other are the same, returns: - - -1 if self < other: - eg: IPv4Network('192.0.2.0/25') < IPv4Network('192.0.2.128/25') - IPv6Network('2001:db8::1000/124') < - IPv6Network('2001:db8::2000/124') - 0 if self == other - eg: IPv4Network('192.0.2.0/24') == IPv4Network('192.0.2.0/24') - IPv6Network('2001:db8::1000/124') == - IPv6Network('2001:db8::1000/124') - 1 if self > other - eg: IPv4Network('192.0.2.128/25') > IPv4Network('192.0.2.0/25') - IPv6Network('2001:db8::2000/124') > - IPv6Network('2001:db8::1000/124') - - Raises: - TypeError if the IP versions are different. - - """ - # does this need to raise a ValueError? - if self._version != other._version: - raise TypeError('%s and %s are not of the same type' % ( - self, other)) - # self._version == other._version below here: - if self.network_address < other.network_address: - return -1 - if self.network_address > other.network_address: - return 1 - # self.network_address == other.network_address below here: - if self.netmask < other.netmask: - return -1 - if self.netmask > other.netmask: - return 1 - return 0 - - def _get_networks_key(self): - """Network-only key function. - - Returns an object that identifies this address' network and - netmask. This function is a suitable "key" argument for sorted() - and list.sort(). - - """ - return (self._version, self.network_address, self.netmask) - - def subnets(self, prefixlen_diff=1, new_prefix=None): - """The subnets which join to make the current subnet. - - In the case that self contains only one IP - (self._prefixlen == 32 for IPv4 or self._prefixlen == 128 - for IPv6), yield an iterator with just ourself. - - Args: - prefixlen_diff: An integer, the amount the prefix length - should be increased by. This should not be set if - new_prefix is also set. - new_prefix: The desired new prefix length. This must be a - larger number (smaller prefix) than the existing prefix. - This should not be set if prefixlen_diff is also set. - - Returns: - An iterator of IPv(4|6) objects. - - Raises: - ValueError: The prefixlen_diff is too small or too large. - OR - prefixlen_diff and new_prefix are both set or new_prefix - is a smaller number than the current prefix (smaller - number means a larger network) - - """ - if self._prefixlen == self._max_prefixlen: - yield self - return - - if new_prefix is not None: - if new_prefix < self._prefixlen: - raise ValueError('new prefix must be longer') - if prefixlen_diff != 1: - raise ValueError('cannot set prefixlen_diff and new_prefix') - prefixlen_diff = new_prefix - self._prefixlen - - if prefixlen_diff < 0: - raise ValueError('prefix length diff must be > 0') - new_prefixlen = self._prefixlen + prefixlen_diff - - if new_prefixlen > self._max_prefixlen: - raise ValueError( - 'prefix length diff %d is invalid for netblock %s' % ( - new_prefixlen, self)) - - start = int(self.network_address) - end = int(self.broadcast_address) + 1 - step = (int(self.hostmask) + 1) >> prefixlen_diff - for new_addr in _compat_range(start, end, step): - current = self.__class__((new_addr, new_prefixlen)) - yield current - - def supernet(self, prefixlen_diff=1, new_prefix=None): - """The supernet containing the current network. - - Args: - prefixlen_diff: An integer, the amount the prefix length of - the network should be decreased by. For example, given a - /24 network and a prefixlen_diff of 3, a supernet with a - /21 netmask is returned. - - Returns: - An IPv4 network object. - - Raises: - ValueError: If self.prefixlen - prefixlen_diff < 0. I.e., you have - a negative prefix length. - OR - If prefixlen_diff and new_prefix are both set or new_prefix is a - larger number than the current prefix (larger number means a - smaller network) - - """ - if self._prefixlen == 0: - return self - - if new_prefix is not None: - if new_prefix > self._prefixlen: - raise ValueError('new prefix must be shorter') - if prefixlen_diff != 1: - raise ValueError('cannot set prefixlen_diff and new_prefix') - prefixlen_diff = self._prefixlen - new_prefix - - new_prefixlen = self.prefixlen - prefixlen_diff - if new_prefixlen < 0: - raise ValueError( - 'current prefixlen is %d, cannot have a prefixlen_diff of %d' % - (self.prefixlen, prefixlen_diff)) - return self.__class__(( - int(self.network_address) & (int(self.netmask) << prefixlen_diff), - new_prefixlen)) - - @property - def is_multicast(self): - """Test if the address is reserved for multicast use. - - Returns: - A boolean, True if the address is a multicast address. - See RFC 2373 2.7 for details. - - """ - return (self.network_address.is_multicast and - self.broadcast_address.is_multicast) - - @staticmethod - def _is_subnet_of(a, b): - try: - # Always false if one is v4 and the other is v6. - if a._version != b._version: - raise TypeError("%s and %s are not of the same version" (a, b)) - return (b.network_address <= a.network_address and - b.broadcast_address >= a.broadcast_address) - except AttributeError: - raise TypeError("Unable to test subnet containment " - "between %s and %s" % (a, b)) - - def subnet_of(self, other): - """Return True if this network is a subnet of other.""" - return self._is_subnet_of(self, other) - - def supernet_of(self, other): - """Return True if this network is a supernet of other.""" - return self._is_subnet_of(other, self) - - @property - def is_reserved(self): - """Test if the address is otherwise IETF reserved. - - Returns: - A boolean, True if the address is within one of the - reserved IPv6 Network ranges. - - """ - return (self.network_address.is_reserved and - self.broadcast_address.is_reserved) - - @property - def is_link_local(self): - """Test if the address is reserved for link-local. - - Returns: - A boolean, True if the address is reserved per RFC 4291. - - """ - return (self.network_address.is_link_local and - self.broadcast_address.is_link_local) - - @property - def is_private(self): - """Test if this address is allocated for private networks. - - Returns: - A boolean, True if the address is reserved per - iana-ipv4-special-registry or iana-ipv6-special-registry. - - """ - return (self.network_address.is_private and - self.broadcast_address.is_private) - - @property - def is_global(self): - """Test if this address is allocated for public networks. - - Returns: - A boolean, True if the address is not reserved per - iana-ipv4-special-registry or iana-ipv6-special-registry. - - """ - return not self.is_private - - @property - def is_unspecified(self): - """Test if the address is unspecified. - - Returns: - A boolean, True if this is the unspecified address as defined in - RFC 2373 2.5.2. - - """ - return (self.network_address.is_unspecified and - self.broadcast_address.is_unspecified) - - @property - def is_loopback(self): - """Test if the address is a loopback address. - - Returns: - A boolean, True if the address is a loopback address as defined in - RFC 2373 2.5.3. - - """ - return (self.network_address.is_loopback and - self.broadcast_address.is_loopback) - - -class _BaseV4(object): - - """Base IPv4 object. - - The following methods are used by IPv4 objects in both single IP - addresses and networks. - - """ - - __slots__ = () - _version = 4 - # Equivalent to 255.255.255.255 or 32 bits of 1's. - _ALL_ONES = (2 ** IPV4LENGTH) - 1 - _DECIMAL_DIGITS = frozenset('0123456789') - - # the valid octets for host and netmasks. only useful for IPv4. - _valid_mask_octets = frozenset([255, 254, 252, 248, 240, 224, 192, 128, 0]) - - _max_prefixlen = IPV4LENGTH - # There are only a handful of valid v4 netmasks, so we cache them all - # when constructed (see _make_netmask()). - _netmask_cache = {} - - def _explode_shorthand_ip_string(self): - return _compat_str(self) - - @classmethod - def _make_netmask(cls, arg): - """Make a (netmask, prefix_len) tuple from the given argument. - - Argument can be: - - an integer (the prefix length) - - a string representing the prefix length (e.g. "24") - - a string representing the prefix netmask (e.g. "255.255.255.0") - """ - if arg not in cls._netmask_cache: - if isinstance(arg, _compat_int_types): - prefixlen = arg - else: - try: - # Check for a netmask in prefix length form - prefixlen = cls._prefix_from_prefix_string(arg) - except NetmaskValueError: - # Check for a netmask or hostmask in dotted-quad form. - # This may raise NetmaskValueError. - prefixlen = cls._prefix_from_ip_string(arg) - netmask = IPv4Address(cls._ip_int_from_prefix(prefixlen)) - cls._netmask_cache[arg] = netmask, prefixlen - return cls._netmask_cache[arg] - - @classmethod - def _ip_int_from_string(cls, ip_str): - """Turn the given IP string into an integer for comparison. - - Args: - ip_str: A string, the IP ip_str. - - Returns: - The IP ip_str as an integer. - - Raises: - AddressValueError: if ip_str isn't a valid IPv4 Address. - - """ - if not ip_str: - raise AddressValueError('Address cannot be empty') - - octets = ip_str.split('.') - if len(octets) != 4: - raise AddressValueError("Expected 4 octets in %r" % ip_str) - - try: - return _compat_int_from_byte_vals( - map(cls._parse_octet, octets), 'big') - except ValueError as exc: - raise AddressValueError("%s in %r" % (exc, ip_str)) - - @classmethod - def _parse_octet(cls, octet_str): - """Convert a decimal octet into an integer. - - Args: - octet_str: A string, the number to parse. - - Returns: - The octet as an integer. - - Raises: - ValueError: if the octet isn't strictly a decimal from [0..255]. - - """ - if not octet_str: - raise ValueError("Empty octet not permitted") - # Whitelist the characters, since int() allows a lot of bizarre stuff. - if not cls._DECIMAL_DIGITS.issuperset(octet_str): - msg = "Only decimal digits permitted in %r" - raise ValueError(msg % octet_str) - # We do the length check second, since the invalid character error - # is likely to be more informative for the user - if len(octet_str) > 3: - msg = "At most 3 characters permitted in %r" - raise ValueError(msg % octet_str) - # Convert to integer (we know digits are legal) - octet_int = int(octet_str, 10) - # Any octets that look like they *might* be written in octal, - # and which don't look exactly the same in both octal and - # decimal are rejected as ambiguous - if octet_int > 7 and octet_str[0] == '0': - msg = "Ambiguous (octal/decimal) value in %r not permitted" - raise ValueError(msg % octet_str) - if octet_int > 255: - raise ValueError("Octet %d (> 255) not permitted" % octet_int) - return octet_int - - @classmethod - def _string_from_ip_int(cls, ip_int): - """Turns a 32-bit integer into dotted decimal notation. - - Args: - ip_int: An integer, the IP address. - - Returns: - The IP address as a string in dotted decimal notation. - - """ - return '.'.join(_compat_str(struct.unpack(b'!B', b)[0] - if isinstance(b, bytes) - else b) - for b in _compat_to_bytes(ip_int, 4, 'big')) - - def _is_hostmask(self, ip_str): - """Test if the IP string is a hostmask (rather than a netmask). - - Args: - ip_str: A string, the potential hostmask. - - Returns: - A boolean, True if the IP string is a hostmask. - - """ - bits = ip_str.split('.') - try: - parts = [x for x in map(int, bits) if x in self._valid_mask_octets] - except ValueError: - return False - if len(parts) != len(bits): - return False - if parts[0] < parts[-1]: - return True - return False - - def _reverse_pointer(self): - """Return the reverse DNS pointer name for the IPv4 address. - - This implements the method described in RFC1035 3.5. - - """ - reverse_octets = _compat_str(self).split('.')[::-1] - return '.'.join(reverse_octets) + '.in-addr.arpa' - - @property - def max_prefixlen(self): - return self._max_prefixlen - - @property - def version(self): - return self._version - - -class IPv4Address(_BaseV4, _BaseAddress): - - """Represent and manipulate single IPv4 Addresses.""" - - __slots__ = ('_ip', '__weakref__') - - def __init__(self, address): - - """ - Args: - address: A string or integer representing the IP - - Additionally, an integer can be passed, so - IPv4Address('192.0.2.1') == IPv4Address(3221225985). - or, more generally - IPv4Address(int(IPv4Address('192.0.2.1'))) == - IPv4Address('192.0.2.1') - - Raises: - AddressValueError: If ipaddress isn't a valid IPv4 address. - - """ - # Efficient constructor from integer. - if isinstance(address, _compat_int_types): - self._check_int_address(address) - self._ip = address - return - - # Constructing from a packed address - if isinstance(address, bytes): - self._check_packed_address(address, 4) - bvs = _compat_bytes_to_byte_vals(address) - self._ip = _compat_int_from_byte_vals(bvs, 'big') - return - - # Assume input argument to be string or any object representation - # which converts into a formatted IP string. - addr_str = _compat_str(address) - if '/' in addr_str: - raise AddressValueError("Unexpected '/' in %r" % address) - self._ip = self._ip_int_from_string(addr_str) - - @property - def packed(self): - """The binary representation of this address.""" - return v4_int_to_packed(self._ip) - - @property - def is_reserved(self): - """Test if the address is otherwise IETF reserved. - - Returns: - A boolean, True if the address is within the - reserved IPv4 Network range. - - """ - return self in self._constants._reserved_network - - @property - def is_private(self): - """Test if this address is allocated for private networks. - - Returns: - A boolean, True if the address is reserved per - iana-ipv4-special-registry. - - """ - return any(self in net for net in self._constants._private_networks) - - @property - def is_global(self): - return ( - self not in self._constants._public_network and - not self.is_private) - - @property - def is_multicast(self): - """Test if the address is reserved for multicast use. - - Returns: - A boolean, True if the address is multicast. - See RFC 3171 for details. - - """ - return self in self._constants._multicast_network - - @property - def is_unspecified(self): - """Test if the address is unspecified. - - Returns: - A boolean, True if this is the unspecified address as defined in - RFC 5735 3. - - """ - return self == self._constants._unspecified_address - - @property - def is_loopback(self): - """Test if the address is a loopback address. - - Returns: - A boolean, True if the address is a loopback per RFC 3330. - - """ - return self in self._constants._loopback_network - - @property - def is_link_local(self): - """Test if the address is reserved for link-local. - - Returns: - A boolean, True if the address is link-local per RFC 3927. - - """ - return self in self._constants._linklocal_network - - -class IPv4Interface(IPv4Address): - - def __init__(self, address): - if isinstance(address, (bytes, _compat_int_types)): - IPv4Address.__init__(self, address) - self.network = IPv4Network(self._ip) - self._prefixlen = self._max_prefixlen - return - - if isinstance(address, tuple): - IPv4Address.__init__(self, address[0]) - if len(address) > 1: - self._prefixlen = int(address[1]) - else: - self._prefixlen = self._max_prefixlen - - self.network = IPv4Network(address, strict=False) - self.netmask = self.network.netmask - self.hostmask = self.network.hostmask - return - - addr = _split_optional_netmask(address) - IPv4Address.__init__(self, addr[0]) - - self.network = IPv4Network(address, strict=False) - self._prefixlen = self.network._prefixlen - - self.netmask = self.network.netmask - self.hostmask = self.network.hostmask - - def __str__(self): - return '%s/%d' % (self._string_from_ip_int(self._ip), - self.network.prefixlen) - - def __eq__(self, other): - address_equal = IPv4Address.__eq__(self, other) - if not address_equal or address_equal is NotImplemented: - return address_equal - try: - return self.network == other.network - except AttributeError: - # An interface with an associated network is NOT the - # same as an unassociated address. That's why the hash - # takes the extra info into account. - return False - - def __lt__(self, other): - address_less = IPv4Address.__lt__(self, other) - if address_less is NotImplemented: - return NotImplemented - try: - return (self.network < other.network or - self.network == other.network and address_less) - except AttributeError: - # We *do* allow addresses and interfaces to be sorted. The - # unassociated address is considered less than all interfaces. - return False - - def __hash__(self): - return self._ip ^ self._prefixlen ^ int(self.network.network_address) - - __reduce__ = _IPAddressBase.__reduce__ - - @property - def ip(self): - return IPv4Address(self._ip) - - @property - def with_prefixlen(self): - return '%s/%s' % (self._string_from_ip_int(self._ip), - self._prefixlen) - - @property - def with_netmask(self): - return '%s/%s' % (self._string_from_ip_int(self._ip), - self.netmask) - - @property - def with_hostmask(self): - return '%s/%s' % (self._string_from_ip_int(self._ip), - self.hostmask) - - -class IPv4Network(_BaseV4, _BaseNetwork): - - """This class represents and manipulates 32-bit IPv4 network + addresses.. - - Attributes: [examples for IPv4Network('192.0.2.0/27')] - .network_address: IPv4Address('192.0.2.0') - .hostmask: IPv4Address('0.0.0.31') - .broadcast_address: IPv4Address('192.0.2.32') - .netmask: IPv4Address('255.255.255.224') - .prefixlen: 27 - - """ - # Class to use when creating address objects - _address_class = IPv4Address - - def __init__(self, address, strict=True): - - """Instantiate a new IPv4 network object. - - Args: - address: A string or integer representing the IP [& network]. - '192.0.2.0/24' - '192.0.2.0/255.255.255.0' - '192.0.0.2/0.0.0.255' - are all functionally the same in IPv4. Similarly, - '192.0.2.1' - '192.0.2.1/255.255.255.255' - '192.0.2.1/32' - are also functionally equivalent. That is to say, failing to - provide a subnetmask will create an object with a mask of /32. - - If the mask (portion after the / in the argument) is given in - dotted quad form, it is treated as a netmask if it starts with a - non-zero field (e.g. /255.0.0.0 == /8) and as a hostmask if it - starts with a zero field (e.g. 0.255.255.255 == /8), with the - single exception of an all-zero mask which is treated as a - netmask == /0. If no mask is given, a default of /32 is used. - - Additionally, an integer can be passed, so - IPv4Network('192.0.2.1') == IPv4Network(3221225985) - or, more generally - IPv4Interface(int(IPv4Interface('192.0.2.1'))) == - IPv4Interface('192.0.2.1') - - Raises: - AddressValueError: If ipaddress isn't a valid IPv4 address. - NetmaskValueError: If the netmask isn't valid for - an IPv4 address. - ValueError: If strict is True and a network address is not - supplied. - - """ - _BaseNetwork.__init__(self, address) - - # Constructing from a packed address or integer - if isinstance(address, (_compat_int_types, bytes)): - self.network_address = IPv4Address(address) - self.netmask, self._prefixlen = self._make_netmask( - self._max_prefixlen) - # fixme: address/network test here. - return - - if isinstance(address, tuple): - if len(address) > 1: - arg = address[1] - else: - # We weren't given an address[1] - arg = self._max_prefixlen - self.network_address = IPv4Address(address[0]) - self.netmask, self._prefixlen = self._make_netmask(arg) - packed = int(self.network_address) - if packed & int(self.netmask) != packed: - if strict: - raise ValueError('%s has host bits set' % self) - else: - self.network_address = IPv4Address(packed & - int(self.netmask)) - return - - # Assume input argument to be string or any object representation - # which converts into a formatted IP prefix string. - addr = _split_optional_netmask(address) - self.network_address = IPv4Address(self._ip_int_from_string(addr[0])) - - if len(addr) == 2: - arg = addr[1] - else: - arg = self._max_prefixlen - self.netmask, self._prefixlen = self._make_netmask(arg) - - if strict: - if (IPv4Address(int(self.network_address) & int(self.netmask)) != - self.network_address): - raise ValueError('%s has host bits set' % self) - self.network_address = IPv4Address(int(self.network_address) & - int(self.netmask)) - - if self._prefixlen == (self._max_prefixlen - 1): - self.hosts = self.__iter__ - - @property - def is_global(self): - """Test if this address is allocated for public networks. - - Returns: - A boolean, True if the address is not reserved per - iana-ipv4-special-registry. - - """ - return (not (self.network_address in IPv4Network('100.64.0.0/10') and - self.broadcast_address in IPv4Network('100.64.0.0/10')) and - not self.is_private) - - -class _IPv4Constants(object): - - _linklocal_network = IPv4Network('169.254.0.0/16') - - _loopback_network = IPv4Network('127.0.0.0/8') - - _multicast_network = IPv4Network('224.0.0.0/4') - - _public_network = IPv4Network('100.64.0.0/10') - - _private_networks = [ - IPv4Network('0.0.0.0/8'), - IPv4Network('10.0.0.0/8'), - IPv4Network('127.0.0.0/8'), - IPv4Network('169.254.0.0/16'), - IPv4Network('172.16.0.0/12'), - IPv4Network('192.0.0.0/29'), - IPv4Network('192.0.0.170/31'), - IPv4Network('192.0.2.0/24'), - IPv4Network('192.168.0.0/16'), - IPv4Network('198.18.0.0/15'), - IPv4Network('198.51.100.0/24'), - IPv4Network('203.0.113.0/24'), - IPv4Network('240.0.0.0/4'), - IPv4Network('255.255.255.255/32'), - ] - - _reserved_network = IPv4Network('240.0.0.0/4') - - _unspecified_address = IPv4Address('0.0.0.0') - - -IPv4Address._constants = _IPv4Constants - - -class _BaseV6(object): - - """Base IPv6 object. - - The following methods are used by IPv6 objects in both single IP - addresses and networks. - - """ - - __slots__ = () - _version = 6 - _ALL_ONES = (2 ** IPV6LENGTH) - 1 - _HEXTET_COUNT = 8 - _HEX_DIGITS = frozenset('0123456789ABCDEFabcdef') - _max_prefixlen = IPV6LENGTH - - # There are only a bunch of valid v6 netmasks, so we cache them all - # when constructed (see _make_netmask()). - _netmask_cache = {} - - @classmethod - def _make_netmask(cls, arg): - """Make a (netmask, prefix_len) tuple from the given argument. - - Argument can be: - - an integer (the prefix length) - - a string representing the prefix length (e.g. "24") - - a string representing the prefix netmask (e.g. "255.255.255.0") - """ - if arg not in cls._netmask_cache: - if isinstance(arg, _compat_int_types): - prefixlen = arg - else: - prefixlen = cls._prefix_from_prefix_string(arg) - netmask = IPv6Address(cls._ip_int_from_prefix(prefixlen)) - cls._netmask_cache[arg] = netmask, prefixlen - return cls._netmask_cache[arg] - - @classmethod - def _ip_int_from_string(cls, ip_str): - """Turn an IPv6 ip_str into an integer. - - Args: - ip_str: A string, the IPv6 ip_str. - - Returns: - An int, the IPv6 address - - Raises: - AddressValueError: if ip_str isn't a valid IPv6 Address. - - """ - if not ip_str: - raise AddressValueError('Address cannot be empty') - - parts = ip_str.split(':') - - # An IPv6 address needs at least 2 colons (3 parts). - _min_parts = 3 - if len(parts) < _min_parts: - msg = "At least %d parts expected in %r" % (_min_parts, ip_str) - raise AddressValueError(msg) - - # If the address has an IPv4-style suffix, convert it to hexadecimal. - if '.' in parts[-1]: - try: - ipv4_int = IPv4Address(parts.pop())._ip - except AddressValueError as exc: - raise AddressValueError("%s in %r" % (exc, ip_str)) - parts.append('%x' % ((ipv4_int >> 16) & 0xFFFF)) - parts.append('%x' % (ipv4_int & 0xFFFF)) - - # An IPv6 address can't have more than 8 colons (9 parts). - # The extra colon comes from using the "::" notation for a single - # leading or trailing zero part. - _max_parts = cls._HEXTET_COUNT + 1 - if len(parts) > _max_parts: - msg = "At most %d colons permitted in %r" % ( - _max_parts - 1, ip_str) - raise AddressValueError(msg) - - # Disregarding the endpoints, find '::' with nothing in between. - # This indicates that a run of zeroes has been skipped. - skip_index = None - for i in _compat_range(1, len(parts) - 1): - if not parts[i]: - if skip_index is not None: - # Can't have more than one '::' - msg = "At most one '::' permitted in %r" % ip_str - raise AddressValueError(msg) - skip_index = i - - # parts_hi is the number of parts to copy from above/before the '::' - # parts_lo is the number of parts to copy from below/after the '::' - if skip_index is not None: - # If we found a '::', then check if it also covers the endpoints. - parts_hi = skip_index - parts_lo = len(parts) - skip_index - 1 - if not parts[0]: - parts_hi -= 1 - if parts_hi: - msg = "Leading ':' only permitted as part of '::' in %r" - raise AddressValueError(msg % ip_str) # ^: requires ^:: - if not parts[-1]: - parts_lo -= 1 - if parts_lo: - msg = "Trailing ':' only permitted as part of '::' in %r" - raise AddressValueError(msg % ip_str) # :$ requires ::$ - parts_skipped = cls._HEXTET_COUNT - (parts_hi + parts_lo) - if parts_skipped < 1: - msg = "Expected at most %d other parts with '::' in %r" - raise AddressValueError(msg % (cls._HEXTET_COUNT - 1, ip_str)) - else: - # Otherwise, allocate the entire address to parts_hi. The - # endpoints could still be empty, but _parse_hextet() will check - # for that. - if len(parts) != cls._HEXTET_COUNT: - msg = "Exactly %d parts expected without '::' in %r" - raise AddressValueError(msg % (cls._HEXTET_COUNT, ip_str)) - if not parts[0]: - msg = "Leading ':' only permitted as part of '::' in %r" - raise AddressValueError(msg % ip_str) # ^: requires ^:: - if not parts[-1]: - msg = "Trailing ':' only permitted as part of '::' in %r" - raise AddressValueError(msg % ip_str) # :$ requires ::$ - parts_hi = len(parts) - parts_lo = 0 - parts_skipped = 0 - - try: - # Now, parse the hextets into a 128-bit integer. - ip_int = 0 - for i in range(parts_hi): - ip_int <<= 16 - ip_int |= cls._parse_hextet(parts[i]) - ip_int <<= 16 * parts_skipped - for i in range(-parts_lo, 0): - ip_int <<= 16 - ip_int |= cls._parse_hextet(parts[i]) - return ip_int - except ValueError as exc: - raise AddressValueError("%s in %r" % (exc, ip_str)) - - @classmethod - def _parse_hextet(cls, hextet_str): - """Convert an IPv6 hextet string into an integer. - - Args: - hextet_str: A string, the number to parse. - - Returns: - The hextet as an integer. - - Raises: - ValueError: if the input isn't strictly a hex number from - [0..FFFF]. - - """ - # Whitelist the characters, since int() allows a lot of bizarre stuff. - if not cls._HEX_DIGITS.issuperset(hextet_str): - raise ValueError("Only hex digits permitted in %r" % hextet_str) - # We do the length check second, since the invalid character error - # is likely to be more informative for the user - if len(hextet_str) > 4: - msg = "At most 4 characters permitted in %r" - raise ValueError(msg % hextet_str) - # Length check means we can skip checking the integer value - return int(hextet_str, 16) - - @classmethod - def _compress_hextets(cls, hextets): - """Compresses a list of hextets. - - Compresses a list of strings, replacing the longest continuous - sequence of "0" in the list with "" and adding empty strings at - the beginning or at the end of the string such that subsequently - calling ":".join(hextets) will produce the compressed version of - the IPv6 address. - - Args: - hextets: A list of strings, the hextets to compress. - - Returns: - A list of strings. - - """ - best_doublecolon_start = -1 - best_doublecolon_len = 0 - doublecolon_start = -1 - doublecolon_len = 0 - for index, hextet in enumerate(hextets): - if hextet == '0': - doublecolon_len += 1 - if doublecolon_start == -1: - # Start of a sequence of zeros. - doublecolon_start = index - if doublecolon_len > best_doublecolon_len: - # This is the longest sequence of zeros so far. - best_doublecolon_len = doublecolon_len - best_doublecolon_start = doublecolon_start - else: - doublecolon_len = 0 - doublecolon_start = -1 - - if best_doublecolon_len > 1: - best_doublecolon_end = (best_doublecolon_start + - best_doublecolon_len) - # For zeros at the end of the address. - if best_doublecolon_end == len(hextets): - hextets += [''] - hextets[best_doublecolon_start:best_doublecolon_end] = [''] - # For zeros at the beginning of the address. - if best_doublecolon_start == 0: - hextets = [''] + hextets - - return hextets - - @classmethod - def _string_from_ip_int(cls, ip_int=None): - """Turns a 128-bit integer into hexadecimal notation. - - Args: - ip_int: An integer, the IP address. - - Returns: - A string, the hexadecimal representation of the address. - - Raises: - ValueError: The address is bigger than 128 bits of all ones. - - """ - if ip_int is None: - ip_int = int(cls._ip) - - if ip_int > cls._ALL_ONES: - raise ValueError('IPv6 address is too large') - - hex_str = '%032x' % ip_int - hextets = ['%x' % int(hex_str[x:x + 4], 16) for x in range(0, 32, 4)] - - hextets = cls._compress_hextets(hextets) - return ':'.join(hextets) - - def _explode_shorthand_ip_string(self): - """Expand a shortened IPv6 address. - - Args: - ip_str: A string, the IPv6 address. - - Returns: - A string, the expanded IPv6 address. - - """ - if isinstance(self, IPv6Network): - ip_str = _compat_str(self.network_address) - elif isinstance(self, IPv6Interface): - ip_str = _compat_str(self.ip) - else: - ip_str = _compat_str(self) - - ip_int = self._ip_int_from_string(ip_str) - hex_str = '%032x' % ip_int - parts = [hex_str[x:x + 4] for x in range(0, 32, 4)] - if isinstance(self, (_BaseNetwork, IPv6Interface)): - return '%s/%d' % (':'.join(parts), self._prefixlen) - return ':'.join(parts) - - def _reverse_pointer(self): - """Return the reverse DNS pointer name for the IPv6 address. - - This implements the method described in RFC3596 2.5. - - """ - reverse_chars = self.exploded[::-1].replace(':', '') - return '.'.join(reverse_chars) + '.ip6.arpa' - - @property - def max_prefixlen(self): - return self._max_prefixlen - - @property - def version(self): - return self._version - - -class IPv6Address(_BaseV6, _BaseAddress): - - """Represent and manipulate single IPv6 Addresses.""" - - __slots__ = ('_ip', '__weakref__') - - def __init__(self, address): - """Instantiate a new IPv6 address object. - - Args: - address: A string or integer representing the IP - - Additionally, an integer can be passed, so - IPv6Address('2001:db8::') == - IPv6Address(42540766411282592856903984951653826560) - or, more generally - IPv6Address(int(IPv6Address('2001:db8::'))) == - IPv6Address('2001:db8::') - - Raises: - AddressValueError: If address isn't a valid IPv6 address. - - """ - # Efficient constructor from integer. - if isinstance(address, _compat_int_types): - self._check_int_address(address) - self._ip = address - return - - # Constructing from a packed address - if isinstance(address, bytes): - self._check_packed_address(address, 16) - bvs = _compat_bytes_to_byte_vals(address) - self._ip = _compat_int_from_byte_vals(bvs, 'big') - return - - # Assume input argument to be string or any object representation - # which converts into a formatted IP string. - addr_str = _compat_str(address) - if '/' in addr_str: - raise AddressValueError("Unexpected '/' in %r" % address) - self._ip = self._ip_int_from_string(addr_str) - - @property - def packed(self): - """The binary representation of this address.""" - return v6_int_to_packed(self._ip) - - @property - def is_multicast(self): - """Test if the address is reserved for multicast use. - - Returns: - A boolean, True if the address is a multicast address. - See RFC 2373 2.7 for details. - - """ - return self in self._constants._multicast_network - - @property - def is_reserved(self): - """Test if the address is otherwise IETF reserved. - - Returns: - A boolean, True if the address is within one of the - reserved IPv6 Network ranges. - - """ - return any(self in x for x in self._constants._reserved_networks) - - @property - def is_link_local(self): - """Test if the address is reserved for link-local. - - Returns: - A boolean, True if the address is reserved per RFC 4291. - - """ - return self in self._constants._linklocal_network - - @property - def is_site_local(self): - """Test if the address is reserved for site-local. - - Note that the site-local address space has been deprecated by RFC 3879. - Use is_private to test if this address is in the space of unique local - addresses as defined by RFC 4193. - - Returns: - A boolean, True if the address is reserved per RFC 3513 2.5.6. - - """ - return self in self._constants._sitelocal_network - - @property - def is_private(self): - """Test if this address is allocated for private networks. - - Returns: - A boolean, True if the address is reserved per - iana-ipv6-special-registry. - - """ - return any(self in net for net in self._constants._private_networks) - - @property - def is_global(self): - """Test if this address is allocated for public networks. - - Returns: - A boolean, true if the address is not reserved per - iana-ipv6-special-registry. - - """ - return not self.is_private - - @property - def is_unspecified(self): - """Test if the address is unspecified. - - Returns: - A boolean, True if this is the unspecified address as defined in - RFC 2373 2.5.2. - - """ - return self._ip == 0 - - @property - def is_loopback(self): - """Test if the address is a loopback address. - - Returns: - A boolean, True if the address is a loopback address as defined in - RFC 2373 2.5.3. - - """ - return self._ip == 1 - - @property - def ipv4_mapped(self): - """Return the IPv4 mapped address. - - Returns: - If the IPv6 address is a v4 mapped address, return the - IPv4 mapped address. Return None otherwise. - - """ - if (self._ip >> 32) != 0xFFFF: - return None - return IPv4Address(self._ip & 0xFFFFFFFF) - - @property - def teredo(self): - """Tuple of embedded teredo IPs. - - Returns: - Tuple of the (server, client) IPs or None if the address - doesn't appear to be a teredo address (doesn't start with - 2001::/32) - - """ - if (self._ip >> 96) != 0x20010000: - return None - return (IPv4Address((self._ip >> 64) & 0xFFFFFFFF), - IPv4Address(~self._ip & 0xFFFFFFFF)) - - @property - def sixtofour(self): - """Return the IPv4 6to4 embedded address. - - Returns: - The IPv4 6to4-embedded address if present or None if the - address doesn't appear to contain a 6to4 embedded address. - - """ - if (self._ip >> 112) != 0x2002: - return None - return IPv4Address((self._ip >> 80) & 0xFFFFFFFF) - - -class IPv6Interface(IPv6Address): - - def __init__(self, address): - if isinstance(address, (bytes, _compat_int_types)): - IPv6Address.__init__(self, address) - self.network = IPv6Network(self._ip) - self._prefixlen = self._max_prefixlen - return - if isinstance(address, tuple): - IPv6Address.__init__(self, address[0]) - if len(address) > 1: - self._prefixlen = int(address[1]) - else: - self._prefixlen = self._max_prefixlen - self.network = IPv6Network(address, strict=False) - self.netmask = self.network.netmask - self.hostmask = self.network.hostmask - return - - addr = _split_optional_netmask(address) - IPv6Address.__init__(self, addr[0]) - self.network = IPv6Network(address, strict=False) - self.netmask = self.network.netmask - self._prefixlen = self.network._prefixlen - self.hostmask = self.network.hostmask - - def __str__(self): - return '%s/%d' % (self._string_from_ip_int(self._ip), - self.network.prefixlen) - - def __eq__(self, other): - address_equal = IPv6Address.__eq__(self, other) - if not address_equal or address_equal is NotImplemented: - return address_equal - try: - return self.network == other.network - except AttributeError: - # An interface with an associated network is NOT the - # same as an unassociated address. That's why the hash - # takes the extra info into account. - return False - - def __lt__(self, other): - address_less = IPv6Address.__lt__(self, other) - if address_less is NotImplemented: - return NotImplemented - try: - return (self.network < other.network or - self.network == other.network and address_less) - except AttributeError: - # We *do* allow addresses and interfaces to be sorted. The - # unassociated address is considered less than all interfaces. - return False - - def __hash__(self): - return self._ip ^ self._prefixlen ^ int(self.network.network_address) - - __reduce__ = _IPAddressBase.__reduce__ - - @property - def ip(self): - return IPv6Address(self._ip) - - @property - def with_prefixlen(self): - return '%s/%s' % (self._string_from_ip_int(self._ip), - self._prefixlen) - - @property - def with_netmask(self): - return '%s/%s' % (self._string_from_ip_int(self._ip), - self.netmask) - - @property - def with_hostmask(self): - return '%s/%s' % (self._string_from_ip_int(self._ip), - self.hostmask) - - @property - def is_unspecified(self): - return self._ip == 0 and self.network.is_unspecified - - @property - def is_loopback(self): - return self._ip == 1 and self.network.is_loopback - - -class IPv6Network(_BaseV6, _BaseNetwork): - - """This class represents and manipulates 128-bit IPv6 networks. - - Attributes: [examples for IPv6('2001:db8::1000/124')] - .network_address: IPv6Address('2001:db8::1000') - .hostmask: IPv6Address('::f') - .broadcast_address: IPv6Address('2001:db8::100f') - .netmask: IPv6Address('ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff0') - .prefixlen: 124 - - """ - - # Class to use when creating address objects - _address_class = IPv6Address - - def __init__(self, address, strict=True): - """Instantiate a new IPv6 Network object. - - Args: - address: A string or integer representing the IPv6 network or the - IP and prefix/netmask. - '2001:db8::/128' - '2001:db8:0000:0000:0000:0000:0000:0000/128' - '2001:db8::' - are all functionally the same in IPv6. That is to say, - failing to provide a subnetmask will create an object with - a mask of /128. - - Additionally, an integer can be passed, so - IPv6Network('2001:db8::') == - IPv6Network(42540766411282592856903984951653826560) - or, more generally - IPv6Network(int(IPv6Network('2001:db8::'))) == - IPv6Network('2001:db8::') - - strict: A boolean. If true, ensure that we have been passed - A true network address, eg, 2001:db8::1000/124 and not an - IP address on a network, eg, 2001:db8::1/124. - - Raises: - AddressValueError: If address isn't a valid IPv6 address. - NetmaskValueError: If the netmask isn't valid for - an IPv6 address. - ValueError: If strict was True and a network address was not - supplied. - - """ - _BaseNetwork.__init__(self, address) - - # Efficient constructor from integer or packed address - if isinstance(address, (bytes, _compat_int_types)): - self.network_address = IPv6Address(address) - self.netmask, self._prefixlen = self._make_netmask( - self._max_prefixlen) - return - - if isinstance(address, tuple): - if len(address) > 1: - arg = address[1] - else: - arg = self._max_prefixlen - self.netmask, self._prefixlen = self._make_netmask(arg) - self.network_address = IPv6Address(address[0]) - packed = int(self.network_address) - if packed & int(self.netmask) != packed: - if strict: - raise ValueError('%s has host bits set' % self) - else: - self.network_address = IPv6Address(packed & - int(self.netmask)) - return - - # Assume input argument to be string or any object representation - # which converts into a formatted IP prefix string. - addr = _split_optional_netmask(address) - - self.network_address = IPv6Address(self._ip_int_from_string(addr[0])) - - if len(addr) == 2: - arg = addr[1] - else: - arg = self._max_prefixlen - self.netmask, self._prefixlen = self._make_netmask(arg) - - if strict: - if (IPv6Address(int(self.network_address) & int(self.netmask)) != - self.network_address): - raise ValueError('%s has host bits set' % self) - self.network_address = IPv6Address(int(self.network_address) & - int(self.netmask)) - - if self._prefixlen == (self._max_prefixlen - 1): - self.hosts = self.__iter__ - - def hosts(self): - """Generate Iterator over usable hosts in a network. - - This is like __iter__ except it doesn't return the - Subnet-Router anycast address. - - """ - network = int(self.network_address) - broadcast = int(self.broadcast_address) - for x in _compat_range(network + 1, broadcast + 1): - yield self._address_class(x) - - @property - def is_site_local(self): - """Test if the address is reserved for site-local. - - Note that the site-local address space has been deprecated by RFC 3879. - Use is_private to test if this address is in the space of unique local - addresses as defined by RFC 4193. - - Returns: - A boolean, True if the address is reserved per RFC 3513 2.5.6. - - """ - return (self.network_address.is_site_local and - self.broadcast_address.is_site_local) - - -class _IPv6Constants(object): - - _linklocal_network = IPv6Network('fe80::/10') - - _multicast_network = IPv6Network('ff00::/8') - - _private_networks = [ - IPv6Network('::1/128'), - IPv6Network('::/128'), - IPv6Network('::ffff:0:0/96'), - IPv6Network('100::/64'), - IPv6Network('2001::/23'), - IPv6Network('2001:2::/48'), - IPv6Network('2001:db8::/32'), - IPv6Network('2001:10::/28'), - IPv6Network('fc00::/7'), - IPv6Network('fe80::/10'), - ] - - _reserved_networks = [ - IPv6Network('::/8'), IPv6Network('100::/8'), - IPv6Network('200::/7'), IPv6Network('400::/6'), - IPv6Network('800::/5'), IPv6Network('1000::/4'), - IPv6Network('4000::/3'), IPv6Network('6000::/3'), - IPv6Network('8000::/3'), IPv6Network('A000::/3'), - IPv6Network('C000::/3'), IPv6Network('E000::/4'), - IPv6Network('F000::/5'), IPv6Network('F800::/6'), - IPv6Network('FE00::/9'), - ] - - _sitelocal_network = IPv6Network('fec0::/10') - - -IPv6Address._constants = _IPv6Constants diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/ipaddress.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/ipaddress.pyc deleted file mode 100644 index 29e74bbd455355f39d49c4b365f81d6af07b6803..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 85785 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 z%0A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 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/lockfile/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/lockfile/__init__.py deleted file mode 100644 index a6f44a5..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/lockfile/__init__.py +++ /dev/null @@ -1,347 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -lockfile.py - Platform-independent advisory file locks. - -Requires Python 2.5 unless you apply 2.4.diff -Locking is done on a per-thread basis instead of a per-process basis. - -Usage: - ->>> lock = LockFile('somefile') ->>> try: -... lock.acquire() -... except AlreadyLocked: -... print 'somefile', 'is locked already.' -... except LockFailed: -... print 'somefile', 'can\\'t be locked.' -... else: -... print 'got lock' -got lock ->>> print lock.is_locked() -True ->>> lock.release() - ->>> lock = LockFile('somefile') ->>> print lock.is_locked() -False ->>> with lock: -... print lock.is_locked() -True ->>> print lock.is_locked() -False - ->>> lock = LockFile('somefile') ->>> # It is okay to lock twice from the same thread... ->>> with lock: -... lock.acquire() -... ->>> # Though no counter is kept, so you can't unlock multiple times... ->>> print lock.is_locked() -False - -Exceptions: - - Error - base class for other exceptions - LockError - base class for all locking exceptions - AlreadyLocked - Another thread or process already holds the lock - LockFailed - Lock failed for some other reason - UnlockError - base class for all unlocking exceptions - AlreadyUnlocked - File was not locked. - NotMyLock - File was locked but not by the current thread/process -""" - -from __future__ import absolute_import - -import functools -import os -import socket -import threading -import warnings - -# Work with PEP8 and non-PEP8 versions of threading module. -if not hasattr(threading, "current_thread"): - threading.current_thread = threading.currentThread -if not hasattr(threading.Thread, "get_name"): - threading.Thread.get_name = threading.Thread.getName - -__all__ = ['Error', 'LockError', 'LockTimeout', 'AlreadyLocked', - 'LockFailed', 'UnlockError', 'NotLocked', 'NotMyLock', - 'LinkFileLock', 'MkdirFileLock', 'SQLiteFileLock', - 'LockBase', 'locked'] - - -class Error(Exception): - """ - Base class for other exceptions. - - >>> try: - ... raise Error - ... except Exception: - ... pass - """ - pass - - -class LockError(Error): - """ - Base class for error arising from attempts to acquire the lock. - - >>> try: - ... raise LockError - ... except Error: - ... pass - """ - pass - - -class LockTimeout(LockError): - """Raised when lock creation fails within a user-defined period of time. - - >>> try: - ... raise LockTimeout - ... except LockError: - ... pass - """ - pass - - -class AlreadyLocked(LockError): - """Some other thread/process is locking the file. - - >>> try: - ... raise AlreadyLocked - ... except LockError: - ... pass - """ - pass - - -class LockFailed(LockError): - """Lock file creation failed for some other reason. - - >>> try: - ... raise LockFailed - ... except LockError: - ... pass - """ - pass - - -class UnlockError(Error): - """ - Base class for errors arising from attempts to release the lock. - - >>> try: - ... raise UnlockError - ... except Error: - ... pass - """ - pass - - -class NotLocked(UnlockError): - """Raised when an attempt is made to unlock an unlocked file. - - >>> try: - ... raise NotLocked - ... except UnlockError: - ... pass - """ - pass - - -class NotMyLock(UnlockError): - """Raised when an attempt is made to unlock a file someone else locked. - - >>> try: - ... raise NotMyLock - ... except UnlockError: - ... pass - """ - pass - - -class _SharedBase(object): - def __init__(self, path): - self.path = path - - def acquire(self, timeout=None): - """ - Acquire the lock. - - * If timeout is omitted (or None), wait forever trying to lock the - file. - - * If timeout > 0, try to acquire the lock for that many seconds. If - the lock period expires and the file is still locked, raise - LockTimeout. - - * If timeout <= 0, raise AlreadyLocked immediately if the file is - already locked. - """ - raise NotImplemented("implement in subclass") - - def release(self): - """ - Release the lock. - - If the file is not locked, raise NotLocked. - """ - raise NotImplemented("implement in subclass") - - def __enter__(self): - """ - Context manager support. - """ - self.acquire() - return self - - def __exit__(self, *_exc): - """ - Context manager support. - """ - self.release() - - def __repr__(self): - return "<%s: %r>" % (self.__class__.__name__, self.path) - - -class LockBase(_SharedBase): - """Base class for platform-specific lock classes.""" - def __init__(self, path, threaded=True, timeout=None): - """ - >>> lock = LockBase('somefile') - >>> lock = LockBase('somefile', threaded=False) - """ - super(LockBase, self).__init__(path) - self.lock_file = os.path.abspath(path) + ".lock" - self.hostname = socket.gethostname() - self.pid = os.getpid() - if threaded: - t = threading.current_thread() - # Thread objects in Python 2.4 and earlier do not have ident - # attrs. Worm around that. - ident = getattr(t, "ident", hash(t)) - self.tname = "-%x" % (ident & 0xffffffff) - else: - self.tname = "" - dirname = os.path.dirname(self.lock_file) - - # unique name is mostly about the current process, but must - # also contain the path -- otherwise, two adjacent locked - # files conflict (one file gets locked, creating lock-file and - # unique file, the other one gets locked, creating lock-file - # and overwriting the already existing lock-file, then one - # gets unlocked, deleting both lock-file and unique file, - # finally the last lock errors out upon releasing. - self.unique_name = os.path.join(dirname, - "%s%s.%s%s" % (self.hostname, - self.tname, - self.pid, - hash(self.path))) - self.timeout = timeout - - def is_locked(self): - """ - Tell whether or not the file is locked. - """ - raise NotImplemented("implement in subclass") - - def i_am_locking(self): - """ - Return True if this object is locking the file. - """ - raise NotImplemented("implement in subclass") - - def break_lock(self): - """ - Remove a lock. Useful if a locking thread failed to unlock. - """ - raise NotImplemented("implement in subclass") - - def __repr__(self): - return "<%s: %r -- %r>" % (self.__class__.__name__, self.unique_name, - self.path) - - -def _fl_helper(cls, mod, *args, **kwds): - warnings.warn("Import from %s module instead of lockfile package" % mod, - DeprecationWarning, stacklevel=2) - # This is a bit funky, but it's only for awhile. The way the unit tests - # are constructed this function winds up as an unbound method, so it - # actually takes three args, not two. We want to toss out self. - if not isinstance(args[0], str): - # We are testing, avoid the first arg - args = args[1:] - if len(args) == 1 and not kwds: - kwds["threaded"] = True - return cls(*args, **kwds) - - -def LinkFileLock(*args, **kwds): - """Factory function provided for backwards compatibility. - - Do not use in new code. Instead, import LinkLockFile from the - lockfile.linklockfile module. - """ - from . import linklockfile - return _fl_helper(linklockfile.LinkLockFile, "lockfile.linklockfile", - *args, **kwds) - - -def MkdirFileLock(*args, **kwds): - """Factory function provided for backwards compatibility. - - Do not use in new code. Instead, import MkdirLockFile from the - lockfile.mkdirlockfile module. - """ - from . import mkdirlockfile - return _fl_helper(mkdirlockfile.MkdirLockFile, "lockfile.mkdirlockfile", - *args, **kwds) - - -def SQLiteFileLock(*args, **kwds): - """Factory function provided for backwards compatibility. - - Do not use in new code. Instead, import SQLiteLockFile from the - lockfile.mkdirlockfile module. - """ - from . import sqlitelockfile - return _fl_helper(sqlitelockfile.SQLiteLockFile, "lockfile.sqlitelockfile", - *args, **kwds) - - -def locked(path, timeout=None): - """Decorator which enables locks for decorated function. - - Arguments: - - path: path for lockfile. - - timeout (optional): Timeout for acquiring lock. - - Usage: - @locked('/var/run/myname', timeout=0) - def myname(...): - ... - """ - def decor(func): - @functools.wraps(func) - def wrapper(*args, **kwargs): - lock = FileLock(path, timeout=timeout) - lock.acquire() - try: - return func(*args, **kwargs) - finally: - lock.release() - return wrapper - return decor - - -if hasattr(os, "link"): - from . import linklockfile as _llf - LockFile = _llf.LinkLockFile -else: - from . import mkdirlockfile as _mlf - LockFile = _mlf.MkdirLockFile - -FileLock = LockFile diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/lockfile/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/lockfile/__init__.pyc deleted file mode 100644 index f040f481981e74c6ba42660086018e30823372d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13475 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 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/lockfile/linklockfile.py b/venv/lib/python2.7/site-packages/pip/_vendor/lockfile/linklockfile.py deleted file mode 100644 index 2ca9be0..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/lockfile/linklockfile.py +++ /dev/null @@ -1,73 +0,0 @@ -from __future__ import absolute_import - -import time -import os - -from . import (LockBase, LockFailed, NotLocked, NotMyLock, LockTimeout, - AlreadyLocked) - - -class LinkLockFile(LockBase): - """Lock access to a file using atomic property of link(2). - - >>> lock = LinkLockFile('somefile') - >>> lock = LinkLockFile('somefile', threaded=False) - """ - - def acquire(self, timeout=None): - try: - open(self.unique_name, "wb").close() - except IOError: - raise LockFailed("failed to create %s" % self.unique_name) - - timeout = timeout if timeout is not None else self.timeout - end_time = time.time() - if timeout is not None and timeout > 0: - end_time += timeout - - while True: - # Try and create a hard link to it. - try: - os.link(self.unique_name, self.lock_file) - except OSError: - # Link creation failed. Maybe we've double-locked? - nlinks = os.stat(self.unique_name).st_nlink - if nlinks == 2: - # The original link plus the one I created == 2. We're - # good to go. - return - else: - # Otherwise the lock creation failed. - if timeout is not None and time.time() > end_time: - os.unlink(self.unique_name) - if timeout > 0: - raise LockTimeout("Timeout waiting to acquire" - " lock for %s" % - self.path) - else: - raise AlreadyLocked("%s is already locked" % - self.path) - time.sleep(timeout is not None and timeout / 10 or 0.1) - else: - # Link creation succeeded. We're good to go. - return - - def release(self): - if not self.is_locked(): - raise NotLocked("%s is not locked" % self.path) - elif not os.path.exists(self.unique_name): - raise NotMyLock("%s is locked, but not by me" % self.path) - os.unlink(self.unique_name) - os.unlink(self.lock_file) - - def is_locked(self): - return os.path.exists(self.lock_file) - - def i_am_locking(self): - return (self.is_locked() and - os.path.exists(self.unique_name) and - os.stat(self.unique_name).st_nlink == 2) - - def break_lock(self): - if os.path.exists(self.lock_file): - os.unlink(self.lock_file) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/lockfile/linklockfile.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/lockfile/linklockfile.pyc deleted file mode 100644 index a433504c8bb9bae21a45dc7881f3e37f7bd7303a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3238 zcmd5;-H#MS5U-xukK1Jr4)K6M#E}Rrdfb8^AV!W8BgQC;nIi!=F_XES-eY#>V|Th2 zZpmSy@M_|#CjKEl`Pca3tN(!Yt6A;<dGO7fZ1+@k*HqWXud3Jmd$IY>4+p>N)BJJy zy}nLl#!N)~Q<M;;ih7C^c!v^)dXDTd?NZOBh<_DIDwI~KSEaN@y&9!;>eVS-pxy$d z4eB*0ZBnnvTB@Y0G*A@P=qb??qHlW#pm?KQ=R;#2)K)y%Lp+6>CQqhT2XQ*i3)_vc z)2?BAfv2zY{^&+%v~A9rn_-;j$Tpbm<`&y~+^rdSdtfelCr))fwRVyDPm@B2k?ga4 z3lecQg7{6=w;LXZH*TzRc-ENEgs5;(5RMu`^_1gOfh+762ZG}Qg10I{)QNq^$^!YN zv*tI}gHyb)-`B=?Hupkrz(;yh6K7jqX!A7gd*dP>>%z{weBdQ)So^*6tIejz&)V9W zmq5Wa?|F;c=S-ezC^~okKgz9m_CA83qiZ+A#OU(7K3uNwsPg!1on8N)GcY?rmS~4) z$N^CF#G#>sOsc!t+f=bGjha-flTyk`JW9!<PZa&AC{uKAM*=r$P_aQwXEjk)qsNMD zorZNNd+cB<B7)dYLbKwE(6V)fB{HJzzkr2ereIZrhRwNQIP?H)W2^pPt6E~!gpE=V zTbzrrQNx4u*rgqT@yMa#Pn^23clcLo*QgywOyCt(acED4f^=!#hsrJ?(>VVy&7Gd` z7q0;(FRZfl(0t@MN4G>%otDQ#6)g~3rzStsJs8CAyLh(+-4>a7xM_~?YaplxditC~ ztGzQu>L`YcIm^==?B2sLwg47@)}Kt{LYMFv<OP3ZUT4uW#*2*?mK7npI*L(WTfhE- z=lAPvh;e3#7?zn7)HI7HQypYssx6?>PjaqG6!e$3KQD^B@L`I4)6KJT$Ic57ia^Wm zonorRwcH2~xJx+$<pB^aT5oTNRuM5aw9*ZX4Kk5Of0zpC!x)hohxWcNjRQ+2(R$pL zlQ9{c4E%!-MOV>T6o^3(7d58M6v<>5`P3N~@dFNY=RsI>26+<c!gL;OcV_Pwo7uzB zrOT7-;^pFl%l(hc_SNW7agm>`apz8F9FH%=8C#qr7wn~5TfsM2k`X-MbMvADN8x7& zt~_H_$20MJp0vYkgSiNsl&emtMRm+Msaoo|T67wYtT@Z6<yPENYKhlt&XQAO>YUq0 z|HN>4NIg%O04Svuo6}^aq_N^W18?>&aZNKntcYk8ur#;Ga%<yCd_j~$$fET<Ikm@^ zaE<_B9N#rdJeP3Gayy5bIk~$C=XJE=ZBDHRfz6qhYC*psA~r!O;X|8$91{Y=W^oR; zV`GgE-1^9{e+(0fMJ^Zr1SlT+A*qE<G+$y@*cyYohd5<N)iRGIwVN>1k0cB}Fb28x zaz+q*7wOm#x4Hspi9#8VH(7Z9dF`KKv##?n@QPmH<j1_ci^}{ePzn5Tmu816aCp90 z_E}jO$|cMVe4`DuUFm-Er$WwqIVu8;Wft_0^0dED0TjeRm<qtTU*BNf0M>xU@+;!C z!dw3aMbVbUvT6k;imx0gK=goa8?Er=xBy>LE&D4ZNY^IcZX=1w7t9&dHE}q)Wluos z4&(|70{KH21Zf^k6U{7cq9BO!eh~Qh!{@(&$-@LJ`fp)6&C^~__<y^-4~yZmbc9;9 z=CsZ>78-7&+6Fl0{tc#fTCjgUFOiQw%w-1@7Acl%x9pG71tsAClIY(r&dRO(NtvuQ Pm~D{DC8woY&T8c!;XBcB diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/lockfile/mkdirlockfile.py b/venv/lib/python2.7/site-packages/pip/_vendor/lockfile/mkdirlockfile.py deleted file mode 100644 index 05a8c96..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/lockfile/mkdirlockfile.py +++ /dev/null @@ -1,84 +0,0 @@ -from __future__ import absolute_import, division - -import time -import os -import sys -import errno - -from . import (LockBase, LockFailed, NotLocked, NotMyLock, LockTimeout, - AlreadyLocked) - - -class MkdirLockFile(LockBase): - """Lock file by creating a directory.""" - def __init__(self, path, threaded=True, timeout=None): - """ - >>> lock = MkdirLockFile('somefile') - >>> lock = MkdirLockFile('somefile', threaded=False) - """ - LockBase.__init__(self, path, threaded, timeout) - # Lock file itself is a directory. Place the unique file name into - # it. - self.unique_name = os.path.join(self.lock_file, - "%s.%s%s" % (self.hostname, - self.tname, - self.pid)) - - def acquire(self, timeout=None): - timeout = timeout if timeout is not None else self.timeout - end_time = time.time() - if timeout is not None and timeout > 0: - end_time += timeout - - if timeout is None: - wait = 0.1 - else: - wait = max(0, timeout / 10) - - while True: - try: - os.mkdir(self.lock_file) - except OSError: - err = sys.exc_info()[1] - if err.errno == errno.EEXIST: - # Already locked. - if os.path.exists(self.unique_name): - # Already locked by me. - return - if timeout is not None and time.time() > end_time: - if timeout > 0: - raise LockTimeout("Timeout waiting to acquire" - " lock for %s" % - self.path) - else: - # Someone else has the lock. - raise AlreadyLocked("%s is already locked" % - self.path) - time.sleep(wait) - else: - # Couldn't create the lock for some other reason - raise LockFailed("failed to create %s" % self.lock_file) - else: - open(self.unique_name, "wb").close() - return - - def release(self): - if not self.is_locked(): - raise NotLocked("%s is not locked" % self.path) - elif not os.path.exists(self.unique_name): - raise NotMyLock("%s is locked, but not by me" % self.path) - os.unlink(self.unique_name) - os.rmdir(self.lock_file) - - def is_locked(self): - return os.path.exists(self.lock_file) - - def i_am_locking(self): - return (self.is_locked() and - os.path.exists(self.unique_name)) - - def break_lock(self): - if os.path.exists(self.lock_file): - for name in os.listdir(self.lock_file): - os.unlink(os.path.join(self.lock_file, name)) - os.rmdir(self.lock_file) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/lockfile/mkdirlockfile.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/lockfile/mkdirlockfile.pyc deleted file mode 100644 index a8bae6b32731b7081090a4faf61812c7e3273deb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3802 zcmd5<-EJGl6+W}1C{h+}#Xm|62kxSQVkU9S#0{JTNZiD#4Fs{(U}eBAfnc@bj_f6u zyVTB5KZ$+O+Sk2r-y{#vx9D5+1^RtwDY{N_)2nEu9i5puGkeZ=zH?^O_)mA`{lA|5 zekk*&fxlnvh`7H)NbzeV7nv9t7?}hz2*hwSkh~#-hH5}=%Ak27FUer(L~hBTB`MUJ zk}u1oErYg9Ix^_UWJLxmGC3oIGcs9~!KzHUGU#IWC9!SUGm^ICrN|4BzYNaugWJ7j zn3Um_UVz4*LzC>fGM{-HXOn4JdEdrZnjK^=D~qknP`5>0j^8hb<2#A7er4Xdmt?t3 zeFxpG(sTM%@4+$q{>)tUVK%Yl%=<3-U+0xgQk{oBM;?sRtfKxsZ1@_KcXj~f1E^Rb zf`ASPS^%<4WM2YMU<Emlmw;HYg3|+xH0eFy0v;4Pb36cAwB4gS?)PZ;(Qpr64R?>j zA?)&5@gz(_*kgyjtd4ICn^5CR95#2b?pp|6WMt%-$TPHoJZs2{rWhZ{s3D^!Cq^(# zHAXG%E^CX(G-Uk+R*1x~iD7AAKj+Y_g!AY2?b~5a%f1X>gQj=Ql@m*Iuf6yGC|?i# zQ(|t@FYhI}v#%CAa$>{X*l-(etH;1b$_)Y($61m2IEGgurSk+~n)s(GjLNLg$kWc4 zCMidrLa#_B)-OT1mgwFzOO*<<BHN$Ym>NB9r&~Fj??ohv?r>tMr)9pTO%I}I<7SZh z(<(biyzL((Re!I{Q(L+I4@dpuKUBNL;rQcQ`^87Ms!whWKXXT)r$1C5;dwIcKkQGl z>4#b2e3IuM`i~zxiNE8JzVU%A(z5E)9eUHBkdr698`I;6G(U^i5hYn#Z=5q7(=tP% zLvQ(R?qL2$qz!11ii|r_ou^#X95C|S2uTt!FQ0=23$^<y8yPpHf~-@YLZevh)s`wD zVV*anxF8-m0D574L#}{N7(D_3vHHLqUlicK;N1%&=27u4X#(Hzid2sc9>i|6LMxCc zm!E^NO&OgL1ZlJ?<3OrAhFf%HbXIwLPOwY$Z#uR8%IKTQcy$IA)AXB$v$Y#<8^6Z% zV={C>dLw@`vX3=yFc)7Ng_nc{SRs*M?!Ghr0u!5B%Zs&#^4MRT+mp5hZjUa}2bR?B z{X==gzdfx-TIZhp^B;VE`eVkJX*qN6LYh~j@G!|V-+dV-!~Gd@zD~QnvI;kxy9m_{ z7iKO@>XN0iHgy*;v8Tl^#8NFA77H{{4tIO&m{w+Qm4%JCi}pxngbk-ba-;(ftC@{x znP!U;E@C-U>i>EBZdIWqbAdZ{nj7|Lh@9LjRo_-sQF>OTyLTUdv;DA6A@=Q2=DdsE zfEckKX)2MQF1L0XaZ5FzoZ3S78s??5J!(Yf*{IE|0Z58i?QWt&xYQne`ZT1Z;xrH3 z71-x)q7ie&teUq>H&`{D;6l(b4Rg_S&6+tMTnd`zDrQ^3TBC)LwZ@ylx*77A<4asN zcd*Ys1Ts&LPn;88In9yagp0)oOhNP))gHXXNriwQM_*S3+EA^@yrleQzpYvw?JIBj z`7O7Gwk92-dqOyRR}Zox+4Oq2JM$qGaBQKLDv8MZ%*C}v#DFO!lwncGt}=pAR@%&p zJS)Z;|7wC_r`+oi2qnR(iEw3ei)+W%FwCu@5kzp^T*ABdDt4^Gn>)~8Zq}zWg2Omy zMcG!rw)D`c0pWpDqr#LsU2aFj{u{iGZpp8B`8y0R7+PK>L&?R44mQcD6OT2ix!=#- zCK*nb+n&+Q;$)&6#zpKt`i?|q$Tdxg2R+){!OT+#zYKMi%F*XKUf;ts{(t&@L(g9D zVd-Q|eFgzC!;=J%nf;zT;)Zpq)<+SJCe2Rf#g<+ie-7lLWalWm%%k_98qt^NeKdO6 z){N4ct9Ks^|JL^zy~Xe1RybC)zk@}tO}mg;m(4q7tGBq4#d=}GMUZ7CjwfY0%PqP* zR^m7<hjAQTh8*$W(|b~MjnW5flzP`G_0h2RKh1A=oujXek>j1Ng^S#|?&`apcBj#4 z_V}OC+}XXEpH*-+!jME-9N(lwD5AI7Ttx%YKq5KyaIK54X5QlbjrhS+<Gx-ezNjO4 Rn_g*UUB{WJKf#UWe*s6tKqLSF diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/lockfile/pidlockfile.py b/venv/lib/python2.7/site-packages/pip/_vendor/lockfile/pidlockfile.py deleted file mode 100644 index 069e85b..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/lockfile/pidlockfile.py +++ /dev/null @@ -1,190 +0,0 @@ -# -*- coding: utf-8 -*- - -# pidlockfile.py -# -# Copyright © 2008–2009 Ben Finney <ben+python@benfinney.id.au> -# -# This is free software: you may copy, modify, and/or distribute this work -# under the terms of the Python Software Foundation License, version 2 or -# later as published by the Python Software Foundation. -# No warranty expressed or implied. See the file LICENSE.PSF-2 for details. - -""" Lockfile behaviour implemented via Unix PID files. - """ - -from __future__ import absolute_import - -import errno -import os -import time - -from . import (LockBase, AlreadyLocked, LockFailed, NotLocked, NotMyLock, - LockTimeout) - - -class PIDLockFile(LockBase): - """ Lockfile implemented as a Unix PID file. - - The lock file is a normal file named by the attribute `path`. - A lock's PID file contains a single line of text, containing - the process ID (PID) of the process that acquired the lock. - - >>> lock = PIDLockFile('somefile') - >>> lock = PIDLockFile('somefile') - """ - - def __init__(self, path, threaded=False, timeout=None): - # pid lockfiles don't support threaded operation, so always force - # False as the threaded arg. - LockBase.__init__(self, path, False, timeout) - self.unique_name = self.path - - def read_pid(self): - """ Get the PID from the lock file. - """ - return read_pid_from_pidfile(self.path) - - def is_locked(self): - """ Test if the lock is currently held. - - The lock is held if the PID file for this lock exists. - - """ - return os.path.exists(self.path) - - def i_am_locking(self): - """ Test if the lock is held by the current process. - - Returns ``True`` if the current process ID matches the - number stored in the PID file. - """ - return self.is_locked() and os.getpid() == self.read_pid() - - def acquire(self, timeout=None): - """ Acquire the lock. - - Creates the PID file for this lock, or raises an error if - the lock could not be acquired. - """ - - timeout = timeout if timeout is not None else self.timeout - end_time = time.time() - if timeout is not None and timeout > 0: - end_time += timeout - - while True: - try: - write_pid_to_pidfile(self.path) - except OSError as exc: - if exc.errno == errno.EEXIST: - # The lock creation failed. Maybe sleep a bit. - if time.time() > end_time: - if timeout is not None and timeout > 0: - raise LockTimeout("Timeout waiting to acquire" - " lock for %s" % - self.path) - else: - raise AlreadyLocked("%s is already locked" % - self.path) - time.sleep(timeout is not None and timeout / 10 or 0.1) - else: - raise LockFailed("failed to create %s" % self.path) - else: - return - - def release(self): - """ Release the lock. - - Removes the PID file to release the lock, or raises an - error if the current process does not hold the lock. - - """ - if not self.is_locked(): - raise NotLocked("%s is not locked" % self.path) - if not self.i_am_locking(): - raise NotMyLock("%s is locked, but not by me" % self.path) - remove_existing_pidfile(self.path) - - def break_lock(self): - """ Break an existing lock. - - Removes the PID file if it already exists, otherwise does - nothing. - - """ - remove_existing_pidfile(self.path) - - -def read_pid_from_pidfile(pidfile_path): - """ Read the PID recorded in the named PID file. - - Read and return the numeric PID recorded as text in the named - PID file. If the PID file cannot be read, or if the content is - not a valid PID, return ``None``. - - """ - pid = None - try: - pidfile = open(pidfile_path, 'r') - except IOError: - pass - else: - # According to the FHS 2.3 section on PID files in /var/run: - # - # The file must consist of the process identifier in - # ASCII-encoded decimal, followed by a newline character. - # - # Programs that read PID files should be somewhat flexible - # in what they accept; i.e., they should ignore extra - # whitespace, leading zeroes, absence of the trailing - # newline, or additional lines in the PID file. - - line = pidfile.readline().strip() - try: - pid = int(line) - except ValueError: - pass - pidfile.close() - - return pid - - -def write_pid_to_pidfile(pidfile_path): - """ Write the PID in the named PID file. - - Get the numeric process ID (“PID”) of the current process - and write it to the named file as a line of text. - - """ - open_flags = (os.O_CREAT | os.O_EXCL | os.O_WRONLY) - open_mode = 0o644 - pidfile_fd = os.open(pidfile_path, open_flags, open_mode) - pidfile = os.fdopen(pidfile_fd, 'w') - - # According to the FHS 2.3 section on PID files in /var/run: - # - # The file must consist of the process identifier in - # ASCII-encoded decimal, followed by a newline character. For - # example, if crond was process number 25, /var/run/crond.pid - # would contain three characters: two, five, and newline. - - pid = os.getpid() - pidfile.write("%s\n" % pid) - pidfile.close() - - -def remove_existing_pidfile(pidfile_path): - """ Remove the named PID file if it exists. - - Removing a PID file that doesn't already exist puts us in the - desired state, so we ignore the condition if the file does not - exist. - - """ - try: - os.remove(pidfile_path) - except OSError as exc: - if exc.errno == errno.ENOENT: - pass - else: - raise diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/lockfile/pidlockfile.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/lockfile/pidlockfile.pyc deleted file mode 100644 index 11a87b1e8b9a8efb254e0708d3d06851b5cf613b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6473 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 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/lockfile/sqlitelockfile.py b/venv/lib/python2.7/site-packages/pip/_vendor/lockfile/sqlitelockfile.py deleted file mode 100644 index f997e24..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/lockfile/sqlitelockfile.py +++ /dev/null @@ -1,156 +0,0 @@ -from __future__ import absolute_import, division - -import time -import os - -try: - unicode -except NameError: - unicode = str - -from . import LockBase, NotLocked, NotMyLock, LockTimeout, AlreadyLocked - - -class SQLiteLockFile(LockBase): - "Demonstrate SQL-based locking." - - testdb = None - - def __init__(self, path, threaded=True, timeout=None): - """ - >>> lock = SQLiteLockFile('somefile') - >>> lock = SQLiteLockFile('somefile', threaded=False) - """ - LockBase.__init__(self, path, threaded, timeout) - self.lock_file = unicode(self.lock_file) - self.unique_name = unicode(self.unique_name) - - if SQLiteLockFile.testdb is None: - import tempfile - _fd, testdb = tempfile.mkstemp() - os.close(_fd) - os.unlink(testdb) - del _fd, tempfile - SQLiteLockFile.testdb = testdb - - import sqlite3 - self.connection = sqlite3.connect(SQLiteLockFile.testdb) - - c = self.connection.cursor() - try: - c.execute("create table locks" - "(" - " lock_file varchar(32)," - " unique_name varchar(32)" - ")") - except sqlite3.OperationalError: - pass - else: - self.connection.commit() - import atexit - atexit.register(os.unlink, SQLiteLockFile.testdb) - - def acquire(self, timeout=None): - timeout = timeout if timeout is not None else self.timeout - end_time = time.time() - if timeout is not None and timeout > 0: - end_time += timeout - - if timeout is None: - wait = 0.1 - elif timeout <= 0: - wait = 0 - else: - wait = timeout / 10 - - cursor = self.connection.cursor() - - while True: - if not self.is_locked(): - # Not locked. Try to lock it. - cursor.execute("insert into locks" - " (lock_file, unique_name)" - " values" - " (?, ?)", - (self.lock_file, self.unique_name)) - self.connection.commit() - - # Check to see if we are the only lock holder. - cursor.execute("select * from locks" - " where unique_name = ?", - (self.unique_name,)) - rows = cursor.fetchall() - if len(rows) > 1: - # Nope. Someone else got there. Remove our lock. - cursor.execute("delete from locks" - " where unique_name = ?", - (self.unique_name,)) - self.connection.commit() - else: - # Yup. We're done, so go home. - return - else: - # Check to see if we are the only lock holder. - cursor.execute("select * from locks" - " where unique_name = ?", - (self.unique_name,)) - rows = cursor.fetchall() - if len(rows) == 1: - # We're the locker, so go home. - return - - # Maybe we should wait a bit longer. - if timeout is not None and time.time() > end_time: - if timeout > 0: - # No more waiting. - raise LockTimeout("Timeout waiting to acquire" - " lock for %s" % - self.path) - else: - # Someone else has the lock and we are impatient.. - raise AlreadyLocked("%s is already locked" % self.path) - - # Well, okay. We'll give it a bit longer. - time.sleep(wait) - - def release(self): - if not self.is_locked(): - raise NotLocked("%s is not locked" % self.path) - if not self.i_am_locking(): - raise NotMyLock("%s is locked, but not by me (by %s)" % - (self.unique_name, self._who_is_locking())) - cursor = self.connection.cursor() - cursor.execute("delete from locks" - " where unique_name = ?", - (self.unique_name,)) - self.connection.commit() - - def _who_is_locking(self): - cursor = self.connection.cursor() - cursor.execute("select unique_name from locks" - " where lock_file = ?", - (self.lock_file,)) - return cursor.fetchone()[0] - - def is_locked(self): - cursor = self.connection.cursor() - cursor.execute("select * from locks" - " where lock_file = ?", - (self.lock_file,)) - rows = cursor.fetchall() - return not not rows - - def i_am_locking(self): - cursor = self.connection.cursor() - cursor.execute("select * from locks" - " where lock_file = ?" - " and unique_name = ?", - (self.lock_file, self.unique_name)) - return not not cursor.fetchall() - - def break_lock(self): - cursor = self.connection.cursor() - cursor.execute("delete from locks" - " where lock_file = ?", - (self.lock_file,)) - self.connection.commit() diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/lockfile/sqlitelockfile.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/lockfile/sqlitelockfile.pyc deleted file mode 100644 index 18dced6f2422609e45803d89f7354196aa253d88..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5126 zcmd5=&2k&Z5$;(mKmY_tijwF!cI+)Via>=DWh;@Lax5m6<6LCgS*l77%BdxY9gqv| z54ba+NEhi!VpVcXm2*fr50H0Al^-FOyoRrSfqdP&07==3t&<6I2lLZ2)ALRD*S)BG z)oxz@)7&5WRDP=X{?#Ut`3#j1|B7OwL{V2!;!xKi#k~&273x+*0(F<VE*;iMS4llg zpCeb-XtzoE`=pf8Gt{k8s_4TI6I_bxlr*T@prlFNCMC1fou#Bj-4-Qn>b9{%m2`s! ziozN_Ci;}<_uV<(bfYr^wIV#!aZuQK6um8z#bc|3C>dqBwRQA`(SBs2EM1Qj%krtD z|9;lreY<D0ZJ=j8v)tC<r1jn*x9u#(xbh%MbT+oOjrOnOT=zm5hx{CRHhy<MvYO@I zjbc3ou!5ntHv!;BsAyu`02pu!>kJYQLItQk2ADOeJM<Xv&JfVSVY?W0rP3haz&*_p z2f!50NKcFWjSe5dyoBN%on)!8dCzJOTHV;f0Yfi_W>LC*v+qKriHAYBx5;yWi6t5; zIwCqk>CjPyK6Oc1)G&aCj0F`cd)!HnOSVcwDDKd1o$|l)QP>*lbnMcROTz|V*GCQ= zSLwJ$wn@WTI;!$?#f=sn)ui!Bl|I1?h*T-4Q7Wd!E4Ar(hK^=vI9F~}>M}2?&C_s! zcQ~%o;RQOX)9?ZV$ICxVFOka=7sd9zWZO$`(T98@OuNX_RH^PII&RQWgNBzy#nxmi zHg7gF#>|XSG`;e3_wHSR)O(9DK6Ue*YbHzd05))K`I)3wJiEh2rNg)0?Zrl)%oYP* zH^0UHeMsP1ZEq{qvcKs-A->yyxAgXVd4H#ucW%G7yn=yo8tsjBkoJ-@L(82dtmTW# zuzLhSltwlPEV~ot^s}&ViRr@P1gBQ>S<=?H(8h*amJwRdQY~&}buwagWW8k9a2u9G zlo?zvP7!DDIi5XE<0#z~IkOi7#@kZwXKAYY78U~Gq7Lts8U1l?;MTmqKG1zQx?Mp1 z{gH;jL#P-3CeI<jtM{`ciL6wC+5xJ3+FWl(P$}>5>Y}*O@jxo0p4}-<P+o=XV++Uk z+089GbTA107QX$9+{2X8_kW18gQqCWK5DC@Jle;`tGJcbK^BKPH>)2XtRCLZx6((u zuin{9Z{5j%cBlV_Irv5RaefP*?a}Ik)loFM5y6FfaeTwR`rdZ%0e8t0?CUhl@>RYW zhIqArZPL6sI`sLBte6pXs!M87Ejsh6h3_{0YO3Y5)MfNk)P?GTa-BBD`g}c%8DHeR zP0ao;&IL9IiFO;5FLFJtiPI@MR?GxLM_dmiF%`Qnbw#@_<*3Wh>&FiJb14Lt=rKhc zS15gXBCROjXX@b2rgT>51vCow8G>%$;w~M$sbD|(e-!tFH=yNB#ViB11bLvdE+v8m zRD<)D^PA%9rC@a;q6!gApOy8iWI;#5O$ao6f@_n-!9ZACV$j!?-5YQS+(_RLzJn&; zbpwa;V(JNeUohnsumU?);S0s11)%>@h&>1wtjioNf#m+IXb*GdDFl6;?giew(t<EK z$Z+p7ddOOe&94igZ2$9f{``9_Vm~l%qJYim+<H-Jvw~bauQR29mD6mp?15_Hu{Mxc zTk+PG&2?TxBl21Ax;MzPWU|7e9i8jbb3vJF5{Jb=L(BoAed`SK6Kqh1VDC{cvIu4# z^z8Nb#t}APJ-tDedsmIQ1ktO;i;UMR;<SwFuyX+eKF4qWWfbD_?A-ok?qW`qt_S(J zpufljysQrW=U9Mo@;MvupJ!3_vw^nY+c*|lh;`~Sz4<@lf}Kg&&cs@eI^6VM<U+RQ z$?)WWx0g-%NGB@f*`vaJ#fQH~HW30WG5$GpHt(Py^#Um42dWJsX`t3{n$Em~n$vJE zs&=Izl(OjX_d;c6+IA~1L8j&`RF*1zrcEXt7tg&-to#>L*oY;=Ggp{cVfftROpKjr z1Z@O($bZ1M1t#I1!smn%;QFO&l+s86>f+#7OtBY-1+i2)rJT4kgbJ1rFJYb54ab$j zjMB`OCS+cjb{3|w;%$ws#{yf29>Qz~UsuiYGud`WjOxc&*{^WH_5&`0Lk7J>Oc2KI zvr=MylI8}FcCw%}P#&F{aAB)#p^_69HpjLtrgSdsDTmK<)(xf1A_{^HE#axD7u7th zsja5g!Fb%;gxqaZ3hO|kit9%R;@d<bUD!xvdYkB#fC1BZext(+tee+Rmh5yYi}?oD znbMuG6lN7~3s1t!RB%E7$a~Hs*8UA>`A0m4*@jL-%cxADeI1QwgBB4T@u}6?kYlfl zvHu_PKLe_~eSH(2{#EE9_jO{kK8KZaVYoiK=U?#{zWWK7NSwaLW8V%ZgY8ap6xb`0 z4mt(r8gKLTSb7Fdejn+j;gbQjh&NA=0&89bFoBxc_XO(mf$|D;`WqjAYO<A!Cm2sn z_6|h8o5=!dK^p)|o>p2cXA@6NJ<b69bbCFw9Lx8-g*U}ri5>qq11HFJy~8Px&{rVu zhIsSiDM65A;W*aii(n9hSw9Ghd`Vt+UV)I$7vukwi<?|9$B1wEe0BaU6epG>weK-| zk=N8Ys3c*grfNt&=C8EY8m-1mqu!`@_y?o%?1Ql#=Qz8MF7nx{{VQB>7U1)bE5*-3 zc$F?*FxeLID+>p);#Inc-4dlG3zUqH-&4;I9&+cuEN=NOA5n6gC8TjJr=se3J8U|g G%KreQf^k>? diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/lockfile/symlinklockfile.py b/venv/lib/python2.7/site-packages/pip/_vendor/lockfile/symlinklockfile.py deleted file mode 100644 index 23b41f5..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/lockfile/symlinklockfile.py +++ /dev/null @@ -1,70 +0,0 @@ -from __future__ import absolute_import - -import os -import time - -from . import (LockBase, NotLocked, NotMyLock, LockTimeout, - AlreadyLocked) - - -class SymlinkLockFile(LockBase): - """Lock access to a file using symlink(2).""" - - def __init__(self, path, threaded=True, timeout=None): - # super(SymlinkLockFile).__init(...) - LockBase.__init__(self, path, threaded, timeout) - # split it back! - self.unique_name = os.path.split(self.unique_name)[1] - - def acquire(self, timeout=None): - # Hopefully unnecessary for symlink. - # try: - # open(self.unique_name, "wb").close() - # except IOError: - # raise LockFailed("failed to create %s" % self.unique_name) - timeout = timeout if timeout is not None else self.timeout - end_time = time.time() - if timeout is not None and timeout > 0: - end_time += timeout - - while True: - # Try and create a symbolic link to it. - try: - os.symlink(self.unique_name, self.lock_file) - except OSError: - # Link creation failed. Maybe we've double-locked? - if self.i_am_locking(): - # Linked to out unique name. Proceed. - return - else: - # Otherwise the lock creation failed. - if timeout is not None and time.time() > end_time: - if timeout > 0: - raise LockTimeout("Timeout waiting to acquire" - " lock for %s" % - self.path) - else: - raise AlreadyLocked("%s is already locked" % - self.path) - time.sleep(timeout / 10 if timeout is not None else 0.1) - else: - # Link creation succeeded. We're good to go. - return - - def release(self): - if not self.is_locked(): - raise NotLocked("%s is not locked" % self.path) - elif not self.i_am_locking(): - raise NotMyLock("%s is locked, but not by me" % self.path) - os.unlink(self.lock_file) - - def is_locked(self): - return os.path.islink(self.lock_file) - - def i_am_locking(self): - return (os.path.islink(self.lock_file) - and os.readlink(self.lock_file) == self.unique_name) - - def break_lock(self): - if os.path.islink(self.lock_file): # exists && link - os.unlink(self.lock_file) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/lockfile/symlinklockfile.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/lockfile/symlinklockfile.pyc deleted file mode 100644 index 689e1ee8f375bb2256929fb90ae5f6e7d20eaf27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3201 zcmd5;U2oJz6usm9NH%OBEe+zMLKZE>tso0+m9|npQlNc;rE(%cSE{Vd?j$(twKtww zAP64X@ZRV0Px=G;++V>j=pX1g*GmG0_r_X}@6259oqNuiJFfk+xbVrZ$A1~f?5g3p zwkG0sU<~myl8KCs^o$tx1IYsE1v&@2CcT;r@vBQ#mvKXS4H-A3*Oc*`^yXwdFTHsg zx1`s?`wg)T*)lS0$}^FDk)L}D{LA%d4&hSV5*al91e*S)E3&D#NjjbsrSGPki5i@q zM{}zfjIQ^c^(}O|g=gOmU-oYAvG0$~95>RjEvDWtqW^tX+Wt`I;m=6xd*dw4M||VQ zG_$XPaeWP7+=i1CVgLw`yhXxu#O4{WXs8{?Gl0}27Dx@50}&eYf~;w@W?3WScs*hU z?h+aX4f}(EbuRQp*bld`f^h26d^>d2x}r}%UK!Nk%bWS%Si{S!Fucf)ktZTg&<66P zCi`_UK9HT7?9@52(~y0v+Q=Dn5-b(jMgd-(!P$fvE96{JlB9X+lLY@DQaI0mlfJ+2 z8P!d))GMOXJl&nzB=3)HL>KjQHrtBHg|g%C6J+2^Vts{v1XHwe4`FpCW%{7+ZRbJ1 z>}(a;(3Y<A_)%x?vvM<kIJ&mFn_pcmKVKbu=^lMGd|Y0|wLR%<bSCNKN}4<0&$282 z+U@P+Cl2YIJh1t&C_5QYC6JvNgfIImlf9TLq7EFFF2Si_z-%e}18h$N5kLyCMlC7d zrJXkwP9sl^5a59FeG1GE+-|9DWK@?DwoZKkk6h%@U*c<0o-})B2^L5pHPt`P$$lW_ zZvI^AKyI`k<uQYc4lTwge^=5D<GeVGk06Zp;+4pMi`Om1_m9abkpG*JUA)t#G+!IV z!kEe8D>)!8@~O*m4uz|9%<dhz2O!q*yvt`q$#iwEx{qMawpRGCpL&XxA|C8c)6#}S zJ=`kF@S=0?!S$jGQy2ED{im~bm@Z&q`}rTd{`@XFj-JY?TjVxA=utsByirbVOsT4{ zX6(k?=DPD4F(L6feP{iLvP9`<V>(Ux<Al>#V@&2%t1&6B)SX#7iKv2@?p0_8f}j$H zKN{-Qyk_{G#OmCKXry`0w9RR=7_@?#Ig4jIsMpS8tQjl?O|xV!)dt+;yqV&SHN1Hb z2KAtY*j*5>b%G<oOWoub)B|M&{x?YsiuLOr3g4lWt5afKf$X{^gs4c*3qK>=ojVvL z9d>v*+?@K54x4)+a8`C%NK&VS*<s8LTJg0^OIcDkYH^ygc*jIT4-e(<2(eY#%;KD4 zy>=A4fR|HxA8^9_loKXV6?Kq6paH$Xo+EKxt+guts?IX`)E(L6<1<*_H@F?s6Z2-a zD;Rz=+v182R>zm-PaqmH;&(y?1T#MbB7UD;g^r@&!K0wCDjYRM#1!xv?&|b0%Wr|@ zGN#{zrHuXyi$MX`id=!hQua1b;<K1IYB=DK64?Y*Bi-XS(K|q-8)-c!mx+F4;Ddzj zNir^m)6AmFGdxL##UM%IcVNf-jMI}nK23`?M)jw7$LG;KtO#oTub&{)FEesH;F_q? zCz|aKT63*ht6t?^rMort(-P^%@S0J}iVAI@OVX>tsO3<PG?f7V{0JqhpMzgl%zev6 OI}*DTv`ssR>i+^JUCM<3 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/msgpack/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/msgpack/__init__.py deleted file mode 100644 index 2afca5a..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/msgpack/__init__.py +++ /dev/null @@ -1,66 +0,0 @@ -# coding: utf-8 -from pip._vendor.msgpack._version import version -from pip._vendor.msgpack.exceptions import * - -from collections import namedtuple - - -class ExtType(namedtuple('ExtType', 'code data')): - """ExtType represents ext type in msgpack.""" - def __new__(cls, code, data): - if not isinstance(code, int): - raise TypeError("code must be int") - if not isinstance(data, bytes): - raise TypeError("data must be bytes") - if not 0 <= code <= 127: - raise ValueError("code must be 0~127") - return super(ExtType, cls).__new__(cls, code, data) - - -import os -if os.environ.get('MSGPACK_PUREPYTHON'): - from pip._vendor.msgpack.fallback import Packer, unpackb, Unpacker -else: - try: - from pip._vendor.msgpack._packer import Packer - from pip._vendor.msgpack._unpacker import unpackb, Unpacker - except ImportError: - from pip._vendor.msgpack.fallback import Packer, unpackb, Unpacker - - -def pack(o, stream, **kwargs): - """ - Pack object `o` and write it to `stream` - - See :class:`Packer` for options. - """ - packer = Packer(**kwargs) - stream.write(packer.pack(o)) - - -def packb(o, **kwargs): - """ - Pack object `o` and return packed bytes - - See :class:`Packer` for options. - """ - return Packer(**kwargs).pack(o) - - -def unpack(stream, **kwargs): - """ - Unpack an object from `stream`. - - Raises `ExtraData` when `stream` contains extra bytes. - See :class:`Unpacker` for options. - """ - data = stream.read() - return unpackb(data, **kwargs) - - -# alias for compatibility to simplejson/marshal/pickle. -load = unpack -loads = unpackb - -dump = pack -dumps = packb diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/msgpack/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/msgpack/__init__.pyc deleted file mode 100644 index 29534e86acd755034ed14688bb475f79e8590328..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2871 zcmc&$+io015UrkFuf6N_B~D1Vgk&BNESBO;0tygC2nZISD8?E)Bv}c~&d#*W*mI-1 z*O$lvfe}yS8~F%608Z8Tl1T9bPaeC=HQm)cRi{o>yYbIVXYse$A7eUtCh+$Q40}Zp zCHPg85#@>oiWI+llzFtyT7$9%<xLtivC<^nB*<if4n5jXl(gs%qC=vmg9$lklCl;J zTBKXFHA!1jluXf~BJ-!Lwkc~<-l0K<@@X1OQ{JUPmsByJ{YA0pP&RX9A&yK_Hv6jW z<KhN2^&D+?$ox%8iP@P4D|(W2*~h^=B{QO2pk!8*1=0&NxJVkVTp~SBgEvTDpuuHI zCTXoV2Y}Ll@$>)^xk-o}ZERW=^#so@)@lc85#>5@<0{i)y1eJs_bYANSc=O;`$^=Y zlLYYIuQ2Qt2o3K5C8WohU}qZ?to1xL_yFSQEZ^wLXsZineZA*=hx7fk@N>IaMe+7h z+<+~QCdPdXdkEo(4iq`X8MD{O$v2Ra-xU@0sz<INtM_Ep<Al|#$UgQq8{3M?HBLN~ z!Xr=FO>#92j!oSJxfUIO3?6453U(ggtOlTL!H*R?4=GUOW9$48`|j)lCK($4cyhGw zv`sNf>8}uC@XD^6zudb0NpA{kj&V<IT38nqu|^blEu3S_8T@5qN(0A;<WMpHA<D)t zE!c6TO~4x^YhhUE-7xIQ1dBMc2(<QF6!x`;2@+vTX#L8hJCW1<oyhbz$}9m(`p@?I z`yZK6vAcci&d<foJLcm%@uzn0v*ek%iD$FwulK98x*^VI*$sE=;byqXQ!>IGT_mOH zALX_mhG~(yFkGtk1CE-9orNGZcl2`=e|zk!V{8x!2pNVFbQtDkGS2vwX&i=08Hb@9 zbQ;U~1;jwJ&z8M!sg_!COpAwW->iOl|3SF=C|F*7y8i9=D|KF&O{*ZhHWJOaVD^tB z>PMn$BV`%zAyP%bMQFh#h?t9tKf~XAfMMT<;2QDh1<`XM{1%wope;}6jKbljs6b;W z$S1Jx_;}a_zZ`Ap*!jb9=to83@0!$s*Qm|XA6jR0ln*;%y{5H)H_jq!?+$C{hyF%s z{IYWBD0WGV>Hx)Wp{*PzwBr!#<Z|mMQEG5q&KGriH!_=6RJH^FSU*RKUdGq2vx^Kh zwYn;1w;4Ykf;*?A?oGg*5l8D_klD~ahBy;squtmPz66^1QriCm<C+jmjexzZU%3qj zZ}BU}`Qau>=eR~6!VSw<QA?m>x}H#$9R*xla`Qe%`<70Ne*5ACz`tN30M-=&avoE4 z!<6|6H<xPQf+)4x`a@haCi)s3Zs_m+q>B?XKQ0Rwp;hs{W1<@KnzAqR`ndXD!)$?B zn2ef8q#mW1gE!%*ARo*?J7@U0s_J%f8(K}?$*$@#J=|3YwCAOx*1U9l?c!bjD+sVo z?%EkvdN0;>sk>>I#ATMDad7DeoaXupVy(2&)pW6w8lcWe-_-8RuWv+IHUeX$X`J>s z_YU^G*4w&2xOdN5uj5B=WjDXeE8L)Rk4m)!d~CpbC6`$lCBj)&>WeZN=ao#cVo&oa y+Id`;axdJg@4wF(VEZ1#yy|%KjqBa6T2R-$hMHGzs~P1t+MRa0-NhZ`wbXyOJFQIs diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/msgpack/_version.py b/venv/lib/python2.7/site-packages/pip/_vendor/msgpack/_version.py deleted file mode 100644 index d28f0de..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/msgpack/_version.py +++ /dev/null @@ -1 +0,0 @@ -version = (0, 5, 6) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/msgpack/_version.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/msgpack/_version.pyc deleted file mode 100644 index 9c1279f326b39dc1e8084b283086d56c31c5e026..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 251 zcmZ8b?FxcG5WKK2gnAAMYL!9?B6@)$s9!;dc_xQ?cimm4{_B~0fmR8E7G`#47}&Mm zBYW~1Un24y3-=bGZ6w+yXJm^UogP|-Agon=RC}i>|AkHmGc!OcVx^hj4odPPEzp8g ztO!jEMX2B=GKy8GOQ`1R%Acv{-?{6ng&!?-xuUglaS{n9kW5Y)*Cx!esquD6aA=|y iK@oE*6y!RQVUz;;_Wn#(W{5Y}xuB0M-ZcMd1o;3Ti8&Vl diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/msgpack/exceptions.py b/venv/lib/python2.7/site-packages/pip/_vendor/msgpack/exceptions.py deleted file mode 100644 index 9766881..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/msgpack/exceptions.py +++ /dev/null @@ -1,41 +0,0 @@ -class UnpackException(Exception): - """Deprecated. Use Exception instead to catch all exception during unpacking.""" - - -class BufferFull(UnpackException): - pass - - -class OutOfData(UnpackException): - pass - - -class UnpackValueError(UnpackException, ValueError): - """Deprecated. Use ValueError instead.""" - - -class ExtraData(UnpackValueError): - def __init__(self, unpacked, extra): - self.unpacked = unpacked - self.extra = extra - - def __str__(self): - return "unpack(b) received extra data." - - -class PackException(Exception): - """Deprecated. Use Exception instead to catch all exception during packing.""" - - -class PackValueError(PackException, ValueError): - """PackValueError is raised when type of input data is supported but it's value is unsupported. - - Deprecated. Use ValueError instead. - """ - - -class PackOverflowError(PackValueError, OverflowError): - """PackOverflowError is raised when integer value is out of range of msgpack support [-2**31, 2**32). - - Deprecated. Use ValueError instead. - """ diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/msgpack/exceptions.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/msgpack/exceptions.pyc deleted file mode 100644 index 63bd345c82179e55a616a86d00cf1053def539ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3313 zcmds3OK;RL5O#LA`|1-8mEeGU0FhR7(+8?RLI{->2_f1lrAUBKl*Z0BYMP|Bv)xv` zAh>bj2l1=;1I##^q-EPfxojaTd&hR{%zQKRjjO*V+w)(hK6_;FRN?;xH2D)cMhGXw zHwZJxH$uJ=^5G*4Duf$)wpz?q2&?6@W5sNhusY828u8(cMzJtPSd;KEeMqaAtrOPH zKR8~@HVB&_ypbO=Su8XOn<5;}Y3b9ai-k5}Gi1lS1s14j=ys#T^$s@r9#2#dM}@5h ztgS(lQ_z8-XdCnuV(*x^Cf`7}&J)2sS8>*%bXRg(oI`_1D(*6>VhS&K`_v6X%Ja`q zmWm+i(o}yPq>hQ;swQ-f6S;@naa3Cm4r7*vIBe)4i#^9NK_q1-k6>seBItoCR?iid zABT(!X`S}1lNGTS9Um;M9z~0*;_<5YME0MuQ?Uq7H?iJXNsug{wxHmGT6)`cwsA@~ zr^h1}3+qsJ5hbh8Uv`oc8<o&dR6wX3THm$Q_qlkLhT$-hXk3OQV2GPd+-TzwHcF*I zS{jj6HPB=XnjBcw0(mP{TmHJM+<(<5GzbmJjhX>Di~RR)nDPxFVliynRiS?$b`OPq zc~BnvSxlGywK2qRhLh`{$t1KK55#7puY`NKlkdWE!2v*aKm!@;eXJrMV5E3x95x)h zgeGU9J2S``WHbmBEoc(S2xL=l(;1(!0A~u_#8Him4KNfX4}H4{f{i+s=#3^j1_TvE zfpVPNs2=J_jF#bH8s|;hk1K#u2G6Fv2gA%zb8n6UZStVU8BijaOBv)=Co@jd0aD+{ zZOsT*D&aWjOC2l3Fww4aK|PMci3|E_%}3)P8<oc5rX5o^S~Z1nzWsMK?lo*3O7!d2 zIIJ8+g*yivCQIq#QDTM&VT$K$fV_u@m6YbejD9dW*PvZ_E%*+L7x&UYQsD*?g8g`( zM^v38oW?$|WRfZ!`S^xRlOz^!lc0Mr8>okp_K=!!EscuRPP<Lv8FEUgYQetxMNK3( z5_AL^IUxhRrZ8v`xUC)+ei$ELvnKtxZ2O<k2a)1kE=pu$z#3d3+^DO4GPvmE-k_fr zmgnbJmL5_3Tb}!W(8sIqgA)Bs6KPCkWpHp6*7rMGvmMqYeZ4Eg%*GO`*~Z57vC*BH iYA*QC#_!ySB-fSeS$3Izj#;cTc(#VWJGI#s^o`%(>^Y$T diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/msgpack/fallback.py b/venv/lib/python2.7/site-packages/pip/_vendor/msgpack/fallback.py deleted file mode 100644 index 9418421..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/msgpack/fallback.py +++ /dev/null @@ -1,977 +0,0 @@ -"""Fallback pure Python implementation of msgpack""" - -import sys -import struct -import warnings - -if sys.version_info[0] == 3: - PY3 = True - int_types = int - Unicode = str - xrange = range - def dict_iteritems(d): - return d.items() -else: - PY3 = False - int_types = (int, long) - Unicode = unicode - def dict_iteritems(d): - return d.iteritems() - - -if hasattr(sys, 'pypy_version_info'): - # cStringIO is slow on PyPy, StringIO is faster. However: PyPy's own - # StringBuilder is fastest. - from __pypy__ import newlist_hint - try: - from __pypy__.builders import BytesBuilder as StringBuilder - except ImportError: - from __pypy__.builders import StringBuilder - USING_STRINGBUILDER = True - class StringIO(object): - def __init__(self, s=b''): - if s: - self.builder = StringBuilder(len(s)) - self.builder.append(s) - else: - self.builder = StringBuilder() - def write(self, s): - if isinstance(s, memoryview): - s = s.tobytes() - elif isinstance(s, bytearray): - s = bytes(s) - self.builder.append(s) - def getvalue(self): - return self.builder.build() -else: - USING_STRINGBUILDER = False - from io import BytesIO as StringIO - newlist_hint = lambda size: [] - - -from pip._vendor.msgpack.exceptions import ( - BufferFull, - OutOfData, - UnpackValueError, - PackValueError, - PackOverflowError, - ExtraData) - -from pip._vendor.msgpack import ExtType - - -EX_SKIP = 0 -EX_CONSTRUCT = 1 -EX_READ_ARRAY_HEADER = 2 -EX_READ_MAP_HEADER = 3 - -TYPE_IMMEDIATE = 0 -TYPE_ARRAY = 1 -TYPE_MAP = 2 -TYPE_RAW = 3 -TYPE_BIN = 4 -TYPE_EXT = 5 - -DEFAULT_RECURSE_LIMIT = 511 - - -def _check_type_strict(obj, t, type=type, tuple=tuple): - if type(t) is tuple: - return type(obj) in t - else: - return type(obj) is t - - -def _get_data_from_buffer(obj): - try: - view = memoryview(obj) - except TypeError: - # try to use legacy buffer protocol if 2.7, otherwise re-raise - if not PY3: - view = memoryview(buffer(obj)) - warnings.warn("using old buffer interface to unpack %s; " - "this leads to unpacking errors if slicing is used and " - "will be removed in a future version" % type(obj), - RuntimeWarning) - else: - raise - if view.itemsize != 1: - raise ValueError("cannot unpack from multi-byte object") - return view - - -def unpack(stream, **kwargs): - warnings.warn( - "Direct calling implementation's unpack() is deprecated, Use msgpack.unpack() or unpackb() instead.", - PendingDeprecationWarning) - data = stream.read() - return unpackb(data, **kwargs) - - -def unpackb(packed, **kwargs): - """ - Unpack an object from `packed`. - - Raises `ExtraData` when `packed` contains extra bytes. - See :class:`Unpacker` for options. - """ - unpacker = Unpacker(None, **kwargs) - unpacker.feed(packed) - try: - ret = unpacker._unpack() - except OutOfData: - raise UnpackValueError("Data is not enough.") - if unpacker._got_extradata(): - raise ExtraData(ret, unpacker._get_extradata()) - return ret - - -class Unpacker(object): - """Streaming unpacker. - - arguments: - - :param file_like: - File-like object having `.read(n)` method. - If specified, unpacker reads serialized data from it and :meth:`feed()` is not usable. - - :param int read_size: - Used as `file_like.read(read_size)`. (default: `min(16*1024, max_buffer_size)`) - - :param bool use_list: - If true, unpack msgpack array to Python list. - Otherwise, unpack to Python tuple. (default: True) - - :param bool raw: - If true, unpack msgpack raw to Python bytes (default). - Otherwise, unpack to Python str (or unicode on Python 2) by decoding - with UTF-8 encoding (recommended). - Currently, the default is true, but it will be changed to false in - near future. So you must specify it explicitly for keeping backward - compatibility. - - *encoding* option which is deprecated overrides this option. - - :param callable object_hook: - When specified, it should be callable. - Unpacker calls it with a dict argument after unpacking msgpack map. - (See also simplejson) - - :param callable object_pairs_hook: - When specified, it should be callable. - Unpacker calls it with a list of key-value pairs after unpacking msgpack map. - (See also simplejson) - - :param str encoding: - Encoding used for decoding msgpack raw. - If it is None (default), msgpack raw is deserialized to Python bytes. - - :param str unicode_errors: - (deprecated) Used for decoding msgpack raw with *encoding*. - (default: `'strict'`) - - :param int max_buffer_size: - Limits size of data waiting unpacked. 0 means system's INT_MAX (default). - Raises `BufferFull` exception when it is insufficient. - You should set this parameter when unpacking data from untrusted source. - - :param int max_str_len: - Limits max length of str. (default: 2**31-1) - - :param int max_bin_len: - Limits max length of bin. (default: 2**31-1) - - :param int max_array_len: - Limits max length of array. (default: 2**31-1) - - :param int max_map_len: - Limits max length of map. (default: 2**31-1) - - - example of streaming deserialize from file-like object:: - - unpacker = Unpacker(file_like, raw=False) - for o in unpacker: - process(o) - - example of streaming deserialize from socket:: - - unpacker = Unpacker(raw=False) - while True: - buf = sock.recv(1024**2) - if not buf: - break - unpacker.feed(buf) - for o in unpacker: - process(o) - """ - - def __init__(self, file_like=None, read_size=0, use_list=True, raw=True, - object_hook=None, object_pairs_hook=None, list_hook=None, - encoding=None, unicode_errors=None, max_buffer_size=0, - ext_hook=ExtType, - max_str_len=2147483647, # 2**32-1 - max_bin_len=2147483647, - max_array_len=2147483647, - max_map_len=2147483647, - max_ext_len=2147483647): - - if encoding is not None: - warnings.warn( - "encoding is deprecated, Use raw=False instead.", - PendingDeprecationWarning) - - if unicode_errors is None: - unicode_errors = 'strict' - - if file_like is None: - self._feeding = True - else: - if not callable(file_like.read): - raise TypeError("`file_like.read` must be callable") - self.file_like = file_like - self._feeding = False - - #: array of bytes fed. - self._buffer = bytearray() - # Some very old pythons don't support `struct.unpack_from()` with a - # `bytearray`. So we wrap it in a `buffer()` there. - if sys.version_info < (2, 7, 6): - self._buffer_view = buffer(self._buffer) - else: - self._buffer_view = self._buffer - #: Which position we currently reads - self._buff_i = 0 - - # When Unpacker is used as an iterable, between the calls to next(), - # the buffer is not "consumed" completely, for efficiency sake. - # Instead, it is done sloppily. To make sure we raise BufferFull at - # the correct moments, we have to keep track of how sloppy we were. - # Furthermore, when the buffer is incomplete (that is: in the case - # we raise an OutOfData) we need to rollback the buffer to the correct - # state, which _buf_checkpoint records. - self._buf_checkpoint = 0 - - self._max_buffer_size = max_buffer_size or 2**31-1 - if read_size > self._max_buffer_size: - raise ValueError("read_size must be smaller than max_buffer_size") - self._read_size = read_size or min(self._max_buffer_size, 16*1024) - self._raw = bool(raw) - self._encoding = encoding - self._unicode_errors = unicode_errors - self._use_list = use_list - self._list_hook = list_hook - self._object_hook = object_hook - self._object_pairs_hook = object_pairs_hook - self._ext_hook = ext_hook - self._max_str_len = max_str_len - self._max_bin_len = max_bin_len - self._max_array_len = max_array_len - self._max_map_len = max_map_len - self._max_ext_len = max_ext_len - self._stream_offset = 0 - - if list_hook is not None and not callable(list_hook): - raise TypeError('`list_hook` is not callable') - if object_hook is not None and not callable(object_hook): - raise TypeError('`object_hook` is not callable') - if object_pairs_hook is not None and not callable(object_pairs_hook): - raise TypeError('`object_pairs_hook` is not callable') - if object_hook is not None and object_pairs_hook is not None: - raise TypeError("object_pairs_hook and object_hook are mutually " - "exclusive") - if not callable(ext_hook): - raise TypeError("`ext_hook` is not callable") - - def feed(self, next_bytes): - assert self._feeding - view = _get_data_from_buffer(next_bytes) - if (len(self._buffer) - self._buff_i + len(view) > self._max_buffer_size): - raise BufferFull - - # Strip buffer before checkpoint before reading file. - if self._buf_checkpoint > 0: - del self._buffer[:self._buf_checkpoint] - self._buff_i -= self._buf_checkpoint - self._buf_checkpoint = 0 - - self._buffer += view - - def _consume(self): - """ Gets rid of the used parts of the buffer. """ - self._stream_offset += self._buff_i - self._buf_checkpoint - self._buf_checkpoint = self._buff_i - - def _got_extradata(self): - return self._buff_i < len(self._buffer) - - def _get_extradata(self): - return self._buffer[self._buff_i:] - - def read_bytes(self, n): - return self._read(n) - - def _read(self, n): - # (int) -> bytearray - self._reserve(n) - i = self._buff_i - self._buff_i = i+n - return self._buffer[i:i+n] - - def _reserve(self, n): - remain_bytes = len(self._buffer) - self._buff_i - n - - # Fast path: buffer has n bytes already - if remain_bytes >= 0: - return - - if self._feeding: - self._buff_i = self._buf_checkpoint - raise OutOfData - - # Strip buffer before checkpoint before reading file. - if self._buf_checkpoint > 0: - del self._buffer[:self._buf_checkpoint] - self._buff_i -= self._buf_checkpoint - self._buf_checkpoint = 0 - - # Read from file - remain_bytes = -remain_bytes - while remain_bytes > 0: - to_read_bytes = max(self._read_size, remain_bytes) - read_data = self.file_like.read(to_read_bytes) - if not read_data: - break - assert isinstance(read_data, bytes) - self._buffer += read_data - remain_bytes -= len(read_data) - - if len(self._buffer) < n + self._buff_i: - self._buff_i = 0 # rollback - raise OutOfData - - def _read_header(self, execute=EX_CONSTRUCT): - typ = TYPE_IMMEDIATE - n = 0 - obj = None - self._reserve(1) - b = self._buffer[self._buff_i] - self._buff_i += 1 - if b & 0b10000000 == 0: - obj = b - elif b & 0b11100000 == 0b11100000: - obj = -1 - (b ^ 0xff) - elif b & 0b11100000 == 0b10100000: - n = b & 0b00011111 - typ = TYPE_RAW - if n > self._max_str_len: - raise UnpackValueError("%s exceeds max_str_len(%s)", n, self._max_str_len) - obj = self._read(n) - elif b & 0b11110000 == 0b10010000: - n = b & 0b00001111 - typ = TYPE_ARRAY - if n > self._max_array_len: - raise UnpackValueError("%s exceeds max_array_len(%s)", n, self._max_array_len) - elif b & 0b11110000 == 0b10000000: - n = b & 0b00001111 - typ = TYPE_MAP - if n > self._max_map_len: - raise UnpackValueError("%s exceeds max_map_len(%s)", n, self._max_map_len) - elif b == 0xc0: - obj = None - elif b == 0xc2: - obj = False - elif b == 0xc3: - obj = True - elif b == 0xc4: - typ = TYPE_BIN - self._reserve(1) - n = self._buffer[self._buff_i] - self._buff_i += 1 - if n > self._max_bin_len: - raise UnpackValueError("%s exceeds max_bin_len(%s)" % (n, self._max_bin_len)) - obj = self._read(n) - elif b == 0xc5: - typ = TYPE_BIN - self._reserve(2) - n = struct.unpack_from(">H", self._buffer_view, self._buff_i)[0] - self._buff_i += 2 - if n > self._max_bin_len: - raise UnpackValueError("%s exceeds max_bin_len(%s)" % (n, self._max_bin_len)) - obj = self._read(n) - elif b == 0xc6: - typ = TYPE_BIN - self._reserve(4) - n = struct.unpack_from(">I", self._buffer_view, self._buff_i)[0] - self._buff_i += 4 - if n > self._max_bin_len: - raise UnpackValueError("%s exceeds max_bin_len(%s)" % (n, self._max_bin_len)) - obj = self._read(n) - elif b == 0xc7: # ext 8 - typ = TYPE_EXT - self._reserve(2) - L, n = struct.unpack_from('Bb', self._buffer_view, self._buff_i) - self._buff_i += 2 - if L > self._max_ext_len: - raise UnpackValueError("%s exceeds max_ext_len(%s)" % (L, self._max_ext_len)) - obj = self._read(L) - elif b == 0xc8: # ext 16 - typ = TYPE_EXT - self._reserve(3) - L, n = struct.unpack_from('>Hb', self._buffer_view, self._buff_i) - self._buff_i += 3 - if L > self._max_ext_len: - raise UnpackValueError("%s exceeds max_ext_len(%s)" % (L, self._max_ext_len)) - obj = self._read(L) - elif b == 0xc9: # ext 32 - typ = TYPE_EXT - self._reserve(5) - L, n = struct.unpack_from('>Ib', self._buffer_view, self._buff_i) - self._buff_i += 5 - if L > self._max_ext_len: - raise UnpackValueError("%s exceeds max_ext_len(%s)" % (L, self._max_ext_len)) - obj = self._read(L) - elif b == 0xca: - self._reserve(4) - obj = struct.unpack_from(">f", self._buffer_view, self._buff_i)[0] - self._buff_i += 4 - elif b == 0xcb: - self._reserve(8) - obj = struct.unpack_from(">d", self._buffer_view, self._buff_i)[0] - self._buff_i += 8 - elif b == 0xcc: - self._reserve(1) - obj = self._buffer[self._buff_i] - self._buff_i += 1 - elif b == 0xcd: - self._reserve(2) - obj = struct.unpack_from(">H", self._buffer_view, self._buff_i)[0] - self._buff_i += 2 - elif b == 0xce: - self._reserve(4) - obj = struct.unpack_from(">I", self._buffer_view, self._buff_i)[0] - self._buff_i += 4 - elif b == 0xcf: - self._reserve(8) - obj = struct.unpack_from(">Q", self._buffer_view, self._buff_i)[0] - self._buff_i += 8 - elif b == 0xd0: - self._reserve(1) - obj = struct.unpack_from("b", self._buffer_view, self._buff_i)[0] - self._buff_i += 1 - elif b == 0xd1: - self._reserve(2) - obj = struct.unpack_from(">h", self._buffer_view, self._buff_i)[0] - self._buff_i += 2 - elif b == 0xd2: - self._reserve(4) - obj = struct.unpack_from(">i", self._buffer_view, self._buff_i)[0] - self._buff_i += 4 - elif b == 0xd3: - self._reserve(8) - obj = struct.unpack_from(">q", self._buffer_view, self._buff_i)[0] - self._buff_i += 8 - elif b == 0xd4: # fixext 1 - typ = TYPE_EXT - if self._max_ext_len < 1: - raise UnpackValueError("%s exceeds max_ext_len(%s)" % (1, self._max_ext_len)) - self._reserve(2) - n, obj = struct.unpack_from("b1s", self._buffer_view, self._buff_i) - self._buff_i += 2 - elif b == 0xd5: # fixext 2 - typ = TYPE_EXT - if self._max_ext_len < 2: - raise UnpackValueError("%s exceeds max_ext_len(%s)" % (2, self._max_ext_len)) - self._reserve(3) - n, obj = struct.unpack_from("b2s", self._buffer_view, self._buff_i) - self._buff_i += 3 - elif b == 0xd6: # fixext 4 - typ = TYPE_EXT - if self._max_ext_len < 4: - raise UnpackValueError("%s exceeds max_ext_len(%s)" % (4, self._max_ext_len)) - self._reserve(5) - n, obj = struct.unpack_from("b4s", self._buffer_view, self._buff_i) - self._buff_i += 5 - elif b == 0xd7: # fixext 8 - typ = TYPE_EXT - if self._max_ext_len < 8: - raise UnpackValueError("%s exceeds max_ext_len(%s)" % (8, self._max_ext_len)) - self._reserve(9) - n, obj = struct.unpack_from("b8s", self._buffer_view, self._buff_i) - self._buff_i += 9 - elif b == 0xd8: # fixext 16 - typ = TYPE_EXT - if self._max_ext_len < 16: - raise UnpackValueError("%s exceeds max_ext_len(%s)" % (16, self._max_ext_len)) - self._reserve(17) - n, obj = struct.unpack_from("b16s", self._buffer_view, self._buff_i) - self._buff_i += 17 - elif b == 0xd9: - typ = TYPE_RAW - self._reserve(1) - n = self._buffer[self._buff_i] - self._buff_i += 1 - if n > self._max_str_len: - raise UnpackValueError("%s exceeds max_str_len(%s)", n, self._max_str_len) - obj = self._read(n) - elif b == 0xda: - typ = TYPE_RAW - self._reserve(2) - n, = struct.unpack_from(">H", self._buffer_view, self._buff_i) - self._buff_i += 2 - if n > self._max_str_len: - raise UnpackValueError("%s exceeds max_str_len(%s)", n, self._max_str_len) - obj = self._read(n) - elif b == 0xdb: - typ = TYPE_RAW - self._reserve(4) - n, = struct.unpack_from(">I", self._buffer_view, self._buff_i) - self._buff_i += 4 - if n > self._max_str_len: - raise UnpackValueError("%s exceeds max_str_len(%s)", n, self._max_str_len) - obj = self._read(n) - elif b == 0xdc: - typ = TYPE_ARRAY - self._reserve(2) - n, = struct.unpack_from(">H", self._buffer_view, self._buff_i) - self._buff_i += 2 - if n > self._max_array_len: - raise UnpackValueError("%s exceeds max_array_len(%s)", n, self._max_array_len) - elif b == 0xdd: - typ = TYPE_ARRAY - self._reserve(4) - n, = struct.unpack_from(">I", self._buffer_view, self._buff_i) - self._buff_i += 4 - if n > self._max_array_len: - raise UnpackValueError("%s exceeds max_array_len(%s)", n, self._max_array_len) - elif b == 0xde: - self._reserve(2) - n, = struct.unpack_from(">H", self._buffer_view, self._buff_i) - self._buff_i += 2 - if n > self._max_map_len: - raise UnpackValueError("%s exceeds max_map_len(%s)", n, self._max_map_len) - typ = TYPE_MAP - elif b == 0xdf: - self._reserve(4) - n, = struct.unpack_from(">I", self._buffer_view, self._buff_i) - self._buff_i += 4 - if n > self._max_map_len: - raise UnpackValueError("%s exceeds max_map_len(%s)", n, self._max_map_len) - typ = TYPE_MAP - else: - raise UnpackValueError("Unknown header: 0x%x" % b) - return typ, n, obj - - def _unpack(self, execute=EX_CONSTRUCT): - typ, n, obj = self._read_header(execute) - - if execute == EX_READ_ARRAY_HEADER: - if typ != TYPE_ARRAY: - raise UnpackValueError("Expected array") - return n - if execute == EX_READ_MAP_HEADER: - if typ != TYPE_MAP: - raise UnpackValueError("Expected map") - return n - # TODO should we eliminate the recursion? - if typ == TYPE_ARRAY: - if execute == EX_SKIP: - for i in xrange(n): - # TODO check whether we need to call `list_hook` - self._unpack(EX_SKIP) - return - ret = newlist_hint(n) - for i in xrange(n): - ret.append(self._unpack(EX_CONSTRUCT)) - if self._list_hook is not None: - ret = self._list_hook(ret) - # TODO is the interaction between `list_hook` and `use_list` ok? - return ret if self._use_list else tuple(ret) - if typ == TYPE_MAP: - if execute == EX_SKIP: - for i in xrange(n): - # TODO check whether we need to call hooks - self._unpack(EX_SKIP) - self._unpack(EX_SKIP) - return - if self._object_pairs_hook is not None: - ret = self._object_pairs_hook( - (self._unpack(EX_CONSTRUCT), - self._unpack(EX_CONSTRUCT)) - for _ in xrange(n)) - else: - ret = {} - for _ in xrange(n): - key = self._unpack(EX_CONSTRUCT) - ret[key] = self._unpack(EX_CONSTRUCT) - if self._object_hook is not None: - ret = self._object_hook(ret) - return ret - if execute == EX_SKIP: - return - if typ == TYPE_RAW: - if self._encoding is not None: - obj = obj.decode(self._encoding, self._unicode_errors) - elif self._raw: - obj = bytes(obj) - else: - obj = obj.decode('utf_8') - return obj - if typ == TYPE_EXT: - return self._ext_hook(n, bytes(obj)) - if typ == TYPE_BIN: - return bytes(obj) - assert typ == TYPE_IMMEDIATE - return obj - - def __iter__(self): - return self - - def __next__(self): - try: - ret = self._unpack(EX_CONSTRUCT) - self._consume() - return ret - except OutOfData: - self._consume() - raise StopIteration - - next = __next__ - - def skip(self, write_bytes=None): - self._unpack(EX_SKIP) - if write_bytes is not None: - warnings.warn("`write_bytes` option is deprecated. Use `.tell()` instead.", DeprecationWarning) - write_bytes(self._buffer[self._buf_checkpoint:self._buff_i]) - self._consume() - - def unpack(self, write_bytes=None): - ret = self._unpack(EX_CONSTRUCT) - if write_bytes is not None: - warnings.warn("`write_bytes` option is deprecated. Use `.tell()` instead.", DeprecationWarning) - write_bytes(self._buffer[self._buf_checkpoint:self._buff_i]) - self._consume() - return ret - - def read_array_header(self, write_bytes=None): - ret = self._unpack(EX_READ_ARRAY_HEADER) - if write_bytes is not None: - warnings.warn("`write_bytes` option is deprecated. Use `.tell()` instead.", DeprecationWarning) - write_bytes(self._buffer[self._buf_checkpoint:self._buff_i]) - self._consume() - return ret - - def read_map_header(self, write_bytes=None): - ret = self._unpack(EX_READ_MAP_HEADER) - if write_bytes is not None: - warnings.warn("`write_bytes` option is deprecated. Use `.tell()` instead.", DeprecationWarning) - write_bytes(self._buffer[self._buf_checkpoint:self._buff_i]) - self._consume() - return ret - - def tell(self): - return self._stream_offset - - -class Packer(object): - """ - MessagePack Packer - - usage: - - packer = Packer() - astream.write(packer.pack(a)) - astream.write(packer.pack(b)) - - Packer's constructor has some keyword arguments: - - :param callable default: - Convert user type to builtin type that Packer supports. - See also simplejson's document. - - :param bool use_single_float: - Use single precision float type for float. (default: False) - - :param bool autoreset: - Reset buffer after each pack and return its content as `bytes`. (default: True). - If set this to false, use `bytes()` to get content and `.reset()` to clear buffer. - - :param bool use_bin_type: - Use bin type introduced in msgpack spec 2.0 for bytes. - It also enables str8 type for unicode. - - :param bool strict_types: - If set to true, types will be checked to be exact. Derived classes - from serializeable types will not be serialized and will be - treated as unsupported type and forwarded to default. - Additionally tuples will not be serialized as lists. - This is useful when trying to implement accurate serialization - for python types. - - :param str encoding: - (deprecated) Convert unicode to bytes with this encoding. (default: 'utf-8') - - :param str unicode_errors: - Error handler for encoding unicode. (default: 'strict') - """ - def __init__(self, default=None, encoding=None, unicode_errors=None, - use_single_float=False, autoreset=True, use_bin_type=False, - strict_types=False): - if encoding is None: - encoding = 'utf_8' - else: - warnings.warn( - "encoding is deprecated, Use raw=False instead.", - PendingDeprecationWarning) - - if unicode_errors is None: - unicode_errors = 'strict' - - self._strict_types = strict_types - self._use_float = use_single_float - self._autoreset = autoreset - self._use_bin_type = use_bin_type - self._encoding = encoding - self._unicode_errors = unicode_errors - self._buffer = StringIO() - if default is not None: - if not callable(default): - raise TypeError("default must be callable") - self._default = default - - def _pack(self, obj, nest_limit=DEFAULT_RECURSE_LIMIT, - check=isinstance, check_type_strict=_check_type_strict): - default_used = False - if self._strict_types: - check = check_type_strict - list_types = list - else: - list_types = (list, tuple) - while True: - if nest_limit < 0: - raise PackValueError("recursion limit exceeded") - if obj is None: - return self._buffer.write(b"\xc0") - if check(obj, bool): - if obj: - return self._buffer.write(b"\xc3") - return self._buffer.write(b"\xc2") - if check(obj, int_types): - if 0 <= obj < 0x80: - return self._buffer.write(struct.pack("B", obj)) - if -0x20 <= obj < 0: - return self._buffer.write(struct.pack("b", obj)) - if 0x80 <= obj <= 0xff: - return self._buffer.write(struct.pack("BB", 0xcc, obj)) - if -0x80 <= obj < 0: - return self._buffer.write(struct.pack(">Bb", 0xd0, obj)) - if 0xff < obj <= 0xffff: - return self._buffer.write(struct.pack(">BH", 0xcd, obj)) - if -0x8000 <= obj < -0x80: - return self._buffer.write(struct.pack(">Bh", 0xd1, obj)) - if 0xffff < obj <= 0xffffffff: - return self._buffer.write(struct.pack(">BI", 0xce, obj)) - if -0x80000000 <= obj < -0x8000: - return self._buffer.write(struct.pack(">Bi", 0xd2, obj)) - if 0xffffffff < obj <= 0xffffffffffffffff: - return self._buffer.write(struct.pack(">BQ", 0xcf, obj)) - if -0x8000000000000000 <= obj < -0x80000000: - return self._buffer.write(struct.pack(">Bq", 0xd3, obj)) - if not default_used and self._default is not None: - obj = self._default(obj) - default_used = True - continue - raise PackOverflowError("Integer value out of range") - if check(obj, (bytes, bytearray)): - n = len(obj) - if n >= 2**32: - raise PackValueError("%s is too large" % type(obj).__name__) - self._pack_bin_header(n) - return self._buffer.write(obj) - if check(obj, Unicode): - if self._encoding is None: - raise TypeError( - "Can't encode unicode string: " - "no encoding is specified") - obj = obj.encode(self._encoding, self._unicode_errors) - n = len(obj) - if n >= 2**32: - raise PackValueError("String is too large") - self._pack_raw_header(n) - return self._buffer.write(obj) - if check(obj, memoryview): - n = len(obj) * obj.itemsize - if n >= 2**32: - raise PackValueError("Memoryview is too large") - self._pack_bin_header(n) - return self._buffer.write(obj) - if check(obj, float): - if self._use_float: - return self._buffer.write(struct.pack(">Bf", 0xca, obj)) - return self._buffer.write(struct.pack(">Bd", 0xcb, obj)) - if check(obj, ExtType): - code = obj.code - data = obj.data - assert isinstance(code, int) - assert isinstance(data, bytes) - L = len(data) - if L == 1: - self._buffer.write(b'\xd4') - elif L == 2: - self._buffer.write(b'\xd5') - elif L == 4: - self._buffer.write(b'\xd6') - elif L == 8: - self._buffer.write(b'\xd7') - elif L == 16: - self._buffer.write(b'\xd8') - elif L <= 0xff: - self._buffer.write(struct.pack(">BB", 0xc7, L)) - elif L <= 0xffff: - self._buffer.write(struct.pack(">BH", 0xc8, L)) - else: - self._buffer.write(struct.pack(">BI", 0xc9, L)) - self._buffer.write(struct.pack("b", code)) - self._buffer.write(data) - return - if check(obj, list_types): - n = len(obj) - self._pack_array_header(n) - for i in xrange(n): - self._pack(obj[i], nest_limit - 1) - return - if check(obj, dict): - return self._pack_map_pairs(len(obj), dict_iteritems(obj), - nest_limit - 1) - if not default_used and self._default is not None: - obj = self._default(obj) - default_used = 1 - continue - raise TypeError("Cannot serialize %r" % (obj, )) - - def pack(self, obj): - try: - self._pack(obj) - except: - self._buffer = StringIO() # force reset - raise - ret = self._buffer.getvalue() - if self._autoreset: - self._buffer = StringIO() - elif USING_STRINGBUILDER: - self._buffer = StringIO(ret) - return ret - - def pack_map_pairs(self, pairs): - self._pack_map_pairs(len(pairs), pairs) - ret = self._buffer.getvalue() - if self._autoreset: - self._buffer = StringIO() - elif USING_STRINGBUILDER: - self._buffer = StringIO(ret) - return ret - - def pack_array_header(self, n): - if n >= 2**32: - raise PackValueError - self._pack_array_header(n) - ret = self._buffer.getvalue() - if self._autoreset: - self._buffer = StringIO() - elif USING_STRINGBUILDER: - self._buffer = StringIO(ret) - return ret - - def pack_map_header(self, n): - if n >= 2**32: - raise PackValueError - self._pack_map_header(n) - ret = self._buffer.getvalue() - if self._autoreset: - self._buffer = StringIO() - elif USING_STRINGBUILDER: - self._buffer = StringIO(ret) - return ret - - def pack_ext_type(self, typecode, data): - if not isinstance(typecode, int): - raise TypeError("typecode must have int type.") - if not 0 <= typecode <= 127: - raise ValueError("typecode should be 0-127") - if not isinstance(data, bytes): - raise TypeError("data must have bytes type") - L = len(data) - if L > 0xffffffff: - raise PackValueError("Too large data") - if L == 1: - self._buffer.write(b'\xd4') - elif L == 2: - self._buffer.write(b'\xd5') - elif L == 4: - self._buffer.write(b'\xd6') - elif L == 8: - self._buffer.write(b'\xd7') - elif L == 16: - self._buffer.write(b'\xd8') - elif L <= 0xff: - self._buffer.write(b'\xc7' + struct.pack('B', L)) - elif L <= 0xffff: - self._buffer.write(b'\xc8' + struct.pack('>H', L)) - else: - self._buffer.write(b'\xc9' + struct.pack('>I', L)) - self._buffer.write(struct.pack('B', typecode)) - self._buffer.write(data) - - def _pack_array_header(self, n): - if n <= 0x0f: - return self._buffer.write(struct.pack('B', 0x90 + n)) - if n <= 0xffff: - return self._buffer.write(struct.pack(">BH", 0xdc, n)) - if n <= 0xffffffff: - return self._buffer.write(struct.pack(">BI", 0xdd, n)) - raise PackValueError("Array is too large") - - def _pack_map_header(self, n): - if n <= 0x0f: - return self._buffer.write(struct.pack('B', 0x80 + n)) - if n <= 0xffff: - return self._buffer.write(struct.pack(">BH", 0xde, n)) - if n <= 0xffffffff: - return self._buffer.write(struct.pack(">BI", 0xdf, n)) - raise PackValueError("Dict is too large") - - def _pack_map_pairs(self, n, pairs, nest_limit=DEFAULT_RECURSE_LIMIT): - self._pack_map_header(n) - for (k, v) in pairs: - self._pack(k, nest_limit - 1) - self._pack(v, nest_limit - 1) - - def _pack_raw_header(self, n): - if n <= 0x1f: - self._buffer.write(struct.pack('B', 0xa0 + n)) - elif self._use_bin_type and n <= 0xff: - self._buffer.write(struct.pack('>BB', 0xd9, n)) - elif n <= 0xffff: - self._buffer.write(struct.pack(">BH", 0xda, n)) - elif n <= 0xffffffff: - self._buffer.write(struct.pack(">BI", 0xdb, n)) - else: - raise PackValueError('Raw is too large') - - def _pack_bin_header(self, n): - if not self._use_bin_type: - return self._pack_raw_header(n) - elif n <= 0xff: - return self._buffer.write(struct.pack('>BB', 0xc4, n)) - elif n <= 0xffff: - return self._buffer.write(struct.pack(">BH", 0xc5, n)) - elif n <= 0xffffffff: - return self._buffer.write(struct.pack(">BI", 0xc6, n)) - else: - raise PackValueError('Bin is too large') - - def bytes(self): - return self._buffer.getvalue() - - def reset(self): - self._buffer = StringIO() diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/msgpack/fallback.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/msgpack/fallback.pyc deleted file mode 100644 index 4d217a5176bfdd9d93462850e887d64b8e9ab8f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32803 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 D{u5N% diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/packaging/__about__.py b/venv/lib/python2.7/site-packages/pip/_vendor/packaging/__about__.py deleted file mode 100644 index 7481c9e..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/packaging/__about__.py +++ /dev/null @@ -1,27 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. -from __future__ import absolute_import, division, print_function - -__all__ = [ - "__title__", - "__summary__", - "__uri__", - "__version__", - "__author__", - "__email__", - "__license__", - "__copyright__", -] - -__title__ = "packaging" -__summary__ = "Core utilities for Python packages" -__uri__ = "https://github.com/pypa/packaging" - -__version__ = "19.0" - -__author__ = "Donald Stufft and individual contributors" -__email__ = "donald@stufft.io" - -__license__ = "BSD or Apache License, Version 2.0" -__copyright__ = "Copyright 2014-2019 %s" % __author__ diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/packaging/__about__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/packaging/__about__.pyc deleted file mode 100644 index 9eeefe60887224f0c9be7f972fa8b508e07d800f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 841 zcmYjPU2oGc6uoJ-t{-bRK-v=z1_`MM+O%V;C_-qkJp!6i#6u($+}KU6C3f&fS@*_o z<_~b4mTh)??0fIY_4TpCzrD_@Km8vW>{<)w^Pd42jSGff00lr9KoUUNfTRIs2uTP5 zYXA#@?E%{d)&zC{tOcwMc?%MBb|6827ZMB|LW0pABuMB((gt<}Ne9?5Bwb*SfVbf! zIRy3?=7T4=t?;!BLIit+Ko>?8&hk{0mD1Mw5}8;FBb2m#G%78mO_xq)*1Ov1N>eLr z!Ex%=mT_fC^#<*O+ICvp#nxQ=RA_hV7<G1~G@9E)yriPIBNrm$()h%^nw+U>qeZ^5 zJAOs8Ynlt0o97t6P?{5GMIo%<hAfpPR~yVO$(F~Bd4{x=wUv1nMY*smw-{xrjH*pV zqx)og$ePSXWAhRhmrBxtk-2rtr6p7{BBU3DIa-hm70_bgtkT9DBb(Lib5pZNLe+(R znqLwu<|FQ~;^g!8P_N1NtrX-GcRIm;FaDp7oQ@}FLxdT5VZILh*>`F!opl=Zh|vXc z;GyB8Tb*fv(#8HNV}FEr-$T=bkH`KhV=r^;r61sU0QD1$@N(DG@@P$Uv{VJd3ZvVb zX!Axd<nQar^p_k@_1QFgYi?%jR*$jeRrD>YL^TxBSgc@ZCtvdP%Dd{3uDN7N-^&}N nDP1UscQ~px_4|5XD&`9Q!53`^!qYGe9`<(F46rw_dkp>ob_LHG diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/packaging/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/packaging/__init__.py deleted file mode 100644 index a0cf67d..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/packaging/__init__.py +++ /dev/null @@ -1,26 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. -from __future__ import absolute_import, division, print_function - -from .__about__ import ( - __author__, - __copyright__, - __email__, - __license__, - __summary__, - __title__, - __uri__, - __version__, -) - -__all__ = [ - "__title__", - "__summary__", - "__uri__", - "__version__", - "__author__", - "__email__", - "__license__", - "__copyright__", -] diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/packaging/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/packaging/__init__.pyc deleted file mode 100644 index 9c484442415446079e09ee09c9188b8953309b61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 663 zcmYjO?QWbf5FFq>xw};A?>+!hm6E8{sjZ@_FVL!@{bi|geV8LwY(tEpclnoR&I@!+ zPS+S1*zxS{tVy0W>D$MP-z83KLGQ1BB6J7(kaS1TfQi5&m>4XENx%|BGKNf`Coog6 zDa;IP1~Uhn!z{oSFiWr{ObV95tiV<<Yp^wCP9Ud{GsrpQ0&)qNLatC#+6HospV@|* ztKcY02>dGovFjS$`-&^mHqQHCRH{LBs<Hlpg4QYP`M$TMCrU*`WkKXq0?tM6ZyU$C z54AZjoA&5bed~!?j!b2Q(iE-6NUO54U3HGT-WcJIXSG*ehu!(8?wvX-hsp&{oEM>c z5d=l(Py`=En5UQqm<5;+e9waYlg)kadq;%}qELh(ia6{(dlb8-C&$lKLhg%FW23R< zx!cK|&@@*@YW#=pp2D2YY!JT62jTL4qa|6-9}fBPz1!Kpch}o{d$n~Rw&lm}@JT+n zD_V7%|H@m{UMkyps(k6Mzt#LlpvH#}m6eUlTT$MLTG=}1Tv<h~-?hi_uicnN_PY8K Q{CBSj-o&5RN%Zpi2e?s<UjP6A diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/packaging/_compat.py b/venv/lib/python2.7/site-packages/pip/_vendor/packaging/_compat.py deleted file mode 100644 index 25da473..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/packaging/_compat.py +++ /dev/null @@ -1,31 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. -from __future__ import absolute_import, division, print_function - -import sys - - -PY2 = sys.version_info[0] == 2 -PY3 = sys.version_info[0] == 3 - -# flake8: noqa - -if PY3: - string_types = (str,) -else: - string_types = (basestring,) - - -def with_metaclass(meta, *bases): - """ - Create a base class with a metaclass. - """ - # This requires a bit of explanation: the basic idea is to make a dummy - # metaclass for one level of class instantiation that replaces itself with - # the actual metaclass. - class metaclass(meta): - def __new__(cls, name, this_bases, d): - return meta(name, bases, d) - - return type.__new__(metaclass, "temporary_class", (), {}) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/packaging/_compat.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/packaging/_compat.pyc deleted file mode 100644 index 9b8f44e8f385cf66ed54846dc600443fef5c3cc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1404 zcmc&!T~8D-6utAoF1sR{;EPJ)K2Bm__)wyWF(y7s$lwc`m@>?Cm$LI^+g(_K4+bOt zU;lvjbXMRW&`fV{@7%WM^q!gE@8kaKpR3<8S~Q=>Psbja89O;Y9u-8TM?;TFpN2k_ z0SyE4@Xn_qq+v)hq_ZVtKhFc2a8~DjD0HDN$u8+*lFKyW-Fj5@NcI<gzC^!>hL5o2 zVbtNH74Sp>8~cP!dSdEgYNb$RQ)_FNIhL!LGODiZDo+}%Dl10QDzhBgSKy(rJoDJV zS>oOWv$yOptv?<PzahF|$H&RPiLQx`e)wdG&OEx}Xh3-gFxMdi!xkoH(;smAtYvED zARU~fMh>zfHD++G>?ub|X;T;2beXotYi?s1Ph0~=ABbMCBbonwI0QI+-N|7D23g4F ze_z9*ryO7oSImUyDxm9t5h8UzVnY#<ZNMfgjK!o%8A2b?Q)L7|8;krr0uT#wZ4k*o z>-I4X&tksb8Iz4?sg6f=kxOmj%Zqrvt52%)$@bp&YHLrw*~{LUi}(4Z-r_cH;;(U| znhjMMn-;}}-TpEb2MD<?X0pm_9XDw<Nyn-h$0DoCCbgT*+;;g;Au4$;#5%hM2+3>p zfZFprW+Q~-BScx}(}Jf7=(Y5*B0*|`%YQg32}<yiyW`ODoSdzMj8i=qP9=AUU7_r} zku4Lfb@*E*nBL{yv3r;r;j@F@#jUcRfhN>L-B)3>!sDVoqp6*0)Ccbph%RxO10gdv z7O6AV6o0xxRioPJ_TXq|G48t2SnU#dWVHy~l5zXDszortzoNY%b{??m?g#aumE}j= Uh{0{G`zyhkw-$E16~7n!15R~D6aWAK diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/packaging/_structures.py b/venv/lib/python2.7/site-packages/pip/_vendor/packaging/_structures.py deleted file mode 100644 index 68dcca6..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/packaging/_structures.py +++ /dev/null @@ -1,68 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. -from __future__ import absolute_import, division, print_function - - -class Infinity(object): - def __repr__(self): - return "Infinity" - - def __hash__(self): - return hash(repr(self)) - - def __lt__(self, other): - return False - - def __le__(self, other): - return False - - def __eq__(self, other): - return isinstance(other, self.__class__) - - def __ne__(self, other): - return not isinstance(other, self.__class__) - - def __gt__(self, other): - return True - - def __ge__(self, other): - return True - - def __neg__(self): - return NegativeInfinity - - -Infinity = Infinity() - - -class NegativeInfinity(object): - def __repr__(self): - return "-Infinity" - - def __hash__(self): - return hash(repr(self)) - - def __lt__(self, other): - return True - - def __le__(self, other): - return True - - def __eq__(self, other): - return isinstance(other, self.__class__) - - def __ne__(self, other): - return not isinstance(other, self.__class__) - - def __gt__(self, other): - return False - - def __ge__(self, other): - return False - - def __neg__(self): - return Infinity - - -NegativeInfinity = NegativeInfinity() diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/packaging/_structures.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/packaging/_structures.pyc deleted file mode 100644 index bb8a9843d67efb48c85f657eb250150c3bb6e40e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5013 zcmds*T~8B16o$|Cix$CeF)@;OXA=Sok>E$v5KT<HkeDeqG|_R{oh}R8ZP}StAlw-J z$NmA&JMEU*KohQ5D4pT#Ow&Ejo-^mXY4Pv;?9#8>-+UUriu`}`heP^18v(x^iiz3| zH63afs9B(Pk(xzvf&!@$wHykH^oQs-(N42Wstk*bpp<QwN81%r6}w%bphAuM4BsNc zee1ZZxx<sUt2=SeC>gc8oz$2ruLV&*(orWdxA~%*Mv0NFUg8@pVgGZ|ijv42`)u2n z!}A9)?69HO9d?r71$)mtFp9+f!zc~?AGnMacFwxooPn2EsZuawjT!}2Ys`{p)NB0h zKJJx`kGN-v7x*TPdV!5C0kS#|s^e1zyIRGq!4lTB;mKvJzGsx%_fogji362t_vFYu zev$4bKM&S64wKc5bbZ5rrH@_*C+RA`!mhjRcBAfclxX9{@v>R_63VYwvP1S&5_D3x z>-h&>7$u=AwMl!v>7`1qbdT+`lQLD^R7yNY4UfqgA;EQvbe9eG(l~U=fp+k2Sez{j zX`%K!y=M)4pWPH-%?~FWl=2q)lyL$V1A!TZjyW?n8?Z8Oe)3|iEUINPSnHTQmF9u2 z!p=w;8!2%-F2g2}z-L%u7MDB*)79nWkVr{+kDZw$n#{^mo0a>Vm4#8{5LE*lt{XTU ziLVS`rSxM@YbkR}tq!GpIE@;QgmZM9dM-;?V2gQ7NQK-oCLGzv?BHZ%r=CL;lkK!O zb_{ctuOXknCzqrWh-Pl%6mpyv$A}Q0Y+P6`(JQu8=$WXmvc{aRb^z5OWuihUpRqa2 z!a6#`uq7s5o6&6nk+R(hdNE%LRDFRyDezG-hY6BJ09o9}^Z?T%p3cgswXUp|TKNHB z4gV@mt@!_+K&{E6Zqg{%%cBJ1i-Ca3i>R>KfY@e5EISyJ?dc-XB+%sqLX)f0VH135 zj0-&lV_I>}X&JNUbmfMypxmsT!!ns~<HF#&=mJ|t*Qdc<XVqi-!^?B%rXHz$YIED> z-rNutbnACxELjPk8W)_md{u1djm<L*D`dn1F9?Y2>nU3xOP+)2eA%*Pe>xfpv{nzl xXs|%z&yzs#1R9n>gYE3@E8kcZWTj4CbeR>JZwJ!yz5Pw7%HBRLE-cn~`~#MOmd*eG diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/packaging/markers.py b/venv/lib/python2.7/site-packages/pip/_vendor/packaging/markers.py deleted file mode 100644 index 5482476..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/packaging/markers.py +++ /dev/null @@ -1,296 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. -from __future__ import absolute_import, division, print_function - -import operator -import os -import platform -import sys - -from pip._vendor.pyparsing import ParseException, ParseResults, stringStart, stringEnd -from pip._vendor.pyparsing import ZeroOrMore, Group, Forward, QuotedString -from pip._vendor.pyparsing import Literal as L # noqa - -from ._compat import string_types -from .specifiers import Specifier, InvalidSpecifier - - -__all__ = [ - "InvalidMarker", - "UndefinedComparison", - "UndefinedEnvironmentName", - "Marker", - "default_environment", -] - - -class InvalidMarker(ValueError): - """ - An invalid marker was found, users should refer to PEP 508. - """ - - -class UndefinedComparison(ValueError): - """ - An invalid operation was attempted on a value that doesn't support it. - """ - - -class UndefinedEnvironmentName(ValueError): - """ - A name was attempted to be used that does not exist inside of the - environment. - """ - - -class Node(object): - def __init__(self, value): - self.value = value - - def __str__(self): - return str(self.value) - - def __repr__(self): - return "<{0}({1!r})>".format(self.__class__.__name__, str(self)) - - def serialize(self): - raise NotImplementedError - - -class Variable(Node): - def serialize(self): - return str(self) - - -class Value(Node): - def serialize(self): - return '"{0}"'.format(self) - - -class Op(Node): - def serialize(self): - return str(self) - - -VARIABLE = ( - L("implementation_version") - | L("platform_python_implementation") - | L("implementation_name") - | L("python_full_version") - | L("platform_release") - | L("platform_version") - | L("platform_machine") - | L("platform_system") - | L("python_version") - | L("sys_platform") - | L("os_name") - | L("os.name") - | L("sys.platform") # PEP-345 - | L("platform.version") # PEP-345 - | L("platform.machine") # PEP-345 - | L("platform.python_implementation") # PEP-345 - | L("python_implementation") # PEP-345 - | L("extra") # undocumented setuptools legacy -) -ALIASES = { - "os.name": "os_name", - "sys.platform": "sys_platform", - "platform.version": "platform_version", - "platform.machine": "platform_machine", - "platform.python_implementation": "platform_python_implementation", - "python_implementation": "platform_python_implementation", -} -VARIABLE.setParseAction(lambda s, l, t: Variable(ALIASES.get(t[0], t[0]))) - -VERSION_CMP = ( - L("===") | L("==") | L(">=") | L("<=") | L("!=") | L("~=") | L(">") | L("<") -) - -MARKER_OP = VERSION_CMP | L("not in") | L("in") -MARKER_OP.setParseAction(lambda s, l, t: Op(t[0])) - -MARKER_VALUE = QuotedString("'") | QuotedString('"') -MARKER_VALUE.setParseAction(lambda s, l, t: Value(t[0])) - -BOOLOP = L("and") | L("or") - -MARKER_VAR = VARIABLE | MARKER_VALUE - -MARKER_ITEM = Group(MARKER_VAR + MARKER_OP + MARKER_VAR) -MARKER_ITEM.setParseAction(lambda s, l, t: tuple(t[0])) - -LPAREN = L("(").suppress() -RPAREN = L(")").suppress() - -MARKER_EXPR = Forward() -MARKER_ATOM = MARKER_ITEM | Group(LPAREN + MARKER_EXPR + RPAREN) -MARKER_EXPR << MARKER_ATOM + ZeroOrMore(BOOLOP + MARKER_EXPR) - -MARKER = stringStart + MARKER_EXPR + stringEnd - - -def _coerce_parse_result(results): - if isinstance(results, ParseResults): - return [_coerce_parse_result(i) for i in results] - else: - return results - - -def _format_marker(marker, first=True): - assert isinstance(marker, (list, tuple, string_types)) - - # Sometimes we have a structure like [[...]] which is a single item list - # where the single item is itself it's own list. In that case we want skip - # the rest of this function so that we don't get extraneous () on the - # outside. - if ( - isinstance(marker, list) - and len(marker) == 1 - and isinstance(marker[0], (list, tuple)) - ): - return _format_marker(marker[0]) - - if isinstance(marker, list): - inner = (_format_marker(m, first=False) for m in marker) - if first: - return " ".join(inner) - else: - return "(" + " ".join(inner) + ")" - elif isinstance(marker, tuple): - return " ".join([m.serialize() for m in marker]) - else: - return marker - - -_operators = { - "in": lambda lhs, rhs: lhs in rhs, - "not in": lambda lhs, rhs: lhs not in rhs, - "<": operator.lt, - "<=": operator.le, - "==": operator.eq, - "!=": operator.ne, - ">=": operator.ge, - ">": operator.gt, -} - - -def _eval_op(lhs, op, rhs): - try: - spec = Specifier("".join([op.serialize(), rhs])) - except InvalidSpecifier: - pass - else: - return spec.contains(lhs) - - oper = _operators.get(op.serialize()) - if oper is None: - raise UndefinedComparison( - "Undefined {0!r} on {1!r} and {2!r}.".format(op, lhs, rhs) - ) - - return oper(lhs, rhs) - - -_undefined = object() - - -def _get_env(environment, name): - value = environment.get(name, _undefined) - - if value is _undefined: - raise UndefinedEnvironmentName( - "{0!r} does not exist in evaluation environment.".format(name) - ) - - return value - - -def _evaluate_markers(markers, environment): - groups = [[]] - - for marker in markers: - assert isinstance(marker, (list, tuple, string_types)) - - if isinstance(marker, list): - groups[-1].append(_evaluate_markers(marker, environment)) - elif isinstance(marker, tuple): - lhs, op, rhs = marker - - if isinstance(lhs, Variable): - lhs_value = _get_env(environment, lhs.value) - rhs_value = rhs.value - else: - lhs_value = lhs.value - rhs_value = _get_env(environment, rhs.value) - - groups[-1].append(_eval_op(lhs_value, op, rhs_value)) - else: - assert marker in ["and", "or"] - if marker == "or": - groups.append([]) - - return any(all(item) for item in groups) - - -def format_full_version(info): - version = "{0.major}.{0.minor}.{0.micro}".format(info) - kind = info.releaselevel - if kind != "final": - version += kind[0] + str(info.serial) - return version - - -def default_environment(): - if hasattr(sys, "implementation"): - iver = format_full_version(sys.implementation.version) - implementation_name = sys.implementation.name - else: - iver = "0" - implementation_name = "" - - return { - "implementation_name": implementation_name, - "implementation_version": iver, - "os_name": os.name, - "platform_machine": platform.machine(), - "platform_release": platform.release(), - "platform_system": platform.system(), - "platform_version": platform.version(), - "python_full_version": platform.python_version(), - "platform_python_implementation": platform.python_implementation(), - "python_version": platform.python_version()[:3], - "sys_platform": sys.platform, - } - - -class Marker(object): - def __init__(self, marker): - try: - self._markers = _coerce_parse_result(MARKER.parseString(marker)) - except ParseException as e: - err_str = "Invalid marker: {0!r}, parse error at {1!r}".format( - marker, marker[e.loc : e.loc + 8] - ) - raise InvalidMarker(err_str) - - def __str__(self): - return _format_marker(self._markers) - - def __repr__(self): - return "<Marker({0!r})>".format(str(self)) - - def evaluate(self, environment=None): - """Evaluate a marker. - - Return the boolean from evaluating the given marker against the - environment. environment is an optional argument to override all or - part of the determined environment. - - The environment is determined from the current Python process. - """ - current_environment = default_environment() - if environment is not None: - current_environment.update(environment) - - return _evaluate_markers(self._markers, current_environment) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/packaging/markers.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/packaging/markers.pyc deleted file mode 100644 index 682a7bfe622c60461296111e0b930c3ec8a98845..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13362 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 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/packaging/requirements.py b/venv/lib/python2.7/site-packages/pip/_vendor/packaging/requirements.py deleted file mode 100644 index dbc5f11..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/packaging/requirements.py +++ /dev/null @@ -1,138 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. -from __future__ import absolute_import, division, print_function - -import string -import re - -from pip._vendor.pyparsing import stringStart, stringEnd, originalTextFor, ParseException -from pip._vendor.pyparsing import ZeroOrMore, Word, Optional, Regex, Combine -from pip._vendor.pyparsing import Literal as L # noqa -from pip._vendor.six.moves.urllib import parse as urlparse - -from .markers import MARKER_EXPR, Marker -from .specifiers import LegacySpecifier, Specifier, SpecifierSet - - -class InvalidRequirement(ValueError): - """ - An invalid requirement was found, users should refer to PEP 508. - """ - - -ALPHANUM = Word(string.ascii_letters + string.digits) - -LBRACKET = L("[").suppress() -RBRACKET = L("]").suppress() -LPAREN = L("(").suppress() -RPAREN = L(")").suppress() -COMMA = L(",").suppress() -SEMICOLON = L(";").suppress() -AT = L("@").suppress() - -PUNCTUATION = Word("-_.") -IDENTIFIER_END = ALPHANUM | (ZeroOrMore(PUNCTUATION) + ALPHANUM) -IDENTIFIER = Combine(ALPHANUM + ZeroOrMore(IDENTIFIER_END)) - -NAME = IDENTIFIER("name") -EXTRA = IDENTIFIER - -URI = Regex(r"[^ ]+")("url") -URL = AT + URI - -EXTRAS_LIST = EXTRA + ZeroOrMore(COMMA + EXTRA) -EXTRAS = (LBRACKET + Optional(EXTRAS_LIST) + RBRACKET)("extras") - -VERSION_PEP440 = Regex(Specifier._regex_str, re.VERBOSE | re.IGNORECASE) -VERSION_LEGACY = Regex(LegacySpecifier._regex_str, re.VERBOSE | re.IGNORECASE) - -VERSION_ONE = VERSION_PEP440 ^ VERSION_LEGACY -VERSION_MANY = Combine( - VERSION_ONE + ZeroOrMore(COMMA + VERSION_ONE), joinString=",", adjacent=False -)("_raw_spec") -_VERSION_SPEC = Optional(((LPAREN + VERSION_MANY + RPAREN) | VERSION_MANY)) -_VERSION_SPEC.setParseAction(lambda s, l, t: t._raw_spec or "") - -VERSION_SPEC = originalTextFor(_VERSION_SPEC)("specifier") -VERSION_SPEC.setParseAction(lambda s, l, t: t[1]) - -MARKER_EXPR = originalTextFor(MARKER_EXPR())("marker") -MARKER_EXPR.setParseAction( - lambda s, l, t: Marker(s[t._original_start : t._original_end]) -) -MARKER_SEPARATOR = SEMICOLON -MARKER = MARKER_SEPARATOR + MARKER_EXPR - -VERSION_AND_MARKER = VERSION_SPEC + Optional(MARKER) -URL_AND_MARKER = URL + Optional(MARKER) - -NAMED_REQUIREMENT = NAME + Optional(EXTRAS) + (URL_AND_MARKER | VERSION_AND_MARKER) - -REQUIREMENT = stringStart + NAMED_REQUIREMENT + stringEnd -# pyparsing isn't thread safe during initialization, so we do it eagerly, see -# issue #104 -REQUIREMENT.parseString("x[]") - - -class Requirement(object): - """Parse a requirement. - - Parse a given requirement string into its parts, such as name, specifier, - URL, and extras. Raises InvalidRequirement on a badly-formed requirement - string. - """ - - # TODO: Can we test whether something is contained within a requirement? - # If so how do we do that? Do we need to test against the _name_ of - # the thing as well as the version? What about the markers? - # TODO: Can we normalize the name and extra name? - - def __init__(self, requirement_string): - try: - req = REQUIREMENT.parseString(requirement_string) - except ParseException as e: - raise InvalidRequirement( - 'Parse error at "{0!r}": {1}'.format( - requirement_string[e.loc : e.loc + 8], e.msg - ) - ) - - self.name = req.name - if req.url: - parsed_url = urlparse.urlparse(req.url) - if parsed_url.scheme == "file": - if urlparse.urlunparse(parsed_url) != req.url: - raise InvalidRequirement("Invalid URL given") - elif not (parsed_url.scheme and parsed_url.netloc) or ( - not parsed_url.scheme and not parsed_url.netloc - ): - raise InvalidRequirement("Invalid URL: {0}".format(req.url)) - self.url = req.url - else: - self.url = None - self.extras = set(req.extras.asList() if req.extras else []) - self.specifier = SpecifierSet(req.specifier) - self.marker = req.marker if req.marker else None - - def __str__(self): - parts = [self.name] - - if self.extras: - parts.append("[{0}]".format(",".join(sorted(self.extras)))) - - if self.specifier: - parts.append(str(self.specifier)) - - if self.url: - parts.append("@ {0}".format(self.url)) - if self.marker: - parts.append(" ") - - if self.marker: - parts.append("; {0}".format(self.marker)) - - return "".join(parts) - - def __repr__(self): - return "<Requirement({0!r})>".format(str(self)) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/packaging/requirements.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/packaging/requirements.pyc deleted file mode 100644 index c8de8babc9133281df447004d328fa53d431038e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5695 zcmd5=TXz%55w4MJ*%H2h4Hg&gGQhHki!WqZ?g3;YSZ8h7X_;LZ4m%lZ+GfPeNX(23 z?7~CBzU;r)Kan4hbCN%h=lqL2>}$TNmTYm7lUI;ErLO9#>gw*gjq?8<FJ1ie#Iq*# zJ_UT=`;$fKcAm(`zeOQYWRYW0lp`lcQJ$PUSv;4caEP2C;lp^CoM9Q~DJ)PlLe2<9 zqvVWIR3xWJQHh+AksK0^1LPc_XpEdOipI$qr)Ywl35q7knKXRE!gr9ILk2HUI7QJk zIfsFdkUvV{5sGHWnW3mmPT5e46dtAM7&*r%I!?}UicXMo0&^wOv$SoIe}H}_dQbGk z`Hb`!=^<);F7PCk-(#~j=|kj?5yq`k%;=mJ%J=}~j8G;9C|?L=a)5GHC<g~9Ukc^W z0Og!erUob#w#lDnigTVcj5$F1Jfj$wmz)cvC;Q|JOct9jlD<g(VUfDTV`q-^1o=mp z;?D?uo-~xtQ`uP{jcMqGL35&@>@1STHpfXXic)=s%6?hoF0&?moLavlJxr~y1YV(~ z_i%}?W$xJjoV!XI(^skLToaoC&63y5lKxTh50Zb3^mVM0^N-7FH^c~><_#+Avv_V` zC7i`g(l@Dfi~JLEeHK}|$Ryt1tVrG_eOov_8|1*=aob?}T$pA^&j{1WJ*IQy{GK%a zXK*xkSP37)9cC{(cS+;4_VIh9alXJW%e)4DmzK&-mGlVdD(oGF)Dr0>YAus*GneI` zB7I+c@ARJU)i{J2l{1LBfa9-{2goJ?ysfkyb~Eh;QKy|`*(hj!up6X7JI*G6bdn&> z-0g1M%s{GFhFJ0dK$>A@r;&M(D(>O6*cZL+B-jaJFWl6xvj<Sjsy4hN)wS16-C<Rg zVb)XvaCFjMPuALr&RF~R?Zg*5)`iatGv-u!2dYLeT5d;ML98nl#zI&PGM#v#Auw-; z7Yca3l4B+|cde?vttq$mctd5Jd)B<<g--SlVpZ>W%{PsXZU)<dPGn2_*cc@Cu!hdE zDG*lTT`vrLrC)Y~L`OQ#nxM*u*Iwf6#{1UTB76ccN2(!arhfpvWaCqf?ZD`<lYK?@ zD=)RT+uhi|WOq}Yq;~qe-3@*4Z0p3%+V)0m!~S~l`n)JH+u*x%-Pnt?>&n5pZq)X> zA)|b7uIsm(u3N#7_CeYOx`1om^)kJ%>m>`@?a;@P3qQVIc=J`V6~B6M`RdDf@oIAA zYV&&f`iB2wvWU-4XJK=p6LjW+IL*8;oXak+?YJ9ElE>ZEvENP>I$raI2WQw>7}#Js z-+7~^u`(ZI%C}U=XMAc;1wIp45qMtUC4sjD-b>kk=iGVm7v6Bn*Z%Ye``N{er@Bcf zmkf_dyj0Gj)eho@xUBe==eN8jZcOgkO}tlbimPw3Fh6X`GT+}g25)oJf>R+=S_mSx zwVnZx+@w0gBbE`<Qh}ks>{B>o+3oGni?)34&NY~s;vo~UeP`d>Ht$Wg&8~!PW5dUK zJ2v6Ova(rq79;f~gL6#7W57prCpO|H9<xIZ@<@VwZ+o0wWP4={aD{Kp-CA<PIXZ>( zX~MH^_Q(lRvYFdYXD&P)`HsC}p9VMoq|f9Itd%p7uzCITnIy#jo3_qFWH4>P5q?Jg z%5xpz0a~%V42C(Q@wujd1CR`FdxM#5z9bo{KeH1cD-6!trj8&9BB=#gY9o1P=_Nbu zHlN!_f*jqz`mTCOv^`R*muxTgZ4==0w(^2hr}lqmWV;>1o-NN0-^^{dlSp$4-OJaa z%ot!2X_F&>a|wHoxXKPv!JBFJmKOZP;u8BVN8iVHX(-FlixMT9WW7V5io}CcY7H^d z+dQ>~dk`m9KE;Frp^1U`Uo46(ddyj6gk8`D#CVjFf`zzj6?-VJ1a0UTOMKcda+Lg) z1Gja6iI_D~FY=W9M!dQZq5b7=6fgAz+kcnA7>%X>>XF94&RRk138K-$LSh5d_DnRf zF)9|0Qe5N$#@3D!ia9e+QgXpEgBBW3qBu`G(*7{pBxQ$$P5MoyObI$oi6c_e%-_>F z&4WgT551nA05tBRlcb&4US^;EY4KF@?(|Ljr_1jG&P|f|w}Viphk*62-G*D(;$Z2) z52+Abd{;Tlg4_$J+8-aSsM=bsz9~3dF4d+uD7HZglN1nk884HX61JQ29i=<!b7nfp z>ev`m8_^&VY4bT+0Vz44cjNt;SZAz*gQeaE!Zjn+nX>UMqF%Zhq?zK1s5k)C1pw0~ zu~4eRZRtA(92ohCyD-rOvXmXOxUB2Du;Ek4&2mnz8^l58x=(pCVwIJ*rmac9f^}|a z%qm(_z>We=TZeNetjS!_ItQ%D<+vZ25|#f10X~JYjQD(qP>}FU?s4$7q;9n&SHZ8* zJ(^kL+6G#&kuOlP)ssPs#C(WS34uNb!t&R?Rs?Zgm`3|dEKwZbkPx(9{z^UlnEOXx z8c}AXi+yP@`GsD}z^aW3cWHIg%fMluDGmie@38~R?b?FhVqATJ=}HN}IHZk{aimTM zHA!7&oIQtoALE?p#I-NZW!x`I#Ep%o@d>M2EW{ZQ4wRW&lB@c7b-mZS!qZ)M7lx%r z0mvGIb6mu8j32npG`?qZO?DN2IJ(4DrZM2ejBSaZnCtCzH7VzW+XJPrBAMp=9clCA z1XT?zrq$!K`Gle=(H$JgFEC0PXtE@MD&CSh!eEBMJq8aMd;_p={ztx5H3w_zc+ydT zLZL8HJW-skJOI*rciHY{-30G03M5i|r;0t)II>B5jN`45H;cE9`Q94`UM)ELAulTS z0>vSq*riQ!=O9zOsN&aFCGjIwfnV|@##Xag3<ou)!Rz^`y{prCB-Ak2QrrQmD=fh3 zOrM#m38qTd$XfTBmQ-;)Qe3JeyUPZ@^TMvKafLJGhBbO=GYH%e@0WQ0l8yR!jm}a@ zpVifkZ>sf2Yl5WRPAAc+nOR*@)#Yz%n=+&N2v@SzjjF2EMUyf^K8NM?wY93e0yJuC zE6eMv>vi-pL{(D`Hy+iOHy>3uS3u?+t=vbUTzRm<ug~@SV*EbI)U)bZO_E0K@usRu zYI&qqdf%&3V`Zk{uC6pT#T<j1t4{dco=ce==65x<wBD$hbspB&Rc*Nnlr6zj16H|s z`Mq*w@dMIo?O}EKi7eIUTCW?U9(W<@EZ=T_X02L(Vw(6qrLj?47JcB{;C7%Yzju5f zB|LnSz26cVH5_SmbG`S2g8aZB1-h@aTEFiaUQvzq#2p~9JJfM-_uYYhL@j`-76Igx z+FLE%%p_JmnaC9{yKR11xFe0p4={H&H-?ma+NxLwt%JE4Yc@Yqn8{6{dhh*#<FGXY oSOC40J8T`#%_3!&Q2%Wt@S~8M!gB=OKq<!$YdV^n$dBj$16-r?KL7v# diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/packaging/specifiers.py b/venv/lib/python2.7/site-packages/pip/_vendor/packaging/specifiers.py deleted file mode 100644 index 743576a..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/packaging/specifiers.py +++ /dev/null @@ -1,749 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. -from __future__ import absolute_import, division, print_function - -import abc -import functools -import itertools -import re - -from ._compat import string_types, with_metaclass -from .version import Version, LegacyVersion, parse - - -class InvalidSpecifier(ValueError): - """ - An invalid specifier was found, users should refer to PEP 440. - """ - - -class BaseSpecifier(with_metaclass(abc.ABCMeta, object)): - @abc.abstractmethod - def __str__(self): - """ - Returns the str representation of this Specifier like object. This - should be representative of the Specifier itself. - """ - - @abc.abstractmethod - def __hash__(self): - """ - Returns a hash value for this Specifier like object. - """ - - @abc.abstractmethod - def __eq__(self, other): - """ - Returns a boolean representing whether or not the two Specifier like - objects are equal. - """ - - @abc.abstractmethod - def __ne__(self, other): - """ - Returns a boolean representing whether or not the two Specifier like - objects are not equal. - """ - - @abc.abstractproperty - def prereleases(self): - """ - Returns whether or not pre-releases as a whole are allowed by this - specifier. - """ - - @prereleases.setter - def prereleases(self, value): - """ - Sets whether or not pre-releases as a whole are allowed by this - specifier. - """ - - @abc.abstractmethod - def contains(self, item, prereleases=None): - """ - Determines if the given item is contained within this specifier. - """ - - @abc.abstractmethod - def filter(self, iterable, prereleases=None): - """ - Takes an iterable of items and filters them so that only items which - are contained within this specifier are allowed in it. - """ - - -class _IndividualSpecifier(BaseSpecifier): - - _operators = {} - - def __init__(self, spec="", prereleases=None): - match = self._regex.search(spec) - if not match: - raise InvalidSpecifier("Invalid specifier: '{0}'".format(spec)) - - self._spec = (match.group("operator").strip(), match.group("version").strip()) - - # Store whether or not this Specifier should accept prereleases - self._prereleases = prereleases - - def __repr__(self): - pre = ( - ", prereleases={0!r}".format(self.prereleases) - if self._prereleases is not None - else "" - ) - - return "<{0}({1!r}{2})>".format(self.__class__.__name__, str(self), pre) - - def __str__(self): - return "{0}{1}".format(*self._spec) - - def __hash__(self): - return hash(self._spec) - - def __eq__(self, other): - if isinstance(other, string_types): - try: - other = self.__class__(other) - except InvalidSpecifier: - return NotImplemented - elif not isinstance(other, self.__class__): - return NotImplemented - - return self._spec == other._spec - - def __ne__(self, other): - if isinstance(other, string_types): - try: - other = self.__class__(other) - except InvalidSpecifier: - return NotImplemented - elif not isinstance(other, self.__class__): - return NotImplemented - - return self._spec != other._spec - - def _get_operator(self, op): - return getattr(self, "_compare_{0}".format(self._operators[op])) - - def _coerce_version(self, version): - if not isinstance(version, (LegacyVersion, Version)): - version = parse(version) - return version - - @property - def operator(self): - return self._spec[0] - - @property - def version(self): - return self._spec[1] - - @property - def prereleases(self): - return self._prereleases - - @prereleases.setter - def prereleases(self, value): - self._prereleases = value - - def __contains__(self, item): - return self.contains(item) - - def contains(self, item, prereleases=None): - # Determine if prereleases are to be allowed or not. - if prereleases is None: - prereleases = self.prereleases - - # Normalize item to a Version or LegacyVersion, this allows us to have - # a shortcut for ``"2.0" in Specifier(">=2") - item = self._coerce_version(item) - - # Determine if we should be supporting prereleases in this specifier - # or not, if we do not support prereleases than we can short circuit - # logic if this version is a prereleases. - if item.is_prerelease and not prereleases: - return False - - # Actually do the comparison to determine if this item is contained - # within this Specifier or not. - return self._get_operator(self.operator)(item, self.version) - - def filter(self, iterable, prereleases=None): - yielded = False - found_prereleases = [] - - kw = {"prereleases": prereleases if prereleases is not None else True} - - # Attempt to iterate over all the values in the iterable and if any of - # them match, yield them. - for version in iterable: - parsed_version = self._coerce_version(version) - - if self.contains(parsed_version, **kw): - # If our version is a prerelease, and we were not set to allow - # prereleases, then we'll store it for later incase nothing - # else matches this specifier. - if parsed_version.is_prerelease and not ( - prereleases or self.prereleases - ): - found_prereleases.append(version) - # Either this is not a prerelease, or we should have been - # accepting prereleases from the beginning. - else: - yielded = True - yield version - - # Now that we've iterated over everything, determine if we've yielded - # any values, and if we have not and we have any prereleases stored up - # then we will go ahead and yield the prereleases. - if not yielded and found_prereleases: - for version in found_prereleases: - yield version - - -class LegacySpecifier(_IndividualSpecifier): - - _regex_str = r""" - (?P<operator>(==|!=|<=|>=|<|>)) - \s* - (?P<version> - [^,;\s)]* # Since this is a "legacy" specifier, and the version - # string can be just about anything, we match everything - # except for whitespace, a semi-colon for marker support, - # a closing paren since versions can be enclosed in - # them, and a comma since it's a version separator. - ) - """ - - _regex = re.compile(r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE) - - _operators = { - "==": "equal", - "!=": "not_equal", - "<=": "less_than_equal", - ">=": "greater_than_equal", - "<": "less_than", - ">": "greater_than", - } - - def _coerce_version(self, version): - if not isinstance(version, LegacyVersion): - version = LegacyVersion(str(version)) - return version - - def _compare_equal(self, prospective, spec): - return prospective == self._coerce_version(spec) - - def _compare_not_equal(self, prospective, spec): - return prospective != self._coerce_version(spec) - - def _compare_less_than_equal(self, prospective, spec): - return prospective <= self._coerce_version(spec) - - def _compare_greater_than_equal(self, prospective, spec): - return prospective >= self._coerce_version(spec) - - def _compare_less_than(self, prospective, spec): - return prospective < self._coerce_version(spec) - - def _compare_greater_than(self, prospective, spec): - return prospective > self._coerce_version(spec) - - -def _require_version_compare(fn): - @functools.wraps(fn) - def wrapped(self, prospective, spec): - if not isinstance(prospective, Version): - return False - return fn(self, prospective, spec) - - return wrapped - - -class Specifier(_IndividualSpecifier): - - _regex_str = r""" - (?P<operator>(~=|==|!=|<=|>=|<|>|===)) - (?P<version> - (?: - # The identity operators allow for an escape hatch that will - # do an exact string match of the version you wish to install. - # This will not be parsed by PEP 440 and we cannot determine - # any semantic meaning from it. This operator is discouraged - # but included entirely as an escape hatch. - (?<====) # Only match for the identity operator - \s* - [^\s]* # We just match everything, except for whitespace - # since we are only testing for strict identity. - ) - | - (?: - # The (non)equality operators allow for wild card and local - # versions to be specified so we have to define these two - # operators separately to enable that. - (?<===|!=) # Only match for equals and not equals - - \s* - v? - (?:[0-9]+!)? # epoch - [0-9]+(?:\.[0-9]+)* # release - (?: # pre release - [-_\.]? - (a|b|c|rc|alpha|beta|pre|preview) - [-_\.]? - [0-9]* - )? - (?: # post release - (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) - )? - - # You cannot use a wild card and a dev or local version - # together so group them with a | and make them optional. - (?: - (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release - (?:\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*)? # local - | - \.\* # Wild card syntax of .* - )? - ) - | - (?: - # The compatible operator requires at least two digits in the - # release segment. - (?<=~=) # Only match for the compatible operator - - \s* - v? - (?:[0-9]+!)? # epoch - [0-9]+(?:\.[0-9]+)+ # release (We have a + instead of a *) - (?: # pre release - [-_\.]? - (a|b|c|rc|alpha|beta|pre|preview) - [-_\.]? - [0-9]* - )? - (?: # post release - (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) - )? - (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release - ) - | - (?: - # All other operators only allow a sub set of what the - # (non)equality operators do. Specifically they do not allow - # local versions to be specified nor do they allow the prefix - # matching wild cards. - (?<!==|!=|~=) # We have special cases for these - # operators so we want to make sure they - # don't match here. - - \s* - v? - (?:[0-9]+!)? # epoch - [0-9]+(?:\.[0-9]+)* # release - (?: # pre release - [-_\.]? - (a|b|c|rc|alpha|beta|pre|preview) - [-_\.]? - [0-9]* - )? - (?: # post release - (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) - )? - (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release - ) - ) - """ - - _regex = re.compile(r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE) - - _operators = { - "~=": "compatible", - "==": "equal", - "!=": "not_equal", - "<=": "less_than_equal", - ">=": "greater_than_equal", - "<": "less_than", - ">": "greater_than", - "===": "arbitrary", - } - - @_require_version_compare - def _compare_compatible(self, prospective, spec): - # Compatible releases have an equivalent combination of >= and ==. That - # is that ~=2.2 is equivalent to >=2.2,==2.*. This allows us to - # implement this in terms of the other specifiers instead of - # implementing it ourselves. The only thing we need to do is construct - # the other specifiers. - - # We want everything but the last item in the version, but we want to - # ignore post and dev releases and we want to treat the pre-release as - # it's own separate segment. - prefix = ".".join( - list( - itertools.takewhile( - lambda x: (not x.startswith("post") and not x.startswith("dev")), - _version_split(spec), - ) - )[:-1] - ) - - # Add the prefix notation to the end of our string - prefix += ".*" - - return self._get_operator(">=")(prospective, spec) and self._get_operator("==")( - prospective, prefix - ) - - @_require_version_compare - def _compare_equal(self, prospective, spec): - # We need special logic to handle prefix matching - if spec.endswith(".*"): - # In the case of prefix matching we want to ignore local segment. - prospective = Version(prospective.public) - # Split the spec out by dots, and pretend that there is an implicit - # dot in between a release segment and a pre-release segment. - spec = _version_split(spec[:-2]) # Remove the trailing .* - - # Split the prospective version out by dots, and pretend that there - # is an implicit dot in between a release segment and a pre-release - # segment. - prospective = _version_split(str(prospective)) - - # Shorten the prospective version to be the same length as the spec - # so that we can determine if the specifier is a prefix of the - # prospective version or not. - prospective = prospective[: len(spec)] - - # Pad out our two sides with zeros so that they both equal the same - # length. - spec, prospective = _pad_version(spec, prospective) - else: - # Convert our spec string into a Version - spec = Version(spec) - - # If the specifier does not have a local segment, then we want to - # act as if the prospective version also does not have a local - # segment. - if not spec.local: - prospective = Version(prospective.public) - - return prospective == spec - - @_require_version_compare - def _compare_not_equal(self, prospective, spec): - return not self._compare_equal(prospective, spec) - - @_require_version_compare - def _compare_less_than_equal(self, prospective, spec): - return prospective <= Version(spec) - - @_require_version_compare - def _compare_greater_than_equal(self, prospective, spec): - return prospective >= Version(spec) - - @_require_version_compare - def _compare_less_than(self, prospective, spec): - # Convert our spec to a Version instance, since we'll want to work with - # it as a version. - spec = Version(spec) - - # Check to see if the prospective version is less than the spec - # version. If it's not we can short circuit and just return False now - # instead of doing extra unneeded work. - if not prospective < spec: - return False - - # This special case is here so that, unless the specifier itself - # includes is a pre-release version, that we do not accept pre-release - # versions for the version mentioned in the specifier (e.g. <3.1 should - # not match 3.1.dev0, but should match 3.0.dev0). - if not spec.is_prerelease and prospective.is_prerelease: - if Version(prospective.base_version) == Version(spec.base_version): - return False - - # If we've gotten to here, it means that prospective version is both - # less than the spec version *and* it's not a pre-release of the same - # version in the spec. - return True - - @_require_version_compare - def _compare_greater_than(self, prospective, spec): - # Convert our spec to a Version instance, since we'll want to work with - # it as a version. - spec = Version(spec) - - # Check to see if the prospective version is greater than the spec - # version. If it's not we can short circuit and just return False now - # instead of doing extra unneeded work. - if not prospective > spec: - return False - - # This special case is here so that, unless the specifier itself - # includes is a post-release version, that we do not accept - # post-release versions for the version mentioned in the specifier - # (e.g. >3.1 should not match 3.0.post0, but should match 3.2.post0). - if not spec.is_postrelease and prospective.is_postrelease: - if Version(prospective.base_version) == Version(spec.base_version): - return False - - # Ensure that we do not allow a local version of the version mentioned - # in the specifier, which is technically greater than, to match. - if prospective.local is not None: - if Version(prospective.base_version) == Version(spec.base_version): - return False - - # If we've gotten to here, it means that prospective version is both - # greater than the spec version *and* it's not a pre-release of the - # same version in the spec. - return True - - def _compare_arbitrary(self, prospective, spec): - return str(prospective).lower() == str(spec).lower() - - @property - def prereleases(self): - # If there is an explicit prereleases set for this, then we'll just - # blindly use that. - if self._prereleases is not None: - return self._prereleases - - # Look at all of our specifiers and determine if they are inclusive - # operators, and if they are if they are including an explicit - # prerelease. - operator, version = self._spec - if operator in ["==", ">=", "<=", "~=", "==="]: - # The == specifier can include a trailing .*, if it does we - # want to remove before parsing. - if operator == "==" and version.endswith(".*"): - version = version[:-2] - - # Parse the version, and if it is a pre-release than this - # specifier allows pre-releases. - if parse(version).is_prerelease: - return True - - return False - - @prereleases.setter - def prereleases(self, value): - self._prereleases = value - - -_prefix_regex = re.compile(r"^([0-9]+)((?:a|b|c|rc)[0-9]+)$") - - -def _version_split(version): - result = [] - for item in version.split("."): - match = _prefix_regex.search(item) - if match: - result.extend(match.groups()) - else: - result.append(item) - return result - - -def _pad_version(left, right): - left_split, right_split = [], [] - - # Get the release segment of our versions - left_split.append(list(itertools.takewhile(lambda x: x.isdigit(), left))) - right_split.append(list(itertools.takewhile(lambda x: x.isdigit(), right))) - - # Get the rest of our versions - left_split.append(left[len(left_split[0]) :]) - right_split.append(right[len(right_split[0]) :]) - - # Insert our padding - left_split.insert(1, ["0"] * max(0, len(right_split[0]) - len(left_split[0]))) - right_split.insert(1, ["0"] * max(0, len(left_split[0]) - len(right_split[0]))) - - return (list(itertools.chain(*left_split)), list(itertools.chain(*right_split))) - - -class SpecifierSet(BaseSpecifier): - def __init__(self, specifiers="", prereleases=None): - # Split on , to break each indidivual specifier into it's own item, and - # strip each item to remove leading/trailing whitespace. - specifiers = [s.strip() for s in specifiers.split(",") if s.strip()] - - # Parsed each individual specifier, attempting first to make it a - # Specifier and falling back to a LegacySpecifier. - parsed = set() - for specifier in specifiers: - try: - parsed.add(Specifier(specifier)) - except InvalidSpecifier: - parsed.add(LegacySpecifier(specifier)) - - # Turn our parsed specifiers into a frozen set and save them for later. - self._specs = frozenset(parsed) - - # Store our prereleases value so we can use it later to determine if - # we accept prereleases or not. - self._prereleases = prereleases - - def __repr__(self): - pre = ( - ", prereleases={0!r}".format(self.prereleases) - if self._prereleases is not None - else "" - ) - - return "<SpecifierSet({0!r}{1})>".format(str(self), pre) - - def __str__(self): - return ",".join(sorted(str(s) for s in self._specs)) - - def __hash__(self): - return hash(self._specs) - - def __and__(self, other): - if isinstance(other, string_types): - other = SpecifierSet(other) - elif not isinstance(other, SpecifierSet): - return NotImplemented - - specifier = SpecifierSet() - specifier._specs = frozenset(self._specs | other._specs) - - if self._prereleases is None and other._prereleases is not None: - specifier._prereleases = other._prereleases - elif self._prereleases is not None and other._prereleases is None: - specifier._prereleases = self._prereleases - elif self._prereleases == other._prereleases: - specifier._prereleases = self._prereleases - else: - raise ValueError( - "Cannot combine SpecifierSets with True and False prerelease " - "overrides." - ) - - return specifier - - def __eq__(self, other): - if isinstance(other, string_types): - other = SpecifierSet(other) - elif isinstance(other, _IndividualSpecifier): - other = SpecifierSet(str(other)) - elif not isinstance(other, SpecifierSet): - return NotImplemented - - return self._specs == other._specs - - def __ne__(self, other): - if isinstance(other, string_types): - other = SpecifierSet(other) - elif isinstance(other, _IndividualSpecifier): - other = SpecifierSet(str(other)) - elif not isinstance(other, SpecifierSet): - return NotImplemented - - return self._specs != other._specs - - def __len__(self): - return len(self._specs) - - def __iter__(self): - return iter(self._specs) - - @property - def prereleases(self): - # If we have been given an explicit prerelease modifier, then we'll - # pass that through here. - if self._prereleases is not None: - return self._prereleases - - # If we don't have any specifiers, and we don't have a forced value, - # then we'll just return None since we don't know if this should have - # pre-releases or not. - if not self._specs: - return None - - # Otherwise we'll see if any of the given specifiers accept - # prereleases, if any of them do we'll return True, otherwise False. - return any(s.prereleases for s in self._specs) - - @prereleases.setter - def prereleases(self, value): - self._prereleases = value - - def __contains__(self, item): - return self.contains(item) - - def contains(self, item, prereleases=None): - # Ensure that our item is a Version or LegacyVersion instance. - if not isinstance(item, (LegacyVersion, Version)): - item = parse(item) - - # Determine if we're forcing a prerelease or not, if we're not forcing - # one for this particular filter call, then we'll use whatever the - # SpecifierSet thinks for whether or not we should support prereleases. - if prereleases is None: - prereleases = self.prereleases - - # We can determine if we're going to allow pre-releases by looking to - # see if any of the underlying items supports them. If none of them do - # and this item is a pre-release then we do not allow it and we can - # short circuit that here. - # Note: This means that 1.0.dev1 would not be contained in something - # like >=1.0.devabc however it would be in >=1.0.debabc,>0.0.dev0 - if not prereleases and item.is_prerelease: - return False - - # We simply dispatch to the underlying specs here to make sure that the - # given version is contained within all of them. - # Note: This use of all() here means that an empty set of specifiers - # will always return True, this is an explicit design decision. - return all(s.contains(item, prereleases=prereleases) for s in self._specs) - - def filter(self, iterable, prereleases=None): - # Determine if we're forcing a prerelease or not, if we're not forcing - # one for this particular filter call, then we'll use whatever the - # SpecifierSet thinks for whether or not we should support prereleases. - if prereleases is None: - prereleases = self.prereleases - - # If we have any specifiers, then we want to wrap our iterable in the - # filter method for each one, this will act as a logical AND amongst - # each specifier. - if self._specs: - for spec in self._specs: - iterable = spec.filter(iterable, prereleases=bool(prereleases)) - return iterable - # If we do not have any specifiers, then we need to have a rough filter - # which will filter out any pre-releases, unless there are no final - # releases, and which will filter out LegacyVersion in general. - else: - filtered = [] - found_prereleases = [] - - for item in iterable: - # Ensure that we some kind of Version class for this item. - if not isinstance(item, (LegacyVersion, Version)): - parsed_version = parse(item) - else: - parsed_version = item - - # Filter out any item which is parsed as a LegacyVersion - if isinstance(parsed_version, LegacyVersion): - continue - - # Store any item which is a pre-release for later unless we've - # already found a final version or we are accepting prereleases - if parsed_version.is_prerelease and not prereleases: - if not filtered: - found_prereleases.append(item) - else: - filtered.append(item) - - # If we've found no items except for pre-releases, then we'll go - # ahead and use the pre-releases - if not filtered and found_prereleases and prereleases is None: - return found_prereleases - - return filtered diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/packaging/specifiers.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/packaging/specifiers.pyc deleted file mode 100644 index 3a73f93591af81444dc3ac4caeab2fa144b285d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28139 zcmeHQTW=gkcCMZo4lg1#k|^t9Y3-&ctVmrb$!l<BFG;Os$-7S0w9?dCHYK{ZIo%|i znj5>DB56~`#xmC4WUoj9BnXlq2oUT;lBYZb!D6w$AbH9|5Fiixl$QVj76=j~$maV_ z^<{<}>Vi0)*&rmRrn<Viy3VO{PMve=R5Abap@DP1zJH;t;-3P(zx)kDg;R!7F8&Nv zQL1XFc|%omYCfl`c{QI`2JhumrJ&{uQV;naHQ$rui)y}@<a^b8uX6LsEvQPLs`jh- zepMY%^8;uFr9G;$PgMui{Gh51sreyQ-LK~N<6cpDCADNIw^x0n)I+7-nLnW1KIIK4 zub@^BD({ebn3Ed)X^mm!;`XqV?n_G#D|b+Nhoy8VEqzA0`*|^cM7gEp_JQ>FQRVfj z)nm#%s2&0V$CZ0XYCo&oVac3O?&0KJ&!mr?Bx2^qjsTNBu{xGV5|xlRi($R89(lH3 zZPbG(>O-09-}ghmUW@kQq7nGD$X;5nl_M0*`WOQ>mO~N^A_*hhUbdsHh8Ifp4L@43 zt6t=kD^3{d_w=ITTV5bd4k7<FZ`mntB_%y5X*faXMF)_3y>{QJ`0iZ8EBi~n7o=3c z_g*6vuu~oogh4=>Q`X!V?}cAQGGOB8m73}6R?IMI#@uj1bE&>wbI+UWA^Kv5EA{n? zYX;tu7no7qym{lM`QnS0CZq}7Z{otXYfja(?Px$Qs&#k0!b`$r+ityV+hfS8ED1wg zUIg0iJCS$sz7t$rs#jdR^5T1&7q`9;EY>#eU7lR4U78GDoGf1nH(zq!3ohYjxpDE< z#fIOw;Mc;)sZ=gRm)}^nZ?Z@}_I<DB)`N=;r+m*@2HG#C;Dr;7EsNddkcJ$cVm>0O zuQ{Q&8<!k?!Q~$!qjBlw)G7#H3CV!63Mwu!l9HaJB$t$c8T3>6q@-6$`p8yf546*- zyneMhK$gl%^i!x-R38~q4V;h`g0*zv5XZJ3T`Y5elh3Opf&vO42j+wl!|&lr#*M>o zdC_`M3(aW7GeMph;YQ$vUM+G+z-E03cl^*yv0_&Id!AWeT=mM)gn0}1(xze>S@c>O zxsTdx#A|B9k3z4qq=|=}nAP;aK1b{;?{=O<VyXpJY@4!xl=@iYzJ@v}MiS&Y=86-p znBdiQ4}1j<+8d|o!%axBNSs}O5b}&|6BgV49P%0?WFUSxd~L{W4aF%?8AcZC^@``z zGFkzPnj0$~C?zm~qFOx?s);u0O_W3GOB>Tv7@AJtncmvEQ`tpP?3N%eqTH;r?JhuL z5q+_3Z_Tzxk$WN}uA^cK_x~CaiSx%G(&Dt!H8`wcaygsgFp+tC5aMz>9PXev2)_$~ z2f_?J&=vkblAu!|F-$V`4bL?fw}gMw;YjC|UF64(bPMn9Ltg-00^H>kYmZ@Hw;5}5 zUKH+R(oYv<tsE;7v-8wu4Fd^RQjAd{;Aamyvv4aVj_Y3J1y#QWa`N>wxa>nSG5yG^ znwVJ2P#hiHc1`Mneoapedy^F3t0fvIO12`M>pYG`7mlF`ucB{St~~}<ztfDXTh2Xl zoggQ07QuGV90(!{U31B=0GFbwRL!ssOgWKRuT{3<IvXo~c_l?WCxyo#w}q>LdOzC5 z!5O;yG`gi<-GXvXBpNF>5`@o=QRBC$2U=9ZBSPRTmc`tF`4R<AIfBKpQg<z>Ngdca z$m9^KQ@khD8bQ6`1<{s(8}Vf@J1_*Iqs`W9o<+6DI))^pKgo4WtEZLq3_E%lNzpje zd#H$y{1%N;Ptk~Y!+yO+tIdVVkSexil*<nhChGo=k<scttU#Dfkc2MGSE%?fqhT|P zW>14z6na|AqQ}!z7WI8ztL%8TKem8jFvI%&2qpWJH>g}~^g{0+lFNZa>EADx+W5s? zShgj#idPRN6-vq#BY6IxbO|;vsvVMiN%F%q1~{q_VJZ_Q$_svrinfZ(wo>?7HPp5k z5D)TdJFmh^Dgvkm?HgSVyW~Sd)lfgLRt0R7toG2Hk4y42N_5Fmj?LOdwXHM2g@WC| zch80-l-Od;Y|WR=Gw)w|a7M%j$<2viSkqp-uWjHlGM*5h9eB&$W=w}pP+k!mPOhO- zSDi?dyyc+2-jE!vZJo0zPsIYao2EeNRVGVWM^id=MKo7l$*8(h1TAQ>ZNKJ6w*719 zS4gH-#v!9<9LrtEi>=2wlNgqfr2(Qx7MQ=+uYwU7O&Jc1DMqRW%QdGSz$1VG)#Y%; z^bpB-5EVG?`E=Ac_nkMJ@HYMarIFx)^*qW$N{=aw-`M+?QTF}|55{N4ICvIOXVFHm zPBUR65rvX%i>t%7MMQ~o!Z?Xxs)vFkikEc_>S++$_8s&pqy$v?5u>Ql&gq}17qnAu zl4~^b4fP$8J@3xSV?fdSmmg>_1tDi}OFS`Mq94j+0E*H65M>BqwLnN46w-vWCGtW$ zl4b=anGt9gT3rVhDRj9BE{+L5WO5m~Zy-as3>5*coC;o6Tf+h-ctcA@L)~7xsS2Rh zdjl$%REA*y;<>kLN8%@mlpG%pZ_<M?$Lk(Gjr1OUiNxgW7zs#RV{jPKYgH?I7U|tO z&qM?r=j7RX^m?^X@v3mcc&<h%yDX&AB?g$N44g$mQob@uM&1}UhKxRlrb4d#*<+ak zE5ouy`(_7jtru7(1lo1jr0zu<{|T{4!K!(YG6xb{=nwRE9O4^fn1~*#Lw31dg~!;l zDW*wnGP^Fr=^RCYNN4S>O(x&4Nf;AP^+p%SVhSG{eYTTceiH@ax`n7ph^>G!VQF?a zWof80&`QXgr>PC6EKQAuK2c3Hd{z?;nbe|muzHbX$goCuiH}Y?rV&t}VNBud_u%7} zbpohj@$6(g15Vs6yJ`HBMr4jU9#aRj+GGyuI;m}<YoFkwhdB475OFN^tlD)Dk$RvM z?1G407NRA!=`l)ZlD9;W(jaw*6IfKaA2b1ya38+~5cU(C1z2p*8}%RpGOK|g12yr~ zVP4|XS)LM@ejB|=$gMq0!a!Pnw7^6wxCtiOpPh$En>!E`;$I4F`*&0L46z3}74Rct zb{iR(Y#6P3eJVI6glMP-IkEea$pv!@tOg(ec0}+c)*r-IlfHwB#n^x#CHLy7NRNIW z-k=Qv+5*-Wk;s~xA2!)!Vz<5KR6@_1WG$1)2ojmNwEjc%%7Aqq$KwC^ee@^fM5}Ux z#$ch;bHFGR1j7WG^Gca(a6dr?a}uoVWuyg#rQsOiVxu7syG)zjlMi~-<`NNoec@g8 zK+H0l<AU1<y)rljwT(=V`mUjZ7np~p8GOhl8#Sp=#Ngl>mL2NJlg8Q)_yXGbMfH}k z_JYFSZP@UG!C$i?(#<2xTwmBHZ<Sg<QnxWv3LBFvW;N<%G+)NG45_I9w}N#~hE;oo zUgAwL`#7OGjRuxu#g^Bjcr?9DxwqweSoC!xdMsq!xrru1^ciHiA#@;aELs0{lgY0O z$bgQGzrZIviA2FPFXo;v3>l@|p+diLAa|fpGzNQypdHVSQQ&3XIqOAUikW<lxr<C_ z0$7~oGq;@P2H_cEK6T8QtVRA1Oj~@tb%jaSIp&^2uin5XG?5f@#awBizrR0^-+lPa z_xF?v`~|}DgToSQq2nHQ`{&3};-C9tWVC+{)CvEbr~Oj~7srpn!*P@aScgYiRM(&Y z!ZYW?ODAzGlkm}DL46XTDR9Y6!WD<8lSy|UoothEt|6{uk`6q$)3gImqDtt%I~Y6g z;#d;6@pLQ+o;fVH_A6InN#M7G6OJPh{sUxS>X{z9dUGmKV`s*ur?*F@x2LAJXOM2s zjE|@F?uKX6JfDe`y_vL-OXqjqJ^!V<;rPN?bJU#kVNmJ?1gtDL=BbK=j-1MzZRf?2 z&c*n+v6i;jp8gqSEC3f|%kaiyL4S2Uj7(>-zK*oE#dV71^X7(UikHmv(3mdVvpH|G z>@^};`-Yo7@<N1Vc<7B8dR6~Ixn4o60T;%rPH+$Fzu|g=@ipi7Y|k;vl{$>*Ws{~& z%|sTU$3S6KMR(h)u@=@={Mw!^0U1?|7PMKfR?#JC%a6_whjEkWCtgI~WVS?*jg$mf zyo>RY48BjxL?%nAqEbvxi}MTXt627h*I5cjriIQcUKrX~%cwQonwpMi5iSQFqGE!b zcV~2K>4WfFzzZi6e)AJjJd;{Sc~p|Qo&pmy5vCXI@St6UeB$lUvpi%zDkN$SpKY>^ zF5t3B;h_NP0x3-K_)qv~KOO9#XWA$_oRI(+)f3Tp0Bw_lhKQ6oEYmk4y>MC=7c!Ra ztZ~%oJhU<qrl!3R)jtz<&Xwv3;m%wpZQ!<k6%BO@uw;f5*p!R@1*J~~a7NJG4lp%} z6yTK6wS@Tj(}LZT@^QC=eWDrcW?7~o|JSF5e24K#36XJj_fmK|;Q#)#0K@m(Y;AWj zz%=7h3U40j|IA<>qi;FWmbIT!Rsn73Ct?=_p13pV<Mb;!|JDub+M9DXr1tAynSIl` z@#-scH>^`^OZ07G#rhf(YNXaIlQ)^%WWrUpOukF5Q@%dy8v63L_-L(pu$ViY%NxDv z?*Q~>(V?kFXKR6+t@E@w2{LASIEX)yg}skqU18bJP~VbEZOq5sz|<!|{d$;BkLss0 zJz<zi!W^2y?8!M4Ue#<0$y5aKozgaJ%W4!sGIC3`j^b9xW+R|s>Kf>j)*5mpqhN?? zBMO@YawAYN6n&1hWAFHFKw-U281ac+jx6gGr9?7e1keL~c=}_dHDNCXDv4&QjOU61 z*CVW|JSso6RRu%oiLEM_R0yM(gdGJ7iZ&KPp0x=DT?_^mFU64JCE_G-sYCN|iNI%E z9!bI=5H^9!qsb-0CUAKyxkT6mE{`Xdh@W_tdBjX$+ktx`DIewrfK}`-IGL5eZj<=d z9+=^&<<M%keK5Vf!*s*-bd&kEr^z;U_2sn9%;35Oqs(`);^#+OW?~+~0%6dhm_{&Z zys+#vJOmRXHbI9!ZTOW+o5tKa!>GJX#QG$boHo_sQ0&C2*{ZK2?hK*H2<eaG=rjAK zxo@y1`6`LZg*~V}FpPwZHv))V34;)Z7lTOMB<ihA-(Wz}>T>{T*{mW2m{#0UP)9gi z98sQv&j2~s56kuSz*+X(HjOR9B89nDS%>$?B=Qj7xMebMvlUyrp&Gk7h4GpmH(@xx z$sjU~ARV3EW+-;OyxBZYP<01JAWU)mjGDJ&vw5eDd>-S{#u(n!e$pn}(k3bJ%cwR9 zd4mZZ3F2Th(^khoC)CplYi6ag!R?mU>`jSdwR&w_tctzJ5#-=vxC2*)zEUqc?Fcco z$U$JB8yZpEsNyny58$jg*dBmeuD663NRTwP9+-&uZs{faJ(|)4_M&K0oCA$Vy_!S{ zG8nKGa6YC784eZ<bM~`qz_m>-fRK9i<-o2^v>WmJS9etdR_|Q8@Y2G$k@2g|FZCMr zruf9<j;@Ml?oR0J_*vW<MO?f@A-8Kid9>+!lmR+>KEsN4F4%V`7IycR_r{#<#qIKT zP~LVbjTKyAad;aI@^jz!Hd<+jPw?kaEea@^`$|7xn&Z3Q56F|dP2Yg04wutjNMKDo zcp=8vHc_tO8{>1^==OFn9vA7p?1llI*@fLv^Bsu9Sc+lmlZgQE7D9JGtM|D-K`1_P z54CA0s$;pDdl^9K5|c*iuA;SQ1&wYCu~iZ9s*CFlZntUP!H^&WpzUfs20w-m9cqO% zqq<S)?PIWb_uL)l!h1roDIU|3@v|V}Q4MX|ezZ!Iq}O*R?w%DPm?AIS!a~$0BYGzu zOBbzU)%u2Z_!z}TBu4up&LQ$8Za5Ak1ObUgg!v#c$xql*vH@}9FJlW5CJrKh7gQ<l zLDDQU2B*DT`Jh#(0P<aO1+BO1)o!x;j3moB>10d};2=y<B7q(AoJ{|o<8pu;^K9z~ z#PpU7ZqxVwHM!FSnq)sCIkfY&DIZ>a1apJlD2v*0ckA#y2?M<X<xciTHBGdlXlMo0 zflGc7{D6S_C2RlzH?`-Sz4QjRK9TI=f}+5gd&S!_p{8=al~=T3!xj;Xxc?n0L=93H zEl5kcm*h80Sxf$Ao7O}Rqso*D^sp^sk7%{NnY~4s6HXBY#;IV2;0B>sSqyi}kevgn zuUoVjQGhm}1`{xu3Bq;E;RI(_@AqoXt=G;(vF3`o#+&GvXgP~6rh;=<|3S}fK=^;* z@u?^=J2Cs|36D&Sv{~UAfV(4`a>Wn-!L;=%ogiF<n4Y$-C;5?S>qe5Fnzmj`@-x%c zSCF^9%H(w>zk)<O6i%?{W3NiE73NU{Lrwfs^i46GK-RIAkkKL6die?=5_(TYgy0DH zrX&&)DO?jKzV!YEx1her9K2#!0LCr`__4GrE2rvSQl3V!<aG!OV-#j(J#C^)2NpjB za*lp7E^X`eB=iRD4c0%GTuUzo=fn{<i*8}*9_pz?y+d@1r&ipQhy@O!kh-BRWBZ%h zwS-*fyh?p|`BcTJF1pUlN9a_@-uS=3kBsreS^1iojz?SvI1|j(I?h30rs4x$2L5Bw zH;BZQ#;XXLFBXE~v1PPF>aYqM6+e<-hir33=BAge9$LP40dBaGn0VOqx9Fbti6*XB zseMJnL?adiaUcVQf!ygft8%}GY9Lh|mkH7dR=5-kf@CzgL|ZXp6>(WPO~N@wu#&um z&~y#t;hoe3Z^EU^Z5(<nH>d6*+()*0)Xqr5x>el8J9}05{he>qtG>7^Yog@5*?6G+ z|H7c_y*MNa1oH^FN}#MBm-WSpU$%VQw75PjL|%dREHTIpCymz;SE@|yZT-V|R6A8W z<w}*6fgf@d53?`%Qm&Lg&~vEgK;c+^u&3WRluKRZM39Ig#w}?PkO~uUJ-Ijzd*o_E zmx9YRkiR6j6lkgqa9o5TkqN1S=I-rSMy0>MOJU>E&R;zhY&+IUyBIdESpE1>uyJ`J z9W;mmO`7*G(kIFHa})v$;k*?K9AsEs!aFg{`cb`Q4B~)y@em{g<WEA|M30V@msmi? z{0YA=LOo7|y7eWLb}4;u!SAQUA!i{~80;A|3dLdLIit5{H<Nz{RodXQ@IS>TF)l|i zakt(lj~oNsjmMyvjsbO(Yz$;RWlSyfjMy@?)>xy#L?R8lcs#iF`u7}<!^pIZN1?RG zsGLGYO}3y}?o4YMBz@Tw-$N0nXD3oFk8=pRlQJdzE7dMiW%%Dxe%G5kI02>lFqN}d z57j$A5zH%LPO=?MD+3bK4T3|=<GrE^>ST9lt>o`_L@R&}Ey}OHM0BL7gTSeDi1xrZ z<2scL5e2;<L+W!{O_<h-V5|>L>8lT>6BWKimEZuxYNLGZ^^lGkroN}C_Y89tCPMfU zW=x8<cC0v?EE_@6c~wz@bN_=wCwd`Bxwofe4CYT5L(FHp<w%~QPYfZ0k-_l&Qf;9a z1^_acDmNx!`XmiGhQP9zn`3f|$=8{@#pD!|7n$5)g6Ziou^AS)U0JU%p$aZR&)FDD zu4Ag>U36%G1AP{m;=;~&4MuJZ<Vz<?qdMBTbiDL@f4+1~Ovrb~;?;~X81Tu0%y?XO zx{Ow3GeN3z@?Fc=N?@qXHxs@Wv*7x|47GmD6qw#M(`wr{_)0vx>wWu>ln|N58pH&u zCME>0Z=)a%3$Z|eO51h9u{6+R-v%S};b_yF@~u(S5;FiB^kExFR#rViYl;of6x0Fy z6jwN5Y`qd$LL$UeHhdi$Iod5JNWP*8z-T*y08*s6gL;1<0U$LCdp?iB0P69Vqj@DJ z8f-XV9FZ+_L&!03;9dls1I5HLQQllb4vzqun`($1h=;VOh1Y_cIiJrSMs40g^Ub&L z6dW1QA9~a>DoA{LOSP8fj^TZW@sa+teGbN^ZoZ|F^tl*D>?z4{I~#hJmE_|RY`2^f zl9?@&YLkyRO9oH?7=a6rU!q2`hQ#Cep)Ada<z$sn+69#1q8n#P8Tf8J{_W8KS?{s` z1g)DOIhQ~}g6AeAAxfn#>3NpSYSFP~fw+~m!UQV6=50iXz=tD-ebw0%JHEVv!;6Hw zK`zj!yd`}KN8m57MB>_F5zgPB*kB~J+|buuFt&B{=<~z~ZCqsx<xd%>FfE_RUoo!a z#F9xPrEv5W2~vLYNOx~RVPKO!942u@@{|~TIE=8`M+iOwf9k_wu<r!tIiduyQ*t~i zPl?fo!(fw%oD3765|bVagK(!IwTkT}>B%tIb0TNLV5<q=jx%8pB!xgH<n@^_2e}1> zz{znPV$)Cnr#j=0aDkEL1R%~-@bmSB=VD)}R-c0da?Xor*6-%j+5t{EkaOT)Y-8K} z8XvyCa9v^3+SXCoaHd^U;#;Nky1jNCXD8qw1e~4lG0#rmrZm)npDL|`DsSU+8&Uvw z@f2i)-A5tA3@}4sfq{y>u;<4pN33-wpGP7z$-{{_GLGw7cX_9e$u-`l<VJ|mdmbn_ zlF3PqgbDTTT4F<XrD<Pmatdmwx37^!LU~3<JxOCpAWIh<Cup5R2VWu)i*}iR5qr*t z;CVcX^hCZ?5E)F=5jQe@O(O%ea>SqPh!{=<BJ1^pm7M28^=r?QVHl7&)yzF(a%>Dv zLBSC*;x{1wYn}cybE3@AbJ(=AWP+FY=%i!H!A107mKY|b>^K3YfD*x~i46E3SjCK} z7b1w{oVpHj)_?Irfb|iowhT+ib%YZr#S;q$g~5a=@fbF0LY%bDm14r`C{+&Z#3k!D z@YQ)lh2*oTWv}LKHiDVAi81!C7`uNw<b{z!?CrwACZDj=GC|Vb>3sKP=jH9B*Q(7q z3hXDH4H#D$(?o$Gl-4CCT?Z2)Sh+bew#&3KOG%JQgMY*YVG>Oas$uXPr8_xY79eVf z`qp<L@^Og9WeVH5SpLJx5Ya&EL2QU?cnCt<#x-z+$xd%5|EAp5mvC|=m#kS-wfUyX zxclc#m9ZHem(o;R`9gAu_Z7u)@i$3{Zf#KE&@3<_dV+Jy@Kii;gs%b6S9N?U)-4wq zaM&!L7~zW8EN)|#;4ImO&TxVxUZ##<#sEQ<;e@z6nvR%xh?cDvn0(BHG>{#DC6mfq zJo@)W5Y(IfO)@XjtJrzc7wy}&am=D^FOXWesL4}(_*=;J8^?3cA;-@ltY_to{z92V z&reE8!rzaeq%S6vB&({yHPRXBClQa(D|S-b*SWSO{wrt;$%rRh*Nd0$90m4U#G@V$ zVMlhd>&{LB?1{0dvCNZOnodsojIo++<oKn<D%GD4_P{D<8Gc9#GFv}VlGEbpI!PY0 zD3(-h`xAmmSe|y05-W{M@!bbrAE3cWhurUM|7IKbQih<Tms3KjzV7gIW8)I_B}`K^ z$8_CP3yUX%azYG5qG(^#SJCRierjJ7HTW+K?Nl$Ssaiw*E^=L|c>O_wJt$rUc9Qdp z*0d=PwUJcY>MGTXX#F1hJ%Ef77kNL=QQ`O`pOkSiJQ%89D%bcQC1ZjW_5>b&XD|sx z>$xzQ;6yj(0TN9n5uK(SPn~qkB)Wng{7DK^7TQ93%hQ@^AOpn_1g9N@&1bNo5Zc+d z6;BuX1jdq95~qZ#d(^k(v{{r71~>UU)I4M${^p?ALBaai;DK)7?Qdz`?oTYNoxDve z^9$_DX=KRT&t|-hcJW%g<e_0`K2KcUVu;3J8yW61X6LAB*R_ZOTy-oytJU86NirN@ zdva0Jfem7B%fv1#z+!64${A&;mIsxJo)Rc#+a9#k3U|i{k3;gOgmgbLDhI6zi}r(k zICQBf?yWwQ(o7e|+6NAT1rQThyJM{o*06bA2oF=l!bsxzf=gc(Mya00K70f7!rD2# zHnJ?fFQz!D=^^W0UwEHqCP7=p;Yu)aL9Q{y|B&`bdUjI{dTdeQ5GU3|ip5r#Tz{t4 zmgT4|oZ|!w=<oQ_L4F~);AeD`;eW#DCXBV8u`XR`S<y0jRloyz167%(AWO*{Zq5M* zF@FewkI@;c=LDe!@Pj_dTQmgzbB?y;BSbTWy6ui~lG7sO#A1CYIZXT+HY@8qU*<#j zbXab2n*S-u=PdhD0O=s4>wxjRQNZEg#oQ1HDp$;7?Wb@6>p#P}gN5Tz%V)=^U1nR+ zHRkAf+j(Zw4_L-{FgZ`%`XO__#pD$xg6osaQGj;eF-;HAt1Cng`-sTJXW~Pej`k1W z7n{sW2jz&SXJvn^n6@_l-4*_a5dIT~g=dr{lNOp#)^R59Faf9N)nBc|>abybJZpis zMwp0@BJ1jv{qHkJZkA_Wx%TQCJhGJc_5Xdb23bMuy=%<L^6_2fZZWyfgo_*&o%|L7 z%g9f1of2WfAyfK)W6cnJ*{6S!r^oR(cf>fEKT<q(<;aIeF82={`GqQ#cuLlx{|4|u B0E7Sl diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/packaging/utils.py b/venv/lib/python2.7/site-packages/pip/_vendor/packaging/utils.py deleted file mode 100644 index 8841878..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/packaging/utils.py +++ /dev/null @@ -1,57 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. -from __future__ import absolute_import, division, print_function - -import re - -from .version import InvalidVersion, Version - - -_canonicalize_regex = re.compile(r"[-_.]+") - - -def canonicalize_name(name): - # This is taken from PEP 503. - return _canonicalize_regex.sub("-", name).lower() - - -def canonicalize_version(version): - """ - This is very similar to Version.__str__, but has one subtle differences - with the way it handles the release segment. - """ - - try: - version = Version(version) - except InvalidVersion: - # Legacy versions cannot be normalized - return version - - parts = [] - - # Epoch - if version.epoch != 0: - parts.append("{0}!".format(version.epoch)) - - # Release segment - # NB: This strips trailing '.0's to normalize - parts.append(re.sub(r"(\.0)+$", "", ".".join(str(x) for x in version.release))) - - # Pre-release - if version.pre is not None: - parts.append("".join(str(x) for x in version.pre)) - - # Post-release - if version.post is not None: - parts.append(".post{0}".format(version.post)) - - # Development release - if version.dev is not None: - parts.append(".dev{0}".format(version.dev)) - - # Local version segment - if version.local is not None: - parts.append("+{0}".format(version.local)) - - return "".join(parts) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/packaging/utils.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/packaging/utils.pyc deleted file mode 100644 index 43c48dffcb454fb9eeae50aa3b1a18b85196bae5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2143 zcmd5-Uys{F5TCX4|1Q0jR(+vJ22~Ig&Q75^fmEF;l^2AFkgqyW;ADLECfUSZyStlQ za`YbB>(}b{;hitQ%*Iw*UU@hydp+Kr*`4{#Z^rK5{oe4^t+NEG%fa{4KNx75N%3Zo z0ptuO3~~o14&*LOTwt{3K-Pds15y{#24qdhTQF%s-iApV7;nI$18Ebk(Ygz13*G=s zdXToQut)YMgASe}=<tDygE_z<KG#LIGCUG_Stw&jB^7I-MIp^C{3w->CYr8fVsL6K z7|spIbG!P3T*sM6Pr0%NZJe)U-9q`d!^l4yCS*eoo%)OdzK?<dSTKtDCBU@<3kR+N zeWb0&hO`fNUfxA9N@7_^k>FXEJW_ndH-<LTt8>%DcUD|*H6SC?z(K}2AK)A8pe0HH z#<7kK57w~?rbU*b$HC<$*nXqV<;C*R(F-{`Qjd?4Z}sN8^iqxRnw7!xpcLhyklMsq zc4!{`G>d+wDf>igF4IB<Wt=SInUJ$!Wkja^a%=A3kstU>E)krX;seJ*LLwn%A^8!# z-`*xv2oDBV0KdqOpn*^<d!QZyV+>bLew_haS<nzML~rSWI)#@E7Dx<)u|f6(CZn5S z?7KC@Y0;|KgFIQZE0U0Q2fp8_U%S?b=8!~tu<U|*TW^jOLnBM5okDF?9fL;5vz^gj zwNa<`XzzWGP<6jny~`@+yS3{6zf}9R>T#{wt5y5&sbX26gSZ*Sax&OQVD)PpdLCZS z=R$jUuesWKTI3>&m1hdCBC8)o+Ndb{$~#{fZysx}klZ77W!y`}bjlT%3D<V73t{G- znRD+V-g<)6Wtwqqrxee4tkIOuaxRT;4Q$D2BIci?t4}qheDJ$J`f~UXvyGG`-uelR z#0bl4Dw2=!1A#ufL-{6N*vL-V3rsXs3K@)dq_;Lk?dp;?@ke&o&5c%p?xH78W?b@3 zsgA$E56k`*{Fhk6KJH@!4XK_&YGVJRD2MN&)E$)lvd{+8ZnN&Ed`&V@VTi(bU_+qK zkWy%S883@uZm4_4Wr+>Oiqk^nu`!fd#Y19{ZFGwQn=^e?yt7TQRNO9(k;7IX7wifi zU$sl@q&u>ZF&2gG-qcCUSQ&kzc$$0Y#s|H#@{fK5`ZFA$<+9tX?=+p3d%zwvzQ*x$ zlIq8?)o*&J8sV?YtQ3!;kSs$gnvh@&X}geW%t9Yh5-gNSk(VOlA!Q(>Ey7Q5cn67< eZsMOpbb68(=_=#L<gF&>9yt5XefPlaHva)+-{Z#s diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/packaging/version.py b/venv/lib/python2.7/site-packages/pip/_vendor/packaging/version.py deleted file mode 100644 index 95157a1..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/packaging/version.py +++ /dev/null @@ -1,420 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. -from __future__ import absolute_import, division, print_function - -import collections -import itertools -import re - -from ._structures import Infinity - - -__all__ = ["parse", "Version", "LegacyVersion", "InvalidVersion", "VERSION_PATTERN"] - - -_Version = collections.namedtuple( - "_Version", ["epoch", "release", "dev", "pre", "post", "local"] -) - - -def parse(version): - """ - Parse the given version string and return either a :class:`Version` object - or a :class:`LegacyVersion` object depending on if the given version is - a valid PEP 440 version or a legacy version. - """ - try: - return Version(version) - except InvalidVersion: - return LegacyVersion(version) - - -class InvalidVersion(ValueError): - """ - An invalid version was found, users should refer to PEP 440. - """ - - -class _BaseVersion(object): - def __hash__(self): - return hash(self._key) - - def __lt__(self, other): - return self._compare(other, lambda s, o: s < o) - - def __le__(self, other): - return self._compare(other, lambda s, o: s <= o) - - def __eq__(self, other): - return self._compare(other, lambda s, o: s == o) - - def __ge__(self, other): - return self._compare(other, lambda s, o: s >= o) - - def __gt__(self, other): - return self._compare(other, lambda s, o: s > o) - - def __ne__(self, other): - return self._compare(other, lambda s, o: s != o) - - def _compare(self, other, method): - if not isinstance(other, _BaseVersion): - return NotImplemented - - return method(self._key, other._key) - - -class LegacyVersion(_BaseVersion): - def __init__(self, version): - self._version = str(version) - self._key = _legacy_cmpkey(self._version) - - def __str__(self): - return self._version - - def __repr__(self): - return "<LegacyVersion({0})>".format(repr(str(self))) - - @property - def public(self): - return self._version - - @property - def base_version(self): - return self._version - - @property - def epoch(self): - return -1 - - @property - def release(self): - return None - - @property - def pre(self): - return None - - @property - def post(self): - return None - - @property - def dev(self): - return None - - @property - def local(self): - return None - - @property - def is_prerelease(self): - return False - - @property - def is_postrelease(self): - return False - - @property - def is_devrelease(self): - return False - - -_legacy_version_component_re = re.compile(r"(\d+ | [a-z]+ | \.| -)", re.VERBOSE) - -_legacy_version_replacement_map = { - "pre": "c", - "preview": "c", - "-": "final-", - "rc": "c", - "dev": "@", -} - - -def _parse_version_parts(s): - for part in _legacy_version_component_re.split(s): - part = _legacy_version_replacement_map.get(part, part) - - if not part or part == ".": - continue - - if part[:1] in "0123456789": - # pad for numeric comparison - yield part.zfill(8) - else: - yield "*" + part - - # ensure that alpha/beta/candidate are before final - yield "*final" - - -def _legacy_cmpkey(version): - # We hardcode an epoch of -1 here. A PEP 440 version can only have a epoch - # greater than or equal to 0. This will effectively put the LegacyVersion, - # which uses the defacto standard originally implemented by setuptools, - # as before all PEP 440 versions. - epoch = -1 - - # This scheme is taken from pkg_resources.parse_version setuptools prior to - # it's adoption of the packaging library. - parts = [] - for part in _parse_version_parts(version.lower()): - if part.startswith("*"): - # remove "-" before a prerelease tag - if part < "*final": - while parts and parts[-1] == "*final-": - parts.pop() - - # remove trailing zeros from each series of numeric parts - while parts and parts[-1] == "00000000": - parts.pop() - - parts.append(part) - parts = tuple(parts) - - return epoch, parts - - -# Deliberately not anchored to the start and end of the string, to make it -# easier for 3rd party code to reuse -VERSION_PATTERN = r""" - v? - (?: - (?:(?P<epoch>[0-9]+)!)? # epoch - (?P<release>[0-9]+(?:\.[0-9]+)*) # release segment - (?P<pre> # pre-release - [-_\.]? - (?P<pre_l>(a|b|c|rc|alpha|beta|pre|preview)) - [-_\.]? - (?P<pre_n>[0-9]+)? - )? - (?P<post> # post release - (?:-(?P<post_n1>[0-9]+)) - | - (?: - [-_\.]? - (?P<post_l>post|rev|r) - [-_\.]? - (?P<post_n2>[0-9]+)? - ) - )? - (?P<dev> # dev release - [-_\.]? - (?P<dev_l>dev) - [-_\.]? - (?P<dev_n>[0-9]+)? - )? - ) - (?:\+(?P<local>[a-z0-9]+(?:[-_\.][a-z0-9]+)*))? # local version -""" - - -class Version(_BaseVersion): - - _regex = re.compile(r"^\s*" + VERSION_PATTERN + r"\s*$", re.VERBOSE | re.IGNORECASE) - - def __init__(self, version): - # Validate the version and parse it into pieces - match = self._regex.search(version) - if not match: - raise InvalidVersion("Invalid version: '{0}'".format(version)) - - # Store the parsed out pieces of the version - self._version = _Version( - epoch=int(match.group("epoch")) if match.group("epoch") else 0, - release=tuple(int(i) for i in match.group("release").split(".")), - pre=_parse_letter_version(match.group("pre_l"), match.group("pre_n")), - post=_parse_letter_version( - match.group("post_l"), match.group("post_n1") or match.group("post_n2") - ), - dev=_parse_letter_version(match.group("dev_l"), match.group("dev_n")), - local=_parse_local_version(match.group("local")), - ) - - # Generate a key which will be used for sorting - self._key = _cmpkey( - self._version.epoch, - self._version.release, - self._version.pre, - self._version.post, - self._version.dev, - self._version.local, - ) - - def __repr__(self): - return "<Version({0})>".format(repr(str(self))) - - def __str__(self): - parts = [] - - # Epoch - if self.epoch != 0: - parts.append("{0}!".format(self.epoch)) - - # Release segment - parts.append(".".join(str(x) for x in self.release)) - - # Pre-release - if self.pre is not None: - parts.append("".join(str(x) for x in self.pre)) - - # Post-release - if self.post is not None: - parts.append(".post{0}".format(self.post)) - - # Development release - if self.dev is not None: - parts.append(".dev{0}".format(self.dev)) - - # Local version segment - if self.local is not None: - parts.append("+{0}".format(self.local)) - - return "".join(parts) - - @property - def epoch(self): - return self._version.epoch - - @property - def release(self): - return self._version.release - - @property - def pre(self): - return self._version.pre - - @property - def post(self): - return self._version.post[1] if self._version.post else None - - @property - def dev(self): - return self._version.dev[1] if self._version.dev else None - - @property - def local(self): - if self._version.local: - return ".".join(str(x) for x in self._version.local) - else: - return None - - @property - def public(self): - return str(self).split("+", 1)[0] - - @property - def base_version(self): - parts = [] - - # Epoch - if self.epoch != 0: - parts.append("{0}!".format(self.epoch)) - - # Release segment - parts.append(".".join(str(x) for x in self.release)) - - return "".join(parts) - - @property - def is_prerelease(self): - return self.dev is not None or self.pre is not None - - @property - def is_postrelease(self): - return self.post is not None - - @property - def is_devrelease(self): - return self.dev is not None - - -def _parse_letter_version(letter, number): - if letter: - # We consider there to be an implicit 0 in a pre-release if there is - # not a numeral associated with it. - if number is None: - number = 0 - - # We normalize any letters to their lower case form - letter = letter.lower() - - # We consider some words to be alternate spellings of other words and - # in those cases we want to normalize the spellings to our preferred - # spelling. - if letter == "alpha": - letter = "a" - elif letter == "beta": - letter = "b" - elif letter in ["c", "pre", "preview"]: - letter = "rc" - elif letter in ["rev", "r"]: - letter = "post" - - return letter, int(number) - if not letter and number: - # We assume if we are given a number, but we are not given a letter - # then this is using the implicit post release syntax (e.g. 1.0-1) - letter = "post" - - return letter, int(number) - - -_local_version_separators = re.compile(r"[\._-]") - - -def _parse_local_version(local): - """ - Takes a string like abc.1.twelve and turns it into ("abc", 1, "twelve"). - """ - if local is not None: - return tuple( - part.lower() if not part.isdigit() else int(part) - for part in _local_version_separators.split(local) - ) - - -def _cmpkey(epoch, release, pre, post, dev, local): - # When we compare a release version, we want to compare it with all of the - # trailing zeros removed. So we'll use a reverse the list, drop all the now - # leading zeros until we come to something non zero, then take the rest - # re-reverse it back into the correct order and make it a tuple and use - # that for our sorting key. - release = tuple( - reversed(list(itertools.dropwhile(lambda x: x == 0, reversed(release)))) - ) - - # We need to "trick" the sorting algorithm to put 1.0.dev0 before 1.0a0. - # We'll do this by abusing the pre segment, but we _only_ want to do this - # if there is not a pre or a post segment. If we have one of those then - # the normal sorting rules will handle this case correctly. - if pre is None and post is None and dev is not None: - pre = -Infinity - # Versions without a pre-release (except as noted above) should sort after - # those with one. - elif pre is None: - pre = Infinity - - # Versions without a post segment should sort before those with one. - if post is None: - post = -Infinity - - # Versions without a development segment should sort after those with one. - if dev is None: - dev = Infinity - - if local is None: - # Versions without a local segment should sort before those with one. - local = -Infinity - else: - # Versions with a local segment need that segment parsed to implement - # the sorting rules in PEP440. - # - Alpha numeric segments sort before numeric segments - # - Alpha numeric segments sort lexicographically - # - Numeric segments sort numerically - # - Shorter versions sort before longer versions when the prefixes - # match exactly - local = tuple((i, "") if isinstance(i, int) else (-Infinity, i) for i in local) - - return epoch, release, pre, post, dev, local diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/packaging/version.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/packaging/version.pyc deleted file mode 100644 index a271680467699972f10bff92319c05b29e0bc0c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19025 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 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pep517/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/pep517/__init__.py deleted file mode 100644 index 9c1a098..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/pep517/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -"""Wrappers to build Python packages using PEP 517 hooks -""" - -__version__ = '0.5.0' diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pep517/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/pep517/__init__.pyc deleted file mode 100644 index 0d638fffcd0646b9247133537bdb6ea2d6a6f9b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 308 zcmYL@-AcnS6oAtXbxaf=A(sVN)1s>iBHrv$DNGOsa>$z4h1Mh{X<c{cGy4Lb4#5NG zJO4kEpR?KJ_xW2z{v<;Ci0Us8f{-;bBI}5Vn5>e?SSb*%j$138r@_!or&>YFA#9DN zmRAk0rKg=&x~Ao_q>KE9ZjEXD%pc)smM+rlIf>B?CkOyxDu8f$@OxaUj0Q+BB>(Ul zLuQ@od62B<j=h^!U^CnA*l^`G`m4!{Pn{L+x~Ojb?oRAohEiMh!mP4$rG4OSI}iC& o4ds|RDD+Yb<Cv8eA7ubas{oMNAx!b){f7}<D<8&p{fOiE7on$5jQ{`u diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pep517/_in_process.py b/venv/lib/python2.7/site-packages/pip/_vendor/pep517/_in_process.py deleted file mode 100644 index d6524b6..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/pep517/_in_process.py +++ /dev/null @@ -1,207 +0,0 @@ -"""This is invoked in a subprocess to call the build backend hooks. - -It expects: -- Command line args: hook_name, control_dir -- Environment variable: PEP517_BUILD_BACKEND=entry.point:spec -- control_dir/input.json: - - {"kwargs": {...}} - -Results: -- control_dir/output.json - - {"return_val": ...} -""" -from glob import glob -from importlib import import_module -import os -from os.path import join as pjoin -import re -import shutil -import sys - -# This is run as a script, not a module, so it can't do a relative import -import compat - - -class BackendUnavailable(Exception): - """Raised if we cannot import the backend""" - - -def _build_backend(): - """Find and load the build backend""" - ep = os.environ['PEP517_BUILD_BACKEND'] - mod_path, _, obj_path = ep.partition(':') - try: - obj = import_module(mod_path) - except ImportError: - raise BackendUnavailable - if obj_path: - for path_part in obj_path.split('.'): - obj = getattr(obj, path_part) - return obj - - -def get_requires_for_build_wheel(config_settings): - """Invoke the optional get_requires_for_build_wheel hook - - Returns [] if the hook is not defined. - """ - backend = _build_backend() - try: - hook = backend.get_requires_for_build_wheel - except AttributeError: - return [] - else: - return hook(config_settings) - - -def prepare_metadata_for_build_wheel(metadata_directory, config_settings): - """Invoke optional prepare_metadata_for_build_wheel - - Implements a fallback by building a wheel if the hook isn't defined. - """ - backend = _build_backend() - try: - hook = backend.prepare_metadata_for_build_wheel - except AttributeError: - return _get_wheel_metadata_from_wheel(backend, metadata_directory, - config_settings) - else: - return hook(metadata_directory, config_settings) - - -WHEEL_BUILT_MARKER = 'PEP517_ALREADY_BUILT_WHEEL' - - -def _dist_info_files(whl_zip): - """Identify the .dist-info folder inside a wheel ZipFile.""" - res = [] - for path in whl_zip.namelist(): - m = re.match(r'[^/\\]+-[^/\\]+\.dist-info/', path) - if m: - res.append(path) - if res: - return res - raise Exception("No .dist-info folder found in wheel") - - -def _get_wheel_metadata_from_wheel( - backend, metadata_directory, config_settings): - """Build a wheel and extract the metadata from it. - - Fallback for when the build backend does not - define the 'get_wheel_metadata' hook. - """ - from zipfile import ZipFile - whl_basename = backend.build_wheel(metadata_directory, config_settings) - with open(os.path.join(metadata_directory, WHEEL_BUILT_MARKER), 'wb'): - pass # Touch marker file - - whl_file = os.path.join(metadata_directory, whl_basename) - with ZipFile(whl_file) as zipf: - dist_info = _dist_info_files(zipf) - zipf.extractall(path=metadata_directory, members=dist_info) - return dist_info[0].split('/')[0] - - -def _find_already_built_wheel(metadata_directory): - """Check for a wheel already built during the get_wheel_metadata hook. - """ - if not metadata_directory: - return None - metadata_parent = os.path.dirname(metadata_directory) - if not os.path.isfile(pjoin(metadata_parent, WHEEL_BUILT_MARKER)): - return None - - whl_files = glob(os.path.join(metadata_parent, '*.whl')) - if not whl_files: - print('Found wheel built marker, but no .whl files') - return None - if len(whl_files) > 1: - print('Found multiple .whl files; unspecified behaviour. ' - 'Will call build_wheel.') - return None - - # Exactly one .whl file - return whl_files[0] - - -def build_wheel(wheel_directory, config_settings, metadata_directory=None): - """Invoke the mandatory build_wheel hook. - - If a wheel was already built in the - prepare_metadata_for_build_wheel fallback, this - will copy it rather than rebuilding the wheel. - """ - prebuilt_whl = _find_already_built_wheel(metadata_directory) - if prebuilt_whl: - shutil.copy2(prebuilt_whl, wheel_directory) - return os.path.basename(prebuilt_whl) - - return _build_backend().build_wheel(wheel_directory, config_settings, - metadata_directory) - - -def get_requires_for_build_sdist(config_settings): - """Invoke the optional get_requires_for_build_wheel hook - - Returns [] if the hook is not defined. - """ - backend = _build_backend() - try: - hook = backend.get_requires_for_build_sdist - except AttributeError: - return [] - else: - return hook(config_settings) - - -class _DummyException(Exception): - """Nothing should ever raise this exception""" - - -class GotUnsupportedOperation(Exception): - """For internal use when backend raises UnsupportedOperation""" - - -def build_sdist(sdist_directory, config_settings): - """Invoke the mandatory build_sdist hook.""" - backend = _build_backend() - try: - return backend.build_sdist(sdist_directory, config_settings) - except getattr(backend, 'UnsupportedOperation', _DummyException): - raise GotUnsupportedOperation - - -HOOK_NAMES = { - 'get_requires_for_build_wheel', - 'prepare_metadata_for_build_wheel', - 'build_wheel', - 'get_requires_for_build_sdist', - 'build_sdist', -} - - -def main(): - if len(sys.argv) < 3: - sys.exit("Needs args: hook_name, control_dir") - hook_name = sys.argv[1] - control_dir = sys.argv[2] - if hook_name not in HOOK_NAMES: - sys.exit("Unknown hook: %s" % hook_name) - hook = globals()[hook_name] - - hook_input = compat.read_json(pjoin(control_dir, 'input.json')) - - json_out = {'unsupported': False, 'return_val': None} - try: - json_out['return_val'] = hook(**hook_input['kwargs']) - except BackendUnavailable: - json_out['no_backend'] = True - except GotUnsupportedOperation: - json_out['unsupported'] = True - - compat.write_json(json_out, pjoin(control_dir, 'output.json'), indent=2) - - -if __name__ == '__main__': - main() diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pep517/_in_process.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/pep517/_in_process.pyc deleted file mode 100644 index 50d5690f2c37a0cd85892874b15a5a0addf47878..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7785 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 F{{XhnZ=wJI diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pep517/build.py b/venv/lib/python2.7/site-packages/pip/_vendor/pep517/build.py deleted file mode 100644 index ac6c949..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/pep517/build.py +++ /dev/null @@ -1,108 +0,0 @@ -"""Build a project using PEP 517 hooks. -""" -import argparse -import logging -import os -import contextlib -from pip._vendor import pytoml -import shutil -import errno -import tempfile - -from .envbuild import BuildEnvironment -from .wrappers import Pep517HookCaller - -log = logging.getLogger(__name__) - - -@contextlib.contextmanager -def tempdir(): - td = tempfile.mkdtemp() - try: - yield td - finally: - shutil.rmtree(td) - - -def _do_build(hooks, env, dist, dest): - get_requires_name = 'get_requires_for_build_{dist}'.format(**locals()) - get_requires = getattr(hooks, get_requires_name) - reqs = get_requires({}) - log.info('Got build requires: %s', reqs) - - env.pip_install(reqs) - log.info('Installed dynamic build dependencies') - - with tempdir() as td: - log.info('Trying to build %s in %s', dist, td) - build_name = 'build_{dist}'.format(**locals()) - build = getattr(hooks, build_name) - filename = build(td, {}) - source = os.path.join(td, filename) - shutil.move(source, os.path.join(dest, os.path.basename(filename))) - - -def mkdir_p(*args, **kwargs): - """Like `mkdir`, but does not raise an exception if the - directory already exists. - """ - try: - return os.mkdir(*args, **kwargs) - except OSError as exc: - if exc.errno != errno.EEXIST: - raise - - -def build(source_dir, dist, dest=None): - pyproject = os.path.join(source_dir, 'pyproject.toml') - dest = os.path.join(source_dir, dest or 'dist') - mkdir_p(dest) - - with open(pyproject) as f: - pyproject_data = pytoml.load(f) - # Ensure the mandatory data can be loaded - buildsys = pyproject_data['build-system'] - requires = buildsys['requires'] - backend = buildsys['build-backend'] - - hooks = Pep517HookCaller(source_dir, backend) - - with BuildEnvironment() as env: - env.pip_install(requires) - _do_build(hooks, env, dist, dest) - - -parser = argparse.ArgumentParser() -parser.add_argument( - 'source_dir', - help="A directory containing pyproject.toml", -) -parser.add_argument( - '--binary', '-b', - action='store_true', - default=False, -) -parser.add_argument( - '--source', '-s', - action='store_true', - default=False, -) -parser.add_argument( - '--out-dir', '-o', - help="Destination in which to save the builds relative to source dir", -) - - -def main(args): - # determine which dists to build - dists = list(filter(None, ( - 'sdist' if args.source or not args.binary else None, - 'wheel' if args.binary or not args.source else None, - ))) - - for dist in dists: - build(args.source_dir, dist, args.out_dir) - - -if __name__ == '__main__': - main(parser.parse_args()) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pep517/build.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/pep517/build.pyc deleted file mode 100644 index f4c2a20a6222bf64e51f76b49b3ebd13175d138d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3865 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 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pep517/check.py b/venv/lib/python2.7/site-packages/pip/_vendor/pep517/check.py deleted file mode 100644 index f4cdc6b..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/pep517/check.py +++ /dev/null @@ -1,202 +0,0 @@ -"""Check a project and backend by attempting to build using PEP 517 hooks. -""" -import argparse -import logging -import os -from os.path import isfile, join as pjoin -from pip._vendor.pytoml import TomlError, load as toml_load -import shutil -from subprocess import CalledProcessError -import sys -import tarfile -from tempfile import mkdtemp -import zipfile - -from .colorlog import enable_colourful_output -from .envbuild import BuildEnvironment -from .wrappers import Pep517HookCaller - -log = logging.getLogger(__name__) - - -def check_build_sdist(hooks, build_sys_requires): - with BuildEnvironment() as env: - try: - env.pip_install(build_sys_requires) - log.info('Installed static build dependencies') - except CalledProcessError: - log.error('Failed to install static build dependencies') - return False - - try: - reqs = hooks.get_requires_for_build_sdist({}) - log.info('Got build requires: %s', reqs) - except Exception: - log.error('Failure in get_requires_for_build_sdist', exc_info=True) - return False - - try: - env.pip_install(reqs) - log.info('Installed dynamic build dependencies') - except CalledProcessError: - log.error('Failed to install dynamic build dependencies') - return False - - td = mkdtemp() - log.info('Trying to build sdist in %s', td) - try: - try: - filename = hooks.build_sdist(td, {}) - log.info('build_sdist returned %r', filename) - except Exception: - log.info('Failure in build_sdist', exc_info=True) - return False - - if not filename.endswith('.tar.gz'): - log.error( - "Filename %s doesn't have .tar.gz extension", filename) - return False - - path = pjoin(td, filename) - if isfile(path): - log.info("Output file %s exists", path) - else: - log.error("Output file %s does not exist", path) - return False - - if tarfile.is_tarfile(path): - log.info("Output file is a tar file") - else: - log.error("Output file is not a tar file") - return False - - finally: - shutil.rmtree(td) - - return True - - -def check_build_wheel(hooks, build_sys_requires): - with BuildEnvironment() as env: - try: - env.pip_install(build_sys_requires) - log.info('Installed static build dependencies') - except CalledProcessError: - log.error('Failed to install static build dependencies') - return False - - try: - reqs = hooks.get_requires_for_build_wheel({}) - log.info('Got build requires: %s', reqs) - except Exception: - log.error('Failure in get_requires_for_build_sdist', exc_info=True) - return False - - try: - env.pip_install(reqs) - log.info('Installed dynamic build dependencies') - except CalledProcessError: - log.error('Failed to install dynamic build dependencies') - return False - - td = mkdtemp() - log.info('Trying to build wheel in %s', td) - try: - try: - filename = hooks.build_wheel(td, {}) - log.info('build_wheel returned %r', filename) - except Exception: - log.info('Failure in build_wheel', exc_info=True) - return False - - if not filename.endswith('.whl'): - log.error("Filename %s doesn't have .whl extension", filename) - return False - - path = pjoin(td, filename) - if isfile(path): - log.info("Output file %s exists", path) - else: - log.error("Output file %s does not exist", path) - return False - - if zipfile.is_zipfile(path): - log.info("Output file is a zip file") - else: - log.error("Output file is not a zip file") - return False - - finally: - shutil.rmtree(td) - - return True - - -def check(source_dir): - pyproject = pjoin(source_dir, 'pyproject.toml') - if isfile(pyproject): - log.info('Found pyproject.toml') - else: - log.error('Missing pyproject.toml') - return False - - try: - with open(pyproject) as f: - pyproject_data = toml_load(f) - # Ensure the mandatory data can be loaded - buildsys = pyproject_data['build-system'] - requires = buildsys['requires'] - backend = buildsys['build-backend'] - log.info('Loaded pyproject.toml') - except (TomlError, KeyError): - log.error("Invalid pyproject.toml", exc_info=True) - return False - - hooks = Pep517HookCaller(source_dir, backend) - - sdist_ok = check_build_sdist(hooks, requires) - wheel_ok = check_build_wheel(hooks, requires) - - if not sdist_ok: - log.warning('Sdist checks failed; scroll up to see') - if not wheel_ok: - log.warning('Wheel checks failed') - - return sdist_ok - - -def main(argv=None): - ap = argparse.ArgumentParser() - ap.add_argument( - 'source_dir', - help="A directory containing pyproject.toml") - args = ap.parse_args(argv) - - enable_colourful_output() - - ok = check(args.source_dir) - - if ok: - print(ansi('Checks passed', 'green')) - else: - print(ansi('Checks failed', 'red')) - sys.exit(1) - - -ansi_codes = { - 'reset': '\x1b[0m', - 'bold': '\x1b[1m', - 'red': '\x1b[31m', - 'green': '\x1b[32m', -} - - -def ansi(s, attr): - if os.name != 'nt' and sys.stdout.isatty(): - return ansi_codes[attr] + str(s) + ansi_codes['reset'] - else: - return str(s) - - -if __name__ == '__main__': - main() diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pep517/check.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/pep517/check.pyc deleted file mode 100644 index bf2a72bfb5de610a603707745da874ed620889d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6183 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 RtK%~zxFrAA%GJ?v=R2xbij)8V diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pep517/colorlog.py b/venv/lib/python2.7/site-packages/pip/_vendor/pep517/colorlog.py deleted file mode 100644 index 69c8a59..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/pep517/colorlog.py +++ /dev/null @@ -1,115 +0,0 @@ -"""Nicer log formatting with colours. - -Code copied from Tornado, Apache licensed. -""" -# Copyright 2012 Facebook -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import logging -import sys - -try: - import curses -except ImportError: - curses = None - - -def _stderr_supports_color(): - color = False - if curses and hasattr(sys.stderr, 'isatty') and sys.stderr.isatty(): - try: - curses.setupterm() - if curses.tigetnum("colors") > 0: - color = True - except Exception: - pass - return color - - -class LogFormatter(logging.Formatter): - """Log formatter with colour support - """ - DEFAULT_COLORS = { - logging.INFO: 2, # Green - logging.WARNING: 3, # Yellow - logging.ERROR: 1, # Red - logging.CRITICAL: 1, - } - - def __init__(self, color=True, datefmt=None): - r""" - :arg bool color: Enables color support. - :arg string fmt: Log message format. - It will be applied to the attributes dict of log records. The - text between ``%(color)s`` and ``%(end_color)s`` will be colored - depending on the level if color support is on. - :arg dict colors: color mappings from logging level to terminal color - code - :arg string datefmt: Datetime format. - Used for formatting ``(asctime)`` placeholder in ``prefix_fmt``. - .. versionchanged:: 3.2 - Added ``fmt`` and ``datefmt`` arguments. - """ - logging.Formatter.__init__(self, datefmt=datefmt) - self._colors = {} - if color and _stderr_supports_color(): - # The curses module has some str/bytes confusion in - # python3. Until version 3.2.3, most methods return - # bytes, but only accept strings. In addition, we want to - # output these strings with the logging module, which - # works with unicode strings. The explicit calls to - # unicode() below are harmless in python2 but will do the - # right conversion in python 3. - fg_color = (curses.tigetstr("setaf") or - curses.tigetstr("setf") or "") - if (3, 0) < sys.version_info < (3, 2, 3): - fg_color = str(fg_color, "ascii") - - for levelno, code in self.DEFAULT_COLORS.items(): - self._colors[levelno] = str( - curses.tparm(fg_color, code), "ascii") - self._normal = str(curses.tigetstr("sgr0"), "ascii") - - scr = curses.initscr() - self.termwidth = scr.getmaxyx()[1] - curses.endwin() - else: - self._normal = '' - # Default width is usually 80, but too wide is - # worse than too narrow - self.termwidth = 70 - - def formatMessage(self, record): - mlen = len(record.message) - right_text = '{initial}-{name}'.format(initial=record.levelname[0], - name=record.name) - if mlen + len(right_text) < self.termwidth: - space = ' ' * (self.termwidth - (mlen + len(right_text))) - else: - space = ' ' - - if record.levelno in self._colors: - start_color = self._colors[record.levelno] - end_color = self._normal - else: - start_color = end_color = '' - - return record.message + space + start_color + right_text + end_color - - -def enable_colourful_output(level=logging.INFO): - handler = logging.StreamHandler() - handler.setFormatter(LogFormatter()) - logging.root.addHandler(handler) - logging.root.setLevel(level) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pep517/colorlog.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/pep517/colorlog.pyc deleted file mode 100644 index 305f698c1a4736726e5a21b5afb3c70c95be1fec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3906 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 Q>D3VEf@;?0TdU9h4@w1-761SM diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pep517/compat.py b/venv/lib/python2.7/site-packages/pip/_vendor/pep517/compat.py deleted file mode 100644 index 01c66fc..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/pep517/compat.py +++ /dev/null @@ -1,23 +0,0 @@ -"""Handle reading and writing JSON in UTF-8, on Python 3 and 2.""" -import json -import sys - -if sys.version_info[0] >= 3: - # Python 3 - def write_json(obj, path, **kwargs): - with open(path, 'w', encoding='utf-8') as f: - json.dump(obj, f, **kwargs) - - def read_json(path): - with open(path, 'r', encoding='utf-8') as f: - return json.load(f) - -else: - # Python 2 - def write_json(obj, path, **kwargs): - with open(path, 'wb') as f: - json.dump(obj, f, encoding='utf-8', **kwargs) - - def read_json(path): - with open(path, 'rb') as f: - return json.load(f) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pep517/compat.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/pep517/compat.pyc deleted file mode 100644 index 5e4526122e23092f81d4e14ed2ab9749ae322f95..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1587 zcmd6n-)j>=5XWcllJtkMU{z3`?(sy^YpjhCiU>jx#aJ&Dr6|Yc_L5$D**$kRNmJSf zsjt#M);~aJwn+<Z>1$n>x!E6?o&D^0<Nmq5_~hr(_XMWR!S8D{{S6%l*g?;LJCHNj z!QeD@V8?;ffxZjeg@?QZdu33Yz{~Ipe^UZpu|XNcGVr<C;QVwD)3yBt+GPXX+gR{C z^;8=3O!PeLd1I9sir=+Aw!BPupSL$_&8MCe-qytI;%Ch+d$yAO#n#F&3uG?3gz7J$ z&7-|X)9dIAz~QWRtoPVqCy(IB1;e24z#-1MaOl8q2iO-p^QW)q+CHUe;Szwcp>(N8 zBvq)(*cqB`t?AR2hStd<6*lN=c^dHHps*<nEs~wSoi1XtYbrRfH;z?L+w5H*`(T~U zF$xNmjbf7qqgVx9ne$ZX;9x(Ptf`I|@6{VW#A-u5ZzN5<|B@f5RcyT?*ba)UsAWQ% zIL~XQ{-GCb(U7%hlnO3YP^86r{Y8+-0amh7Ow1x~NVL<4Dxbrirt<)Mz!Ew-@uYg+ zpy>b|v7BjQ%JLo@u^CGS#|+w6QdA)&yg)Cc4Z<^yxs17QhiKD~u-_yd(kSWD!nuW= zb2u}h5x~nrJ9gm2yC^Y~Jrc7*W0!?S3CEr58HIE=R#hR1Ftm{9(r%hmNTlwdO#v-m zp`OP$eWo4)bgga(N6U~`9sADCl@iiT{68uQt60u`w6nAObT5YPC5pIAqUcoMq;fsc yhSrbpQD;&_ndnLj&t^H-`VIXZ(1Y6;NIuNdSN63o;Xs8|S=G7gER?F1h0;In30rOe diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pep517/envbuild.py b/venv/lib/python2.7/site-packages/pip/_vendor/pep517/envbuild.py deleted file mode 100644 index f7ac5f4..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/pep517/envbuild.py +++ /dev/null @@ -1,158 +0,0 @@ -"""Build wheels/sdists by installing build deps to a temporary environment. -""" - -import os -import logging -from pip._vendor import pytoml -import shutil -from subprocess import check_call -import sys -from sysconfig import get_paths -from tempfile import mkdtemp - -from .wrappers import Pep517HookCaller - -log = logging.getLogger(__name__) - - -def _load_pyproject(source_dir): - with open(os.path.join(source_dir, 'pyproject.toml')) as f: - pyproject_data = pytoml.load(f) - buildsys = pyproject_data['build-system'] - return buildsys['requires'], buildsys['build-backend'] - - -class BuildEnvironment(object): - """Context manager to install build deps in a simple temporary environment - - Based on code I wrote for pip, which is MIT licensed. - """ - # Copyright (c) 2008-2016 The pip developers (see AUTHORS.txt file) - # - # Permission is hereby granted, free of charge, to any person obtaining - # a copy of this software and associated documentation files (the - # "Software"), to deal in the Software without restriction, including - # without limitation the rights to use, copy, modify, merge, publish, - # distribute, sublicense, and/or sell copies of the Software, and to - # permit persons to whom the Software is furnished to do so, subject to - # the following conditions: - # - # The above copyright notice and this permission notice shall be - # included in all copies or substantial portions of the Software. - # - # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - path = None - - def __init__(self, cleanup=True): - self._cleanup = cleanup - - def __enter__(self): - self.path = mkdtemp(prefix='pep517-build-env-') - log.info('Temporary build environment: %s', self.path) - - self.save_path = os.environ.get('PATH', None) - self.save_pythonpath = os.environ.get('PYTHONPATH', None) - - install_scheme = 'nt' if (os.name == 'nt') else 'posix_prefix' - install_dirs = get_paths(install_scheme, vars={ - 'base': self.path, - 'platbase': self.path, - }) - - scripts = install_dirs['scripts'] - if self.save_path: - os.environ['PATH'] = scripts + os.pathsep + self.save_path - else: - os.environ['PATH'] = scripts + os.pathsep + os.defpath - - if install_dirs['purelib'] == install_dirs['platlib']: - lib_dirs = install_dirs['purelib'] - else: - lib_dirs = install_dirs['purelib'] + os.pathsep + \ - install_dirs['platlib'] - if self.save_pythonpath: - os.environ['PYTHONPATH'] = lib_dirs + os.pathsep + \ - self.save_pythonpath - else: - os.environ['PYTHONPATH'] = lib_dirs - - return self - - def pip_install(self, reqs): - """Install dependencies into this env by calling pip in a subprocess""" - if not reqs: - return - log.info('Calling pip to install %s', reqs) - check_call([ - sys.executable, '-m', 'pip', 'install', '--ignore-installed', - '--prefix', self.path] + list(reqs)) - - def __exit__(self, exc_type, exc_val, exc_tb): - needs_cleanup = ( - self._cleanup and - self.path is not None and - os.path.isdir(self.path) - ) - if needs_cleanup: - shutil.rmtree(self.path) - - if self.save_path is None: - os.environ.pop('PATH', None) - else: - os.environ['PATH'] = self.save_path - - if self.save_pythonpath is None: - os.environ.pop('PYTHONPATH', None) - else: - os.environ['PYTHONPATH'] = self.save_pythonpath - - -def build_wheel(source_dir, wheel_dir, config_settings=None): - """Build a wheel from a source directory using PEP 517 hooks. - - :param str source_dir: Source directory containing pyproject.toml - :param str wheel_dir: Target directory to create wheel in - :param dict config_settings: Options to pass to build backend - - This is a blocking function which will run pip in a subprocess to install - build requirements. - """ - if config_settings is None: - config_settings = {} - requires, backend = _load_pyproject(source_dir) - hooks = Pep517HookCaller(source_dir, backend) - - with BuildEnvironment() as env: - env.pip_install(requires) - reqs = hooks.get_requires_for_build_wheel(config_settings) - env.pip_install(reqs) - return hooks.build_wheel(wheel_dir, config_settings) - - -def build_sdist(source_dir, sdist_dir, config_settings=None): - """Build an sdist from a source directory using PEP 517 hooks. - - :param str source_dir: Source directory containing pyproject.toml - :param str sdist_dir: Target directory to place sdist in - :param dict config_settings: Options to pass to build backend - - This is a blocking function which will run pip in a subprocess to install - build requirements. - """ - if config_settings is None: - config_settings = {} - requires, backend = _load_pyproject(source_dir) - hooks = Pep517HookCaller(source_dir, backend) - - with BuildEnvironment() as env: - env.pip_install(requires) - reqs = hooks.get_requires_for_build_sdist(config_settings) - env.pip_install(reqs) - return hooks.build_sdist(sdist_dir, config_settings) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pep517/envbuild.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/pep517/envbuild.pyc deleted file mode 100644 index 3bad07aa9d9911fead012d12da89ce060f026d4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5625 zcmd^DZEqXL5uQC#FQiCI@rz`^ZF(*0f=ElrMiMo3-N3Qo#4c)CISGhEq&OV!meNVb zyUXoTmICWTAs7A75BUrI5&aMS+W*oY&^|MJqUj*{tQI}+mb0^Ov$HeL%wFSP-S#j4 zbmfmR)lUQe5Ad3QqDY7aC>13hWr_wM9PQD-6S_fJgT_r7G)dKMb2ONfwkBosG+v;= z!nAFX28+@*M_G%;Z5p&)+dO4UH15!#gZcs`i<EU~e1!&ANNJA_mr1YCIYfAek`}#& zTvsV+lfFhHNVLS9bD}Q?*ICr0L$A?wRp_qJYfSI<uJF#DqIft-v&4USpmk<8O_CaG z{Nbse=Eg=@mgf8ZP<kY~G`=nT$hUf27FAT8`Z_;Ot0Euk+-|hff8*KiDa>i-QIw~) z7-z2DMm;{z@lhCKQpan7x36tjM)trs)&f}Lql6boc^=1I0kxyc5AXi^Nl_d<!UVdC zxw(m#S9*lkJV#;iQ*;O|HRzQb*SW{K`gWDh6xk*n&e1EyoHLKUz?pvj;uVzS(fSz% zG$?7%I{!6keZ)$d!<^fORaKsrRdJ|eyTO|>9k4_#eRFCcu3ZG9(qB)~N*mLiwhp8C zNasn9rNr_?MG0MbOc<&2=7l&c(mVj)b<2t<>2ZI{nlr_uiglQz6?R87vTsQgCXtOq z0Fej+_0Wl=Fgd8rvPzF5t2d9MYI9U%iLT7%Hz%8??^nb8<<Z@(uk$-w)dySgN9N== z$v4#<Jp1M5-e#GW{n`%t_U^O&aEDp)hR4`eQEirTE}Jj}S$qSBzKkV9-at52+EuU& ztBBOQ>V|47%V+wK?dtIx6N<S5KdhgJc+GE7XjnK58zoK(9@Qi*PQ`XT&u8}<P4JV3 z5b&v{5G@LJMeXJ<nB-BBTYX~vag;~<x?(%7H#TeCX%6c)>A1}F_ZxY;?c;eE8J+k= z?#D%<{ipuRs<7H06_pR|{0gp=#s_|C{AW-1{49-ij_w;WGUlCKykfO%DzHcxYbYSI zD<)ri5o;`rGacoVvd6>3QjE?<mObU71?1(Ow#XQ!d1}M(LkMD6PEz8Z>^@Wf+=J=D zKOHollj1GIC&gEBc&Hx2Gd)t+B;526XWQgs2aCHd*6z!Eod1;H5`LSKc{=i_I%Fb; z3onSrFR^j~p{Y!Q1pt{_ZYf~q*11vu0)~Jk2LTXbk*a?%7O)r{TI0@(wC03@MECPs zGp)?-&bIPg9e@b_y0p#`HB`+zYf`>0i=o5C?5^J$+IXQBRgcuG=Iq+7>Fje@yGwN| zRDe3hI3(Y8h+FAVdSc#z+MQqa9Y(=B`{pO$?oE+f8fNkPo`2gR(#|J)PXu*#zTA8A zd|Rq~rn$9@dSzkKldzPPun8i7iW@kDTL=u5S!AWcMrz_JEv*rQEhm-E(xIc#3ADta zpn;A7TasleEB0mPG#?cK&mjZqSR*|UHl)XPk!#Cw#6-th0*RoHtDV||BA?=G9*uP% zKEyLh%+aMxoahl(1?&SxDuLG;9zuh#HP*8A3l?zL1V84EEHXC1$b8A5%Ss4C#1>tJ z;YX;L_fU|!s;+rA)lKh~>Hv0E8g125?|Qeq>#FNrQA?<`)pf7yO_7PWB*^p(1f0jf zwG{2bbJ=^~EVYw*d{&3>Pzjgpl5orgvEn(}U*HsgyDD14%L&nLkEb@Dpm^$X3m+*3 zqKMApR2$$iK-nGuH*wOOfpDh4=?6d+jeg{t$q+#}Mu6Qm>n!F>hZ#V>Z3Kh*V=)zs zmQ$_|&+q~F`{{mORQe*g=|qB4zwgYt#}*R!T>O*^j=3@y$9j&(`b5VQ8x1q<jF#OX zL*gVD?M#SS$OkUjDwZGx6aaXZWbOs3lDd#LubOH_HDDhxi^@pNt|uq|cMyz5NK)Pt zLc;G+i>rL-$gmt-xl9Ulld4b23TX2{;VYybTtR3iIs&R5$>2psISvAX;3{9KJMqMl z5HqM9!sy(fzs(E+R=zc;UAMt1@1te6$2-^#R#66PD0;m8fYDHnDfl^4f+xJ)6uE9C zuxSn^HqC^r#<tQrxXnF(hQgUpQ3k(2Wd<SGl=Vp*+S5`ybVB7ga+65I&~j+cHEe4d z!oj%gK&?+WP)88Nu%5_ksbzHo=5WnhR;%8Ml-oVFazVE+WZ(=#vHLI_7s({!DyuOJ zlOhg7r&rd9VDery(ZO}pf<6}?aPd17J-jo;C1j=nC!Gu&;sf)|`PF%^(`fmvR?L>e zJK$}J5BwPf$89C1dxKKqD+5d#88{3SnD&)NxHKSeBZUD6K7dT+Y>rLloaoyJbOr>R z7gqrX82AeQf$N7{NX~$iu5Dr3CV<J!xOsemg+G5GsL3(QjDbOtF8h(Ys`;a;7^C8@ z20ly~cas8FvWa2L+<Cm?<G$n{;KF1!T-tiCjH+nt8(Y<*IBebXcja<1GeeAAIYL6m z(EHY{M^f0CS>(>>CfSQB#N?StfX8vAap|bVP4n5&Ng7*Z&-p0b50NxjtYz-`&r6#Y zxm+^K$jHA-Q|eok+r}P;2>c>{m=*C6i#eL)F%QLBoO-`Zv&^q1`S(SRnap1VatqWq zH@?S0Tb$!>yC5Kt!55mK$pssbShW2SD89U2-1$PJ|DjA4idrmV&rDr{U%*VsSEj0y zeC0cu2pFEk!|II#S&8H*1&<IPgZIIC<58F4OphSJ1g}I?YIl%ITvf|nM|FWHUG=}@ zQn@eRJ^mYfN(A{~pF(OK>ss3XBbO4b%(#@)zvEI<%>|EPmEuFer%Zju#S<<r-)Vji zG5(782b`vNlf`_%h2$w*;5M`mkdxgbm)oenyvVnrU<)1GC!%R?Ea_@+ha2Q(bZQ*D zxXTX*IsUvhN|C%axWb&5RaBPvDkLZ;!+>pnz{0u;K1RDsh8YJXODcx^CCs6rAS7c! qz<YZGNkUx$F3EoGyFBG%iJc792=urBtxVq)&U6~Bh1IV*tN#HnKTCfA diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pep517/wrappers.py b/venv/lib/python2.7/site-packages/pip/_vendor/pep517/wrappers.py deleted file mode 100644 index b14b899..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/pep517/wrappers.py +++ /dev/null @@ -1,163 +0,0 @@ -from contextlib import contextmanager -import os -from os.path import dirname, abspath, join as pjoin -import shutil -from subprocess import check_call -import sys -from tempfile import mkdtemp - -from . import compat - -_in_proc_script = pjoin(dirname(abspath(__file__)), '_in_process.py') - - -@contextmanager -def tempdir(): - td = mkdtemp() - try: - yield td - finally: - shutil.rmtree(td) - - -class BackendUnavailable(Exception): - """Will be raised if the backend cannot be imported in the hook process.""" - - -class UnsupportedOperation(Exception): - """May be raised by build_sdist if the backend indicates that it can't.""" - - -def default_subprocess_runner(cmd, cwd=None, extra_environ=None): - """The default method of calling the wrapper subprocess.""" - env = os.environ.copy() - if extra_environ: - env.update(extra_environ) - - check_call(cmd, cwd=cwd, env=env) - - -class Pep517HookCaller(object): - """A wrapper around a source directory to be built with a PEP 517 backend. - - source_dir : The path to the source directory, containing pyproject.toml. - backend : The build backend spec, as per PEP 517, from pyproject.toml. - """ - def __init__(self, source_dir, build_backend): - self.source_dir = abspath(source_dir) - self.build_backend = build_backend - self._subprocess_runner = default_subprocess_runner - - # TODO: Is this over-engineered? Maybe frontends only need to - # set this when creating the wrapper, not on every call. - @contextmanager - def subprocess_runner(self, runner): - prev = self._subprocess_runner - self._subprocess_runner = runner - yield - self._subprocess_runner = prev - - def get_requires_for_build_wheel(self, config_settings=None): - """Identify packages required for building a wheel - - Returns a list of dependency specifications, e.g.: - ["wheel >= 0.25", "setuptools"] - - This does not include requirements specified in pyproject.toml. - It returns the result of calling the equivalently named hook in a - subprocess. - """ - return self._call_hook('get_requires_for_build_wheel', { - 'config_settings': config_settings - }) - - def prepare_metadata_for_build_wheel( - self, metadata_directory, config_settings=None): - """Prepare a *.dist-info folder with metadata for this project. - - Returns the name of the newly created folder. - - If the build backend defines a hook with this name, it will be called - in a subprocess. If not, the backend will be asked to build a wheel, - and the dist-info extracted from that. - """ - return self._call_hook('prepare_metadata_for_build_wheel', { - 'metadata_directory': abspath(metadata_directory), - 'config_settings': config_settings, - }) - - def build_wheel( - self, wheel_directory, config_settings=None, - metadata_directory=None): - """Build a wheel from this project. - - Returns the name of the newly created file. - - In general, this will call the 'build_wheel' hook in the backend. - However, if that was previously called by - 'prepare_metadata_for_build_wheel', and the same metadata_directory is - used, the previously built wheel will be copied to wheel_directory. - """ - if metadata_directory is not None: - metadata_directory = abspath(metadata_directory) - return self._call_hook('build_wheel', { - 'wheel_directory': abspath(wheel_directory), - 'config_settings': config_settings, - 'metadata_directory': metadata_directory, - }) - - def get_requires_for_build_sdist(self, config_settings=None): - """Identify packages required for building a wheel - - Returns a list of dependency specifications, e.g.: - ["setuptools >= 26"] - - This does not include requirements specified in pyproject.toml. - It returns the result of calling the equivalently named hook in a - subprocess. - """ - return self._call_hook('get_requires_for_build_sdist', { - 'config_settings': config_settings - }) - - def build_sdist(self, sdist_directory, config_settings=None): - """Build an sdist from this project. - - Returns the name of the newly created file. - - This calls the 'build_sdist' backend hook in a subprocess. - """ - return self._call_hook('build_sdist', { - 'sdist_directory': abspath(sdist_directory), - 'config_settings': config_settings, - }) - - def _call_hook(self, hook_name, kwargs): - # On Python 2, pytoml returns Unicode values (which is correct) but the - # environment passed to check_call needs to contain string values. We - # convert here by encoding using ASCII (the backend can only contain - # letters, digits and _, . and : characters, and will be used as a - # Python identifier, so non-ASCII content is wrong on Python 2 in - # any case). - if sys.version_info[0] == 2: - build_backend = self.build_backend.encode('ASCII') - else: - build_backend = self.build_backend - - with tempdir() as td: - compat.write_json({'kwargs': kwargs}, pjoin(td, 'input.json'), - indent=2) - - # Run the hook in a subprocess - self._subprocess_runner( - [sys.executable, _in_proc_script, hook_name, td], - cwd=self.source_dir, - extra_environ={'PEP517_BUILD_BACKEND': build_backend} - ) - - data = compat.read_json(pjoin(td, 'output.json')) - if data.get('unsupported'): - raise UnsupportedOperation - if data.get('no_backend'): - raise BackendUnavailable - return data['return_val'] diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pep517/wrappers.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/pep517/wrappers.pyc deleted file mode 100644 index a8966a59d798728659e5581e509ffd12ccfe415f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7144 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 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pkg_resources/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/pkg_resources/__init__.py deleted file mode 100644 index fdd40de..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/pkg_resources/__init__.py +++ /dev/null @@ -1,3286 +0,0 @@ -# coding: utf-8 -""" -Package resource API --------------------- - -A resource is a logical file contained within a package, or a logical -subdirectory thereof. The package resource API expects resource names -to have their path parts separated with ``/``, *not* whatever the local -path separator is. Do not use os.path operations to manipulate resource -names being passed into the API. - -The package resource API is designed to work with normal filesystem packages, -.egg files, and unpacked .egg files. It can also work in a limited way with -.zip files and with custom PEP 302 loaders that support the ``get_data()`` -method. -""" - -from __future__ import absolute_import - -import sys -import os -import io -import time -import re -import types -import zipfile -import zipimport -import warnings -import stat -import functools -import pkgutil -import operator -import platform -import collections -import plistlib -import email.parser -import errno -import tempfile -import textwrap -import itertools -import inspect -import ntpath -import posixpath -from pkgutil import get_importer - -try: - import _imp -except ImportError: - # Python 3.2 compatibility - import imp as _imp - -try: - FileExistsError -except NameError: - FileExistsError = OSError - -from pip._vendor import six -from pip._vendor.six.moves import urllib, map, filter - -# capture these to bypass sandboxing -from os import utime -try: - from os import mkdir, rename, unlink - WRITE_SUPPORT = True -except ImportError: - # no write support, probably under GAE - WRITE_SUPPORT = False - -from os import open as os_open -from os.path import isdir, split - -try: - import importlib.machinery as importlib_machinery - # access attribute to force import under delayed import mechanisms. - importlib_machinery.__name__ -except ImportError: - importlib_machinery = None - -from . import py31compat -from pip._vendor import appdirs -from pip._vendor import packaging -__import__('pip._vendor.packaging.version') -__import__('pip._vendor.packaging.specifiers') -__import__('pip._vendor.packaging.requirements') -__import__('pip._vendor.packaging.markers') - - -__metaclass__ = type - - -if (3, 0) < sys.version_info < (3, 4): - raise RuntimeError("Python 3.4 or later is required") - -if six.PY2: - # Those builtin exceptions are only defined in Python 3 - PermissionError = None - NotADirectoryError = None - -# declare some globals that will be defined later to -# satisfy the linters. -require = None -working_set = None -add_activation_listener = None -resources_stream = None -cleanup_resources = None -resource_dir = None -resource_stream = None -set_extraction_path = None -resource_isdir = None -resource_string = None -iter_entry_points = None -resource_listdir = None -resource_filename = None -resource_exists = None -_distribution_finders = None -_namespace_handlers = None -_namespace_packages = None - - -class PEP440Warning(RuntimeWarning): - """ - Used when there is an issue with a version or specifier not complying with - PEP 440. - """ - - -def parse_version(v): - try: - return packaging.version.Version(v) - except packaging.version.InvalidVersion: - return packaging.version.LegacyVersion(v) - - -_state_vars = {} - - -def _declare_state(vartype, **kw): - globals().update(kw) - _state_vars.update(dict.fromkeys(kw, vartype)) - - -def __getstate__(): - state = {} - g = globals() - for k, v in _state_vars.items(): - state[k] = g['_sget_' + v](g[k]) - return state - - -def __setstate__(state): - g = globals() - for k, v in state.items(): - g['_sset_' + _state_vars[k]](k, g[k], v) - return state - - -def _sget_dict(val): - return val.copy() - - -def _sset_dict(key, ob, state): - ob.clear() - ob.update(state) - - -def _sget_object(val): - return val.__getstate__() - - -def _sset_object(key, ob, state): - ob.__setstate__(state) - - -_sget_none = _sset_none = lambda *args: None - - -def get_supported_platform(): - """Return this platform's maximum compatible version. - - distutils.util.get_platform() normally reports the minimum version - of Mac OS X that would be required to *use* extensions produced by - distutils. But what we want when checking compatibility is to know the - version of Mac OS X that we are *running*. To allow usage of packages that - explicitly require a newer version of Mac OS X, we must also know the - current version of the OS. - - If this condition occurs for any other platform with a version in its - platform strings, this function should be extended accordingly. - """ - plat = get_build_platform() - m = macosVersionString.match(plat) - if m is not None and sys.platform == "darwin": - try: - plat = 'macosx-%s-%s' % ('.'.join(_macosx_vers()[:2]), m.group(3)) - except ValueError: - # not Mac OS X - pass - return plat - - -__all__ = [ - # Basic resource access and distribution/entry point discovery - 'require', 'run_script', 'get_provider', 'get_distribution', - 'load_entry_point', 'get_entry_map', 'get_entry_info', - 'iter_entry_points', - 'resource_string', 'resource_stream', 'resource_filename', - 'resource_listdir', 'resource_exists', 'resource_isdir', - - # Environmental control - 'declare_namespace', 'working_set', 'add_activation_listener', - 'find_distributions', 'set_extraction_path', 'cleanup_resources', - 'get_default_cache', - - # Primary implementation classes - 'Environment', 'WorkingSet', 'ResourceManager', - 'Distribution', 'Requirement', 'EntryPoint', - - # Exceptions - 'ResolutionError', 'VersionConflict', 'DistributionNotFound', - 'UnknownExtra', 'ExtractionError', - - # Warnings - 'PEP440Warning', - - # Parsing functions and string utilities - 'parse_requirements', 'parse_version', 'safe_name', 'safe_version', - 'get_platform', 'compatible_platforms', 'yield_lines', 'split_sections', - 'safe_extra', 'to_filename', 'invalid_marker', 'evaluate_marker', - - # filesystem utilities - 'ensure_directory', 'normalize_path', - - # Distribution "precedence" constants - 'EGG_DIST', 'BINARY_DIST', 'SOURCE_DIST', 'CHECKOUT_DIST', 'DEVELOP_DIST', - - # "Provider" interfaces, implementations, and registration/lookup APIs - 'IMetadataProvider', 'IResourceProvider', 'FileMetadata', - 'PathMetadata', 'EggMetadata', 'EmptyProvider', 'empty_provider', - 'NullProvider', 'EggProvider', 'DefaultProvider', 'ZipProvider', - 'register_finder', 'register_namespace_handler', 'register_loader_type', - 'fixup_namespace_packages', 'get_importer', - - # Warnings - 'PkgResourcesDeprecationWarning', - - # Deprecated/backward compatibility only - 'run_main', 'AvailableDistributions', -] - - -class ResolutionError(Exception): - """Abstract base for dependency resolution errors""" - - def __repr__(self): - return self.__class__.__name__ + repr(self.args) - - -class VersionConflict(ResolutionError): - """ - An already-installed version conflicts with the requested version. - - Should be initialized with the installed Distribution and the requested - Requirement. - """ - - _template = "{self.dist} is installed but {self.req} is required" - - @property - def dist(self): - return self.args[0] - - @property - def req(self): - return self.args[1] - - def report(self): - return self._template.format(**locals()) - - def with_context(self, required_by): - """ - If required_by is non-empty, return a version of self that is a - ContextualVersionConflict. - """ - if not required_by: - return self - args = self.args + (required_by,) - return ContextualVersionConflict(*args) - - -class ContextualVersionConflict(VersionConflict): - """ - A VersionConflict that accepts a third parameter, the set of the - requirements that required the installed Distribution. - """ - - _template = VersionConflict._template + ' by {self.required_by}' - - @property - def required_by(self): - return self.args[2] - - -class DistributionNotFound(ResolutionError): - """A requested distribution was not found""" - - _template = ("The '{self.req}' distribution was not found " - "and is required by {self.requirers_str}") - - @property - def req(self): - return self.args[0] - - @property - def requirers(self): - return self.args[1] - - @property - def requirers_str(self): - if not self.requirers: - return 'the application' - return ', '.join(self.requirers) - - def report(self): - return self._template.format(**locals()) - - def __str__(self): - return self.report() - - -class UnknownExtra(ResolutionError): - """Distribution doesn't have an "extra feature" of the given name""" - - -_provider_factories = {} - -PY_MAJOR = sys.version[:3] -EGG_DIST = 3 -BINARY_DIST = 2 -SOURCE_DIST = 1 -CHECKOUT_DIST = 0 -DEVELOP_DIST = -1 - - -def register_loader_type(loader_type, provider_factory): - """Register `provider_factory` to make providers for `loader_type` - - `loader_type` is the type or class of a PEP 302 ``module.__loader__``, - and `provider_factory` is a function that, passed a *module* object, - returns an ``IResourceProvider`` for that module. - """ - _provider_factories[loader_type] = provider_factory - - -def get_provider(moduleOrReq): - """Return an IResourceProvider for the named module or requirement""" - if isinstance(moduleOrReq, Requirement): - return working_set.find(moduleOrReq) or require(str(moduleOrReq))[0] - try: - module = sys.modules[moduleOrReq] - except KeyError: - __import__(moduleOrReq) - module = sys.modules[moduleOrReq] - loader = getattr(module, '__loader__', None) - return _find_adapter(_provider_factories, loader)(module) - - -def _macosx_vers(_cache=[]): - if not _cache: - version = platform.mac_ver()[0] - # fallback for MacPorts - if version == '': - plist = '/System/Library/CoreServices/SystemVersion.plist' - if os.path.exists(plist): - if hasattr(plistlib, 'readPlist'): - plist_content = plistlib.readPlist(plist) - if 'ProductVersion' in plist_content: - version = plist_content['ProductVersion'] - - _cache.append(version.split('.')) - return _cache[0] - - -def _macosx_arch(machine): - return {'PowerPC': 'ppc', 'Power_Macintosh': 'ppc'}.get(machine, machine) - - -def get_build_platform(): - """Return this platform's string for platform-specific distributions - - XXX Currently this is the same as ``distutils.util.get_platform()``, but it - needs some hacks for Linux and Mac OS X. - """ - from sysconfig import get_platform - - plat = get_platform() - if sys.platform == "darwin" and not plat.startswith('macosx-'): - try: - version = _macosx_vers() - machine = os.uname()[4].replace(" ", "_") - return "macosx-%d.%d-%s" % ( - int(version[0]), int(version[1]), - _macosx_arch(machine), - ) - except ValueError: - # if someone is running a non-Mac darwin system, this will fall - # through to the default implementation - pass - return plat - - -macosVersionString = re.compile(r"macosx-(\d+)\.(\d+)-(.*)") -darwinVersionString = re.compile(r"darwin-(\d+)\.(\d+)\.(\d+)-(.*)") -# XXX backward compat -get_platform = get_build_platform - - -def compatible_platforms(provided, required): - """Can code for the `provided` platform run on the `required` platform? - - Returns true if either platform is ``None``, or the platforms are equal. - - XXX Needs compatibility checks for Linux and other unixy OSes. - """ - if provided is None or required is None or provided == required: - # easy case - return True - - # Mac OS X special cases - reqMac = macosVersionString.match(required) - if reqMac: - provMac = macosVersionString.match(provided) - - # is this a Mac package? - if not provMac: - # this is backwards compatibility for packages built before - # setuptools 0.6. All packages built after this point will - # use the new macosx designation. - provDarwin = darwinVersionString.match(provided) - if provDarwin: - dversion = int(provDarwin.group(1)) - macosversion = "%s.%s" % (reqMac.group(1), reqMac.group(2)) - if dversion == 7 and macosversion >= "10.3" or \ - dversion == 8 and macosversion >= "10.4": - return True - # egg isn't macosx or legacy darwin - return False - - # are they the same major version and machine type? - if provMac.group(1) != reqMac.group(1) or \ - provMac.group(3) != reqMac.group(3): - return False - - # is the required OS major update >= the provided one? - if int(provMac.group(2)) > int(reqMac.group(2)): - return False - - return True - - # XXX Linux and other platforms' special cases should go here - return False - - -def run_script(dist_spec, script_name): - """Locate distribution `dist_spec` and run its `script_name` script""" - ns = sys._getframe(1).f_globals - name = ns['__name__'] - ns.clear() - ns['__name__'] = name - require(dist_spec)[0].run_script(script_name, ns) - - -# backward compatibility -run_main = run_script - - -def get_distribution(dist): - """Return a current distribution object for a Requirement or string""" - if isinstance(dist, six.string_types): - dist = Requirement.parse(dist) - if isinstance(dist, Requirement): - dist = get_provider(dist) - if not isinstance(dist, Distribution): - raise TypeError("Expected string, Requirement, or Distribution", dist) - return dist - - -def load_entry_point(dist, group, name): - """Return `name` entry point of `group` for `dist` or raise ImportError""" - return get_distribution(dist).load_entry_point(group, name) - - -def get_entry_map(dist, group=None): - """Return the entry point map for `group`, or the full entry map""" - return get_distribution(dist).get_entry_map(group) - - -def get_entry_info(dist, group, name): - """Return the EntryPoint object for `group`+`name`, or ``None``""" - return get_distribution(dist).get_entry_info(group, name) - - -class IMetadataProvider: - def has_metadata(name): - """Does the package's distribution contain the named metadata?""" - - def get_metadata(name): - """The named metadata resource as a string""" - - def get_metadata_lines(name): - """Yield named metadata resource as list of non-blank non-comment lines - - Leading and trailing whitespace is stripped from each line, and lines - with ``#`` as the first non-blank character are omitted.""" - - def metadata_isdir(name): - """Is the named metadata a directory? (like ``os.path.isdir()``)""" - - def metadata_listdir(name): - """List of metadata names in the directory (like ``os.listdir()``)""" - - def run_script(script_name, namespace): - """Execute the named script in the supplied namespace dictionary""" - - -class IResourceProvider(IMetadataProvider): - """An object that provides access to package resources""" - - def get_resource_filename(manager, resource_name): - """Return a true filesystem path for `resource_name` - - `manager` must be an ``IResourceManager``""" - - def get_resource_stream(manager, resource_name): - """Return a readable file-like object for `resource_name` - - `manager` must be an ``IResourceManager``""" - - def get_resource_string(manager, resource_name): - """Return a string containing the contents of `resource_name` - - `manager` must be an ``IResourceManager``""" - - def has_resource(resource_name): - """Does the package contain the named resource?""" - - def resource_isdir(resource_name): - """Is the named resource a directory? (like ``os.path.isdir()``)""" - - def resource_listdir(resource_name): - """List of resource names in the directory (like ``os.listdir()``)""" - - -class WorkingSet: - """A collection of active distributions on sys.path (or a similar list)""" - - def __init__(self, entries=None): - """Create working set from list of path entries (default=sys.path)""" - self.entries = [] - self.entry_keys = {} - self.by_key = {} - self.callbacks = [] - - if entries is None: - entries = sys.path - - for entry in entries: - self.add_entry(entry) - - @classmethod - def _build_master(cls): - """ - Prepare the master working set. - """ - ws = cls() - try: - from __main__ import __requires__ - except ImportError: - # The main program does not list any requirements - return ws - - # ensure the requirements are met - try: - ws.require(__requires__) - except VersionConflict: - return cls._build_from_requirements(__requires__) - - return ws - - @classmethod - def _build_from_requirements(cls, req_spec): - """ - Build a working set from a requirement spec. Rewrites sys.path. - """ - # try it without defaults already on sys.path - # by starting with an empty path - ws = cls([]) - reqs = parse_requirements(req_spec) - dists = ws.resolve(reqs, Environment()) - for dist in dists: - ws.add(dist) - - # add any missing entries from sys.path - for entry in sys.path: - if entry not in ws.entries: - ws.add_entry(entry) - - # then copy back to sys.path - sys.path[:] = ws.entries - return ws - - def add_entry(self, entry): - """Add a path item to ``.entries``, finding any distributions on it - - ``find_distributions(entry, True)`` is used to find distributions - corresponding to the path entry, and they are added. `entry` is - always appended to ``.entries``, even if it is already present. - (This is because ``sys.path`` can contain the same value more than - once, and the ``.entries`` of the ``sys.path`` WorkingSet should always - equal ``sys.path``.) - """ - self.entry_keys.setdefault(entry, []) - self.entries.append(entry) - for dist in find_distributions(entry, True): - self.add(dist, entry, False) - - def __contains__(self, dist): - """True if `dist` is the active distribution for its project""" - return self.by_key.get(dist.key) == dist - - def find(self, req): - """Find a distribution matching requirement `req` - - If there is an active distribution for the requested project, this - returns it as long as it meets the version requirement specified by - `req`. But, if there is an active distribution for the project and it - does *not* meet the `req` requirement, ``VersionConflict`` is raised. - If there is no active distribution for the requested project, ``None`` - is returned. - """ - dist = self.by_key.get(req.key) - if dist is not None and dist not in req: - # XXX add more info - raise VersionConflict(dist, req) - return dist - - def iter_entry_points(self, group, name=None): - """Yield entry point objects from `group` matching `name` - - If `name` is None, yields all entry points in `group` from all - distributions in the working set, otherwise only ones matching - both `group` and `name` are yielded (in distribution order). - """ - return ( - entry - for dist in self - for entry in dist.get_entry_map(group).values() - if name is None or name == entry.name - ) - - def run_script(self, requires, script_name): - """Locate distribution for `requires` and run `script_name` script""" - ns = sys._getframe(1).f_globals - name = ns['__name__'] - ns.clear() - ns['__name__'] = name - self.require(requires)[0].run_script(script_name, ns) - - def __iter__(self): - """Yield distributions for non-duplicate projects in the working set - - The yield order is the order in which the items' path entries were - added to the working set. - """ - seen = {} - for item in self.entries: - if item not in self.entry_keys: - # workaround a cache issue - continue - - for key in self.entry_keys[item]: - if key not in seen: - seen[key] = 1 - yield self.by_key[key] - - def add(self, dist, entry=None, insert=True, replace=False): - """Add `dist` to working set, associated with `entry` - - If `entry` is unspecified, it defaults to the ``.location`` of `dist`. - On exit from this routine, `entry` is added to the end of the working - set's ``.entries`` (if it wasn't already present). - - `dist` is only added to the working set if it's for a project that - doesn't already have a distribution in the set, unless `replace=True`. - If it's added, any callbacks registered with the ``subscribe()`` method - will be called. - """ - if insert: - dist.insert_on(self.entries, entry, replace=replace) - - if entry is None: - entry = dist.location - keys = self.entry_keys.setdefault(entry, []) - keys2 = self.entry_keys.setdefault(dist.location, []) - if not replace and dist.key in self.by_key: - # ignore hidden distros - return - - self.by_key[dist.key] = dist - if dist.key not in keys: - keys.append(dist.key) - if dist.key not in keys2: - keys2.append(dist.key) - self._added_new(dist) - - def resolve(self, requirements, env=None, installer=None, - replace_conflicting=False, extras=None): - """List all distributions needed to (recursively) meet `requirements` - - `requirements` must be a sequence of ``Requirement`` objects. `env`, - if supplied, should be an ``Environment`` instance. If - not supplied, it defaults to all distributions available within any - entry or distribution in the working set. `installer`, if supplied, - will be invoked with each requirement that cannot be met by an - already-installed distribution; it should return a ``Distribution`` or - ``None``. - - Unless `replace_conflicting=True`, raises a VersionConflict exception - if - any requirements are found on the path that have the correct name but - the wrong version. Otherwise, if an `installer` is supplied it will be - invoked to obtain the correct version of the requirement and activate - it. - - `extras` is a list of the extras to be used with these requirements. - This is important because extra requirements may look like `my_req; - extra = "my_extra"`, which would otherwise be interpreted as a purely - optional requirement. Instead, we want to be able to assert that these - requirements are truly required. - """ - - # set up the stack - requirements = list(requirements)[::-1] - # set of processed requirements - processed = {} - # key -> dist - best = {} - to_activate = [] - - req_extras = _ReqExtras() - - # Mapping of requirement to set of distributions that required it; - # useful for reporting info about conflicts. - required_by = collections.defaultdict(set) - - while requirements: - # process dependencies breadth-first - req = requirements.pop(0) - if req in processed: - # Ignore cyclic or redundant dependencies - continue - - if not req_extras.markers_pass(req, extras): - continue - - dist = best.get(req.key) - if dist is None: - # Find the best distribution and add it to the map - dist = self.by_key.get(req.key) - if dist is None or (dist not in req and replace_conflicting): - ws = self - if env is None: - if dist is None: - env = Environment(self.entries) - else: - # Use an empty environment and workingset to avoid - # any further conflicts with the conflicting - # distribution - env = Environment([]) - ws = WorkingSet([]) - dist = best[req.key] = env.best_match( - req, ws, installer, - replace_conflicting=replace_conflicting - ) - if dist is None: - requirers = required_by.get(req, None) - raise DistributionNotFound(req, requirers) - to_activate.append(dist) - if dist not in req: - # Oops, the "best" so far conflicts with a dependency - dependent_req = required_by[req] - raise VersionConflict(dist, req).with_context(dependent_req) - - # push the new requirements onto the stack - new_requirements = dist.requires(req.extras)[::-1] - requirements.extend(new_requirements) - - # Register the new requirements needed by req - for new_requirement in new_requirements: - required_by[new_requirement].add(req.project_name) - req_extras[new_requirement] = req.extras - - processed[req] = True - - # return list of distros to activate - return to_activate - - def find_plugins( - self, plugin_env, full_env=None, installer=None, fallback=True): - """Find all activatable distributions in `plugin_env` - - Example usage:: - - distributions, errors = working_set.find_plugins( - Environment(plugin_dirlist) - ) - # add plugins+libs to sys.path - map(working_set.add, distributions) - # display errors - print('Could not load', errors) - - The `plugin_env` should be an ``Environment`` instance that contains - only distributions that are in the project's "plugin directory" or - directories. The `full_env`, if supplied, should be an ``Environment`` - contains all currently-available distributions. If `full_env` is not - supplied, one is created automatically from the ``WorkingSet`` this - method is called on, which will typically mean that every directory on - ``sys.path`` will be scanned for distributions. - - `installer` is a standard installer callback as used by the - ``resolve()`` method. The `fallback` flag indicates whether we should - attempt to resolve older versions of a plugin if the newest version - cannot be resolved. - - This method returns a 2-tuple: (`distributions`, `error_info`), where - `distributions` is a list of the distributions found in `plugin_env` - that were loadable, along with any other distributions that are needed - to resolve their dependencies. `error_info` is a dictionary mapping - unloadable plugin distributions to an exception instance describing the - error that occurred. Usually this will be a ``DistributionNotFound`` or - ``VersionConflict`` instance. - """ - - plugin_projects = list(plugin_env) - # scan project names in alphabetic order - plugin_projects.sort() - - error_info = {} - distributions = {} - - if full_env is None: - env = Environment(self.entries) - env += plugin_env - else: - env = full_env + plugin_env - - shadow_set = self.__class__([]) - # put all our entries in shadow_set - list(map(shadow_set.add, self)) - - for project_name in plugin_projects: - - for dist in plugin_env[project_name]: - - req = [dist.as_requirement()] - - try: - resolvees = shadow_set.resolve(req, env, installer) - - except ResolutionError as v: - # save error info - error_info[dist] = v - if fallback: - # try the next older version of project - continue - else: - # give up on this project, keep going - break - - else: - list(map(shadow_set.add, resolvees)) - distributions.update(dict.fromkeys(resolvees)) - - # success, no need to try any more versions of this project - break - - distributions = list(distributions) - distributions.sort() - - return distributions, error_info - - def require(self, *requirements): - """Ensure that distributions matching `requirements` are activated - - `requirements` must be a string or a (possibly-nested) sequence - thereof, specifying the distributions and versions required. The - return value is a sequence of the distributions that needed to be - activated to fulfill the requirements; all relevant distributions are - included, even if they were already activated in this working set. - """ - needed = self.resolve(parse_requirements(requirements)) - - for dist in needed: - self.add(dist) - - return needed - - def subscribe(self, callback, existing=True): - """Invoke `callback` for all distributions - - If `existing=True` (default), - call on all existing ones, as well. - """ - if callback in self.callbacks: - return - self.callbacks.append(callback) - if not existing: - return - for dist in self: - callback(dist) - - def _added_new(self, dist): - for callback in self.callbacks: - callback(dist) - - def __getstate__(self): - return ( - self.entries[:], self.entry_keys.copy(), self.by_key.copy(), - self.callbacks[:] - ) - - def __setstate__(self, e_k_b_c): - entries, keys, by_key, callbacks = e_k_b_c - self.entries = entries[:] - self.entry_keys = keys.copy() - self.by_key = by_key.copy() - self.callbacks = callbacks[:] - - -class _ReqExtras(dict): - """ - Map each requirement to the extras that demanded it. - """ - - def markers_pass(self, req, extras=None): - """ - Evaluate markers for req against each extra that - demanded it. - - Return False if the req has a marker and fails - evaluation. Otherwise, return True. - """ - extra_evals = ( - req.marker.evaluate({'extra': extra}) - for extra in self.get(req, ()) + (extras or (None,)) - ) - return not req.marker or any(extra_evals) - - -class Environment: - """Searchable snapshot of distributions on a search path""" - - def __init__( - self, search_path=None, platform=get_supported_platform(), - python=PY_MAJOR): - """Snapshot distributions available on a search path - - Any distributions found on `search_path` are added to the environment. - `search_path` should be a sequence of ``sys.path`` items. If not - supplied, ``sys.path`` is used. - - `platform` is an optional string specifying the name of the platform - that platform-specific distributions must be compatible with. If - unspecified, it defaults to the current platform. `python` is an - optional string naming the desired version of Python (e.g. ``'3.6'``); - it defaults to the current version. - - You may explicitly set `platform` (and/or `python`) to ``None`` if you - wish to map *all* distributions, not just those compatible with the - running platform or Python version. - """ - self._distmap = {} - self.platform = platform - self.python = python - self.scan(search_path) - - def can_add(self, dist): - """Is distribution `dist` acceptable for this environment? - - The distribution must match the platform and python version - requirements specified when this environment was created, or False - is returned. - """ - py_compat = ( - self.python is None - or dist.py_version is None - or dist.py_version == self.python - ) - return py_compat and compatible_platforms(dist.platform, self.platform) - - def remove(self, dist): - """Remove `dist` from the environment""" - self._distmap[dist.key].remove(dist) - - def scan(self, search_path=None): - """Scan `search_path` for distributions usable in this environment - - Any distributions found are added to the environment. - `search_path` should be a sequence of ``sys.path`` items. If not - supplied, ``sys.path`` is used. Only distributions conforming to - the platform/python version defined at initialization are added. - """ - if search_path is None: - search_path = sys.path - - for item in search_path: - for dist in find_distributions(item): - self.add(dist) - - def __getitem__(self, project_name): - """Return a newest-to-oldest list of distributions for `project_name` - - Uses case-insensitive `project_name` comparison, assuming all the - project's distributions use their project's name converted to all - lowercase as their key. - - """ - distribution_key = project_name.lower() - return self._distmap.get(distribution_key, []) - - def add(self, dist): - """Add `dist` if we ``can_add()`` it and it has not already been added - """ - if self.can_add(dist) and dist.has_version(): - dists = self._distmap.setdefault(dist.key, []) - if dist not in dists: - dists.append(dist) - dists.sort(key=operator.attrgetter('hashcmp'), reverse=True) - - def best_match( - self, req, working_set, installer=None, replace_conflicting=False): - """Find distribution best matching `req` and usable on `working_set` - - This calls the ``find(req)`` method of the `working_set` to see if a - suitable distribution is already active. (This may raise - ``VersionConflict`` if an unsuitable version of the project is already - active in the specified `working_set`.) If a suitable distribution - isn't active, this method returns the newest distribution in the - environment that meets the ``Requirement`` in `req`. If no suitable - distribution is found, and `installer` is supplied, then the result of - calling the environment's ``obtain(req, installer)`` method will be - returned. - """ - try: - dist = working_set.find(req) - except VersionConflict: - if not replace_conflicting: - raise - dist = None - if dist is not None: - return dist - for dist in self[req.key]: - if dist in req: - return dist - # try to download/install - return self.obtain(req, installer) - - def obtain(self, requirement, installer=None): - """Obtain a distribution matching `requirement` (e.g. via download) - - Obtain a distro that matches requirement (e.g. via download). In the - base ``Environment`` class, this routine just returns - ``installer(requirement)``, unless `installer` is None, in which case - None is returned instead. This method is a hook that allows subclasses - to attempt other ways of obtaining a distribution before falling back - to the `installer` argument.""" - if installer is not None: - return installer(requirement) - - def __iter__(self): - """Yield the unique project names of the available distributions""" - for key in self._distmap.keys(): - if self[key]: - yield key - - def __iadd__(self, other): - """In-place addition of a distribution or environment""" - if isinstance(other, Distribution): - self.add(other) - elif isinstance(other, Environment): - for project in other: - for dist in other[project]: - self.add(dist) - else: - raise TypeError("Can't add %r to environment" % (other,)) - return self - - def __add__(self, other): - """Add an environment or distribution to an environment""" - new = self.__class__([], platform=None, python=None) - for env in self, other: - new += env - return new - - -# XXX backward compatibility -AvailableDistributions = Environment - - -class ExtractionError(RuntimeError): - """An error occurred extracting a resource - - The following attributes are available from instances of this exception: - - manager - The resource manager that raised this exception - - cache_path - The base directory for resource extraction - - original_error - The exception instance that caused extraction to fail - """ - - -class ResourceManager: - """Manage resource extraction and packages""" - extraction_path = None - - def __init__(self): - self.cached_files = {} - - def resource_exists(self, package_or_requirement, resource_name): - """Does the named resource exist?""" - return get_provider(package_or_requirement).has_resource(resource_name) - - def resource_isdir(self, package_or_requirement, resource_name): - """Is the named resource an existing directory?""" - return get_provider(package_or_requirement).resource_isdir( - resource_name - ) - - def resource_filename(self, package_or_requirement, resource_name): - """Return a true filesystem path for specified resource""" - return get_provider(package_or_requirement).get_resource_filename( - self, resource_name - ) - - def resource_stream(self, package_or_requirement, resource_name): - """Return a readable file-like object for specified resource""" - return get_provider(package_or_requirement).get_resource_stream( - self, resource_name - ) - - def resource_string(self, package_or_requirement, resource_name): - """Return specified resource as a string""" - return get_provider(package_or_requirement).get_resource_string( - self, resource_name - ) - - def resource_listdir(self, package_or_requirement, resource_name): - """List the contents of the named resource directory""" - return get_provider(package_or_requirement).resource_listdir( - resource_name - ) - - def extraction_error(self): - """Give an error message for problems extracting file(s)""" - - old_exc = sys.exc_info()[1] - cache_path = self.extraction_path or get_default_cache() - - tmpl = textwrap.dedent(""" - Can't extract file(s) to egg cache - - The following error occurred while trying to extract file(s) - to the Python egg cache: - - {old_exc} - - The Python egg cache directory is currently set to: - - {cache_path} - - Perhaps your account does not have write access to this directory? - You can change the cache directory by setting the PYTHON_EGG_CACHE - environment variable to point to an accessible directory. - """).lstrip() - err = ExtractionError(tmpl.format(**locals())) - err.manager = self - err.cache_path = cache_path - err.original_error = old_exc - raise err - - def get_cache_path(self, archive_name, names=()): - """Return absolute location in cache for `archive_name` and `names` - - The parent directory of the resulting path will be created if it does - not already exist. `archive_name` should be the base filename of the - enclosing egg (which may not be the name of the enclosing zipfile!), - including its ".egg" extension. `names`, if provided, should be a - sequence of path name parts "under" the egg's extraction location. - - This method should only be called by resource providers that need to - obtain an extraction location, and only for names they intend to - extract, as it tracks the generated names for possible cleanup later. - """ - extract_path = self.extraction_path or get_default_cache() - target_path = os.path.join(extract_path, archive_name + '-tmp', *names) - try: - _bypass_ensure_directory(target_path) - except Exception: - self.extraction_error() - - self._warn_unsafe_extraction_path(extract_path) - - self.cached_files[target_path] = 1 - return target_path - - @staticmethod - def _warn_unsafe_extraction_path(path): - """ - If the default extraction path is overridden and set to an insecure - location, such as /tmp, it opens up an opportunity for an attacker to - replace an extracted file with an unauthorized payload. Warn the user - if a known insecure location is used. - - See Distribute #375 for more details. - """ - if os.name == 'nt' and not path.startswith(os.environ['windir']): - # On Windows, permissions are generally restrictive by default - # and temp directories are not writable by other users, so - # bypass the warning. - return - mode = os.stat(path).st_mode - if mode & stat.S_IWOTH or mode & stat.S_IWGRP: - msg = ( - "%s is writable by group/others and vulnerable to attack " - "when " - "used with get_resource_filename. Consider a more secure " - "location (set with .set_extraction_path or the " - "PYTHON_EGG_CACHE environment variable)." % path - ) - warnings.warn(msg, UserWarning) - - def postprocess(self, tempname, filename): - """Perform any platform-specific postprocessing of `tempname` - - This is where Mac header rewrites should be done; other platforms don't - have anything special they should do. - - Resource providers should call this method ONLY after successfully - extracting a compressed resource. They must NOT call it on resources - that are already in the filesystem. - - `tempname` is the current (temporary) name of the file, and `filename` - is the name it will be renamed to by the caller after this routine - returns. - """ - - if os.name == 'posix': - # Make the resource executable - mode = ((os.stat(tempname).st_mode) | 0o555) & 0o7777 - os.chmod(tempname, mode) - - def set_extraction_path(self, path): - """Set the base path where resources will be extracted to, if needed. - - If you do not call this routine before any extractions take place, the - path defaults to the return value of ``get_default_cache()``. (Which - is based on the ``PYTHON_EGG_CACHE`` environment variable, with various - platform-specific fallbacks. See that routine's documentation for more - details.) - - Resources are extracted to subdirectories of this path based upon - information given by the ``IResourceProvider``. You may set this to a - temporary directory, but then you must call ``cleanup_resources()`` to - delete the extracted files when done. There is no guarantee that - ``cleanup_resources()`` will be able to remove all extracted files. - - (Note: you may not change the extraction path for a given resource - manager once resources have been extracted, unless you first call - ``cleanup_resources()``.) - """ - if self.cached_files: - raise ValueError( - "Can't change extraction path, files already extracted" - ) - - self.extraction_path = path - - def cleanup_resources(self, force=False): - """ - Delete all extracted resource files and directories, returning a list - of the file and directory names that could not be successfully removed. - This function does not have any concurrency protection, so it should - generally only be called when the extraction path is a temporary - directory exclusive to a single process. This method is not - automatically called; you must call it explicitly or register it as an - ``atexit`` function if you wish to ensure cleanup of a temporary - directory used for extractions. - """ - # XXX - - -def get_default_cache(): - """ - Return the ``PYTHON_EGG_CACHE`` environment variable - or a platform-relevant user cache dir for an app - named "Python-Eggs". - """ - return ( - os.environ.get('PYTHON_EGG_CACHE') - or appdirs.user_cache_dir(appname='Python-Eggs') - ) - - -def safe_name(name): - """Convert an arbitrary string to a standard distribution name - - Any runs of non-alphanumeric/. characters are replaced with a single '-'. - """ - return re.sub('[^A-Za-z0-9.]+', '-', name) - - -def safe_version(version): - """ - Convert an arbitrary string to a standard version string - """ - try: - # normalize the version - return str(packaging.version.Version(version)) - except packaging.version.InvalidVersion: - version = version.replace(' ', '.') - return re.sub('[^A-Za-z0-9.]+', '-', version) - - -def safe_extra(extra): - """Convert an arbitrary string to a standard 'extra' name - - Any runs of non-alphanumeric characters are replaced with a single '_', - and the result is always lowercased. - """ - return re.sub('[^A-Za-z0-9.-]+', '_', extra).lower() - - -def to_filename(name): - """Convert a project or version name to its filename-escaped form - - Any '-' characters are currently replaced with '_'. - """ - return name.replace('-', '_') - - -def invalid_marker(text): - """ - Validate text as a PEP 508 environment marker; return an exception - if invalid or False otherwise. - """ - try: - evaluate_marker(text) - except SyntaxError as e: - e.filename = None - e.lineno = None - return e - return False - - -def evaluate_marker(text, extra=None): - """ - Evaluate a PEP 508 environment marker. - Return a boolean indicating the marker result in this environment. - Raise SyntaxError if marker is invalid. - - This implementation uses the 'pyparsing' module. - """ - try: - marker = packaging.markers.Marker(text) - return marker.evaluate() - except packaging.markers.InvalidMarker as e: - raise SyntaxError(e) - - -class NullProvider: - """Try to implement resources and metadata for arbitrary PEP 302 loaders""" - - egg_name = None - egg_info = None - loader = None - - def __init__(self, module): - self.loader = getattr(module, '__loader__', None) - self.module_path = os.path.dirname(getattr(module, '__file__', '')) - - def get_resource_filename(self, manager, resource_name): - return self._fn(self.module_path, resource_name) - - def get_resource_stream(self, manager, resource_name): - return io.BytesIO(self.get_resource_string(manager, resource_name)) - - def get_resource_string(self, manager, resource_name): - return self._get(self._fn(self.module_path, resource_name)) - - def has_resource(self, resource_name): - return self._has(self._fn(self.module_path, resource_name)) - - def _get_metadata_path(self, name): - return self._fn(self.egg_info, name) - - def has_metadata(self, name): - if not self.egg_info: - return self.egg_info - - path = self._get_metadata_path(name) - return self._has(path) - - def get_metadata(self, name): - if not self.egg_info: - return "" - value = self._get(self._fn(self.egg_info, name)) - return value.decode('utf-8') if six.PY3 else value - - def get_metadata_lines(self, name): - return yield_lines(self.get_metadata(name)) - - def resource_isdir(self, resource_name): - return self._isdir(self._fn(self.module_path, resource_name)) - - def metadata_isdir(self, name): - return self.egg_info and self._isdir(self._fn(self.egg_info, name)) - - def resource_listdir(self, resource_name): - return self._listdir(self._fn(self.module_path, resource_name)) - - def metadata_listdir(self, name): - if self.egg_info: - return self._listdir(self._fn(self.egg_info, name)) - return [] - - def run_script(self, script_name, namespace): - script = 'scripts/' + script_name - if not self.has_metadata(script): - raise ResolutionError( - "Script {script!r} not found in metadata at {self.egg_info!r}" - .format(**locals()), - ) - script_text = self.get_metadata(script).replace('\r\n', '\n') - script_text = script_text.replace('\r', '\n') - script_filename = self._fn(self.egg_info, script) - namespace['__file__'] = script_filename - if os.path.exists(script_filename): - source = open(script_filename).read() - code = compile(source, script_filename, 'exec') - exec(code, namespace, namespace) - else: - from linecache import cache - cache[script_filename] = ( - len(script_text), 0, script_text.split('\n'), script_filename - ) - script_code = compile(script_text, script_filename, 'exec') - exec(script_code, namespace, namespace) - - def _has(self, path): - raise NotImplementedError( - "Can't perform this operation for unregistered loader type" - ) - - def _isdir(self, path): - raise NotImplementedError( - "Can't perform this operation for unregistered loader type" - ) - - def _listdir(self, path): - raise NotImplementedError( - "Can't perform this operation for unregistered loader type" - ) - - def _fn(self, base, resource_name): - self._validate_resource_path(resource_name) - if resource_name: - return os.path.join(base, *resource_name.split('/')) - return base - - @staticmethod - def _validate_resource_path(path): - """ - Validate the resource paths according to the docs. - https://setuptools.readthedocs.io/en/latest/pkg_resources.html#basic-resource-access - - >>> warned = getfixture('recwarn') - >>> warnings.simplefilter('always') - >>> vrp = NullProvider._validate_resource_path - >>> vrp('foo/bar.txt') - >>> bool(warned) - False - >>> vrp('../foo/bar.txt') - >>> bool(warned) - True - >>> warned.clear() - >>> vrp('/foo/bar.txt') - >>> bool(warned) - True - >>> vrp('foo/../../bar.txt') - >>> bool(warned) - True - >>> warned.clear() - >>> vrp('foo/f../bar.txt') - >>> bool(warned) - False - - Windows path separators are straight-up disallowed. - >>> vrp(r'\\foo/bar.txt') - Traceback (most recent call last): - ... - ValueError: Use of .. or absolute path in a resource path \ -is not allowed. - - >>> vrp(r'C:\\foo/bar.txt') - Traceback (most recent call last): - ... - ValueError: Use of .. or absolute path in a resource path \ -is not allowed. - - Blank values are allowed - - >>> vrp('') - >>> bool(warned) - False - - Non-string values are not. - - >>> vrp(None) - Traceback (most recent call last): - ... - AttributeError: ... - """ - invalid = ( - os.path.pardir in path.split(posixpath.sep) or - posixpath.isabs(path) or - ntpath.isabs(path) - ) - if not invalid: - return - - msg = "Use of .. or absolute path in a resource path is not allowed." - - # Aggressively disallow Windows absolute paths - if ntpath.isabs(path) and not posixpath.isabs(path): - raise ValueError(msg) - - # for compatibility, warn; in future - # raise ValueError(msg) - warnings.warn( - msg[:-1] + " and will raise exceptions in a future release.", - DeprecationWarning, - stacklevel=4, - ) - - def _get(self, path): - if hasattr(self.loader, 'get_data'): - return self.loader.get_data(path) - raise NotImplementedError( - "Can't perform this operation for loaders without 'get_data()'" - ) - - -register_loader_type(object, NullProvider) - - -class EggProvider(NullProvider): - """Provider based on a virtual filesystem""" - - def __init__(self, module): - NullProvider.__init__(self, module) - self._setup_prefix() - - def _setup_prefix(self): - # we assume here that our metadata may be nested inside a "basket" - # of multiple eggs; that's why we use module_path instead of .archive - path = self.module_path - old = None - while path != old: - if _is_egg_path(path): - self.egg_name = os.path.basename(path) - self.egg_info = os.path.join(path, 'EGG-INFO') - self.egg_root = path - break - old = path - path, base = os.path.split(path) - - -class DefaultProvider(EggProvider): - """Provides access to package resources in the filesystem""" - - def _has(self, path): - return os.path.exists(path) - - def _isdir(self, path): - return os.path.isdir(path) - - def _listdir(self, path): - return os.listdir(path) - - def get_resource_stream(self, manager, resource_name): - return open(self._fn(self.module_path, resource_name), 'rb') - - def _get(self, path): - with open(path, 'rb') as stream: - return stream.read() - - @classmethod - def _register(cls): - loader_names = 'SourceFileLoader', 'SourcelessFileLoader', - for name in loader_names: - loader_cls = getattr(importlib_machinery, name, type(None)) - register_loader_type(loader_cls, cls) - - -DefaultProvider._register() - - -class EmptyProvider(NullProvider): - """Provider that returns nothing for all requests""" - - module_path = None - - _isdir = _has = lambda self, path: False - - def _get(self, path): - return '' - - def _listdir(self, path): - return [] - - def __init__(self): - pass - - -empty_provider = EmptyProvider() - - -class ZipManifests(dict): - """ - zip manifest builder - """ - - @classmethod - def build(cls, path): - """ - Build a dictionary similar to the zipimport directory - caches, except instead of tuples, store ZipInfo objects. - - Use a platform-specific path separator (os.sep) for the path keys - for compatibility with pypy on Windows. - """ - with zipfile.ZipFile(path) as zfile: - items = ( - ( - name.replace('/', os.sep), - zfile.getinfo(name), - ) - for name in zfile.namelist() - ) - return dict(items) - - load = build - - -class MemoizedZipManifests(ZipManifests): - """ - Memoized zipfile manifests. - """ - manifest_mod = collections.namedtuple('manifest_mod', 'manifest mtime') - - def load(self, path): - """ - Load a manifest at path or return a suitable manifest already loaded. - """ - path = os.path.normpath(path) - mtime = os.stat(path).st_mtime - - if path not in self or self[path].mtime != mtime: - manifest = self.build(path) - self[path] = self.manifest_mod(manifest, mtime) - - return self[path].manifest - - -class ZipProvider(EggProvider): - """Resource support for zips and eggs""" - - eagers = None - _zip_manifests = MemoizedZipManifests() - - def __init__(self, module): - EggProvider.__init__(self, module) - self.zip_pre = self.loader.archive + os.sep - - def _zipinfo_name(self, fspath): - # Convert a virtual filename (full path to file) into a zipfile subpath - # usable with the zipimport directory cache for our target archive - fspath = fspath.rstrip(os.sep) - if fspath == self.loader.archive: - return '' - if fspath.startswith(self.zip_pre): - return fspath[len(self.zip_pre):] - raise AssertionError( - "%s is not a subpath of %s" % (fspath, self.zip_pre) - ) - - def _parts(self, zip_path): - # Convert a zipfile subpath into an egg-relative path part list. - # pseudo-fs path - fspath = self.zip_pre + zip_path - if fspath.startswith(self.egg_root + os.sep): - return fspath[len(self.egg_root) + 1:].split(os.sep) - raise AssertionError( - "%s is not a subpath of %s" % (fspath, self.egg_root) - ) - - @property - def zipinfo(self): - return self._zip_manifests.load(self.loader.archive) - - def get_resource_filename(self, manager, resource_name): - if not self.egg_name: - raise NotImplementedError( - "resource_filename() only supported for .egg, not .zip" - ) - # no need to lock for extraction, since we use temp names - zip_path = self._resource_to_zip(resource_name) - eagers = self._get_eager_resources() - if '/'.join(self._parts(zip_path)) in eagers: - for name in eagers: - self._extract_resource(manager, self._eager_to_zip(name)) - return self._extract_resource(manager, zip_path) - - @staticmethod - def _get_date_and_size(zip_stat): - size = zip_stat.file_size - # ymdhms+wday, yday, dst - date_time = zip_stat.date_time + (0, 0, -1) - # 1980 offset already done - timestamp = time.mktime(date_time) - return timestamp, size - - def _extract_resource(self, manager, zip_path): - - if zip_path in self._index(): - for name in self._index()[zip_path]: - last = self._extract_resource( - manager, os.path.join(zip_path, name) - ) - # return the extracted directory name - return os.path.dirname(last) - - timestamp, size = self._get_date_and_size(self.zipinfo[zip_path]) - - if not WRITE_SUPPORT: - raise IOError('"os.rename" and "os.unlink" are not supported ' - 'on this platform') - try: - - real_path = manager.get_cache_path( - self.egg_name, self._parts(zip_path) - ) - - if self._is_current(real_path, zip_path): - return real_path - - outf, tmpnam = _mkstemp( - ".$extract", - dir=os.path.dirname(real_path), - ) - os.write(outf, self.loader.get_data(zip_path)) - os.close(outf) - utime(tmpnam, (timestamp, timestamp)) - manager.postprocess(tmpnam, real_path) - - try: - rename(tmpnam, real_path) - - except os.error: - if os.path.isfile(real_path): - if self._is_current(real_path, zip_path): - # the file became current since it was checked above, - # so proceed. - return real_path - # Windows, del old file and retry - elif os.name == 'nt': - unlink(real_path) - rename(tmpnam, real_path) - return real_path - raise - - except os.error: - # report a user-friendly error - manager.extraction_error() - - return real_path - - def _is_current(self, file_path, zip_path): - """ - Return True if the file_path is current for this zip_path - """ - timestamp, size = self._get_date_and_size(self.zipinfo[zip_path]) - if not os.path.isfile(file_path): - return False - stat = os.stat(file_path) - if stat.st_size != size or stat.st_mtime != timestamp: - return False - # check that the contents match - zip_contents = self.loader.get_data(zip_path) - with open(file_path, 'rb') as f: - file_contents = f.read() - return zip_contents == file_contents - - def _get_eager_resources(self): - if self.eagers is None: - eagers = [] - for name in ('native_libs.txt', 'eager_resources.txt'): - if self.has_metadata(name): - eagers.extend(self.get_metadata_lines(name)) - self.eagers = eagers - return self.eagers - - def _index(self): - try: - return self._dirindex - except AttributeError: - ind = {} - for path in self.zipinfo: - parts = path.split(os.sep) - while parts: - parent = os.sep.join(parts[:-1]) - if parent in ind: - ind[parent].append(parts[-1]) - break - else: - ind[parent] = [parts.pop()] - self._dirindex = ind - return ind - - def _has(self, fspath): - zip_path = self._zipinfo_name(fspath) - return zip_path in self.zipinfo or zip_path in self._index() - - def _isdir(self, fspath): - return self._zipinfo_name(fspath) in self._index() - - def _listdir(self, fspath): - return list(self._index().get(self._zipinfo_name(fspath), ())) - - def _eager_to_zip(self, resource_name): - return self._zipinfo_name(self._fn(self.egg_root, resource_name)) - - def _resource_to_zip(self, resource_name): - return self._zipinfo_name(self._fn(self.module_path, resource_name)) - - -register_loader_type(zipimport.zipimporter, ZipProvider) - - -class FileMetadata(EmptyProvider): - """Metadata handler for standalone PKG-INFO files - - Usage:: - - metadata = FileMetadata("/path/to/PKG-INFO") - - This provider rejects all data and metadata requests except for PKG-INFO, - which is treated as existing, and will be the contents of the file at - the provided location. - """ - - def __init__(self, path): - self.path = path - - def _get_metadata_path(self, name): - return self.path - - def has_metadata(self, name): - return name == 'PKG-INFO' and os.path.isfile(self.path) - - def get_metadata(self, name): - if name != 'PKG-INFO': - raise KeyError("No metadata except PKG-INFO is available") - - with io.open(self.path, encoding='utf-8', errors="replace") as f: - metadata = f.read() - self._warn_on_replacement(metadata) - return metadata - - def _warn_on_replacement(self, metadata): - # Python 2.7 compat for: replacement_char = '�' - replacement_char = b'\xef\xbf\xbd'.decode('utf-8') - if replacement_char in metadata: - tmpl = "{self.path} could not be properly decoded in UTF-8" - msg = tmpl.format(**locals()) - warnings.warn(msg) - - def get_metadata_lines(self, name): - return yield_lines(self.get_metadata(name)) - - -class PathMetadata(DefaultProvider): - """Metadata provider for egg directories - - Usage:: - - # Development eggs: - - egg_info = "/path/to/PackageName.egg-info" - base_dir = os.path.dirname(egg_info) - metadata = PathMetadata(base_dir, egg_info) - dist_name = os.path.splitext(os.path.basename(egg_info))[0] - dist = Distribution(basedir, project_name=dist_name, metadata=metadata) - - # Unpacked egg directories: - - egg_path = "/path/to/PackageName-ver-pyver-etc.egg" - metadata = PathMetadata(egg_path, os.path.join(egg_path,'EGG-INFO')) - dist = Distribution.from_filename(egg_path, metadata=metadata) - """ - - def __init__(self, path, egg_info): - self.module_path = path - self.egg_info = egg_info - - -class EggMetadata(ZipProvider): - """Metadata provider for .egg files""" - - def __init__(self, importer): - """Create a metadata provider from a zipimporter""" - - self.zip_pre = importer.archive + os.sep - self.loader = importer - if importer.prefix: - self.module_path = os.path.join(importer.archive, importer.prefix) - else: - self.module_path = importer.archive - self._setup_prefix() - - -_declare_state('dict', _distribution_finders={}) - - -def register_finder(importer_type, distribution_finder): - """Register `distribution_finder` to find distributions in sys.path items - - `importer_type` is the type or class of a PEP 302 "Importer" (sys.path item - handler), and `distribution_finder` is a callable that, passed a path - item and the importer instance, yields ``Distribution`` instances found on - that path item. See ``pkg_resources.find_on_path`` for an example.""" - _distribution_finders[importer_type] = distribution_finder - - -def find_distributions(path_item, only=False): - """Yield distributions accessible via `path_item`""" - importer = get_importer(path_item) - finder = _find_adapter(_distribution_finders, importer) - return finder(importer, path_item, only) - - -def find_eggs_in_zip(importer, path_item, only=False): - """ - Find eggs in zip files; possibly multiple nested eggs. - """ - if importer.archive.endswith('.whl'): - # wheels are not supported with this finder - # they don't have PKG-INFO metadata, and won't ever contain eggs - return - metadata = EggMetadata(importer) - if metadata.has_metadata('PKG-INFO'): - yield Distribution.from_filename(path_item, metadata=metadata) - if only: - # don't yield nested distros - return - for subitem in metadata.resource_listdir(''): - if _is_egg_path(subitem): - subpath = os.path.join(path_item, subitem) - dists = find_eggs_in_zip(zipimport.zipimporter(subpath), subpath) - for dist in dists: - yield dist - elif subitem.lower().endswith('.dist-info'): - subpath = os.path.join(path_item, subitem) - submeta = EggMetadata(zipimport.zipimporter(subpath)) - submeta.egg_info = subpath - yield Distribution.from_location(path_item, subitem, submeta) - - -register_finder(zipimport.zipimporter, find_eggs_in_zip) - - -def find_nothing(importer, path_item, only=False): - return () - - -register_finder(object, find_nothing) - - -def _by_version_descending(names): - """ - Given a list of filenames, return them in descending order - by version number. - - >>> names = 'bar', 'foo', 'Python-2.7.10.egg', 'Python-2.7.2.egg' - >>> _by_version_descending(names) - ['Python-2.7.10.egg', 'Python-2.7.2.egg', 'foo', 'bar'] - >>> names = 'Setuptools-1.2.3b1.egg', 'Setuptools-1.2.3.egg' - >>> _by_version_descending(names) - ['Setuptools-1.2.3.egg', 'Setuptools-1.2.3b1.egg'] - >>> names = 'Setuptools-1.2.3b1.egg', 'Setuptools-1.2.3.post1.egg' - >>> _by_version_descending(names) - ['Setuptools-1.2.3.post1.egg', 'Setuptools-1.2.3b1.egg'] - """ - def _by_version(name): - """ - Parse each component of the filename - """ - name, ext = os.path.splitext(name) - parts = itertools.chain(name.split('-'), [ext]) - return [packaging.version.parse(part) for part in parts] - - return sorted(names, key=_by_version, reverse=True) - - -def find_on_path(importer, path_item, only=False): - """Yield distributions accessible on a sys.path directory""" - path_item = _normalize_cached(path_item) - - if _is_unpacked_egg(path_item): - yield Distribution.from_filename( - path_item, metadata=PathMetadata( - path_item, os.path.join(path_item, 'EGG-INFO') - ) - ) - return - - entries = safe_listdir(path_item) - - # for performance, before sorting by version, - # screen entries for only those that will yield - # distributions - filtered = ( - entry - for entry in entries - if dist_factory(path_item, entry, only) - ) - - # scan for .egg and .egg-info in directory - path_item_entries = _by_version_descending(filtered) - for entry in path_item_entries: - fullpath = os.path.join(path_item, entry) - factory = dist_factory(path_item, entry, only) - for dist in factory(fullpath): - yield dist - - -def dist_factory(path_item, entry, only): - """ - Return a dist_factory for a path_item and entry - """ - lower = entry.lower() - is_meta = any(map(lower.endswith, ('.egg-info', '.dist-info'))) - return ( - distributions_from_metadata - if is_meta else - find_distributions - if not only and _is_egg_path(entry) else - resolve_egg_link - if not only and lower.endswith('.egg-link') else - NoDists() - ) - - -class NoDists: - """ - >>> bool(NoDists()) - False - - >>> list(NoDists()('anything')) - [] - """ - def __bool__(self): - return False - if six.PY2: - __nonzero__ = __bool__ - - def __call__(self, fullpath): - return iter(()) - - -def safe_listdir(path): - """ - Attempt to list contents of path, but suppress some exceptions. - """ - try: - return os.listdir(path) - except (PermissionError, NotADirectoryError): - pass - except OSError as e: - # Ignore the directory if does not exist, not a directory or - # permission denied - ignorable = ( - e.errno in (errno.ENOTDIR, errno.EACCES, errno.ENOENT) - # Python 2 on Windows needs to be handled this way :( - or getattr(e, "winerror", None) == 267 - ) - if not ignorable: - raise - return () - - -def distributions_from_metadata(path): - root = os.path.dirname(path) - if os.path.isdir(path): - if len(os.listdir(path)) == 0: - # empty metadata dir; skip - return - metadata = PathMetadata(root, path) - else: - metadata = FileMetadata(path) - entry = os.path.basename(path) - yield Distribution.from_location( - root, entry, metadata, precedence=DEVELOP_DIST, - ) - - -def non_empty_lines(path): - """ - Yield non-empty lines from file at path - """ - with open(path) as f: - for line in f: - line = line.strip() - if line: - yield line - - -def resolve_egg_link(path): - """ - Given a path to an .egg-link, resolve distributions - present in the referenced path. - """ - referenced_paths = non_empty_lines(path) - resolved_paths = ( - os.path.join(os.path.dirname(path), ref) - for ref in referenced_paths - ) - dist_groups = map(find_distributions, resolved_paths) - return next(dist_groups, ()) - - -register_finder(pkgutil.ImpImporter, find_on_path) - -if hasattr(importlib_machinery, 'FileFinder'): - register_finder(importlib_machinery.FileFinder, find_on_path) - -_declare_state('dict', _namespace_handlers={}) -_declare_state('dict', _namespace_packages={}) - - -def register_namespace_handler(importer_type, namespace_handler): - """Register `namespace_handler` to declare namespace packages - - `importer_type` is the type or class of a PEP 302 "Importer" (sys.path item - handler), and `namespace_handler` is a callable like this:: - - def namespace_handler(importer, path_entry, moduleName, module): - # return a path_entry to use for child packages - - Namespace handlers are only called if the importer object has already - agreed that it can handle the relevant path item, and they should only - return a subpath if the module __path__ does not already contain an - equivalent subpath. For an example namespace handler, see - ``pkg_resources.file_ns_handler``. - """ - _namespace_handlers[importer_type] = namespace_handler - - -def _handle_ns(packageName, path_item): - """Ensure that named package includes a subpath of path_item (if needed)""" - - importer = get_importer(path_item) - if importer is None: - return None - - # capture warnings due to #1111 - with warnings.catch_warnings(): - warnings.simplefilter("ignore") - loader = importer.find_module(packageName) - - if loader is None: - return None - module = sys.modules.get(packageName) - if module is None: - module = sys.modules[packageName] = types.ModuleType(packageName) - module.__path__ = [] - _set_parent_ns(packageName) - elif not hasattr(module, '__path__'): - raise TypeError("Not a package:", packageName) - handler = _find_adapter(_namespace_handlers, importer) - subpath = handler(importer, path_item, packageName, module) - if subpath is not None: - path = module.__path__ - path.append(subpath) - loader.load_module(packageName) - _rebuild_mod_path(path, packageName, module) - return subpath - - -def _rebuild_mod_path(orig_path, package_name, module): - """ - Rebuild module.__path__ ensuring that all entries are ordered - corresponding to their sys.path order - """ - sys_path = [_normalize_cached(p) for p in sys.path] - - def safe_sys_path_index(entry): - """ - Workaround for #520 and #513. - """ - try: - return sys_path.index(entry) - except ValueError: - return float('inf') - - def position_in_sys_path(path): - """ - Return the ordinal of the path based on its position in sys.path - """ - path_parts = path.split(os.sep) - module_parts = package_name.count('.') + 1 - parts = path_parts[:-module_parts] - return safe_sys_path_index(_normalize_cached(os.sep.join(parts))) - - new_path = sorted(orig_path, key=position_in_sys_path) - new_path = [_normalize_cached(p) for p in new_path] - - if isinstance(module.__path__, list): - module.__path__[:] = new_path - else: - module.__path__ = new_path - - -def declare_namespace(packageName): - """Declare that package 'packageName' is a namespace package""" - - _imp.acquire_lock() - try: - if packageName in _namespace_packages: - return - - path = sys.path - parent, _, _ = packageName.rpartition('.') - - if parent: - declare_namespace(parent) - if parent not in _namespace_packages: - __import__(parent) - try: - path = sys.modules[parent].__path__ - except AttributeError: - raise TypeError("Not a package:", parent) - - # Track what packages are namespaces, so when new path items are added, - # they can be updated - _namespace_packages.setdefault(parent or None, []).append(packageName) - _namespace_packages.setdefault(packageName, []) - - for path_item in path: - # Ensure all the parent's path items are reflected in the child, - # if they apply - _handle_ns(packageName, path_item) - - finally: - _imp.release_lock() - - -def fixup_namespace_packages(path_item, parent=None): - """Ensure that previously-declared namespace packages include path_item""" - _imp.acquire_lock() - try: - for package in _namespace_packages.get(parent, ()): - subpath = _handle_ns(package, path_item) - if subpath: - fixup_namespace_packages(subpath, package) - finally: - _imp.release_lock() - - -def file_ns_handler(importer, path_item, packageName, module): - """Compute an ns-package subpath for a filesystem or zipfile importer""" - - subpath = os.path.join(path_item, packageName.split('.')[-1]) - normalized = _normalize_cached(subpath) - for item in module.__path__: - if _normalize_cached(item) == normalized: - break - else: - # Only return the path if it's not already there - return subpath - - -register_namespace_handler(pkgutil.ImpImporter, file_ns_handler) -register_namespace_handler(zipimport.zipimporter, file_ns_handler) - -if hasattr(importlib_machinery, 'FileFinder'): - register_namespace_handler(importlib_machinery.FileFinder, file_ns_handler) - - -def null_ns_handler(importer, path_item, packageName, module): - return None - - -register_namespace_handler(object, null_ns_handler) - - -def normalize_path(filename): - """Normalize a file/dir name for comparison purposes""" - return os.path.normcase(os.path.realpath(os.path.normpath(_cygwin_patch(filename)))) - - -def _cygwin_patch(filename): # pragma: nocover - """ - Contrary to POSIX 2008, on Cygwin, getcwd (3) contains - symlink components. Using - os.path.abspath() works around this limitation. A fix in os.getcwd() - would probably better, in Cygwin even more so, except - that this seems to be by design... - """ - return os.path.abspath(filename) if sys.platform == 'cygwin' else filename - - -def _normalize_cached(filename, _cache={}): - try: - return _cache[filename] - except KeyError: - _cache[filename] = result = normalize_path(filename) - return result - - -def _is_egg_path(path): - """ - Determine if given path appears to be an egg. - """ - return path.lower().endswith('.egg') - - -def _is_unpacked_egg(path): - """ - Determine if given path appears to be an unpacked egg. - """ - return ( - _is_egg_path(path) and - os.path.isfile(os.path.join(path, 'EGG-INFO', 'PKG-INFO')) - ) - - -def _set_parent_ns(packageName): - parts = packageName.split('.') - name = parts.pop() - if parts: - parent = '.'.join(parts) - setattr(sys.modules[parent], name, sys.modules[packageName]) - - -def yield_lines(strs): - """Yield non-empty/non-comment lines of a string or sequence""" - if isinstance(strs, six.string_types): - for s in strs.splitlines(): - s = s.strip() - # skip blank lines/comments - if s and not s.startswith('#'): - yield s - else: - for ss in strs: - for s in yield_lines(ss): - yield s - - -MODULE = re.compile(r"\w+(\.\w+)*$").match -EGG_NAME = re.compile( - r""" - (?P<name>[^-]+) ( - -(?P<ver>[^-]+) ( - -py(?P<pyver>[^-]+) ( - -(?P<plat>.+) - )? - )? - )? - """, - re.VERBOSE | re.IGNORECASE, -).match - - -class EntryPoint: - """Object representing an advertised importable object""" - - def __init__(self, name, module_name, attrs=(), extras=(), dist=None): - if not MODULE(module_name): - raise ValueError("Invalid module name", module_name) - self.name = name - self.module_name = module_name - self.attrs = tuple(attrs) - self.extras = tuple(extras) - self.dist = dist - - def __str__(self): - s = "%s = %s" % (self.name, self.module_name) - if self.attrs: - s += ':' + '.'.join(self.attrs) - if self.extras: - s += ' [%s]' % ','.join(self.extras) - return s - - def __repr__(self): - return "EntryPoint.parse(%r)" % str(self) - - def load(self, require=True, *args, **kwargs): - """ - Require packages for this EntryPoint, then resolve it. - """ - if not require or args or kwargs: - warnings.warn( - "Parameters to load are deprecated. Call .resolve and " - ".require separately.", - PkgResourcesDeprecationWarning, - stacklevel=2, - ) - if require: - self.require(*args, **kwargs) - return self.resolve() - - def resolve(self): - """ - Resolve the entry point from its module and attrs. - """ - module = __import__(self.module_name, fromlist=['__name__'], level=0) - try: - return functools.reduce(getattr, self.attrs, module) - except AttributeError as exc: - raise ImportError(str(exc)) - - def require(self, env=None, installer=None): - if self.extras and not self.dist: - raise UnknownExtra("Can't require() without a distribution", self) - - # Get the requirements for this entry point with all its extras and - # then resolve them. We have to pass `extras` along when resolving so - # that the working set knows what extras we want. Otherwise, for - # dist-info distributions, the working set will assume that the - # requirements for that extra are purely optional and skip over them. - reqs = self.dist.requires(self.extras) - items = working_set.resolve(reqs, env, installer, extras=self.extras) - list(map(working_set.add, items)) - - pattern = re.compile( - r'\s*' - r'(?P<name>.+?)\s*' - r'=\s*' - r'(?P<module>[\w.]+)\s*' - r'(:\s*(?P<attr>[\w.]+))?\s*' - r'(?P<extras>\[.*\])?\s*$' - ) - - @classmethod - def parse(cls, src, dist=None): - """Parse a single entry point from string `src` - - Entry point syntax follows the form:: - - name = some.module:some.attr [extra1, extra2] - - The entry name and module name are required, but the ``:attrs`` and - ``[extras]`` parts are optional - """ - m = cls.pattern.match(src) - if not m: - msg = "EntryPoint must be in 'name=module:attrs [extras]' format" - raise ValueError(msg, src) - res = m.groupdict() - extras = cls._parse_extras(res['extras']) - attrs = res['attr'].split('.') if res['attr'] else () - return cls(res['name'], res['module'], attrs, extras, dist) - - @classmethod - def _parse_extras(cls, extras_spec): - if not extras_spec: - return () - req = Requirement.parse('x' + extras_spec) - if req.specs: - raise ValueError() - return req.extras - - @classmethod - def parse_group(cls, group, lines, dist=None): - """Parse an entry point group""" - if not MODULE(group): - raise ValueError("Invalid group name", group) - this = {} - for line in yield_lines(lines): - ep = cls.parse(line, dist) - if ep.name in this: - raise ValueError("Duplicate entry point", group, ep.name) - this[ep.name] = ep - return this - - @classmethod - def parse_map(cls, data, dist=None): - """Parse a map of entry point groups""" - if isinstance(data, dict): - data = data.items() - else: - data = split_sections(data) - maps = {} - for group, lines in data: - if group is None: - if not lines: - continue - raise ValueError("Entry points must be listed in groups") - group = group.strip() - if group in maps: - raise ValueError("Duplicate group name", group) - maps[group] = cls.parse_group(group, lines, dist) - return maps - - -def _remove_md5_fragment(location): - if not location: - return '' - parsed = urllib.parse.urlparse(location) - if parsed[-1].startswith('md5='): - return urllib.parse.urlunparse(parsed[:-1] + ('',)) - return location - - -def _version_from_file(lines): - """ - Given an iterable of lines from a Metadata file, return - the value of the Version field, if present, or None otherwise. - """ - def is_version_line(line): - return line.lower().startswith('version:') - version_lines = filter(is_version_line, lines) - line = next(iter(version_lines), '') - _, _, value = line.partition(':') - return safe_version(value.strip()) or None - - -class Distribution: - """Wrap an actual or potential sys.path entry w/metadata""" - PKG_INFO = 'PKG-INFO' - - def __init__( - self, location=None, metadata=None, project_name=None, - version=None, py_version=PY_MAJOR, platform=None, - precedence=EGG_DIST): - self.project_name = safe_name(project_name or 'Unknown') - if version is not None: - self._version = safe_version(version) - self.py_version = py_version - self.platform = platform - self.location = location - self.precedence = precedence - self._provider = metadata or empty_provider - - @classmethod - def from_location(cls, location, basename, metadata=None, **kw): - project_name, version, py_version, platform = [None] * 4 - basename, ext = os.path.splitext(basename) - if ext.lower() in _distributionImpl: - cls = _distributionImpl[ext.lower()] - - match = EGG_NAME(basename) - if match: - project_name, version, py_version, platform = match.group( - 'name', 'ver', 'pyver', 'plat' - ) - return cls( - location, metadata, project_name=project_name, version=version, - py_version=py_version, platform=platform, **kw - )._reload_version() - - def _reload_version(self): - return self - - @property - def hashcmp(self): - return ( - self.parsed_version, - self.precedence, - self.key, - _remove_md5_fragment(self.location), - self.py_version or '', - self.platform or '', - ) - - def __hash__(self): - return hash(self.hashcmp) - - def __lt__(self, other): - return self.hashcmp < other.hashcmp - - def __le__(self, other): - return self.hashcmp <= other.hashcmp - - def __gt__(self, other): - return self.hashcmp > other.hashcmp - - def __ge__(self, other): - return self.hashcmp >= other.hashcmp - - def __eq__(self, other): - if not isinstance(other, self.__class__): - # It's not a Distribution, so they are not equal - return False - return self.hashcmp == other.hashcmp - - def __ne__(self, other): - return not self == other - - # These properties have to be lazy so that we don't have to load any - # metadata until/unless it's actually needed. (i.e., some distributions - # may not know their name or version without loading PKG-INFO) - - @property - def key(self): - try: - return self._key - except AttributeError: - self._key = key = self.project_name.lower() - return key - - @property - def parsed_version(self): - if not hasattr(self, "_parsed_version"): - self._parsed_version = parse_version(self.version) - - return self._parsed_version - - def _warn_legacy_version(self): - LV = packaging.version.LegacyVersion - is_legacy = isinstance(self._parsed_version, LV) - if not is_legacy: - return - - # While an empty version is technically a legacy version and - # is not a valid PEP 440 version, it's also unlikely to - # actually come from someone and instead it is more likely that - # it comes from setuptools attempting to parse a filename and - # including it in the list. So for that we'll gate this warning - # on if the version is anything at all or not. - if not self.version: - return - - tmpl = textwrap.dedent(""" - '{project_name} ({version})' is being parsed as a legacy, - non PEP 440, - version. You may find odd behavior and sort order. - In particular it will be sorted as less than 0.0. It - is recommended to migrate to PEP 440 compatible - versions. - """).strip().replace('\n', ' ') - - warnings.warn(tmpl.format(**vars(self)), PEP440Warning) - - @property - def version(self): - try: - return self._version - except AttributeError: - version = self._get_version() - if version is None: - path = self._get_metadata_path_for_display(self.PKG_INFO) - msg = ( - "Missing 'Version:' header and/or {} file at path: {}" - ).format(self.PKG_INFO, path) - raise ValueError(msg, self) - - return version - - @property - def _dep_map(self): - """ - A map of extra to its list of (direct) requirements - for this distribution, including the null extra. - """ - try: - return self.__dep_map - except AttributeError: - self.__dep_map = self._filter_extras(self._build_dep_map()) - return self.__dep_map - - @staticmethod - def _filter_extras(dm): - """ - Given a mapping of extras to dependencies, strip off - environment markers and filter out any dependencies - not matching the markers. - """ - for extra in list(filter(None, dm)): - new_extra = extra - reqs = dm.pop(extra) - new_extra, _, marker = extra.partition(':') - fails_marker = marker and ( - invalid_marker(marker) - or not evaluate_marker(marker) - ) - if fails_marker: - reqs = [] - new_extra = safe_extra(new_extra) or None - - dm.setdefault(new_extra, []).extend(reqs) - return dm - - def _build_dep_map(self): - dm = {} - for name in 'requires.txt', 'depends.txt': - for extra, reqs in split_sections(self._get_metadata(name)): - dm.setdefault(extra, []).extend(parse_requirements(reqs)) - return dm - - def requires(self, extras=()): - """List of Requirements needed for this distro if `extras` are used""" - dm = self._dep_map - deps = [] - deps.extend(dm.get(None, ())) - for ext in extras: - try: - deps.extend(dm[safe_extra(ext)]) - except KeyError: - raise UnknownExtra( - "%s has no such extra feature %r" % (self, ext) - ) - return deps - - def _get_metadata_path_for_display(self, name): - """ - Return the path to the given metadata file, if available. - """ - try: - # We need to access _get_metadata_path() on the provider object - # directly rather than through this class's __getattr__() - # since _get_metadata_path() is marked private. - path = self._provider._get_metadata_path(name) - - # Handle exceptions e.g. in case the distribution's metadata - # provider doesn't support _get_metadata_path(). - except Exception: - return '[could not detect]' - - return path - - def _get_metadata(self, name): - if self.has_metadata(name): - for line in self.get_metadata_lines(name): - yield line - - def _get_version(self): - lines = self._get_metadata(self.PKG_INFO) - version = _version_from_file(lines) - - return version - - def activate(self, path=None, replace=False): - """Ensure distribution is importable on `path` (default=sys.path)""" - if path is None: - path = sys.path - self.insert_on(path, replace=replace) - if path is sys.path: - fixup_namespace_packages(self.location) - for pkg in self._get_metadata('namespace_packages.txt'): - if pkg in sys.modules: - declare_namespace(pkg) - - def egg_name(self): - """Return what this distribution's standard .egg filename should be""" - filename = "%s-%s-py%s" % ( - to_filename(self.project_name), to_filename(self.version), - self.py_version or PY_MAJOR - ) - - if self.platform: - filename += '-' + self.platform - return filename - - def __repr__(self): - if self.location: - return "%s (%s)" % (self, self.location) - else: - return str(self) - - def __str__(self): - try: - version = getattr(self, 'version', None) - except ValueError: - version = None - version = version or "[unknown version]" - return "%s %s" % (self.project_name, version) - - def __getattr__(self, attr): - """Delegate all unrecognized public attributes to .metadata provider""" - if attr.startswith('_'): - raise AttributeError(attr) - return getattr(self._provider, attr) - - def __dir__(self): - return list( - set(super(Distribution, self).__dir__()) - | set( - attr for attr in self._provider.__dir__() - if not attr.startswith('_') - ) - ) - - if not hasattr(object, '__dir__'): - # python 2.7 not supported - del __dir__ - - @classmethod - def from_filename(cls, filename, metadata=None, **kw): - return cls.from_location( - _normalize_cached(filename), os.path.basename(filename), metadata, - **kw - ) - - def as_requirement(self): - """Return a ``Requirement`` that matches this distribution exactly""" - if isinstance(self.parsed_version, packaging.version.Version): - spec = "%s==%s" % (self.project_name, self.parsed_version) - else: - spec = "%s===%s" % (self.project_name, self.parsed_version) - - return Requirement.parse(spec) - - def load_entry_point(self, group, name): - """Return the `name` entry point of `group` or raise ImportError""" - ep = self.get_entry_info(group, name) - if ep is None: - raise ImportError("Entry point %r not found" % ((group, name),)) - return ep.load() - - def get_entry_map(self, group=None): - """Return the entry point map for `group`, or the full entry map""" - try: - ep_map = self._ep_map - except AttributeError: - ep_map = self._ep_map = EntryPoint.parse_map( - self._get_metadata('entry_points.txt'), self - ) - if group is not None: - return ep_map.get(group, {}) - return ep_map - - def get_entry_info(self, group, name): - """Return the EntryPoint object for `group`+`name`, or ``None``""" - return self.get_entry_map(group).get(name) - - def insert_on(self, path, loc=None, replace=False): - """Ensure self.location is on path - - If replace=False (default): - - If location is already in path anywhere, do nothing. - - Else: - - If it's an egg and its parent directory is on path, - insert just ahead of the parent. - - Else: add to the end of path. - If replace=True: - - If location is already on path anywhere (not eggs) - or higher priority than its parent (eggs) - do nothing. - - Else: - - If it's an egg and its parent directory is on path, - insert just ahead of the parent, - removing any lower-priority entries. - - Else: add it to the front of path. - """ - - loc = loc or self.location - if not loc: - return - - nloc = _normalize_cached(loc) - bdir = os.path.dirname(nloc) - npath = [(p and _normalize_cached(p) or p) for p in path] - - for p, item in enumerate(npath): - if item == nloc: - if replace: - break - else: - # don't modify path (even removing duplicates) if - # found and not replace - return - elif item == bdir and self.precedence == EGG_DIST: - # if it's an .egg, give it precedence over its directory - # UNLESS it's already been added to sys.path and replace=False - if (not replace) and nloc in npath[p:]: - return - if path is sys.path: - self.check_version_conflict() - path.insert(p, loc) - npath.insert(p, nloc) - break - else: - if path is sys.path: - self.check_version_conflict() - if replace: - path.insert(0, loc) - else: - path.append(loc) - return - - # p is the spot where we found or inserted loc; now remove duplicates - while True: - try: - np = npath.index(nloc, p + 1) - except ValueError: - break - else: - del npath[np], path[np] - # ha! - p = np - - return - - def check_version_conflict(self): - if self.key == 'setuptools': - # ignore the inevitable setuptools self-conflicts :( - return - - nsp = dict.fromkeys(self._get_metadata('namespace_packages.txt')) - loc = normalize_path(self.location) - for modname in self._get_metadata('top_level.txt'): - if (modname not in sys.modules or modname in nsp - or modname in _namespace_packages): - continue - if modname in ('pkg_resources', 'setuptools', 'site'): - continue - fn = getattr(sys.modules[modname], '__file__', None) - if fn and (normalize_path(fn).startswith(loc) or - fn.startswith(self.location)): - continue - issue_warning( - "Module %s was already imported from %s, but %s is being added" - " to sys.path" % (modname, fn, self.location), - ) - - def has_version(self): - try: - self.version - except ValueError: - issue_warning("Unbuilt egg for " + repr(self)) - return False - return True - - def clone(self, **kw): - """Copy this distribution, substituting in any changed keyword args""" - names = 'project_name version py_version platform location precedence' - for attr in names.split(): - kw.setdefault(attr, getattr(self, attr, None)) - kw.setdefault('metadata', self._provider) - return self.__class__(**kw) - - @property - def extras(self): - return [dep for dep in self._dep_map if dep] - - -class EggInfoDistribution(Distribution): - def _reload_version(self): - """ - Packages installed by distutils (e.g. numpy or scipy), - which uses an old safe_version, and so - their version numbers can get mangled when - converted to filenames (e.g., 1.11.0.dev0+2329eae to - 1.11.0.dev0_2329eae). These distributions will not be - parsed properly - downstream by Distribution and safe_version, so - take an extra step and try to get the version number from - the metadata file itself instead of the filename. - """ - md_version = self._get_version() - if md_version: - self._version = md_version - return self - - -class DistInfoDistribution(Distribution): - """ - Wrap an actual or potential sys.path entry - w/metadata, .dist-info style. - """ - PKG_INFO = 'METADATA' - EQEQ = re.compile(r"([\(,])\s*(\d.*?)\s*([,\)])") - - @property - def _parsed_pkg_info(self): - """Parse and cache metadata""" - try: - return self._pkg_info - except AttributeError: - metadata = self.get_metadata(self.PKG_INFO) - self._pkg_info = email.parser.Parser().parsestr(metadata) - return self._pkg_info - - @property - def _dep_map(self): - try: - return self.__dep_map - except AttributeError: - self.__dep_map = self._compute_dependencies() - return self.__dep_map - - def _compute_dependencies(self): - """Recompute this distribution's dependencies.""" - dm = self.__dep_map = {None: []} - - reqs = [] - # Including any condition expressions - for req in self._parsed_pkg_info.get_all('Requires-Dist') or []: - reqs.extend(parse_requirements(req)) - - def reqs_for_extra(extra): - for req in reqs: - if not req.marker or req.marker.evaluate({'extra': extra}): - yield req - - common = frozenset(reqs_for_extra(None)) - dm[None].extend(common) - - for extra in self._parsed_pkg_info.get_all('Provides-Extra') or []: - s_extra = safe_extra(extra.strip()) - dm[s_extra] = list(frozenset(reqs_for_extra(extra)) - common) - - return dm - - -_distributionImpl = { - '.egg': Distribution, - '.egg-info': EggInfoDistribution, - '.dist-info': DistInfoDistribution, -} - - -def issue_warning(*args, **kw): - level = 1 - g = globals() - try: - # find the first stack frame that is *not* code in - # the pkg_resources module, to use for the warning - while sys._getframe(level).f_globals is g: - level += 1 - except ValueError: - pass - warnings.warn(stacklevel=level + 1, *args, **kw) - - -class RequirementParseError(ValueError): - def __str__(self): - return ' '.join(self.args) - - -def parse_requirements(strs): - """Yield ``Requirement`` objects for each specification in `strs` - - `strs` must be a string, or a (possibly-nested) iterable thereof. - """ - # create a steppable iterator, so we can handle \-continuations - lines = iter(yield_lines(strs)) - - for line in lines: - # Drop comments -- a hash without a space may be in a URL. - if ' #' in line: - line = line[:line.find(' #')] - # If there is a line continuation, drop it, and append the next line. - if line.endswith('\\'): - line = line[:-2].strip() - try: - line += next(lines) - except StopIteration: - return - yield Requirement(line) - - -class Requirement(packaging.requirements.Requirement): - def __init__(self, requirement_string): - """DO NOT CALL THIS UNDOCUMENTED METHOD; use Requirement.parse()!""" - try: - super(Requirement, self).__init__(requirement_string) - except packaging.requirements.InvalidRequirement as e: - raise RequirementParseError(str(e)) - self.unsafe_name = self.name - project_name = safe_name(self.name) - self.project_name, self.key = project_name, project_name.lower() - self.specs = [ - (spec.operator, spec.version) for spec in self.specifier] - self.extras = tuple(map(safe_extra, self.extras)) - self.hashCmp = ( - self.key, - self.specifier, - frozenset(self.extras), - str(self.marker) if self.marker else None, - ) - self.__hash = hash(self.hashCmp) - - def __eq__(self, other): - return ( - isinstance(other, Requirement) and - self.hashCmp == other.hashCmp - ) - - def __ne__(self, other): - return not self == other - - def __contains__(self, item): - if isinstance(item, Distribution): - if item.key != self.key: - return False - - item = item.version - - # Allow prereleases always in order to match the previous behavior of - # this method. In the future this should be smarter and follow PEP 440 - # more accurately. - return self.specifier.contains(item, prereleases=True) - - def __hash__(self): - return self.__hash - - def __repr__(self): - return "Requirement.parse(%r)" % str(self) - - @staticmethod - def parse(s): - req, = parse_requirements(s) - return req - - -def _always_object(classes): - """ - Ensure object appears in the mro even - for old-style classes. - """ - if object not in classes: - return classes + (object,) - return classes - - -def _find_adapter(registry, ob): - """Return an adapter factory for `ob` from `registry`""" - types = _always_object(inspect.getmro(getattr(ob, '__class__', type(ob)))) - for t in types: - if t in registry: - return registry[t] - - -def ensure_directory(path): - """Ensure that the parent directory of `path` exists""" - dirname = os.path.dirname(path) - py31compat.makedirs(dirname, exist_ok=True) - - -def _bypass_ensure_directory(path): - """Sandbox-bypassing version of ensure_directory()""" - if not WRITE_SUPPORT: - raise IOError('"os.mkdir" not supported on this platform.') - dirname, filename = split(path) - if dirname and filename and not isdir(dirname): - _bypass_ensure_directory(dirname) - try: - mkdir(dirname, 0o755) - except FileExistsError: - pass - - -def split_sections(s): - """Split a string or iterable thereof into (section, content) pairs - - Each ``section`` is a stripped version of the section header ("[section]") - and each ``content`` is a list of stripped lines excluding blank lines and - comment-only lines. If there are any such lines before the first section - header, they're returned in a first ``section`` of ``None``. - """ - section = None - content = [] - for line in yield_lines(s): - if line.startswith("["): - if line.endswith("]"): - if section or content: - yield section, content - section = line[1:-1].strip() - content = [] - else: - raise ValueError("Invalid section heading", line) - else: - content.append(line) - - # wrap up last segment - yield section, content - - -def _mkstemp(*args, **kw): - old_open = os.open - try: - # temporarily bypass sandboxing - os.open = os_open - return tempfile.mkstemp(*args, **kw) - finally: - # and then put it back - os.open = old_open - - -# Silence the PEP440Warning by default, so that end users don't get hit by it -# randomly just because they use pkg_resources. We want to append the rule -# because we want earlier uses of filterwarnings to take precedence over this -# one. -warnings.filterwarnings("ignore", category=PEP440Warning, append=True) - - -# from jaraco.functools 1.3 -def _call_aside(f, *args, **kwargs): - f(*args, **kwargs) - return f - - -@_call_aside -def _initialize(g=globals()): - "Set up global resource manager (deliberately not state-saved)" - manager = ResourceManager() - g['_manager'] = manager - g.update( - (name, getattr(manager, name)) - for name in dir(manager) - if not name.startswith('_') - ) - - -@_call_aside -def _initialize_master_working_set(): - """ - Prepare the master working set and make the ``require()`` - API available. - - This function has explicit effects on the global state - of pkg_resources. It is intended to be invoked once at - the initialization of this module. - - Invocation by other packages is unsupported and done - at their own risk. - """ - working_set = WorkingSet._build_master() - _declare_state('object', working_set=working_set) - - require = working_set.require - iter_entry_points = working_set.iter_entry_points - add_activation_listener = working_set.subscribe - run_script = working_set.run_script - # backward compatibility - run_main = run_script - # Activate all distributions already on sys.path with replace=False and - # ensure that all distributions added to the working set in the future - # (e.g. by calling ``require()``) will get activated as well, - # with higher priority (replace=True). - tuple( - dist.activate(replace=False) - for dist in working_set - ) - add_activation_listener( - lambda dist: dist.activate(replace=True), - existing=False, - ) - working_set.entries = [] - # match order - list(map(working_set.add_entry, sys.path)) - globals().update(locals()) - -class PkgResourcesDeprecationWarning(Warning): - """ - Base class for warning about deprecations in ``pkg_resources`` - - This class is not derived from ``DeprecationWarning``, and as such is - visible by default. - """ diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pkg_resources/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/pkg_resources/__init__.pyc deleted file mode 100644 index a19f61d62923d3aaf282e503a59068c23172f0bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 137751 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 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pkg_resources/py31compat.py b/venv/lib/python2.7/site-packages/pip/_vendor/pkg_resources/py31compat.py deleted file mode 100644 index a2d3007..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/pkg_resources/py31compat.py +++ /dev/null @@ -1,23 +0,0 @@ -import os -import errno -import sys - -from pip._vendor import six - - -def _makedirs_31(path, exist_ok=False): - try: - os.makedirs(path) - except OSError as exc: - if not exist_ok or exc.errno != errno.EEXIST: - raise - - -# rely on compatibility behavior until mode considerations -# and exists_ok considerations are disentangled. -# See https://github.com/pypa/setuptools/pull/1083#issuecomment-315168663 -needs_makedirs = ( - six.PY2 or - (3, 4) <= sys.version_info < (3, 4, 1) -) -makedirs = _makedirs_31 if needs_makedirs else os.makedirs diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pkg_resources/py31compat.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/pkg_resources/py31compat.pyc deleted file mode 100644 index ebcd4e932c49a9c517029bf0b4c9bb4fb19d81c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 881 zcmc&xU2oGc6g^I|eo+Q{+!L>n(3W*Y6-X08npz1Y#?($?L_$$Wyy7OcGu!LhsXPq$ z$NT`e&OZ7RaN_HGukW?bIrjfN?Yz9*{+i)_1hl@RX>Q5n^fQz|{OB{p>>=+V_G;fl z>0=%s4#4;pav#5`t^pok)<ngTH^Dv3S_u4tL1oBWC;;ifV{se24Q;_2kkkXrI*2>& z=1JHl6yh(9laP^XeFse}Gmlp1Z_zw<xesJkJFwKvum*lHu+Q=kf%Q;ypod^TJg_xG z*BoI@V0?GlEI{EykMI+?96>Ui6X{8P*-7Y5r+z>g+oENj7CaZ)*d_&^CPS^2wyub4 zEtPGMHyob7pPYpbn{`@Nsr_E}@})2~QAJIGFSC#~Q5$njUQ}tZNG*>Rsg5pGnR9KT zn`N}>>u>V9=nXFA!9c$nWUtNgO@5;fXiTf<EUHAcC#11yS?<~1$7yovQuRz0T;@tg zRWVI8H|k1f+(gx?-^<jTfbCZ++oijc2VP0P=V+P^88DyiuxD(S2}edaGQzz<=mgp1 zYO0&?uH*@oj9u~AwcWki%2<~saQpYb#uTE~Z<LmXkKJR}wWnVWYhVi!K`5CBd7<n! q?Mlvb^9XnBkZg4P|6)4vj^--AD*0Q--Z;!%MxXcG?{?elh4&9*YQMDr diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/progress/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/progress/__init__.py deleted file mode 100644 index e434c25..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/progress/__init__.py +++ /dev/null @@ -1,177 +0,0 @@ -# Copyright (c) 2012 Giorgos Verigakis <verigak@gmail.com> -# -# Permission to use, copy, modify, and distribute this software for any -# purpose with or without fee is hereby granted, provided that the above -# copyright notice and this permission notice appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -from __future__ import division, print_function - -from collections import deque -from datetime import timedelta -from math import ceil -from sys import stderr -try: - from time import monotonic -except ImportError: - from time import time as monotonic - - -__version__ = '1.5' - -HIDE_CURSOR = '\x1b[?25l' -SHOW_CURSOR = '\x1b[?25h' - - -class Infinite(object): - file = stderr - sma_window = 10 # Simple Moving Average window - check_tty = True - hide_cursor = True - - def __init__(self, message='', **kwargs): - self.index = 0 - self.start_ts = monotonic() - self.avg = 0 - self._avg_update_ts = self.start_ts - self._ts = self.start_ts - self._xput = deque(maxlen=self.sma_window) - for key, val in kwargs.items(): - setattr(self, key, val) - - self._width = 0 - self.message = message - - if self.file and self.is_tty(): - if self.hide_cursor: - print(HIDE_CURSOR, end='', file=self.file) - print(self.message, end='', file=self.file) - self.file.flush() - - def __getitem__(self, key): - if key.startswith('_'): - return None - return getattr(self, key, None) - - @property - def elapsed(self): - return int(monotonic() - self.start_ts) - - @property - def elapsed_td(self): - return timedelta(seconds=self.elapsed) - - def update_avg(self, n, dt): - if n > 0: - xput_len = len(self._xput) - self._xput.append(dt / n) - now = monotonic() - # update when we're still filling _xput, then after every second - if (xput_len < self.sma_window or - now - self._avg_update_ts > 1): - self.avg = sum(self._xput) / len(self._xput) - self._avg_update_ts = now - - def update(self): - pass - - def start(self): - pass - - def clearln(self): - if self.file and self.is_tty(): - print('\r\x1b[K', end='', file=self.file) - - def write(self, s): - if self.file and self.is_tty(): - line = self.message + s.ljust(self._width) - print('\r' + line, end='', file=self.file) - self._width = max(self._width, len(s)) - self.file.flush() - - def writeln(self, line): - if self.file and self.is_tty(): - self.clearln() - print(line, end='', file=self.file) - self.file.flush() - - def finish(self): - if self.file and self.is_tty(): - print(file=self.file) - if self.hide_cursor: - print(SHOW_CURSOR, end='', file=self.file) - - def is_tty(self): - return self.file.isatty() if self.check_tty else True - - def next(self, n=1): - now = monotonic() - dt = now - self._ts - self.update_avg(n, dt) - self._ts = now - self.index = self.index + n - self.update() - - def iter(self, it): - with self: - for x in it: - yield x - self.next() - - def __enter__(self): - self.start() - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - self.finish() - - -class Progress(Infinite): - def __init__(self, *args, **kwargs): - super(Progress, self).__init__(*args, **kwargs) - self.max = kwargs.get('max', 100) - - @property - def eta(self): - return int(ceil(self.avg * self.remaining)) - - @property - def eta_td(self): - return timedelta(seconds=self.eta) - - @property - def percent(self): - return self.progress * 100 - - @property - def progress(self): - return min(1, self.index / self.max) - - @property - def remaining(self): - return max(self.max - self.index, 0) - - def start(self): - self.update() - - def goto(self, index): - incr = index - self.index - self.next(incr) - - def iter(self, it): - try: - self.max = len(it) - except TypeError: - pass - - with self: - for x in it: - yield x - self.next() diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/progress/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/progress/__init__.pyc deleted file mode 100644 index 5322c17ce018a1dd9d80c584c89b6e5cdd783aae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8933 zcmdT~TW=f36+Xk8NJ*4rS-w?v6QgLtCWsX$vD>6+62~@b*RdS0?8;?gENJdZT4}kY zc9#-m*gy;U!3CNWedt3U`cNPb{T)SrKz~Ys_PzbSGs}w=r>|s5?eNUb>~PNQJ7*4+ z|5tVT&EL#DY)bYj;`5VNjU@j7;o;9nDAF=gH`2;UJtu~Da}wsIRgikY_VW@JrB#x8 z$@U8pPD!gQ^|I|3C9FtmTI$nc4wiJ`l7utTnw9#jnDywq6#S~}OiTQg7^B}Yr4wd! zLS*EDhvnwPt4MubJS?>!-i-LiWW$IzE6+p@MSfLZ6t61&qTZbw+&wPdysXt0z*O)b zylOd6X_-6*dqEPkqjV0PP8>w3yU~rBDQ?vaCs87vzuWa~x59ft%lG^+ZP;4{+-mwk zXnQ5}lGO9#c=$l89ktVT6f}nqaE&C7xfd^7O8Ct37azZKDIAhpy1kpxMi2$5KTr@i z{wWpoHxRy1FFy2=r%a&@zepXhouclbsAte!S-d=DQLl(UEnY$8g8Psky2XBXR=ko< ztBN<J1ms;-0wS*{0jW<bag5^Unvl4PzYZZ+^$rw_2j}&xPl&gmH&2RpOo>zCEh=$Z zoVD6<un|n7NpVS&>`~&B$Stz@ZxCSQiHM6ihDs)#>)*_?yPeaUg%P?aX^HG}bP7)y zK2?_98}cM4+ZC>J?crJZGAB>-^0Xl7G^aknas@fei`ji3>)H3t$P>GPSzWCv@jsQA z<02V7FY(_cU62%Ffi4P^D!;lahbCttY<)rd5b?K%?ZoXxuE)7h<ywsrSPjsS5x8KZ z7y40}2kA$iqh?q@XCnxG6`~qy5P5#j;e558ByGg0n<n~LV{cQ9+y&uwJ6<F8`$PD2 z)FY^fq}6cuu~2(omvnobZfX}#{Z^7raf+Wd(lpkMVXl{M>1|ka(%AH!S$;n^5hQM! z9;7oMw*t?1o835R$GVuhnvUGKdF{G;^}e%q$I+3Eu$yevXap%4O#E=eImI4V+}Ur$ zo0gv)|3LZLYlJn7h&D+F)Cv~g1A8lbjd*3F9l{xtmB+o6gLmUc(f-cG%e&Frm*e*? zH-D1!-uE8IZ{xMuS-H2;2|8~D5u_G|Z>1M+Z@QoJmR{~2#NLjvbbB)fpDV6Q$8_Bb zodcD1zyCTmkbIvTG8Hqc*Q_~V&X}cK#Z+=9aOW)EYUz|YdAv$X{{aXX+P2#Jp^+H= z1Vc#GhB1H+40BDPYZaaVd#=$OV7d54YC72upb0Lx+Kzlx$)?qmKIELki1P}Xam$Ma z;kwuxkgesqAE2wiCuZIhOq0CvB6lj9B@n=ef&0VXPeVd$3a6`93Y-k|R^xXF<~pc6 zkDFb(j2|{SiSK<3GNIZf_iZ*Ap1`Jsoo!;B>8sm%U9%l|iPa_9b;#J{ut_`2*mP6x zDtdiRxmh|iKUJZ>13{BEvQv=wIk_eXf@MQIwlq;4e@2#Z*TB~gg-A_|#@vGJ;0x-+ zYj%rr8fc%bRvNB0y7Dq6x>MN`Zc%ohOCN2yGmEwXEw5Haqv!(Abr_=*eHxt(!Iwbf zEV5CJ@!6!?a^~@=xTQv?9vZ=Wq0m$jf<Wr_K|E^jkJ~J%uPhEAB>bFQkRJhR&6_1) z)x0@wUKzS01*6&{!VsD=_v15@V}(?X<;nqNE%5)12l|R4`u&%%Kn7I}mq5_;k%V0A z8@$pmI(Qb`!R8uvPL_wL-njm1LN!*GzqsWPjy0pu$gOaylyjN`-$OGw>Ln01L%$J+ z(F2gmgdo0ZJf$ZN#Pb-POgwud;<2>i%61<~fG?+>=9udfdvkK?C9(qma5ZF#KoAA0 zLygR?#UBinU&!CAjOjDgqXK5~HX>k6Za6*M?k1^olA{#5;t%pZ=S|)@i^i&kVO-HA z(O4e_kw0!I;qLciMDs5}Bm@@f<cv9ImWP?nKr^3VIMd9H5zSaSr&0v(Ha=KQ*x58; zOF<0?27_Fgmb`jY%G}e4l<6%hRx3&3vQ3EI2Q_Z_(W+H`VblbfF#J%0(~#jHPZ-GW zE(SCC-5!zOZLyA@2@B_FQhAAW0Jf4@wH{`G8WiX5?Li2%LS*hfl%x%3dT)RQ&KXS6 z%zf>~o%JkppB#Xolz3)Nws?3NNOA#r_dt?^NJclyBzZEEB(e^e)*1}3AKxgLls?<s z@|!z6(WqHvCmbAv4%83t#aWGD5^_$3?luLW$)?e)Mlq7y5GOT++y;RR2@C`Nm~6pd zjGWF=Fa=4ZTL3y^2VHAB>YS%A*&QG#%+(vF1nPU#gma9|J8Y_K-bGX67Od}GAa#+= z3I}kF^BBi{MSd@h@tM%*d4#JPn$E(D0j9|V8}|(v{QiexdglmN*B+k8<oL@Bryy9f zJ16Vwkj>o(BLboYI#<w)Ksq%Qq>AjlNe~6#JZ2Ehd}s=yD89spc-FE$L~cR#{YH6w zk31^Hur+SB=*6y!I*K2=?yu3w@`q{Dr1E)juj(5w@^w^qKf|=4A!~l`_nK~c(6I+^ zc2Jp6kkElg<L14L9fS8Cix$s7XUI@fIJbjQqvgA<78G2!)%Lm}y3R0=>Y3*gJnMYK zhEF=@*}R5EWq|TX$B%)K<koqEjXFR5-k~ix8izk1^;0&Kqs=p~kh;d^I-8qlh9XmH zEX5s%q9KzB_fRs~J2!j0Qk*Z$7b-KAJl=)MRHcM>ezuIZpu+e(s}(izpuXtgTD;u{ z;cM|0b_HdiuI{5QXh<U&Wg!<`6mM;}s9i1Laufw#Eh1*4Q`#L=aZ&8GRoqIyii;Yr zt>VtG;;NC1R-VtUI|MUo36TKk0}lq^^YE>?@Yi%|^mTjK(je>g=;>Tz)%h{n0DXJ> z)hb@ng&jDIFKQv0%c9_;Q%5kbfC;SVIjoos)jb|fQ_H`_m4U)Y>cwp;C}>{Z7ZYWq z8P*cCg1<iSakle18>Ltm(EK6xTMc9;(dOg;BK3z7;aB+R7i(x5ee+PBzq>5u{0MVL z>QN56e0CC2APc=|1GT6>U`t2Yqc19ZJpJ1E1^-*h3U1b#$x0vAwCX!K%<;qk4{IWp z{So9*?gj>{hs%+gB00^WqLzcTQUt5E-bFjG=glCpnHqh1V%T-=VK;xmb(Bx;TeX<+ zX%)#9X)N?P!Y5{Cwo2BN$;sjGF1GY%Tu1q%1uB34I~&oodQu!u<NRL+%nUQ<fy)u> z8C{?z!D*v^?m(CUijJNm_=GjbE1-sPL+|OSD~Ou$nB#`-V-r8{enXz=d4g2A$-UD& zc?@bY#Ijy>a9nHM8ZN*-&Qt5rF)85S&fmUY<8R;mts6t%eXP(zxY@n*l4FI&8!Z>n z#x>~NLq>W%j@$8(<A(DoW;j>Tj9Gk|^Zgb3$g0nIRGq7)khABFnid~^!M)yMbDqs- zY#3~uH8%Iz5Fs48kxerxY+ZTCol@h;ESLv9$CWIiDVYlL#{QeR<7#aQ_p`ivqnmbP z=H0j@4xL(yEzNcq`ucwf*>AOFjPOTX{wIN>_)YD%8tIm%9g613L1NQ)h70?<FvH!= zRtG=Bs#WOPE`HsN`CkzD)@9E85RJyq_M>flspi0%%uRwcH6nj#k0&27xk{Looy;xZ Vl+Je^KVDSLQofW!uAV=+`CsN`kg)&& diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/progress/bar.py b/venv/lib/python2.7/site-packages/pip/_vendor/progress/bar.py deleted file mode 100644 index 8819efd..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/progress/bar.py +++ /dev/null @@ -1,91 +0,0 @@ -# -*- coding: utf-8 -*- - -# Copyright (c) 2012 Giorgos Verigakis <verigak@gmail.com> -# -# Permission to use, copy, modify, and distribute this software for any -# purpose with or without fee is hereby granted, provided that the above -# copyright notice and this permission notice appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -from __future__ import unicode_literals - -import sys - -from . import Progress - - -class Bar(Progress): - width = 32 - suffix = '%(index)d/%(max)d' - bar_prefix = ' |' - bar_suffix = '| ' - empty_fill = ' ' - fill = '#' - - def update(self): - filled_length = int(self.width * self.progress) - empty_length = self.width - filled_length - - message = self.message % self - bar = self.fill * filled_length - empty = self.empty_fill * empty_length - suffix = self.suffix % self - line = ''.join([message, self.bar_prefix, bar, empty, self.bar_suffix, - suffix]) - self.writeln(line) - - -class ChargingBar(Bar): - suffix = '%(percent)d%%' - bar_prefix = ' ' - bar_suffix = ' ' - empty_fill = '∙' - fill = '█' - - -class FillingSquaresBar(ChargingBar): - empty_fill = '▢' - fill = '▣' - - -class FillingCirclesBar(ChargingBar): - empty_fill = '◯' - fill = '◉' - - -class IncrementalBar(Bar): - if sys.platform.startswith('win'): - phases = (u' ', u'▌', u'█') - else: - phases = (' ', '▏', '▎', '▍', '▌', '▋', '▊', '▉', '█') - - def update(self): - nphases = len(self.phases) - filled_len = self.width * self.progress - nfull = int(filled_len) # Number of full chars - phase = int((filled_len - nfull) * nphases) # Phase of last char - nempty = self.width - nfull # Number of empty chars - - message = self.message % self - bar = self.phases[-1] * nfull - current = self.phases[phase] if phase > 0 else '' - empty = self.empty_fill * max(0, nempty - len(current)) - suffix = self.suffix % self - line = ''.join([message, self.bar_prefix, bar, current, empty, - self.bar_suffix, suffix]) - self.writeln(line) - - -class PixelBar(IncrementalBar): - phases = ('⡀', '⡄', '⡆', '⡇', '⣇', '⣧', '⣷', '⣿') - - -class ShadyBar(IncrementalBar): - phases = (' ', '░', '▒', '▓', '█') diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/progress/bar.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/progress/bar.pyc deleted file mode 100644 index 7c038883a7077b43ca4b97ccb09a42f55ae39e63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4043 zcmd5<OK%%h6h1S4#Cf%8N!=8X2!ensRNV5Y03krFKw?2vO%M{6kTvy;ok_=IcOFer z*%Bxfq`WFXYQ++|V9AmtdwvH00PzFh`_3Id(x#g(+S;Cb?&Hk8=YIE`^IaGIU7UOA zi$kBaB>xm3-xFJszfke;vm_MhTGFt@V%wI`mWC}}LA;`b1?d*0QN&nD{Gzli@yc>t zWLM<VMoGLG@k`oU8TXdOn-#yTy>sK<8S&;vy$j>sig=5o84itmXT>`#{;bZhH13@f z@5re4=(u;DCa>3?z;=TF@Tpm-rAsKXC}{OOzZnLpAG=|4A>fc1ub_4@?sZ~6Nm62R z&W*<yQSBTtdL0#C2n~=SCV&aB0G}f9;r;;*_FIw$_NTx!D&nlyX7FaPiXuCLVyzZL zp1*z4tFP6%E@Wn-cXgm*u$pl}Q$E*Xoz`)N^EBcnDyhgoWYf~pmgQYbhNgkil9i#Y zBL$Y#p^D8SN0x^Wc(Wt}yf%bDqiob*w<Vi1GBElT89>))%*voFow9HpDBztr8O*Rr zA6c)_{0kWhsm;?oA{azzT7ujPymTYw7WyNAxtA`Gb~}DrM7<q^VLFG3-|eS6O>LIZ zOtN-6*jAOz9_FLUB{y#NW1sz_X0FCrw_+S_7}dC(zL)r6J6%MJllopW^rH^USwN3j z%yc+hPR+*rYPOC#v!i*!Ao6Qyh!)9Z)av~>xay{U{i++++r7~9<D`CVyT0>kd@0(x zeCF(x==9n6wX>}^lI=IWYw>A(I{o^`^?uMl6+}tuhT*C7%txK(MRw`ayy{0@FUHiy z7wa(R<^E1e^Rm8&)mBkUj-n8&YAxD}miazqEm$?RmRoN&Be&}}n+j30+3k5*h^9lZ zbx#hD$sr03^&Mj8ETfq0@sVuQp(m~2Ne-bXTT@><rOoFz+_)1&ode_Z1t=U4pNLY# zC!!Sbi6|{IAc;gqzgVmF{kY{v=}B*GEss39@85erXDV;)Y4keB(CJiJ5axpbeAL(- zhh3-eBn*rRaw${J2XKGDwtgjZk>d_TkH>#6dccZjl4J2}F7GISQ<#js=uv|}=V6{s zc)|o>di&>txD`J5_HX}gwtxG^W4rwm*!5fcw$DKNFlxnq7f$Ym(??H7R$_Yv6?62y zEt>@aS$N=dOX6oq(+Hdh?69B_q!ey~i1DL{Yz5JD=-m1?cayzb-pu9qx%@7d-{kV^ zT;6Dr?wFS7PfB<HpfaXA^3RC$$U+5hn9W2FHse?!uY<x?$ad^Aga<-IUru;RYSp3g z9!M0lcLJl!q&7_ymx~hbD$QZBqMV38@&y@!5tS`da69HJsa+K=ys}F+1xsRFwW>qh zPJp8l=a?@C7&A)qGMJN&GUyO>ytW{N`3a%Yc`xYwB|uFKwGwXSC~%fCLVv?e{KRB+ zQmw;;rBtR_U3GE4FbRuEVJd5JvYHYA9RynviOhUT8WXxyHjLUCD4J`ij;<aViX=5T zOffn~D~n@T=a8Yyy1a=^lETAgP9?SXVM6jG3b77bOJK@nWzHkkGuA5jbHzGp)d=0e zKCHC5Z|HvRJaYSc+&XvfyO~4}DA`HO?I?89b}#NK{J0#%X|ffh8_v@(?6II`0{AYT zgt1u$X0vwLR?{yA+y1`9LJdtU^evNEyb5p3U=t=CgU2tQ=kj_kzs%)VM&238-}3e! zx%^Y_ce(O|PomK>p>+a1aa656bZ>nTHhh97A?Jd-2;};P>+MXZZHD39=;9xTqN^80 z^Z&uzUVbnz-TE<?Kjm_-#%cDs_5D>JL!@{<4Lmtgn#%I)ZaYh}nAcqli}O4R5D037 zMK72RZ%Pht3J&?wp=UdU-r=lz@{{6W`+%PL+vdvt4)dzs_LuAhd#O-8R;^S^_#Uqo F{|6`{cKZMT diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/progress/counter.py b/venv/lib/python2.7/site-packages/pip/_vendor/progress/counter.py deleted file mode 100644 index d955ca4..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/progress/counter.py +++ /dev/null @@ -1,41 +0,0 @@ -# -*- coding: utf-8 -*- - -# Copyright (c) 2012 Giorgos Verigakis <verigak@gmail.com> -# -# Permission to use, copy, modify, and distribute this software for any -# purpose with or without fee is hereby granted, provided that the above -# copyright notice and this permission notice appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -from __future__ import unicode_literals -from . import Infinite, Progress - - -class Counter(Infinite): - def update(self): - self.write(str(self.index)) - - -class Countdown(Progress): - def update(self): - self.write(str(self.remaining)) - - -class Stack(Progress): - phases = (' ', '▁', '▂', '▃', '▄', '▅', '▆', '▇', '█') - - def update(self): - nphases = len(self.phases) - i = min(nphases - 1, int(self.progress * nphases)) - self.write(self.phases[i]) - - -class Pie(Stack): - phases = ('○', '◔', '◑', '◕', '●') diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/progress/counter.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/progress/counter.pyc deleted file mode 100644 index 03da2c07947885b1c775d44efd85f82bc4e6a55f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2422 zcmd5;OK;Oa5T12jZAu?VP+kWrPL@z{D^LXzLWmv^2dc{DLL?NK>?W8x>)>7YrS{MV z4~YXp0{Z{>3;Y0>8E>54xPVf}-kF_!&Fh;@<=1rc_TkK{4!Ea+^f7o~j*yY~3P=F@ z0$Kuu^gvc1@t|LURt5T1XjM^K1yzBr09k_*fMbA{ts2NWs47bvrL+!mVkn&~r45ix zPz|0tRZ1s7UVsgM8r6t@<KqkD>>M_^jytJT?IgA;ixLyli0{$x1UAofH`X}Bo%Jm3 zWy%=az>(E7*SMs#mDW8WTQ4G`fJ{V-(S()<;RYYrp*i%CUsh@Eb!7Gd-r{M384r#H zy#m)3i`IOaZEM(UXQT;rjm=mRYpHe$W2z)pN!LdT+?W)(V35UIkyXJ~lm*>1kt#F6 z-cGQ4H+!wOH<wr5>7|wI-b&}b*?A!MvL$?agWyFlhzE<YHa1F<MZ5gG*Ip+Pf9)-$ zWt!pEg+GE$;fp(iU0cU9^MS+@=aDnyNDzey<j;0nM}5_9+a`DVsmv4XhBP+Pd~E86 z<lM{nvEp@MCz0n!%XC|Ju*1*)jde(&3@PAze5U#l=AiCzoI}dJk*CHHV-D60RO4)P zL-JHeQ9U=YoI+&?V8d9FM>lNL*(~EoIx}XkAmcFGB*028C|H#cxwK7A5nsqDJAVE+ zbo9v4V@FRMeedW8M?X6HiSbW+kS2`(r^wi%1TgFm1XvIDv2+Nyib$v0P^JDQDhnPQ z;2?@>++xM>;96NM2x@CZ`63W<ok)~sL=N6WMj00MW6cx^7quaXIqMjxoMK$#v|C5k z$LApFZlNBAi~}(%7KBgn`!}KS8FQl?p2eNdO(N5^brU~BO4dc);{dM5s!U``C{E-V zWLzTG+|9!knKSqFbCHRs-yHqw=yylI__UGh{CzTQdItC8vr&?auZC0orqdnn*Emhw zh11P#p3#Ma<AgjkfRZ~T@Nn@D3GN|zJRI(G#;9?WTSn=_;--8=e=ZDF**P&^nXln* F@(*y3G6Vns diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/progress/spinner.py b/venv/lib/python2.7/site-packages/pip/_vendor/progress/spinner.py deleted file mode 100644 index 4e100ca..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/progress/spinner.py +++ /dev/null @@ -1,43 +0,0 @@ -# -*- coding: utf-8 -*- - -# Copyright (c) 2012 Giorgos Verigakis <verigak@gmail.com> -# -# Permission to use, copy, modify, and distribute this software for any -# purpose with or without fee is hereby granted, provided that the above -# copyright notice and this permission notice appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -from __future__ import unicode_literals -from . import Infinite - - -class Spinner(Infinite): - phases = ('-', '\\', '|', '/') - hide_cursor = True - - def update(self): - i = self.index % len(self.phases) - self.write(self.phases[i]) - - -class PieSpinner(Spinner): - phases = ['◷', '◶', '◵', '◴'] - - -class MoonSpinner(Spinner): - phases = ['◑', '◒', '◐', '◓'] - - -class LineSpinner(Spinner): - phases = ['⎺', '⎻', '⎼', '⎽', '⎼', '⎻'] - - -class PixelSpinner(Spinner): - phases = ['⣾', '⣷', '⣯', '⣟', '⡿', '⢿', '⣻', '⣽'] diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/progress/spinner.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/progress/spinner.pyc deleted file mode 100644 index 3888a2cfafebd6113b2f5ff45f6c5821e182c600..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2211 zcmd5-OK;Oa5T3R3>XULHQjtK21F}G^TY)N&5JGT5qE+SeLIjFJc9R+$+w88}v?>Qw z&J~mcM+Er+TzE)4{|kSC9{@A!O^{l8Ln2OgUTg2p_w9J>{+t@W@MQX43+&~hz77tk zeKa`!8AJeG26YCEJHTCt9O$}GchN6^aG}kB7vU+uF2J370eA^S!9>f$Xc2g25FHyv zOTfnm(TQQS4197Bof<|fz^9?+9mBN3UwC;8Ej@!Gi^EpJMI#Eekj+SiG?PzP(7F}3 z!x*P@8J$`h#<7q?xCM;eAh@T{5I`sqOWh${1f@Xx*NYI;yb|7#(b989-ZgT^NWVpK z2M5u2lh&I@V+Y^?=E#iUz%GO8<J@s=XotZph8YrFGa0XVl#wo?2xBgKnih;itZDaj zy{UvUlbaF|d9<UZ2b74~xDP($p#URPf|j4kaHFY(ztNO_JBhfE%HQt!TNma1c=O@n z(xZ4`NnToNT~@s-d|NKy)k*y|KMm8lFjl%5MRR&_xzkvskQt2)5%Wai(n&`OrF@l> zI-hQtG_#cBj<dMCqTGO0nL%|Fd4^d{N7ZP=&8}!P^tf@l3C|*Q1ERy=T$7p56X>mn zc;Kx}sze53=>LKJ->?UC8YgflI;#@HpJRZmhT_PwJBhd2vNP{m{)Tl5RDxJ@#9u}w z@Z;r2t3O!%-s*QA%?HF-K+G7jMuCoLOy)EWMZA=lIkx2_iT?o?&n@<StDjl@VpO@H zu66bR7q`RsP+d^vn09mqjl*?8)xn@sI#eBdpK=EFK3o08>aU~92sQ3=I0n@*iS}yP z6Vbu)puS)zp}YS=2{vi`xZszh44sN4hMvg@=zp`?zCQi8)_;}j*WYvf#_GN$us^cI z9Y<{EaaiJ3JZgWoVYV}!NotrF0!<>IkAmq;0lkj_6=Fc#2ei%zv<cJqujZZp8s(&@ O5@y(pTOF$w==U2=DE#mM diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pyparsing.py b/venv/lib/python2.7/site-packages/pip/_vendor/pyparsing.py deleted file mode 100644 index 9d6a01d..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/pyparsing.py +++ /dev/null @@ -1,6493 +0,0 @@ -#-*- coding: utf-8 -*- -# module pyparsing.py -# -# Copyright (c) 2003-2019 Paul T. McGuire -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be -# included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__doc__ = \ -""" -pyparsing module - Classes and methods to define and execute parsing grammars -============================================================================= - -The pyparsing module is an alternative approach to creating and -executing simple grammars, vs. the traditional lex/yacc approach, or the -use of regular expressions. With pyparsing, you don't need to learn -a new syntax for defining grammars or matching expressions - the parsing -module provides a library of classes that you use to construct the -grammar directly in Python. - -Here is a program to parse "Hello, World!" (or any greeting of the form -``"<salutation>, <addressee>!"``), built up using :class:`Word`, -:class:`Literal`, and :class:`And` elements -(the :class:`'+'<ParserElement.__add__>` operators create :class:`And` expressions, -and the strings are auto-converted to :class:`Literal` expressions):: - - from pip._vendor.pyparsing import Word, alphas - - # define grammar of a greeting - greet = Word(alphas) + "," + Word(alphas) + "!" - - hello = "Hello, World!" - print (hello, "->", greet.parseString(hello)) - -The program outputs the following:: - - Hello, World! -> ['Hello', ',', 'World', '!'] - -The Python representation of the grammar is quite readable, owing to the -self-explanatory class names, and the use of '+', '|' and '^' operators. - -The :class:`ParseResults` object returned from -:class:`ParserElement.parseString` can be -accessed as a nested list, a dictionary, or an object with named -attributes. - -The pyparsing module handles some of the problems that are typically -vexing when writing text parsers: - - - extra or missing whitespace (the above program will also handle - "Hello,World!", "Hello , World !", etc.) - - quoted strings - - embedded comments - - -Getting Started - ------------------ -Visit the classes :class:`ParserElement` and :class:`ParseResults` to -see the base classes that most other pyparsing -classes inherit from. Use the docstrings for examples of how to: - - - construct literal match expressions from :class:`Literal` and - :class:`CaselessLiteral` classes - - construct character word-group expressions using the :class:`Word` - class - - see how to create repetitive expressions using :class:`ZeroOrMore` - and :class:`OneOrMore` classes - - use :class:`'+'<And>`, :class:`'|'<MatchFirst>`, :class:`'^'<Or>`, - and :class:`'&'<Each>` operators to combine simple expressions into - more complex ones - - associate names with your parsed results using - :class:`ParserElement.setResultsName` - - find some helpful expression short-cuts like :class:`delimitedList` - and :class:`oneOf` - - find more useful common expressions in the :class:`pyparsing_common` - namespace class -""" - -__version__ = "2.4.0" -__versionTime__ = "07 Apr 2019 18:28 UTC" -__author__ = "Paul McGuire <ptmcg@users.sourceforge.net>" - -import string -from weakref import ref as wkref -import copy -import sys -import warnings -import re -import sre_constants -import collections -import pprint -import traceback -import types -from datetime import datetime - -try: - # Python 3 - from itertools import filterfalse -except ImportError: - from itertools import ifilterfalse as filterfalse - -try: - from _thread import RLock -except ImportError: - from threading import RLock - -try: - # Python 3 - from collections.abc import Iterable - from collections.abc import MutableMapping -except ImportError: - # Python 2.7 - from collections import Iterable - from collections import MutableMapping - -try: - from collections import OrderedDict as _OrderedDict -except ImportError: - try: - from ordereddict import OrderedDict as _OrderedDict - except ImportError: - _OrderedDict = None - -try: - from types import SimpleNamespace -except ImportError: - class SimpleNamespace: pass - -# version compatibility configuration -__compat__ = SimpleNamespace() -__compat__.__doc__ = """ - A cross-version compatibility configuration for pyparsing features that will be - released in a future version. By setting values in this configuration to True, - those features can be enabled in prior versions for compatibility development - and testing. - - - collect_all_And_tokens - flag to enable fix for Issue #63 that fixes erroneous grouping - of results names when an And expression is nested within an Or or MatchFirst; set to - True to enable bugfix to be released in pyparsing 2.4 -""" -__compat__.collect_all_And_tokens = True - - -#~ sys.stderr.write( "testing pyparsing module, version %s, %s\n" % (__version__,__versionTime__ ) ) - -__all__ = [ '__version__', '__versionTime__', '__author__', '__compat__', -'And', 'CaselessKeyword', 'CaselessLiteral', 'CharsNotIn', 'Combine', 'Dict', 'Each', 'Empty', -'FollowedBy', 'Forward', 'GoToColumn', 'Group', 'Keyword', 'LineEnd', 'LineStart', 'Literal', -'PrecededBy', 'MatchFirst', 'NoMatch', 'NotAny', 'OneOrMore', 'OnlyOnce', 'Optional', 'Or', -'ParseBaseException', 'ParseElementEnhance', 'ParseException', 'ParseExpression', 'ParseFatalException', -'ParseResults', 'ParseSyntaxException', 'ParserElement', 'QuotedString', 'RecursiveGrammarException', -'Regex', 'SkipTo', 'StringEnd', 'StringStart', 'Suppress', 'Token', 'TokenConverter', -'White', 'Word', 'WordEnd', 'WordStart', 'ZeroOrMore', 'Char', -'alphanums', 'alphas', 'alphas8bit', 'anyCloseTag', 'anyOpenTag', 'cStyleComment', 'col', -'commaSeparatedList', 'commonHTMLEntity', 'countedArray', 'cppStyleComment', 'dblQuotedString', -'dblSlashComment', 'delimitedList', 'dictOf', 'downcaseTokens', 'empty', 'hexnums', -'htmlComment', 'javaStyleComment', 'line', 'lineEnd', 'lineStart', 'lineno', -'makeHTMLTags', 'makeXMLTags', 'matchOnlyAtCol', 'matchPreviousExpr', 'matchPreviousLiteral', -'nestedExpr', 'nullDebugAction', 'nums', 'oneOf', 'opAssoc', 'operatorPrecedence', 'printables', -'punc8bit', 'pythonStyleComment', 'quotedString', 'removeQuotes', 'replaceHTMLEntity', -'replaceWith', 'restOfLine', 'sglQuotedString', 'srange', 'stringEnd', -'stringStart', 'traceParseAction', 'unicodeString', 'upcaseTokens', 'withAttribute', -'indentedBlock', 'originalTextFor', 'ungroup', 'infixNotation','locatedExpr', 'withClass', -'CloseMatch', 'tokenMap', 'pyparsing_common', 'pyparsing_unicode', 'unicode_set', -] - -system_version = tuple(sys.version_info)[:3] -PY_3 = system_version[0] == 3 -if PY_3: - _MAX_INT = sys.maxsize - basestring = str - unichr = chr - unicode = str - _ustr = str - - # build list of single arg builtins, that can be used as parse actions - singleArgBuiltins = [sum, len, sorted, reversed, list, tuple, set, any, all, min, max] - -else: - _MAX_INT = sys.maxint - range = xrange - - def _ustr(obj): - """Drop-in replacement for str(obj) that tries to be Unicode - friendly. It first tries str(obj). If that fails with - a UnicodeEncodeError, then it tries unicode(obj). It then - < returns the unicode object | encodes it with the default - encoding | ... >. - """ - if isinstance(obj,unicode): - return obj - - try: - # If this works, then _ustr(obj) has the same behaviour as str(obj), so - # it won't break any existing code. - return str(obj) - - except UnicodeEncodeError: - # Else encode it - ret = unicode(obj).encode(sys.getdefaultencoding(), 'xmlcharrefreplace') - xmlcharref = Regex(r'&#\d+;') - xmlcharref.setParseAction(lambda t: '\\u' + hex(int(t[0][2:-1]))[2:]) - return xmlcharref.transformString(ret) - - # build list of single arg builtins, tolerant of Python version, that can be used as parse actions - singleArgBuiltins = [] - import __builtin__ - for fname in "sum len sorted reversed list tuple set any all min max".split(): - try: - singleArgBuiltins.append(getattr(__builtin__,fname)) - except AttributeError: - continue - -_generatorType = type((y for y in range(1))) - -def _xml_escape(data): - """Escape &, <, >, ", ', etc. in a string of data.""" - - # ampersand must be replaced first - from_symbols = '&><"\'' - to_symbols = ('&'+s+';' for s in "amp gt lt quot apos".split()) - for from_,to_ in zip(from_symbols, to_symbols): - data = data.replace(from_, to_) - return data - -alphas = string.ascii_uppercase + string.ascii_lowercase -nums = "0123456789" -hexnums = nums + "ABCDEFabcdef" -alphanums = alphas + nums -_bslash = chr(92) -printables = "".join(c for c in string.printable if c not in string.whitespace) - -class ParseBaseException(Exception): - """base exception class for all parsing runtime exceptions""" - # Performance tuning: we construct a *lot* of these, so keep this - # constructor as small and fast as possible - def __init__( self, pstr, loc=0, msg=None, elem=None ): - self.loc = loc - if msg is None: - self.msg = pstr - self.pstr = "" - else: - self.msg = msg - self.pstr = pstr - self.parserElement = elem - self.args = (pstr, loc, msg) - - @classmethod - def _from_exception(cls, pe): - """ - internal factory method to simplify creating one type of ParseException - from another - avoids having __init__ signature conflicts among subclasses - """ - return cls(pe.pstr, pe.loc, pe.msg, pe.parserElement) - - def __getattr__( self, aname ): - """supported attributes by name are: - - lineno - returns the line number of the exception text - - col - returns the column number of the exception text - - line - returns the line containing the exception text - """ - if( aname == "lineno" ): - return lineno( self.loc, self.pstr ) - elif( aname in ("col", "column") ): - return col( self.loc, self.pstr ) - elif( aname == "line" ): - return line( self.loc, self.pstr ) - else: - raise AttributeError(aname) - - def __str__( self ): - return "%s (at char %d), (line:%d, col:%d)" % \ - ( self.msg, self.loc, self.lineno, self.column ) - def __repr__( self ): - return _ustr(self) - def markInputline( self, markerString = ">!<" ): - """Extracts the exception line from the input string, and marks - the location of the exception with a special symbol. - """ - line_str = self.line - line_column = self.column - 1 - if markerString: - line_str = "".join((line_str[:line_column], - markerString, line_str[line_column:])) - return line_str.strip() - def __dir__(self): - return "lineno col line".split() + dir(type(self)) - -class ParseException(ParseBaseException): - """ - Exception thrown when parse expressions don't match class; - supported attributes by name are: - - lineno - returns the line number of the exception text - - col - returns the column number of the exception text - - line - returns the line containing the exception text - - Example:: - - try: - Word(nums).setName("integer").parseString("ABC") - except ParseException as pe: - print(pe) - print("column: {}".format(pe.col)) - - prints:: - - Expected integer (at char 0), (line:1, col:1) - column: 1 - - """ - - @staticmethod - def explain(exc, depth=16): - """ - Method to take an exception and translate the Python internal traceback into a list - of the pyparsing expressions that caused the exception to be raised. - - Parameters: - - - exc - exception raised during parsing (need not be a ParseException, in support - of Python exceptions that might be raised in a parse action) - - depth (default=16) - number of levels back in the stack trace to list expression - and function names; if None, the full stack trace names will be listed; if 0, only - the failing input line, marker, and exception string will be shown - - Returns a multi-line string listing the ParserElements and/or function names in the - exception's stack trace. - - Note: the diagnostic output will include string representations of the expressions - that failed to parse. These representations will be more helpful if you use `setName` to - give identifiable names to your expressions. Otherwise they will use the default string - forms, which may be cryptic to read. - - explain() is only supported under Python 3. - """ - import inspect - - if depth is None: - depth = sys.getrecursionlimit() - ret = [] - if isinstance(exc, ParseBaseException): - ret.append(exc.line) - ret.append(' ' * (exc.col - 1) + '^') - ret.append("{0}: {1}".format(type(exc).__name__, exc)) - - if depth > 0: - callers = inspect.getinnerframes(exc.__traceback__, context=depth) - seen = set() - for i, ff in enumerate(callers[-depth:]): - frm = ff[0] - - f_self = frm.f_locals.get('self', None) - if isinstance(f_self, ParserElement): - if frm.f_code.co_name not in ('parseImpl', '_parseNoCache'): - continue - if f_self in seen: - continue - seen.add(f_self) - - self_type = type(f_self) - ret.append("{0}.{1} - {2}".format(self_type.__module__, - self_type.__name__, - f_self)) - elif f_self is not None: - self_type = type(f_self) - ret.append("{0}.{1}".format(self_type.__module__, - self_type.__name__)) - else: - code = frm.f_code - if code.co_name in ('wrapper', '<module>'): - continue - - ret.append("{0}".format(code.co_name)) - - depth -= 1 - if not depth: - break - - return '\n'.join(ret) - - -class ParseFatalException(ParseBaseException): - """user-throwable exception thrown when inconsistent parse content - is found; stops all parsing immediately""" - pass - -class ParseSyntaxException(ParseFatalException): - """just like :class:`ParseFatalException`, but thrown internally - when an :class:`ErrorStop<And._ErrorStop>` ('-' operator) indicates - that parsing is to stop immediately because an unbacktrackable - syntax error has been found. - """ - pass - -#~ class ReparseException(ParseBaseException): - #~ """Experimental class - parse actions can raise this exception to cause - #~ pyparsing to reparse the input string: - #~ - with a modified input string, and/or - #~ - with a modified start location - #~ Set the values of the ReparseException in the constructor, and raise the - #~ exception in a parse action to cause pyparsing to use the new string/location. - #~ Setting the values as None causes no change to be made. - #~ """ - #~ def __init_( self, newstring, restartLoc ): - #~ self.newParseText = newstring - #~ self.reparseLoc = restartLoc - -class RecursiveGrammarException(Exception): - """exception thrown by :class:`ParserElement.validate` if the - grammar could be improperly recursive - """ - def __init__( self, parseElementList ): - self.parseElementTrace = parseElementList - - def __str__( self ): - return "RecursiveGrammarException: %s" % self.parseElementTrace - -class _ParseResultsWithOffset(object): - def __init__(self,p1,p2): - self.tup = (p1,p2) - def __getitem__(self,i): - return self.tup[i] - def __repr__(self): - return repr(self.tup[0]) - def setOffset(self,i): - self.tup = (self.tup[0],i) - -class ParseResults(object): - """Structured parse results, to provide multiple means of access to - the parsed data: - - - as a list (``len(results)``) - - by list index (``results[0], results[1]``, etc.) - - by attribute (``results.<resultsName>`` - see :class:`ParserElement.setResultsName`) - - Example:: - - integer = Word(nums) - date_str = (integer.setResultsName("year") + '/' - + integer.setResultsName("month") + '/' - + integer.setResultsName("day")) - # equivalent form: - # date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - - # parseString returns a ParseResults object - result = date_str.parseString("1999/12/31") - - def test(s, fn=repr): - print("%s -> %s" % (s, fn(eval(s)))) - test("list(result)") - test("result[0]") - test("result['month']") - test("result.day") - test("'month' in result") - test("'minutes' in result") - test("result.dump()", str) - - prints:: - - list(result) -> ['1999', '/', '12', '/', '31'] - result[0] -> '1999' - result['month'] -> '12' - result.day -> '31' - 'month' in result -> True - 'minutes' in result -> False - result.dump() -> ['1999', '/', '12', '/', '31'] - - day: 31 - - month: 12 - - year: 1999 - """ - def __new__(cls, toklist=None, name=None, asList=True, modal=True ): - if isinstance(toklist, cls): - return toklist - retobj = object.__new__(cls) - retobj.__doinit = True - return retobj - - # Performance tuning: we construct a *lot* of these, so keep this - # constructor as small and fast as possible - def __init__( self, toklist=None, name=None, asList=True, modal=True, isinstance=isinstance ): - if self.__doinit: - self.__doinit = False - self.__name = None - self.__parent = None - self.__accumNames = {} - self.__asList = asList - self.__modal = modal - if toklist is None: - toklist = [] - if isinstance(toklist, list): - self.__toklist = toklist[:] - elif isinstance(toklist, _generatorType): - self.__toklist = list(toklist) - else: - self.__toklist = [toklist] - self.__tokdict = dict() - - if name is not None and name: - if not modal: - self.__accumNames[name] = 0 - if isinstance(name,int): - name = _ustr(name) # will always return a str, but use _ustr for consistency - self.__name = name - if not (isinstance(toklist, (type(None), basestring, list)) and toklist in (None,'',[])): - if isinstance(toklist,basestring): - toklist = [ toklist ] - if asList: - if isinstance(toklist,ParseResults): - self[name] = _ParseResultsWithOffset(ParseResults(toklist.__toklist), 0) - else: - self[name] = _ParseResultsWithOffset(ParseResults(toklist[0]),0) - self[name].__name = name - else: - try: - self[name] = toklist[0] - except (KeyError,TypeError,IndexError): - self[name] = toklist - - def __getitem__( self, i ): - if isinstance( i, (int,slice) ): - return self.__toklist[i] - else: - if i not in self.__accumNames: - return self.__tokdict[i][-1][0] - else: - return ParseResults([ v[0] for v in self.__tokdict[i] ]) - - def __setitem__( self, k, v, isinstance=isinstance ): - if isinstance(v,_ParseResultsWithOffset): - self.__tokdict[k] = self.__tokdict.get(k,list()) + [v] - sub = v[0] - elif isinstance(k,(int,slice)): - self.__toklist[k] = v - sub = v - else: - self.__tokdict[k] = self.__tokdict.get(k,list()) + [_ParseResultsWithOffset(v,0)] - sub = v - if isinstance(sub,ParseResults): - sub.__parent = wkref(self) - - def __delitem__( self, i ): - if isinstance(i,(int,slice)): - mylen = len( self.__toklist ) - del self.__toklist[i] - - # convert int to slice - if isinstance(i, int): - if i < 0: - i += mylen - i = slice(i, i+1) - # get removed indices - removed = list(range(*i.indices(mylen))) - removed.reverse() - # fixup indices in token dictionary - for name,occurrences in self.__tokdict.items(): - for j in removed: - for k, (value, position) in enumerate(occurrences): - occurrences[k] = _ParseResultsWithOffset(value, position - (position > j)) - else: - del self.__tokdict[i] - - def __contains__( self, k ): - return k in self.__tokdict - - def __len__( self ): return len( self.__toklist ) - def __bool__(self): return ( not not self.__toklist ) - __nonzero__ = __bool__ - def __iter__( self ): return iter( self.__toklist ) - def __reversed__( self ): return iter( self.__toklist[::-1] ) - def _iterkeys( self ): - if hasattr(self.__tokdict, "iterkeys"): - return self.__tokdict.iterkeys() - else: - return iter(self.__tokdict) - - def _itervalues( self ): - return (self[k] for k in self._iterkeys()) - - def _iteritems( self ): - return ((k, self[k]) for k in self._iterkeys()) - - if PY_3: - keys = _iterkeys - """Returns an iterator of all named result keys.""" - - values = _itervalues - """Returns an iterator of all named result values.""" - - items = _iteritems - """Returns an iterator of all named result key-value tuples.""" - - else: - iterkeys = _iterkeys - """Returns an iterator of all named result keys (Python 2.x only).""" - - itervalues = _itervalues - """Returns an iterator of all named result values (Python 2.x only).""" - - iteritems = _iteritems - """Returns an iterator of all named result key-value tuples (Python 2.x only).""" - - def keys( self ): - """Returns all named result keys (as a list in Python 2.x, as an iterator in Python 3.x).""" - return list(self.iterkeys()) - - def values( self ): - """Returns all named result values (as a list in Python 2.x, as an iterator in Python 3.x).""" - return list(self.itervalues()) - - def items( self ): - """Returns all named result key-values (as a list of tuples in Python 2.x, as an iterator in Python 3.x).""" - return list(self.iteritems()) - - def haskeys( self ): - """Since keys() returns an iterator, this method is helpful in bypassing - code that looks for the existence of any defined results names.""" - return bool(self.__tokdict) - - def pop( self, *args, **kwargs): - """ - Removes and returns item at specified index (default= ``last``). - Supports both ``list`` and ``dict`` semantics for ``pop()``. If - passed no argument or an integer argument, it will use ``list`` - semantics and pop tokens from the list of parsed tokens. If passed - a non-integer argument (most likely a string), it will use ``dict`` - semantics and pop the corresponding value from any defined results - names. A second default return value argument is supported, just as in - ``dict.pop()``. - - Example:: - - def remove_first(tokens): - tokens.pop(0) - print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] - print(OneOrMore(Word(nums)).addParseAction(remove_first).parseString("0 123 321")) # -> ['123', '321'] - - label = Word(alphas) - patt = label("LABEL") + OneOrMore(Word(nums)) - print(patt.parseString("AAB 123 321").dump()) - - # Use pop() in a parse action to remove named result (note that corresponding value is not - # removed from list form of results) - def remove_LABEL(tokens): - tokens.pop("LABEL") - return tokens - patt.addParseAction(remove_LABEL) - print(patt.parseString("AAB 123 321").dump()) - - prints:: - - ['AAB', '123', '321'] - - LABEL: AAB - - ['AAB', '123', '321'] - """ - if not args: - args = [-1] - for k,v in kwargs.items(): - if k == 'default': - args = (args[0], v) - else: - raise TypeError("pop() got an unexpected keyword argument '%s'" % k) - if (isinstance(args[0], int) or - len(args) == 1 or - args[0] in self): - index = args[0] - ret = self[index] - del self[index] - return ret - else: - defaultvalue = args[1] - return defaultvalue - - def get(self, key, defaultValue=None): - """ - Returns named result matching the given key, or if there is no - such name, then returns the given ``defaultValue`` or ``None`` if no - ``defaultValue`` is specified. - - Similar to ``dict.get()``. - - Example:: - - integer = Word(nums) - date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - - result = date_str.parseString("1999/12/31") - print(result.get("year")) # -> '1999' - print(result.get("hour", "not specified")) # -> 'not specified' - print(result.get("hour")) # -> None - """ - if key in self: - return self[key] - else: - return defaultValue - - def insert( self, index, insStr ): - """ - Inserts new element at location index in the list of parsed tokens. - - Similar to ``list.insert()``. - - Example:: - - print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] - - # use a parse action to insert the parse location in the front of the parsed results - def insert_locn(locn, tokens): - tokens.insert(0, locn) - print(OneOrMore(Word(nums)).addParseAction(insert_locn).parseString("0 123 321")) # -> [0, '0', '123', '321'] - """ - self.__toklist.insert(index, insStr) - # fixup indices in token dictionary - for name,occurrences in self.__tokdict.items(): - for k, (value, position) in enumerate(occurrences): - occurrences[k] = _ParseResultsWithOffset(value, position + (position > index)) - - def append( self, item ): - """ - Add single element to end of ParseResults list of elements. - - Example:: - - print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] - - # use a parse action to compute the sum of the parsed integers, and add it to the end - def append_sum(tokens): - tokens.append(sum(map(int, tokens))) - print(OneOrMore(Word(nums)).addParseAction(append_sum).parseString("0 123 321")) # -> ['0', '123', '321', 444] - """ - self.__toklist.append(item) - - def extend( self, itemseq ): - """ - Add sequence of elements to end of ParseResults list of elements. - - Example:: - - patt = OneOrMore(Word(alphas)) - - # use a parse action to append the reverse of the matched strings, to make a palindrome - def make_palindrome(tokens): - tokens.extend(reversed([t[::-1] for t in tokens])) - return ''.join(tokens) - print(patt.addParseAction(make_palindrome).parseString("lskdj sdlkjf lksd")) # -> 'lskdjsdlkjflksddsklfjkldsjdksl' - """ - if isinstance(itemseq, ParseResults): - self.__iadd__(itemseq) - else: - self.__toklist.extend(itemseq) - - def clear( self ): - """ - Clear all elements and results names. - """ - del self.__toklist[:] - self.__tokdict.clear() - - def __getattr__( self, name ): - try: - return self[name] - except KeyError: - return "" - - if name in self.__tokdict: - if name not in self.__accumNames: - return self.__tokdict[name][-1][0] - else: - return ParseResults([ v[0] for v in self.__tokdict[name] ]) - else: - return "" - - def __add__( self, other ): - ret = self.copy() - ret += other - return ret - - def __iadd__( self, other ): - if other.__tokdict: - offset = len(self.__toklist) - addoffset = lambda a: offset if a<0 else a+offset - otheritems = other.__tokdict.items() - otherdictitems = [(k, _ParseResultsWithOffset(v[0],addoffset(v[1])) ) - for (k,vlist) in otheritems for v in vlist] - for k,v in otherdictitems: - self[k] = v - if isinstance(v[0],ParseResults): - v[0].__parent = wkref(self) - - self.__toklist += other.__toklist - self.__accumNames.update( other.__accumNames ) - return self - - def __radd__(self, other): - if isinstance(other,int) and other == 0: - # useful for merging many ParseResults using sum() builtin - return self.copy() - else: - # this may raise a TypeError - so be it - return other + self - - def __repr__( self ): - return "(%s, %s)" % ( repr( self.__toklist ), repr( self.__tokdict ) ) - - def __str__( self ): - return '[' + ', '.join(_ustr(i) if isinstance(i, ParseResults) else repr(i) for i in self.__toklist) + ']' - - def _asStringList( self, sep='' ): - out = [] - for item in self.__toklist: - if out and sep: - out.append(sep) - if isinstance( item, ParseResults ): - out += item._asStringList() - else: - out.append( _ustr(item) ) - return out - - def asList( self ): - """ - Returns the parse results as a nested list of matching tokens, all converted to strings. - - Example:: - - patt = OneOrMore(Word(alphas)) - result = patt.parseString("sldkj lsdkj sldkj") - # even though the result prints in string-like form, it is actually a pyparsing ParseResults - print(type(result), result) # -> <class 'pyparsing.ParseResults'> ['sldkj', 'lsdkj', 'sldkj'] - - # Use asList() to create an actual list - result_list = result.asList() - print(type(result_list), result_list) # -> <class 'list'> ['sldkj', 'lsdkj', 'sldkj'] - """ - return [res.asList() if isinstance(res,ParseResults) else res for res in self.__toklist] - - def asDict( self ): - """ - Returns the named parse results as a nested dictionary. - - Example:: - - integer = Word(nums) - date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - - result = date_str.parseString('12/31/1999') - print(type(result), repr(result)) # -> <class 'pyparsing.ParseResults'> (['12', '/', '31', '/', '1999'], {'day': [('1999', 4)], 'year': [('12', 0)], 'month': [('31', 2)]}) - - result_dict = result.asDict() - print(type(result_dict), repr(result_dict)) # -> <class 'dict'> {'day': '1999', 'year': '12', 'month': '31'} - - # even though a ParseResults supports dict-like access, sometime you just need to have a dict - import json - print(json.dumps(result)) # -> Exception: TypeError: ... is not JSON serializable - print(json.dumps(result.asDict())) # -> {"month": "31", "day": "1999", "year": "12"} - """ - if PY_3: - item_fn = self.items - else: - item_fn = self.iteritems - - def toItem(obj): - if isinstance(obj, ParseResults): - if obj.haskeys(): - return obj.asDict() - else: - return [toItem(v) for v in obj] - else: - return obj - - return dict((k,toItem(v)) for k,v in item_fn()) - - def copy( self ): - """ - Returns a new copy of a :class:`ParseResults` object. - """ - ret = ParseResults( self.__toklist ) - ret.__tokdict = dict(self.__tokdict.items()) - ret.__parent = self.__parent - ret.__accumNames.update( self.__accumNames ) - ret.__name = self.__name - return ret - - def asXML( self, doctag=None, namedItemsOnly=False, indent="", formatted=True ): - """ - (Deprecated) Returns the parse results as XML. Tags are created for tokens and lists that have defined results names. - """ - nl = "\n" - out = [] - namedItems = dict((v[1],k) for (k,vlist) in self.__tokdict.items() - for v in vlist) - nextLevelIndent = indent + " " - - # collapse out indents if formatting is not desired - if not formatted: - indent = "" - nextLevelIndent = "" - nl = "" - - selfTag = None - if doctag is not None: - selfTag = doctag - else: - if self.__name: - selfTag = self.__name - - if not selfTag: - if namedItemsOnly: - return "" - else: - selfTag = "ITEM" - - out += [ nl, indent, "<", selfTag, ">" ] - - for i,res in enumerate(self.__toklist): - if isinstance(res,ParseResults): - if i in namedItems: - out += [ res.asXML(namedItems[i], - namedItemsOnly and doctag is None, - nextLevelIndent, - formatted)] - else: - out += [ res.asXML(None, - namedItemsOnly and doctag is None, - nextLevelIndent, - formatted)] - else: - # individual token, see if there is a name for it - resTag = None - if i in namedItems: - resTag = namedItems[i] - if not resTag: - if namedItemsOnly: - continue - else: - resTag = "ITEM" - xmlBodyText = _xml_escape(_ustr(res)) - out += [ nl, nextLevelIndent, "<", resTag, ">", - xmlBodyText, - "</", resTag, ">" ] - - out += [ nl, indent, "</", selfTag, ">" ] - return "".join(out) - - def __lookup(self,sub): - for k,vlist in self.__tokdict.items(): - for v,loc in vlist: - if sub is v: - return k - return None - - def getName(self): - r""" - Returns the results name for this token expression. Useful when several - different expressions might match at a particular location. - - Example:: - - integer = Word(nums) - ssn_expr = Regex(r"\d\d\d-\d\d-\d\d\d\d") - house_number_expr = Suppress('#') + Word(nums, alphanums) - user_data = (Group(house_number_expr)("house_number") - | Group(ssn_expr)("ssn") - | Group(integer)("age")) - user_info = OneOrMore(user_data) - - result = user_info.parseString("22 111-22-3333 #221B") - for item in result: - print(item.getName(), ':', item[0]) - - prints:: - - age : 22 - ssn : 111-22-3333 - house_number : 221B - """ - if self.__name: - return self.__name - elif self.__parent: - par = self.__parent() - if par: - return par.__lookup(self) - else: - return None - elif (len(self) == 1 and - len(self.__tokdict) == 1 and - next(iter(self.__tokdict.values()))[0][1] in (0,-1)): - return next(iter(self.__tokdict.keys())) - else: - return None - - def dump(self, indent='', depth=0, full=True): - """ - Diagnostic method for listing out the contents of - a :class:`ParseResults`. Accepts an optional ``indent`` argument so - that this string can be embedded in a nested display of other data. - - Example:: - - integer = Word(nums) - date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - - result = date_str.parseString('12/31/1999') - print(result.dump()) - - prints:: - - ['12', '/', '31', '/', '1999'] - - day: 1999 - - month: 31 - - year: 12 - """ - out = [] - NL = '\n' - out.append( indent+_ustr(self.asList()) ) - if full: - if self.haskeys(): - items = sorted((str(k), v) for k,v in self.items()) - for k,v in items: - if out: - out.append(NL) - out.append( "%s%s- %s: " % (indent,(' '*depth), k) ) - if isinstance(v,ParseResults): - if v: - out.append( v.dump(indent,depth+1) ) - else: - out.append(_ustr(v)) - else: - out.append(repr(v)) - elif any(isinstance(vv,ParseResults) for vv in self): - v = self - for i,vv in enumerate(v): - if isinstance(vv,ParseResults): - out.append("\n%s%s[%d]:\n%s%s%s" % (indent,(' '*(depth)),i,indent,(' '*(depth+1)),vv.dump(indent,depth+1) )) - else: - out.append("\n%s%s[%d]:\n%s%s%s" % (indent,(' '*(depth)),i,indent,(' '*(depth+1)),_ustr(vv))) - - return "".join(out) - - def pprint(self, *args, **kwargs): - """ - Pretty-printer for parsed results as a list, using the - `pprint <https://docs.python.org/3/library/pprint.html>`_ module. - Accepts additional positional or keyword args as defined for - `pprint.pprint <https://docs.python.org/3/library/pprint.html#pprint.pprint>`_ . - - Example:: - - ident = Word(alphas, alphanums) - num = Word(nums) - func = Forward() - term = ident | num | Group('(' + func + ')') - func <<= ident + Group(Optional(delimitedList(term))) - result = func.parseString("fna a,b,(fnb c,d,200),100") - result.pprint(width=40) - - prints:: - - ['fna', - ['a', - 'b', - ['(', 'fnb', ['c', 'd', '200'], ')'], - '100']] - """ - pprint.pprint(self.asList(), *args, **kwargs) - - # add support for pickle protocol - def __getstate__(self): - return ( self.__toklist, - ( self.__tokdict.copy(), - self.__parent is not None and self.__parent() or None, - self.__accumNames, - self.__name ) ) - - def __setstate__(self,state): - self.__toklist = state[0] - (self.__tokdict, - par, - inAccumNames, - self.__name) = state[1] - self.__accumNames = {} - self.__accumNames.update(inAccumNames) - if par is not None: - self.__parent = wkref(par) - else: - self.__parent = None - - def __getnewargs__(self): - return self.__toklist, self.__name, self.__asList, self.__modal - - def __dir__(self): - return (dir(type(self)) + list(self.keys())) - -MutableMapping.register(ParseResults) - -def col (loc,strg): - """Returns current column within a string, counting newlines as line separators. - The first column is number 1. - - Note: the default parsing behavior is to expand tabs in the input string - before starting the parsing process. See - :class:`ParserElement.parseString` for more - information on parsing strings containing ``<TAB>`` s, and suggested - methods to maintain a consistent view of the parsed string, the parse - location, and line and column positions within the parsed string. - """ - s = strg - return 1 if 0<loc<len(s) and s[loc-1] == '\n' else loc - s.rfind("\n", 0, loc) - -def lineno(loc,strg): - """Returns current line number within a string, counting newlines as line separators. - The first line is number 1. - - Note - the default parsing behavior is to expand tabs in the input string - before starting the parsing process. See :class:`ParserElement.parseString` - for more information on parsing strings containing ``<TAB>`` s, and - suggested methods to maintain a consistent view of the parsed string, the - parse location, and line and column positions within the parsed string. - """ - return strg.count("\n",0,loc) + 1 - -def line( loc, strg ): - """Returns the line of text containing loc within a string, counting newlines as line separators. - """ - lastCR = strg.rfind("\n", 0, loc) - nextCR = strg.find("\n", loc) - if nextCR >= 0: - return strg[lastCR+1:nextCR] - else: - return strg[lastCR+1:] - -def _defaultStartDebugAction( instring, loc, expr ): - print (("Match " + _ustr(expr) + " at loc " + _ustr(loc) + "(%d,%d)" % ( lineno(loc,instring), col(loc,instring) ))) - -def _defaultSuccessDebugAction( instring, startloc, endloc, expr, toks ): - print ("Matched " + _ustr(expr) + " -> " + str(toks.asList())) - -def _defaultExceptionDebugAction( instring, loc, expr, exc ): - print ("Exception raised:" + _ustr(exc)) - -def nullDebugAction(*args): - """'Do-nothing' debug action, to suppress debugging output during parsing.""" - pass - -# Only works on Python 3.x - nonlocal is toxic to Python 2 installs -#~ 'decorator to trim function calls to match the arity of the target' -#~ def _trim_arity(func, maxargs=3): - #~ if func in singleArgBuiltins: - #~ return lambda s,l,t: func(t) - #~ limit = 0 - #~ foundArity = False - #~ def wrapper(*args): - #~ nonlocal limit,foundArity - #~ while 1: - #~ try: - #~ ret = func(*args[limit:]) - #~ foundArity = True - #~ return ret - #~ except TypeError: - #~ if limit == maxargs or foundArity: - #~ raise - #~ limit += 1 - #~ continue - #~ return wrapper - -# this version is Python 2.x-3.x cross-compatible -'decorator to trim function calls to match the arity of the target' -def _trim_arity(func, maxargs=2): - if func in singleArgBuiltins: - return lambda s,l,t: func(t) - limit = [0] - foundArity = [False] - - # traceback return data structure changed in Py3.5 - normalize back to plain tuples - if system_version[:2] >= (3,5): - def extract_stack(limit=0): - # special handling for Python 3.5.0 - extra deep call stack by 1 - offset = -3 if system_version == (3,5,0) else -2 - frame_summary = traceback.extract_stack(limit=-offset+limit-1)[offset] - return [frame_summary[:2]] - def extract_tb(tb, limit=0): - frames = traceback.extract_tb(tb, limit=limit) - frame_summary = frames[-1] - return [frame_summary[:2]] - else: - extract_stack = traceback.extract_stack - extract_tb = traceback.extract_tb - - # synthesize what would be returned by traceback.extract_stack at the call to - # user's parse action 'func', so that we don't incur call penalty at parse time - - LINE_DIFF = 6 - # IF ANY CODE CHANGES, EVEN JUST COMMENTS OR BLANK LINES, BETWEEN THE NEXT LINE AND - # THE CALL TO FUNC INSIDE WRAPPER, LINE_DIFF MUST BE MODIFIED!!!! - this_line = extract_stack(limit=2)[-1] - pa_call_line_synth = (this_line[0], this_line[1]+LINE_DIFF) - - def wrapper(*args): - while 1: - try: - ret = func(*args[limit[0]:]) - foundArity[0] = True - return ret - except TypeError: - # re-raise TypeErrors if they did not come from our arity testing - if foundArity[0]: - raise - else: - try: - tb = sys.exc_info()[-1] - if not extract_tb(tb, limit=2)[-1][:2] == pa_call_line_synth: - raise - finally: - del tb - - if limit[0] <= maxargs: - limit[0] += 1 - continue - raise - - # copy func name to wrapper for sensible debug output - func_name = "<parse action>" - try: - func_name = getattr(func, '__name__', - getattr(func, '__class__').__name__) - except Exception: - func_name = str(func) - wrapper.__name__ = func_name - - return wrapper - -class ParserElement(object): - """Abstract base level parser element class.""" - DEFAULT_WHITE_CHARS = " \n\t\r" - verbose_stacktrace = False - - @staticmethod - def setDefaultWhitespaceChars( chars ): - r""" - Overrides the default whitespace chars - - Example:: - - # default whitespace chars are space, <TAB> and newline - OneOrMore(Word(alphas)).parseString("abc def\nghi jkl") # -> ['abc', 'def', 'ghi', 'jkl'] - - # change to just treat newline as significant - ParserElement.setDefaultWhitespaceChars(" \t") - OneOrMore(Word(alphas)).parseString("abc def\nghi jkl") # -> ['abc', 'def'] - """ - ParserElement.DEFAULT_WHITE_CHARS = chars - - @staticmethod - def inlineLiteralsUsing(cls): - """ - Set class to be used for inclusion of string literals into a parser. - - Example:: - - # default literal class used is Literal - integer = Word(nums) - date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - - date_str.parseString("1999/12/31") # -> ['1999', '/', '12', '/', '31'] - - - # change to Suppress - ParserElement.inlineLiteralsUsing(Suppress) - date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - - date_str.parseString("1999/12/31") # -> ['1999', '12', '31'] - """ - ParserElement._literalStringClass = cls - - def __init__( self, savelist=False ): - self.parseAction = list() - self.failAction = None - #~ self.name = "<unknown>" # don't define self.name, let subclasses try/except upcall - self.strRepr = None - self.resultsName = None - self.saveAsList = savelist - self.skipWhitespace = True - self.whiteChars = set(ParserElement.DEFAULT_WHITE_CHARS) - self.copyDefaultWhiteChars = True - self.mayReturnEmpty = False # used when checking for left-recursion - self.keepTabs = False - self.ignoreExprs = list() - self.debug = False - self.streamlined = False - self.mayIndexError = True # used to optimize exception handling for subclasses that don't advance parse index - self.errmsg = "" - self.modalResults = True # used to mark results names as modal (report only last) or cumulative (list all) - self.debugActions = ( None, None, None ) #custom debug actions - self.re = None - self.callPreparse = True # used to avoid redundant calls to preParse - self.callDuringTry = False - - def copy( self ): - """ - Make a copy of this :class:`ParserElement`. Useful for defining - different parse actions for the same parsing pattern, using copies of - the original parse element. - - Example:: - - integer = Word(nums).setParseAction(lambda toks: int(toks[0])) - integerK = integer.copy().addParseAction(lambda toks: toks[0]*1024) + Suppress("K") - integerM = integer.copy().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M") - - print(OneOrMore(integerK | integerM | integer).parseString("5K 100 640K 256M")) - - prints:: - - [5120, 100, 655360, 268435456] - - Equivalent form of ``expr.copy()`` is just ``expr()``:: - - integerM = integer().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M") - """ - cpy = copy.copy( self ) - cpy.parseAction = self.parseAction[:] - cpy.ignoreExprs = self.ignoreExprs[:] - if self.copyDefaultWhiteChars: - cpy.whiteChars = ParserElement.DEFAULT_WHITE_CHARS - return cpy - - def setName( self, name ): - """ - Define name for this expression, makes debugging and exception messages clearer. - - Example:: - - Word(nums).parseString("ABC") # -> Exception: Expected W:(0123...) (at char 0), (line:1, col:1) - Word(nums).setName("integer").parseString("ABC") # -> Exception: Expected integer (at char 0), (line:1, col:1) - """ - self.name = name - self.errmsg = "Expected " + self.name - if hasattr(self,"exception"): - self.exception.msg = self.errmsg - return self - - def setResultsName( self, name, listAllMatches=False ): - """ - Define name for referencing matching tokens as a nested attribute - of the returned parse results. - NOTE: this returns a *copy* of the original :class:`ParserElement` object; - this is so that the client can define a basic element, such as an - integer, and reference it in multiple places with different names. - - You can also set results names using the abbreviated syntax, - ``expr("name")`` in place of ``expr.setResultsName("name")`` - - see :class:`__call__`. - - Example:: - - date_str = (integer.setResultsName("year") + '/' - + integer.setResultsName("month") + '/' - + integer.setResultsName("day")) - - # equivalent form: - date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - """ - newself = self.copy() - if name.endswith("*"): - name = name[:-1] - listAllMatches=True - newself.resultsName = name - newself.modalResults = not listAllMatches - return newself - - def setBreak(self,breakFlag = True): - """Method to invoke the Python pdb debugger when this element is - about to be parsed. Set ``breakFlag`` to True to enable, False to - disable. - """ - if breakFlag: - _parseMethod = self._parse - def breaker(instring, loc, doActions=True, callPreParse=True): - import pdb - pdb.set_trace() - return _parseMethod( instring, loc, doActions, callPreParse ) - breaker._originalParseMethod = _parseMethod - self._parse = breaker - else: - if hasattr(self._parse,"_originalParseMethod"): - self._parse = self._parse._originalParseMethod - return self - - def setParseAction( self, *fns, **kwargs ): - """ - Define one or more actions to perform when successfully matching parse element definition. - Parse action fn is a callable method with 0-3 arguments, called as ``fn(s,loc,toks)`` , - ``fn(loc,toks)`` , ``fn(toks)`` , or just ``fn()`` , where: - - - s = the original string being parsed (see note below) - - loc = the location of the matching substring - - toks = a list of the matched tokens, packaged as a :class:`ParseResults` object - - If the functions in fns modify the tokens, they can return them as the return - value from fn, and the modified list of tokens will replace the original. - Otherwise, fn does not need to return any value. - - Optional keyword arguments: - - callDuringTry = (default= ``False`` ) indicate if parse action should be run during lookaheads and alternate testing - - Note: the default parsing behavior is to expand tabs in the input string - before starting the parsing process. See :class:`parseString for more - information on parsing strings containing ``<TAB>`` s, and suggested - methods to maintain a consistent view of the parsed string, the parse - location, and line and column positions within the parsed string. - - Example:: - - integer = Word(nums) - date_str = integer + '/' + integer + '/' + integer - - date_str.parseString("1999/12/31") # -> ['1999', '/', '12', '/', '31'] - - # use parse action to convert to ints at parse time - integer = Word(nums).setParseAction(lambda toks: int(toks[0])) - date_str = integer + '/' + integer + '/' + integer - - # note that integer fields are now ints, not strings - date_str.parseString("1999/12/31") # -> [1999, '/', 12, '/', 31] - """ - self.parseAction = list(map(_trim_arity, list(fns))) - self.callDuringTry = kwargs.get("callDuringTry", False) - return self - - def addParseAction( self, *fns, **kwargs ): - """ - Add one or more parse actions to expression's list of parse actions. See :class:`setParseAction`. - - See examples in :class:`copy`. - """ - self.parseAction += list(map(_trim_arity, list(fns))) - self.callDuringTry = self.callDuringTry or kwargs.get("callDuringTry", False) - return self - - def addCondition(self, *fns, **kwargs): - """Add a boolean predicate function to expression's list of parse actions. See - :class:`setParseAction` for function call signatures. Unlike ``setParseAction``, - functions passed to ``addCondition`` need to return boolean success/fail of the condition. - - Optional keyword arguments: - - message = define a custom message to be used in the raised exception - - fatal = if True, will raise ParseFatalException to stop parsing immediately; otherwise will raise ParseException - - Example:: - - integer = Word(nums).setParseAction(lambda toks: int(toks[0])) - year_int = integer.copy() - year_int.addCondition(lambda toks: toks[0] >= 2000, message="Only support years 2000 and later") - date_str = year_int + '/' + integer + '/' + integer - - result = date_str.parseString("1999/12/31") # -> Exception: Only support years 2000 and later (at char 0), (line:1, col:1) - """ - msg = kwargs.get("message", "failed user-defined condition") - exc_type = ParseFatalException if kwargs.get("fatal", False) else ParseException - for fn in fns: - fn = _trim_arity(fn) - def pa(s,l,t): - if not bool(fn(s,l,t)): - raise exc_type(s,l,msg) - self.parseAction.append(pa) - self.callDuringTry = self.callDuringTry or kwargs.get("callDuringTry", False) - return self - - def setFailAction( self, fn ): - """Define action to perform if parsing fails at this expression. - Fail acton fn is a callable function that takes the arguments - ``fn(s,loc,expr,err)`` where: - - s = string being parsed - - loc = location where expression match was attempted and failed - - expr = the parse expression that failed - - err = the exception thrown - The function returns no value. It may throw :class:`ParseFatalException` - if it is desired to stop parsing immediately.""" - self.failAction = fn - return self - - def _skipIgnorables( self, instring, loc ): - exprsFound = True - while exprsFound: - exprsFound = False - for e in self.ignoreExprs: - try: - while 1: - loc,dummy = e._parse( instring, loc ) - exprsFound = True - except ParseException: - pass - return loc - - def preParse( self, instring, loc ): - if self.ignoreExprs: - loc = self._skipIgnorables( instring, loc ) - - if self.skipWhitespace: - wt = self.whiteChars - instrlen = len(instring) - while loc < instrlen and instring[loc] in wt: - loc += 1 - - return loc - - def parseImpl( self, instring, loc, doActions=True ): - return loc, [] - - def postParse( self, instring, loc, tokenlist ): - return tokenlist - - #~ @profile - def _parseNoCache( self, instring, loc, doActions=True, callPreParse=True ): - debugging = ( self.debug ) #and doActions ) - - if debugging or self.failAction: - #~ print ("Match",self,"at loc",loc,"(%d,%d)" % ( lineno(loc,instring), col(loc,instring) )) - if (self.debugActions[0] ): - self.debugActions[0]( instring, loc, self ) - if callPreParse and self.callPreparse: - preloc = self.preParse( instring, loc ) - else: - preloc = loc - tokensStart = preloc - try: - try: - loc,tokens = self.parseImpl( instring, preloc, doActions ) - except IndexError: - raise ParseException( instring, len(instring), self.errmsg, self ) - except ParseBaseException as err: - #~ print ("Exception raised:", err) - if self.debugActions[2]: - self.debugActions[2]( instring, tokensStart, self, err ) - if self.failAction: - self.failAction( instring, tokensStart, self, err ) - raise - else: - if callPreParse and self.callPreparse: - preloc = self.preParse( instring, loc ) - else: - preloc = loc - tokensStart = preloc - if self.mayIndexError or preloc >= len(instring): - try: - loc,tokens = self.parseImpl( instring, preloc, doActions ) - except IndexError: - raise ParseException( instring, len(instring), self.errmsg, self ) - else: - loc,tokens = self.parseImpl( instring, preloc, doActions ) - - tokens = self.postParse( instring, loc, tokens ) - - retTokens = ParseResults( tokens, self.resultsName, asList=self.saveAsList, modal=self.modalResults ) - if self.parseAction and (doActions or self.callDuringTry): - if debugging: - try: - for fn in self.parseAction: - try: - tokens = fn( instring, tokensStart, retTokens ) - except IndexError as parse_action_exc: - exc = ParseException("exception raised in parse action") - exc.__cause__ = parse_action_exc - raise exc - - if tokens is not None and tokens is not retTokens: - retTokens = ParseResults( tokens, - self.resultsName, - asList=self.saveAsList and isinstance(tokens,(ParseResults,list)), - modal=self.modalResults ) - except ParseBaseException as err: - #~ print "Exception raised in user parse action:", err - if (self.debugActions[2] ): - self.debugActions[2]( instring, tokensStart, self, err ) - raise - else: - for fn in self.parseAction: - try: - tokens = fn( instring, tokensStart, retTokens ) - except IndexError as parse_action_exc: - exc = ParseException("exception raised in parse action") - exc.__cause__ = parse_action_exc - raise exc - - if tokens is not None and tokens is not retTokens: - retTokens = ParseResults( tokens, - self.resultsName, - asList=self.saveAsList and isinstance(tokens,(ParseResults,list)), - modal=self.modalResults ) - if debugging: - #~ print ("Matched",self,"->",retTokens.asList()) - if (self.debugActions[1] ): - self.debugActions[1]( instring, tokensStart, loc, self, retTokens ) - - return loc, retTokens - - def tryParse( self, instring, loc ): - try: - return self._parse( instring, loc, doActions=False )[0] - except ParseFatalException: - raise ParseException( instring, loc, self.errmsg, self) - - def canParseNext(self, instring, loc): - try: - self.tryParse(instring, loc) - except (ParseException, IndexError): - return False - else: - return True - - class _UnboundedCache(object): - def __init__(self): - cache = {} - self.not_in_cache = not_in_cache = object() - - def get(self, key): - return cache.get(key, not_in_cache) - - def set(self, key, value): - cache[key] = value - - def clear(self): - cache.clear() - - def cache_len(self): - return len(cache) - - self.get = types.MethodType(get, self) - self.set = types.MethodType(set, self) - self.clear = types.MethodType(clear, self) - self.__len__ = types.MethodType(cache_len, self) - - if _OrderedDict is not None: - class _FifoCache(object): - def __init__(self, size): - self.not_in_cache = not_in_cache = object() - - cache = _OrderedDict() - - def get(self, key): - return cache.get(key, not_in_cache) - - def set(self, key, value): - cache[key] = value - while len(cache) > size: - try: - cache.popitem(False) - except KeyError: - pass - - def clear(self): - cache.clear() - - def cache_len(self): - return len(cache) - - self.get = types.MethodType(get, self) - self.set = types.MethodType(set, self) - self.clear = types.MethodType(clear, self) - self.__len__ = types.MethodType(cache_len, self) - - else: - class _FifoCache(object): - def __init__(self, size): - self.not_in_cache = not_in_cache = object() - - cache = {} - key_fifo = collections.deque([], size) - - def get(self, key): - return cache.get(key, not_in_cache) - - def set(self, key, value): - cache[key] = value - while len(key_fifo) > size: - cache.pop(key_fifo.popleft(), None) - key_fifo.append(key) - - def clear(self): - cache.clear() - key_fifo.clear() - - def cache_len(self): - return len(cache) - - self.get = types.MethodType(get, self) - self.set = types.MethodType(set, self) - self.clear = types.MethodType(clear, self) - self.__len__ = types.MethodType(cache_len, self) - - # argument cache for optimizing repeated calls when backtracking through recursive expressions - packrat_cache = {} # this is set later by enabledPackrat(); this is here so that resetCache() doesn't fail - packrat_cache_lock = RLock() - packrat_cache_stats = [0, 0] - - # this method gets repeatedly called during backtracking with the same arguments - - # we can cache these arguments and save ourselves the trouble of re-parsing the contained expression - def _parseCache( self, instring, loc, doActions=True, callPreParse=True ): - HIT, MISS = 0, 1 - lookup = (self, instring, loc, callPreParse, doActions) - with ParserElement.packrat_cache_lock: - cache = ParserElement.packrat_cache - value = cache.get(lookup) - if value is cache.not_in_cache: - ParserElement.packrat_cache_stats[MISS] += 1 - try: - value = self._parseNoCache(instring, loc, doActions, callPreParse) - except ParseBaseException as pe: - # cache a copy of the exception, without the traceback - cache.set(lookup, pe.__class__(*pe.args)) - raise - else: - cache.set(lookup, (value[0], value[1].copy())) - return value - else: - ParserElement.packrat_cache_stats[HIT] += 1 - if isinstance(value, Exception): - raise value - return (value[0], value[1].copy()) - - _parse = _parseNoCache - - @staticmethod - def resetCache(): - ParserElement.packrat_cache.clear() - ParserElement.packrat_cache_stats[:] = [0] * len(ParserElement.packrat_cache_stats) - - _packratEnabled = False - @staticmethod - def enablePackrat(cache_size_limit=128): - """Enables "packrat" parsing, which adds memoizing to the parsing logic. - Repeated parse attempts at the same string location (which happens - often in many complex grammars) can immediately return a cached value, - instead of re-executing parsing/validating code. Memoizing is done of - both valid results and parsing exceptions. - - Parameters: - - - cache_size_limit - (default= ``128``) - if an integer value is provided - will limit the size of the packrat cache; if None is passed, then - the cache size will be unbounded; if 0 is passed, the cache will - be effectively disabled. - - This speedup may break existing programs that use parse actions that - have side-effects. For this reason, packrat parsing is disabled when - you first import pyparsing. To activate the packrat feature, your - program must call the class method :class:`ParserElement.enablePackrat`. - For best results, call ``enablePackrat()`` immediately after - importing pyparsing. - - Example:: - - from pip._vendor import pyparsing - pyparsing.ParserElement.enablePackrat() - """ - if not ParserElement._packratEnabled: - ParserElement._packratEnabled = True - if cache_size_limit is None: - ParserElement.packrat_cache = ParserElement._UnboundedCache() - else: - ParserElement.packrat_cache = ParserElement._FifoCache(cache_size_limit) - ParserElement._parse = ParserElement._parseCache - - def parseString( self, instring, parseAll=False ): - """ - Execute the parse expression with the given string. - This is the main interface to the client code, once the complete - expression has been built. - - If you want the grammar to require that the entire input string be - successfully parsed, then set ``parseAll`` to True (equivalent to ending - the grammar with ``StringEnd()``). - - Note: ``parseString`` implicitly calls ``expandtabs()`` on the input string, - in order to report proper column numbers in parse actions. - If the input string contains tabs and - the grammar uses parse actions that use the ``loc`` argument to index into the - string being parsed, you can ensure you have a consistent view of the input - string by: - - - calling ``parseWithTabs`` on your grammar before calling ``parseString`` - (see :class:`parseWithTabs`) - - define your parse action using the full ``(s,loc,toks)`` signature, and - reference the input string using the parse action's ``s`` argument - - explictly expand the tabs in your input string before calling - ``parseString`` - - Example:: - - Word('a').parseString('aaaaabaaa') # -> ['aaaaa'] - Word('a').parseString('aaaaabaaa', parseAll=True) # -> Exception: Expected end of text - """ - ParserElement.resetCache() - if not self.streamlined: - self.streamline() - #~ self.saveAsList = True - for e in self.ignoreExprs: - e.streamline() - if not self.keepTabs: - instring = instring.expandtabs() - try: - loc, tokens = self._parse( instring, 0 ) - if parseAll: - loc = self.preParse( instring, loc ) - se = Empty() + StringEnd() - se._parse( instring, loc ) - except ParseBaseException as exc: - if ParserElement.verbose_stacktrace: - raise - else: - # catch and re-raise exception from here, clears out pyparsing internal stack trace - raise exc - else: - return tokens - - def scanString( self, instring, maxMatches=_MAX_INT, overlap=False ): - """ - Scan the input string for expression matches. Each match will return the - matching tokens, start location, and end location. May be called with optional - ``maxMatches`` argument, to clip scanning after 'n' matches are found. If - ``overlap`` is specified, then overlapping matches will be reported. - - Note that the start and end locations are reported relative to the string - being parsed. See :class:`parseString` for more information on parsing - strings with embedded tabs. - - Example:: - - source = "sldjf123lsdjjkf345sldkjf879lkjsfd987" - print(source) - for tokens,start,end in Word(alphas).scanString(source): - print(' '*start + '^'*(end-start)) - print(' '*start + tokens[0]) - - prints:: - - sldjf123lsdjjkf345sldkjf879lkjsfd987 - ^^^^^ - sldjf - ^^^^^^^ - lsdjjkf - ^^^^^^ - sldkjf - ^^^^^^ - lkjsfd - """ - if not self.streamlined: - self.streamline() - for e in self.ignoreExprs: - e.streamline() - - if not self.keepTabs: - instring = _ustr(instring).expandtabs() - instrlen = len(instring) - loc = 0 - preparseFn = self.preParse - parseFn = self._parse - ParserElement.resetCache() - matches = 0 - try: - while loc <= instrlen and matches < maxMatches: - try: - preloc = preparseFn( instring, loc ) - nextLoc,tokens = parseFn( instring, preloc, callPreParse=False ) - except ParseException: - loc = preloc+1 - else: - if nextLoc > loc: - matches += 1 - yield tokens, preloc, nextLoc - if overlap: - nextloc = preparseFn( instring, loc ) - if nextloc > loc: - loc = nextLoc - else: - loc += 1 - else: - loc = nextLoc - else: - loc = preloc+1 - except ParseBaseException as exc: - if ParserElement.verbose_stacktrace: - raise - else: - # catch and re-raise exception from here, clears out pyparsing internal stack trace - raise exc - - def transformString( self, instring ): - """ - Extension to :class:`scanString`, to modify matching text with modified tokens that may - be returned from a parse action. To use ``transformString``, define a grammar and - attach a parse action to it that modifies the returned token list. - Invoking ``transformString()`` on a target string will then scan for matches, - and replace the matched text patterns according to the logic in the parse - action. ``transformString()`` returns the resulting transformed string. - - Example:: - - wd = Word(alphas) - wd.setParseAction(lambda toks: toks[0].title()) - - print(wd.transformString("now is the winter of our discontent made glorious summer by this sun of york.")) - - prints:: - - Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York. - """ - out = [] - lastE = 0 - # force preservation of <TAB>s, to minimize unwanted transformation of string, and to - # keep string locs straight between transformString and scanString - self.keepTabs = True - try: - for t,s,e in self.scanString( instring ): - out.append( instring[lastE:s] ) - if t: - if isinstance(t,ParseResults): - out += t.asList() - elif isinstance(t,list): - out += t - else: - out.append(t) - lastE = e - out.append(instring[lastE:]) - out = [o for o in out if o] - return "".join(map(_ustr,_flatten(out))) - except ParseBaseException as exc: - if ParserElement.verbose_stacktrace: - raise - else: - # catch and re-raise exception from here, clears out pyparsing internal stack trace - raise exc - - def searchString( self, instring, maxMatches=_MAX_INT ): - """ - Another extension to :class:`scanString`, simplifying the access to the tokens found - to match the given parse expression. May be called with optional - ``maxMatches`` argument, to clip searching after 'n' matches are found. - - Example:: - - # a capitalized word starts with an uppercase letter, followed by zero or more lowercase letters - cap_word = Word(alphas.upper(), alphas.lower()) - - print(cap_word.searchString("More than Iron, more than Lead, more than Gold I need Electricity")) - - # the sum() builtin can be used to merge results into a single ParseResults object - print(sum(cap_word.searchString("More than Iron, more than Lead, more than Gold I need Electricity"))) - - prints:: - - [['More'], ['Iron'], ['Lead'], ['Gold'], ['I'], ['Electricity']] - ['More', 'Iron', 'Lead', 'Gold', 'I', 'Electricity'] - """ - try: - return ParseResults([ t for t,s,e in self.scanString( instring, maxMatches ) ]) - except ParseBaseException as exc: - if ParserElement.verbose_stacktrace: - raise - else: - # catch and re-raise exception from here, clears out pyparsing internal stack trace - raise exc - - def split(self, instring, maxsplit=_MAX_INT, includeSeparators=False): - """ - Generator method to split a string using the given expression as a separator. - May be called with optional ``maxsplit`` argument, to limit the number of splits; - and the optional ``includeSeparators`` argument (default= ``False``), if the separating - matching text should be included in the split results. - - Example:: - - punc = oneOf(list(".,;:/-!?")) - print(list(punc.split("This, this?, this sentence, is badly punctuated!"))) - - prints:: - - ['This', ' this', '', ' this sentence', ' is badly punctuated', ''] - """ - splits = 0 - last = 0 - for t,s,e in self.scanString(instring, maxMatches=maxsplit): - yield instring[last:s] - if includeSeparators: - yield t[0] - last = e - yield instring[last:] - - def __add__(self, other ): - """ - Implementation of + operator - returns :class:`And`. Adding strings to a ParserElement - converts them to :class:`Literal`s by default. - - Example:: - - greet = Word(alphas) + "," + Word(alphas) + "!" - hello = "Hello, World!" - print (hello, "->", greet.parseString(hello)) - - prints:: - - Hello, World! -> ['Hello', ',', 'World', '!'] - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return And( [ self, other ] ) - - def __radd__(self, other ): - """ - Implementation of + operator when left operand is not a :class:`ParserElement` - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return other + self - - def __sub__(self, other): - """ - Implementation of - operator, returns :class:`And` with error stop - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return self + And._ErrorStop() + other - - def __rsub__(self, other ): - """ - Implementation of - operator when left operand is not a :class:`ParserElement` - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return other - self - - def __mul__(self,other): - """ - Implementation of * operator, allows use of ``expr * 3`` in place of - ``expr + expr + expr``. Expressions may also me multiplied by a 2-integer - tuple, similar to ``{min,max}`` multipliers in regular expressions. Tuples - may also include ``None`` as in: - - ``expr*(n,None)`` or ``expr*(n,)`` is equivalent - to ``expr*n + ZeroOrMore(expr)`` - (read as "at least n instances of ``expr``") - - ``expr*(None,n)`` is equivalent to ``expr*(0,n)`` - (read as "0 to n instances of ``expr``") - - ``expr*(None,None)`` is equivalent to ``ZeroOrMore(expr)`` - - ``expr*(1,None)`` is equivalent to ``OneOrMore(expr)`` - - Note that ``expr*(None,n)`` does not raise an exception if - more than n exprs exist in the input stream; that is, - ``expr*(None,n)`` does not enforce a maximum number of expr - occurrences. If this behavior is desired, then write - ``expr*(None,n) + ~expr`` - """ - if isinstance(other,int): - minElements, optElements = other,0 - elif isinstance(other,tuple): - other = (other + (None, None))[:2] - if other[0] is None: - other = (0, other[1]) - if isinstance(other[0],int) and other[1] is None: - if other[0] == 0: - return ZeroOrMore(self) - if other[0] == 1: - return OneOrMore(self) - else: - return self*other[0] + ZeroOrMore(self) - elif isinstance(other[0],int) and isinstance(other[1],int): - minElements, optElements = other - optElements -= minElements - else: - raise TypeError("cannot multiply 'ParserElement' and ('%s','%s') objects", type(other[0]),type(other[1])) - else: - raise TypeError("cannot multiply 'ParserElement' and '%s' objects", type(other)) - - if minElements < 0: - raise ValueError("cannot multiply ParserElement by negative value") - if optElements < 0: - raise ValueError("second tuple value must be greater or equal to first tuple value") - if minElements == optElements == 0: - raise ValueError("cannot multiply ParserElement by 0 or (0,0)") - - if (optElements): - def makeOptionalList(n): - if n>1: - return Optional(self + makeOptionalList(n-1)) - else: - return Optional(self) - if minElements: - if minElements == 1: - ret = self + makeOptionalList(optElements) - else: - ret = And([self]*minElements) + makeOptionalList(optElements) - else: - ret = makeOptionalList(optElements) - else: - if minElements == 1: - ret = self - else: - ret = And([self]*minElements) - return ret - - def __rmul__(self, other): - return self.__mul__(other) - - def __or__(self, other ): - """ - Implementation of | operator - returns :class:`MatchFirst` - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return MatchFirst( [ self, other ] ) - - def __ror__(self, other ): - """ - Implementation of | operator when left operand is not a :class:`ParserElement` - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return other | self - - def __xor__(self, other ): - """ - Implementation of ^ operator - returns :class:`Or` - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return Or( [ self, other ] ) - - def __rxor__(self, other ): - """ - Implementation of ^ operator when left operand is not a :class:`ParserElement` - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return other ^ self - - def __and__(self, other ): - """ - Implementation of & operator - returns :class:`Each` - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return Each( [ self, other ] ) - - def __rand__(self, other ): - """ - Implementation of & operator when left operand is not a :class:`ParserElement` - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return other & self - - def __invert__( self ): - """ - Implementation of ~ operator - returns :class:`NotAny` - """ - return NotAny( self ) - - def __call__(self, name=None): - """ - Shortcut for :class:`setResultsName`, with ``listAllMatches=False``. - - If ``name`` is given with a trailing ``'*'`` character, then ``listAllMatches`` will be - passed as ``True``. - - If ``name` is omitted, same as calling :class:`copy`. - - Example:: - - # these are equivalent - userdata = Word(alphas).setResultsName("name") + Word(nums+"-").setResultsName("socsecno") - userdata = Word(alphas)("name") + Word(nums+"-")("socsecno") - """ - if name is not None: - return self.setResultsName(name) - else: - return self.copy() - - def suppress( self ): - """ - Suppresses the output of this :class:`ParserElement`; useful to keep punctuation from - cluttering up returned output. - """ - return Suppress( self ) - - def leaveWhitespace( self ): - """ - Disables the skipping of whitespace before matching the characters in the - :class:`ParserElement`'s defined pattern. This is normally only used internally by - the pyparsing module, but may be needed in some whitespace-sensitive grammars. - """ - self.skipWhitespace = False - return self - - def setWhitespaceChars( self, chars ): - """ - Overrides the default whitespace chars - """ - self.skipWhitespace = True - self.whiteChars = chars - self.copyDefaultWhiteChars = False - return self - - def parseWithTabs( self ): - """ - Overrides default behavior to expand ``<TAB>``s to spaces before parsing the input string. - Must be called before ``parseString`` when the input grammar contains elements that - match ``<TAB>`` characters. - """ - self.keepTabs = True - return self - - def ignore( self, other ): - """ - Define expression to be ignored (e.g., comments) while doing pattern - matching; may be called repeatedly, to define multiple comment or other - ignorable patterns. - - Example:: - - patt = OneOrMore(Word(alphas)) - patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj'] - - patt.ignore(cStyleComment) - patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj', 'lskjd'] - """ - if isinstance(other, basestring): - other = Suppress(other) - - if isinstance( other, Suppress ): - if other not in self.ignoreExprs: - self.ignoreExprs.append(other) - else: - self.ignoreExprs.append( Suppress( other.copy() ) ) - return self - - def setDebugActions( self, startAction, successAction, exceptionAction ): - """ - Enable display of debugging messages while doing pattern matching. - """ - self.debugActions = (startAction or _defaultStartDebugAction, - successAction or _defaultSuccessDebugAction, - exceptionAction or _defaultExceptionDebugAction) - self.debug = True - return self - - def setDebug( self, flag=True ): - """ - Enable display of debugging messages while doing pattern matching. - Set ``flag`` to True to enable, False to disable. - - Example:: - - wd = Word(alphas).setName("alphaword") - integer = Word(nums).setName("numword") - term = wd | integer - - # turn on debugging for wd - wd.setDebug() - - OneOrMore(term).parseString("abc 123 xyz 890") - - prints:: - - Match alphaword at loc 0(1,1) - Matched alphaword -> ['abc'] - Match alphaword at loc 3(1,4) - Exception raised:Expected alphaword (at char 4), (line:1, col:5) - Match alphaword at loc 7(1,8) - Matched alphaword -> ['xyz'] - Match alphaword at loc 11(1,12) - Exception raised:Expected alphaword (at char 12), (line:1, col:13) - Match alphaword at loc 15(1,16) - Exception raised:Expected alphaword (at char 15), (line:1, col:16) - - The output shown is that produced by the default debug actions - custom debug actions can be - specified using :class:`setDebugActions`. Prior to attempting - to match the ``wd`` expression, the debugging message ``"Match <exprname> at loc <n>(<line>,<col>)"`` - is shown. Then if the parse succeeds, a ``"Matched"`` message is shown, or an ``"Exception raised"`` - message is shown. Also note the use of :class:`setName` to assign a human-readable name to the expression, - which makes debugging and exception messages easier to understand - for instance, the default - name created for the :class:`Word` expression without calling ``setName`` is ``"W:(ABCD...)"``. - """ - if flag: - self.setDebugActions( _defaultStartDebugAction, _defaultSuccessDebugAction, _defaultExceptionDebugAction ) - else: - self.debug = False - return self - - def __str__( self ): - return self.name - - def __repr__( self ): - return _ustr(self) - - def streamline( self ): - self.streamlined = True - self.strRepr = None - return self - - def checkRecursion( self, parseElementList ): - pass - - def validate( self, validateTrace=[] ): - """ - Check defined expressions for valid structure, check for infinite recursive definitions. - """ - self.checkRecursion( [] ) - - def parseFile( self, file_or_filename, parseAll=False ): - """ - Execute the parse expression on the given file or filename. - If a filename is specified (instead of a file object), - the entire file is opened, read, and closed before parsing. - """ - try: - file_contents = file_or_filename.read() - except AttributeError: - with open(file_or_filename, "r") as f: - file_contents = f.read() - try: - return self.parseString(file_contents, parseAll) - except ParseBaseException as exc: - if ParserElement.verbose_stacktrace: - raise - else: - # catch and re-raise exception from here, clears out pyparsing internal stack trace - raise exc - - def __eq__(self,other): - if isinstance(other, ParserElement): - return self is other or vars(self) == vars(other) - elif isinstance(other, basestring): - return self.matches(other) - else: - return super(ParserElement,self)==other - - def __ne__(self,other): - return not (self == other) - - def __hash__(self): - return hash(id(self)) - - def __req__(self,other): - return self == other - - def __rne__(self,other): - return not (self == other) - - def matches(self, testString, parseAll=True): - """ - Method for quick testing of a parser against a test string. Good for simple - inline microtests of sub expressions while building up larger parser. - - Parameters: - - testString - to test against this expression for a match - - parseAll - (default= ``True``) - flag to pass to :class:`parseString` when running tests - - Example:: - - expr = Word(nums) - assert expr.matches("100") - """ - try: - self.parseString(_ustr(testString), parseAll=parseAll) - return True - except ParseBaseException: - return False - - def runTests(self, tests, parseAll=True, comment='#', - fullDump=True, printResults=True, failureTests=False, postParse=None): - """ - Execute the parse expression on a series of test strings, showing each - test, the parsed results or where the parse failed. Quick and easy way to - run a parse expression against a list of sample strings. - - Parameters: - - tests - a list of separate test strings, or a multiline string of test strings - - parseAll - (default= ``True``) - flag to pass to :class:`parseString` when running tests - - comment - (default= ``'#'``) - expression for indicating embedded comments in the test - string; pass None to disable comment filtering - - fullDump - (default= ``True``) - dump results as list followed by results names in nested outline; - if False, only dump nested list - - printResults - (default= ``True``) prints test output to stdout - - failureTests - (default= ``False``) indicates if these tests are expected to fail parsing - - postParse - (default= ``None``) optional callback for successful parse results; called as - `fn(test_string, parse_results)` and returns a string to be added to the test output - - Returns: a (success, results) tuple, where success indicates that all tests succeeded - (or failed if ``failureTests`` is True), and the results contain a list of lines of each - test's output - - Example:: - - number_expr = pyparsing_common.number.copy() - - result = number_expr.runTests(''' - # unsigned integer - 100 - # negative integer - -100 - # float with scientific notation - 6.02e23 - # integer with scientific notation - 1e-12 - ''') - print("Success" if result[0] else "Failed!") - - result = number_expr.runTests(''' - # stray character - 100Z - # missing leading digit before '.' - -.100 - # too many '.' - 3.14.159 - ''', failureTests=True) - print("Success" if result[0] else "Failed!") - - prints:: - - # unsigned integer - 100 - [100] - - # negative integer - -100 - [-100] - - # float with scientific notation - 6.02e23 - [6.02e+23] - - # integer with scientific notation - 1e-12 - [1e-12] - - Success - - # stray character - 100Z - ^ - FAIL: Expected end of text (at char 3), (line:1, col:4) - - # missing leading digit before '.' - -.100 - ^ - FAIL: Expected {real number with scientific notation | real number | signed integer} (at char 0), (line:1, col:1) - - # too many '.' - 3.14.159 - ^ - FAIL: Expected end of text (at char 4), (line:1, col:5) - - Success - - Each test string must be on a single line. If you want to test a string that spans multiple - lines, create a test like this:: - - expr.runTest(r"this is a test\\n of strings that spans \\n 3 lines") - - (Note that this is a raw string literal, you must include the leading 'r'.) - """ - if isinstance(tests, basestring): - tests = list(map(str.strip, tests.rstrip().splitlines())) - if isinstance(comment, basestring): - comment = Literal(comment) - allResults = [] - comments = [] - success = True - for t in tests: - if comment is not None and comment.matches(t, False) or comments and not t: - comments.append(t) - continue - if not t: - continue - out = ['\n'.join(comments), t] - comments = [] - try: - # convert newline marks to actual newlines, and strip leading BOM if present - NL = Literal(r'\n').addParseAction(replaceWith('\n')).ignore(quotedString) - BOM = '\ufeff' - t = NL.transformString(t.lstrip(BOM)) - result = self.parseString(t, parseAll=parseAll) - out.append(result.dump(full=fullDump)) - success = success and not failureTests - if postParse is not None: - try: - pp_value = postParse(t, result) - if pp_value is not None: - out.append(str(pp_value)) - except Exception as e: - out.append("{0} failed: {1}: {2}".format(postParse.__name__, type(e).__name__, e)) - except ParseBaseException as pe: - fatal = "(FATAL)" if isinstance(pe, ParseFatalException) else "" - if '\n' in t: - out.append(line(pe.loc, t)) - out.append(' '*(col(pe.loc,t)-1) + '^' + fatal) - else: - out.append(' '*pe.loc + '^' + fatal) - out.append("FAIL: " + str(pe)) - success = success and failureTests - result = pe - except Exception as exc: - out.append("FAIL-EXCEPTION: " + str(exc)) - success = success and failureTests - result = exc - - if printResults: - if fullDump: - out.append('') - print('\n'.join(out)) - - allResults.append((t, result)) - - return success, allResults - - -class Token(ParserElement): - """Abstract :class:`ParserElement` subclass, for defining atomic - matching patterns. - """ - def __init__( self ): - super(Token,self).__init__( savelist=False ) - - -class Empty(Token): - """An empty token, will always match. - """ - def __init__( self ): - super(Empty,self).__init__() - self.name = "Empty" - self.mayReturnEmpty = True - self.mayIndexError = False - - -class NoMatch(Token): - """A token that will never match. - """ - def __init__( self ): - super(NoMatch,self).__init__() - self.name = "NoMatch" - self.mayReturnEmpty = True - self.mayIndexError = False - self.errmsg = "Unmatchable token" - - def parseImpl( self, instring, loc, doActions=True ): - raise ParseException(instring, loc, self.errmsg, self) - - -class Literal(Token): - """Token to exactly match a specified string. - - Example:: - - Literal('blah').parseString('blah') # -> ['blah'] - Literal('blah').parseString('blahfooblah') # -> ['blah'] - Literal('blah').parseString('bla') # -> Exception: Expected "blah" - - For case-insensitive matching, use :class:`CaselessLiteral`. - - For keyword matching (force word break before and after the matched string), - use :class:`Keyword` or :class:`CaselessKeyword`. - """ - def __init__( self, matchString ): - super(Literal,self).__init__() - self.match = matchString - self.matchLen = len(matchString) - try: - self.firstMatchChar = matchString[0] - except IndexError: - warnings.warn("null string passed to Literal; use Empty() instead", - SyntaxWarning, stacklevel=2) - self.__class__ = Empty - self.name = '"%s"' % _ustr(self.match) - self.errmsg = "Expected " + self.name - self.mayReturnEmpty = False - self.mayIndexError = False - - # Performance tuning: this routine gets called a *lot* - # if this is a single character match string and the first character matches, - # short-circuit as quickly as possible, and avoid calling startswith - #~ @profile - def parseImpl( self, instring, loc, doActions=True ): - if (instring[loc] == self.firstMatchChar and - (self.matchLen==1 or instring.startswith(self.match,loc)) ): - return loc+self.matchLen, self.match - raise ParseException(instring, loc, self.errmsg, self) -_L = Literal -ParserElement._literalStringClass = Literal - -class Keyword(Token): - """Token to exactly match a specified string as a keyword, that is, - it must be immediately followed by a non-keyword character. Compare - with :class:`Literal`: - - - ``Literal("if")`` will match the leading ``'if'`` in - ``'ifAndOnlyIf'``. - - ``Keyword("if")`` will not; it will only match the leading - ``'if'`` in ``'if x=1'``, or ``'if(y==2)'`` - - Accepts two optional constructor arguments in addition to the - keyword string: - - - ``identChars`` is a string of characters that would be valid - identifier characters, defaulting to all alphanumerics + "_" and - "$" - - ``caseless`` allows case-insensitive matching, default is ``False``. - - Example:: - - Keyword("start").parseString("start") # -> ['start'] - Keyword("start").parseString("starting") # -> Exception - - For case-insensitive matching, use :class:`CaselessKeyword`. - """ - DEFAULT_KEYWORD_CHARS = alphanums+"_$" - - def __init__( self, matchString, identChars=None, caseless=False ): - super(Keyword,self).__init__() - if identChars is None: - identChars = Keyword.DEFAULT_KEYWORD_CHARS - self.match = matchString - self.matchLen = len(matchString) - try: - self.firstMatchChar = matchString[0] - except IndexError: - warnings.warn("null string passed to Keyword; use Empty() instead", - SyntaxWarning, stacklevel=2) - self.name = '"%s"' % self.match - self.errmsg = "Expected " + self.name - self.mayReturnEmpty = False - self.mayIndexError = False - self.caseless = caseless - if caseless: - self.caselessmatch = matchString.upper() - identChars = identChars.upper() - self.identChars = set(identChars) - - def parseImpl( self, instring, loc, doActions=True ): - if self.caseless: - if ( (instring[ loc:loc+self.matchLen ].upper() == self.caselessmatch) and - (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen].upper() not in self.identChars) and - (loc == 0 or instring[loc-1].upper() not in self.identChars) ): - return loc+self.matchLen, self.match - else: - if (instring[loc] == self.firstMatchChar and - (self.matchLen==1 or instring.startswith(self.match,loc)) and - (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen] not in self.identChars) and - (loc == 0 or instring[loc-1] not in self.identChars) ): - return loc+self.matchLen, self.match - raise ParseException(instring, loc, self.errmsg, self) - - def copy(self): - c = super(Keyword,self).copy() - c.identChars = Keyword.DEFAULT_KEYWORD_CHARS - return c - - @staticmethod - def setDefaultKeywordChars( chars ): - """Overrides the default Keyword chars - """ - Keyword.DEFAULT_KEYWORD_CHARS = chars - -class CaselessLiteral(Literal): - """Token to match a specified string, ignoring case of letters. - Note: the matched results will always be in the case of the given - match string, NOT the case of the input text. - - Example:: - - OneOrMore(CaselessLiteral("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD', 'CMD'] - - (Contrast with example for :class:`CaselessKeyword`.) - """ - def __init__( self, matchString ): - super(CaselessLiteral,self).__init__( matchString.upper() ) - # Preserve the defining literal. - self.returnString = matchString - self.name = "'%s'" % self.returnString - self.errmsg = "Expected " + self.name - - def parseImpl( self, instring, loc, doActions=True ): - if instring[ loc:loc+self.matchLen ].upper() == self.match: - return loc+self.matchLen, self.returnString - raise ParseException(instring, loc, self.errmsg, self) - -class CaselessKeyword(Keyword): - """ - Caseless version of :class:`Keyword`. - - Example:: - - OneOrMore(CaselessKeyword("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD'] - - (Contrast with example for :class:`CaselessLiteral`.) - """ - def __init__( self, matchString, identChars=None ): - super(CaselessKeyword,self).__init__( matchString, identChars, caseless=True ) - -class CloseMatch(Token): - """A variation on :class:`Literal` which matches "close" matches, - that is, strings with at most 'n' mismatching characters. - :class:`CloseMatch` takes parameters: - - - ``match_string`` - string to be matched - - ``maxMismatches`` - (``default=1``) maximum number of - mismatches allowed to count as a match - - The results from a successful parse will contain the matched text - from the input string and the following named results: - - - ``mismatches`` - a list of the positions within the - match_string where mismatches were found - - ``original`` - the original match_string used to compare - against the input string - - If ``mismatches`` is an empty list, then the match was an exact - match. - - Example:: - - patt = CloseMatch("ATCATCGAATGGA") - patt.parseString("ATCATCGAAXGGA") # -> (['ATCATCGAAXGGA'], {'mismatches': [[9]], 'original': ['ATCATCGAATGGA']}) - patt.parseString("ATCAXCGAAXGGA") # -> Exception: Expected 'ATCATCGAATGGA' (with up to 1 mismatches) (at char 0), (line:1, col:1) - - # exact match - patt.parseString("ATCATCGAATGGA") # -> (['ATCATCGAATGGA'], {'mismatches': [[]], 'original': ['ATCATCGAATGGA']}) - - # close match allowing up to 2 mismatches - patt = CloseMatch("ATCATCGAATGGA", maxMismatches=2) - patt.parseString("ATCAXCGAAXGGA") # -> (['ATCAXCGAAXGGA'], {'mismatches': [[4, 9]], 'original': ['ATCATCGAATGGA']}) - """ - def __init__(self, match_string, maxMismatches=1): - super(CloseMatch,self).__init__() - self.name = match_string - self.match_string = match_string - self.maxMismatches = maxMismatches - self.errmsg = "Expected %r (with up to %d mismatches)" % (self.match_string, self.maxMismatches) - self.mayIndexError = False - self.mayReturnEmpty = False - - def parseImpl( self, instring, loc, doActions=True ): - start = loc - instrlen = len(instring) - maxloc = start + len(self.match_string) - - if maxloc <= instrlen: - match_string = self.match_string - match_stringloc = 0 - mismatches = [] - maxMismatches = self.maxMismatches - - for match_stringloc,s_m in enumerate(zip(instring[loc:maxloc], self.match_string)): - src,mat = s_m - if src != mat: - mismatches.append(match_stringloc) - if len(mismatches) > maxMismatches: - break - else: - loc = match_stringloc + 1 - results = ParseResults([instring[start:loc]]) - results['original'] = self.match_string - results['mismatches'] = mismatches - return loc, results - - raise ParseException(instring, loc, self.errmsg, self) - - -class Word(Token): - """Token for matching words composed of allowed character sets. - Defined with string containing all allowed initial characters, an - optional string containing allowed body characters (if omitted, - defaults to the initial character set), and an optional minimum, - maximum, and/or exact length. The default value for ``min`` is - 1 (a minimum value < 1 is not valid); the default values for - ``max`` and ``exact`` are 0, meaning no maximum or exact - length restriction. An optional ``excludeChars`` parameter can - list characters that might be found in the input ``bodyChars`` - string; useful to define a word of all printables except for one or - two characters, for instance. - - :class:`srange` is useful for defining custom character set strings - for defining ``Word`` expressions, using range notation from - regular expression character sets. - - A common mistake is to use :class:`Word` to match a specific literal - string, as in ``Word("Address")``. Remember that :class:`Word` - uses the string argument to define *sets* of matchable characters. - This expression would match "Add", "AAA", "dAred", or any other word - made up of the characters 'A', 'd', 'r', 'e', and 's'. To match an - exact literal string, use :class:`Literal` or :class:`Keyword`. - - pyparsing includes helper strings for building Words: - - - :class:`alphas` - - :class:`nums` - - :class:`alphanums` - - :class:`hexnums` - - :class:`alphas8bit` (alphabetic characters in ASCII range 128-255 - - accented, tilded, umlauted, etc.) - - :class:`punc8bit` (non-alphabetic characters in ASCII range - 128-255 - currency, symbols, superscripts, diacriticals, etc.) - - :class:`printables` (any non-whitespace character) - - Example:: - - # a word composed of digits - integer = Word(nums) # equivalent to Word("0123456789") or Word(srange("0-9")) - - # a word with a leading capital, and zero or more lowercase - capital_word = Word(alphas.upper(), alphas.lower()) - - # hostnames are alphanumeric, with leading alpha, and '-' - hostname = Word(alphas, alphanums+'-') - - # roman numeral (not a strict parser, accepts invalid mix of characters) - roman = Word("IVXLCDM") - - # any string of non-whitespace characters, except for ',' - csv_value = Word(printables, excludeChars=",") - """ - def __init__( self, initChars, bodyChars=None, min=1, max=0, exact=0, asKeyword=False, excludeChars=None ): - super(Word,self).__init__() - if excludeChars: - excludeChars = set(excludeChars) - initChars = ''.join(c for c in initChars if c not in excludeChars) - if bodyChars: - bodyChars = ''.join(c for c in bodyChars if c not in excludeChars) - self.initCharsOrig = initChars - self.initChars = set(initChars) - if bodyChars : - self.bodyCharsOrig = bodyChars - self.bodyChars = set(bodyChars) - else: - self.bodyCharsOrig = initChars - self.bodyChars = set(initChars) - - self.maxSpecified = max > 0 - - if min < 1: - raise ValueError("cannot specify a minimum length < 1; use Optional(Word()) if zero-length word is permitted") - - self.minLen = min - - if max > 0: - self.maxLen = max - else: - self.maxLen = _MAX_INT - - if exact > 0: - self.maxLen = exact - self.minLen = exact - - self.name = _ustr(self) - self.errmsg = "Expected " + self.name - self.mayIndexError = False - self.asKeyword = asKeyword - - if ' ' not in self.initCharsOrig+self.bodyCharsOrig and (min==1 and max==0 and exact==0): - if self.bodyCharsOrig == self.initCharsOrig: - self.reString = "[%s]+" % _escapeRegexRangeChars(self.initCharsOrig) - elif len(self.initCharsOrig) == 1: - self.reString = "%s[%s]*" % \ - (re.escape(self.initCharsOrig), - _escapeRegexRangeChars(self.bodyCharsOrig),) - else: - self.reString = "[%s][%s]*" % \ - (_escapeRegexRangeChars(self.initCharsOrig), - _escapeRegexRangeChars(self.bodyCharsOrig),) - if self.asKeyword: - self.reString = r"\b"+self.reString+r"\b" - try: - self.re = re.compile( self.reString ) - except Exception: - self.re = None - - def parseImpl( self, instring, loc, doActions=True ): - if self.re: - result = self.re.match(instring,loc) - if not result: - raise ParseException(instring, loc, self.errmsg, self) - - loc = result.end() - return loc, result.group() - - if instring[loc] not in self.initChars: - raise ParseException(instring, loc, self.errmsg, self) - - start = loc - loc += 1 - instrlen = len(instring) - bodychars = self.bodyChars - maxloc = start + self.maxLen - maxloc = min( maxloc, instrlen ) - while loc < maxloc and instring[loc] in bodychars: - loc += 1 - - throwException = False - if loc - start < self.minLen: - throwException = True - elif self.maxSpecified and loc < instrlen and instring[loc] in bodychars: - throwException = True - elif self.asKeyword: - if (start>0 and instring[start-1] in bodychars) or (loc<instrlen and instring[loc] in bodychars): - throwException = True - - if throwException: - raise ParseException(instring, loc, self.errmsg, self) - - return loc, instring[start:loc] - - def __str__( self ): - try: - return super(Word,self).__str__() - except Exception: - pass - - - if self.strRepr is None: - - def charsAsStr(s): - if len(s)>4: - return s[:4]+"..." - else: - return s - - if ( self.initCharsOrig != self.bodyCharsOrig ): - self.strRepr = "W:(%s,%s)" % ( charsAsStr(self.initCharsOrig), charsAsStr(self.bodyCharsOrig) ) - else: - self.strRepr = "W:(%s)" % charsAsStr(self.initCharsOrig) - - return self.strRepr - - -class Char(Word): - """A short-cut class for defining ``Word(characters, exact=1)``, - when defining a match of any single character in a string of - characters. - """ - def __init__(self, charset, asKeyword=False, excludeChars=None): - super(Char, self).__init__(charset, exact=1, asKeyword=asKeyword, excludeChars=excludeChars) - self.reString = "[%s]" % _escapeRegexRangeChars(self.initCharsOrig) - self.re = re.compile( self.reString ) - - -class Regex(Token): - r"""Token for matching strings that match a given regular - expression. Defined with string specifying the regular expression in - a form recognized by the stdlib Python `re module <https://docs.python.org/3/library/re.html>`_. - If the given regex contains named groups (defined using ``(?P<name>...)``), - these will be preserved as named parse results. - - Example:: - - realnum = Regex(r"[+-]?\d+\.\d*") - date = Regex(r'(?P<year>\d{4})-(?P<month>\d\d?)-(?P<day>\d\d?)') - # ref: https://stackoverflow.com/questions/267399/how-do-you-match-only-valid-roman-numerals-with-a-regular-expression - roman = Regex(r"M{0,4}(CM|CD|D?{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})") - """ - compiledREtype = type(re.compile("[A-Z]")) - def __init__( self, pattern, flags=0, asGroupList=False, asMatch=False): - """The parameters ``pattern`` and ``flags`` are passed - to the ``re.compile()`` function as-is. See the Python - `re module <https://docs.python.org/3/library/re.html>`_ module for an - explanation of the acceptable patterns and flags. - """ - super(Regex,self).__init__() - - if isinstance(pattern, basestring): - if not pattern: - warnings.warn("null string passed to Regex; use Empty() instead", - SyntaxWarning, stacklevel=2) - - self.pattern = pattern - self.flags = flags - - try: - self.re = re.compile(self.pattern, self.flags) - self.reString = self.pattern - except sre_constants.error: - warnings.warn("invalid pattern (%s) passed to Regex" % pattern, - SyntaxWarning, stacklevel=2) - raise - - elif isinstance(pattern, Regex.compiledREtype): - self.re = pattern - self.pattern = \ - self.reString = str(pattern) - self.flags = flags - - else: - raise ValueError("Regex may only be constructed with a string or a compiled RE object") - - self.name = _ustr(self) - self.errmsg = "Expected " + self.name - self.mayIndexError = False - self.mayReturnEmpty = True - self.asGroupList = asGroupList - self.asMatch = asMatch - if self.asGroupList: - self.parseImpl = self.parseImplAsGroupList - if self.asMatch: - self.parseImpl = self.parseImplAsMatch - - def parseImpl(self, instring, loc, doActions=True): - result = self.re.match(instring,loc) - if not result: - raise ParseException(instring, loc, self.errmsg, self) - - loc = result.end() - ret = ParseResults(result.group()) - d = result.groupdict() - if d: - for k, v in d.items(): - ret[k] = v - return loc, ret - - def parseImplAsGroupList(self, instring, loc, doActions=True): - result = self.re.match(instring,loc) - if not result: - raise ParseException(instring, loc, self.errmsg, self) - - loc = result.end() - ret = result.groups() - return loc, ret - - def parseImplAsMatch(self, instring, loc, doActions=True): - result = self.re.match(instring,loc) - if not result: - raise ParseException(instring, loc, self.errmsg, self) - - loc = result.end() - ret = result - return loc, ret - - def __str__( self ): - try: - return super(Regex,self).__str__() - except Exception: - pass - - if self.strRepr is None: - self.strRepr = "Re:(%s)" % repr(self.pattern) - - return self.strRepr - - def sub(self, repl): - r""" - Return Regex with an attached parse action to transform the parsed - result as if called using `re.sub(expr, repl, string) <https://docs.python.org/3/library/re.html#re.sub>`_. - - Example:: - - make_html = Regex(r"(\w+):(.*?):").sub(r"<\1>\2</\1>") - print(make_html.transformString("h1:main title:")) - # prints "<h1>main title</h1>" - """ - if self.asGroupList: - warnings.warn("cannot use sub() with Regex(asGroupList=True)", - SyntaxWarning, stacklevel=2) - raise SyntaxError() - - if self.asMatch and callable(repl): - warnings.warn("cannot use sub() with a callable with Regex(asMatch=True)", - SyntaxWarning, stacklevel=2) - raise SyntaxError() - - if self.asMatch: - def pa(tokens): - return tokens[0].expand(repl) - else: - def pa(tokens): - return self.re.sub(repl, tokens[0]) - return self.addParseAction(pa) - -class QuotedString(Token): - r""" - Token for matching strings that are delimited by quoting characters. - - Defined with the following parameters: - - - quoteChar - string of one or more characters defining the - quote delimiting string - - escChar - character to escape quotes, typically backslash - (default= ``None`` ) - - escQuote - special quote sequence to escape an embedded quote - string (such as SQL's ``""`` to escape an embedded ``"``) - (default= ``None`` ) - - multiline - boolean indicating whether quotes can span - multiple lines (default= ``False`` ) - - unquoteResults - boolean indicating whether the matched text - should be unquoted (default= ``True`` ) - - endQuoteChar - string of one or more characters defining the - end of the quote delimited string (default= ``None`` => same as - quoteChar) - - convertWhitespaceEscapes - convert escaped whitespace - (``'\t'``, ``'\n'``, etc.) to actual whitespace - (default= ``True`` ) - - Example:: - - qs = QuotedString('"') - print(qs.searchString('lsjdf "This is the quote" sldjf')) - complex_qs = QuotedString('{{', endQuoteChar='}}') - print(complex_qs.searchString('lsjdf {{This is the "quote"}} sldjf')) - sql_qs = QuotedString('"', escQuote='""') - print(sql_qs.searchString('lsjdf "This is the quote with ""embedded"" quotes" sldjf')) - - prints:: - - [['This is the quote']] - [['This is the "quote"']] - [['This is the quote with "embedded" quotes']] - """ - def __init__( self, quoteChar, escChar=None, escQuote=None, multiline=False, unquoteResults=True, endQuoteChar=None, convertWhitespaceEscapes=True): - super(QuotedString,self).__init__() - - # remove white space from quote chars - wont work anyway - quoteChar = quoteChar.strip() - if not quoteChar: - warnings.warn("quoteChar cannot be the empty string",SyntaxWarning,stacklevel=2) - raise SyntaxError() - - if endQuoteChar is None: - endQuoteChar = quoteChar - else: - endQuoteChar = endQuoteChar.strip() - if not endQuoteChar: - warnings.warn("endQuoteChar cannot be the empty string",SyntaxWarning,stacklevel=2) - raise SyntaxError() - - self.quoteChar = quoteChar - self.quoteCharLen = len(quoteChar) - self.firstQuoteChar = quoteChar[0] - self.endQuoteChar = endQuoteChar - self.endQuoteCharLen = len(endQuoteChar) - self.escChar = escChar - self.escQuote = escQuote - self.unquoteResults = unquoteResults - self.convertWhitespaceEscapes = convertWhitespaceEscapes - - if multiline: - self.flags = re.MULTILINE | re.DOTALL - self.pattern = r'%s(?:[^%s%s]' % \ - ( re.escape(self.quoteChar), - _escapeRegexRangeChars(self.endQuoteChar[0]), - (escChar is not None and _escapeRegexRangeChars(escChar) or '') ) - else: - self.flags = 0 - self.pattern = r'%s(?:[^%s\n\r%s]' % \ - ( re.escape(self.quoteChar), - _escapeRegexRangeChars(self.endQuoteChar[0]), - (escChar is not None and _escapeRegexRangeChars(escChar) or '') ) - if len(self.endQuoteChar) > 1: - self.pattern += ( - '|(?:' + ')|(?:'.join("%s[^%s]" % (re.escape(self.endQuoteChar[:i]), - _escapeRegexRangeChars(self.endQuoteChar[i])) - for i in range(len(self.endQuoteChar)-1,0,-1)) + ')' - ) - if escQuote: - self.pattern += (r'|(?:%s)' % re.escape(escQuote)) - if escChar: - self.pattern += (r'|(?:%s.)' % re.escape(escChar)) - self.escCharReplacePattern = re.escape(self.escChar)+"(.)" - self.pattern += (r')*%s' % re.escape(self.endQuoteChar)) - - try: - self.re = re.compile(self.pattern, self.flags) - self.reString = self.pattern - except sre_constants.error: - warnings.warn("invalid pattern (%s) passed to Regex" % self.pattern, - SyntaxWarning, stacklevel=2) - raise - - self.name = _ustr(self) - self.errmsg = "Expected " + self.name - self.mayIndexError = False - self.mayReturnEmpty = True - - def parseImpl( self, instring, loc, doActions=True ): - result = instring[loc] == self.firstQuoteChar and self.re.match(instring,loc) or None - if not result: - raise ParseException(instring, loc, self.errmsg, self) - - loc = result.end() - ret = result.group() - - if self.unquoteResults: - - # strip off quotes - ret = ret[self.quoteCharLen:-self.endQuoteCharLen] - - if isinstance(ret,basestring): - # replace escaped whitespace - if '\\' in ret and self.convertWhitespaceEscapes: - ws_map = { - r'\t' : '\t', - r'\n' : '\n', - r'\f' : '\f', - r'\r' : '\r', - } - for wslit,wschar in ws_map.items(): - ret = ret.replace(wslit, wschar) - - # replace escaped characters - if self.escChar: - ret = re.sub(self.escCharReplacePattern, r"\g<1>", ret) - - # replace escaped quotes - if self.escQuote: - ret = ret.replace(self.escQuote, self.endQuoteChar) - - return loc, ret - - def __str__( self ): - try: - return super(QuotedString,self).__str__() - except Exception: - pass - - if self.strRepr is None: - self.strRepr = "quoted string, starting with %s ending with %s" % (self.quoteChar, self.endQuoteChar) - - return self.strRepr - - -class CharsNotIn(Token): - """Token for matching words composed of characters *not* in a given - set (will include whitespace in matched characters if not listed in - the provided exclusion set - see example). Defined with string - containing all disallowed characters, and an optional minimum, - maximum, and/or exact length. The default value for ``min`` is - 1 (a minimum value < 1 is not valid); the default values for - ``max`` and ``exact`` are 0, meaning no maximum or exact - length restriction. - - Example:: - - # define a comma-separated-value as anything that is not a ',' - csv_value = CharsNotIn(',') - print(delimitedList(csv_value).parseString("dkls,lsdkjf,s12 34,@!#,213")) - - prints:: - - ['dkls', 'lsdkjf', 's12 34', '@!#', '213'] - """ - def __init__( self, notChars, min=1, max=0, exact=0 ): - super(CharsNotIn,self).__init__() - self.skipWhitespace = False - self.notChars = notChars - - if min < 1: - raise ValueError( - "cannot specify a minimum length < 1; use " + - "Optional(CharsNotIn()) if zero-length char group is permitted") - - self.minLen = min - - if max > 0: - self.maxLen = max - else: - self.maxLen = _MAX_INT - - if exact > 0: - self.maxLen = exact - self.minLen = exact - - self.name = _ustr(self) - self.errmsg = "Expected " + self.name - self.mayReturnEmpty = ( self.minLen == 0 ) - self.mayIndexError = False - - def parseImpl( self, instring, loc, doActions=True ): - if instring[loc] in self.notChars: - raise ParseException(instring, loc, self.errmsg, self) - - start = loc - loc += 1 - notchars = self.notChars - maxlen = min( start+self.maxLen, len(instring) ) - while loc < maxlen and \ - (instring[loc] not in notchars): - loc += 1 - - if loc - start < self.minLen: - raise ParseException(instring, loc, self.errmsg, self) - - return loc, instring[start:loc] - - def __str__( self ): - try: - return super(CharsNotIn, self).__str__() - except Exception: - pass - - if self.strRepr is None: - if len(self.notChars) > 4: - self.strRepr = "!W:(%s...)" % self.notChars[:4] - else: - self.strRepr = "!W:(%s)" % self.notChars - - return self.strRepr - -class White(Token): - """Special matching class for matching whitespace. Normally, - whitespace is ignored by pyparsing grammars. This class is included - when some whitespace structures are significant. Define with - a string containing the whitespace characters to be matched; default - is ``" \\t\\r\\n"``. Also takes optional ``min``, - ``max``, and ``exact`` arguments, as defined for the - :class:`Word` class. - """ - whiteStrs = { - ' ' : '<SP>', - '\t': '<TAB>', - '\n': '<LF>', - '\r': '<CR>', - '\f': '<FF>', - 'u\00A0': '<NBSP>', - 'u\1680': '<OGHAM_SPACE_MARK>', - 'u\180E': '<MONGOLIAN_VOWEL_SEPARATOR>', - 'u\2000': '<EN_QUAD>', - 'u\2001': '<EM_QUAD>', - 'u\2002': '<EN_SPACE>', - 'u\2003': '<EM_SPACE>', - 'u\2004': '<THREE-PER-EM_SPACE>', - 'u\2005': '<FOUR-PER-EM_SPACE>', - 'u\2006': '<SIX-PER-EM_SPACE>', - 'u\2007': '<FIGURE_SPACE>', - 'u\2008': '<PUNCTUATION_SPACE>', - 'u\2009': '<THIN_SPACE>', - 'u\200A': '<HAIR_SPACE>', - 'u\200B': '<ZERO_WIDTH_SPACE>', - 'u\202F': '<NNBSP>', - 'u\205F': '<MMSP>', - 'u\3000': '<IDEOGRAPHIC_SPACE>', - } - def __init__(self, ws=" \t\r\n", min=1, max=0, exact=0): - super(White,self).__init__() - self.matchWhite = ws - self.setWhitespaceChars( "".join(c for c in self.whiteChars if c not in self.matchWhite) ) - #~ self.leaveWhitespace() - self.name = ("".join(White.whiteStrs[c] for c in self.matchWhite)) - self.mayReturnEmpty = True - self.errmsg = "Expected " + self.name - - self.minLen = min - - if max > 0: - self.maxLen = max - else: - self.maxLen = _MAX_INT - - if exact > 0: - self.maxLen = exact - self.minLen = exact - - def parseImpl( self, instring, loc, doActions=True ): - if instring[loc] not in self.matchWhite: - raise ParseException(instring, loc, self.errmsg, self) - start = loc - loc += 1 - maxloc = start + self.maxLen - maxloc = min( maxloc, len(instring) ) - while loc < maxloc and instring[loc] in self.matchWhite: - loc += 1 - - if loc - start < self.minLen: - raise ParseException(instring, loc, self.errmsg, self) - - return loc, instring[start:loc] - - -class _PositionToken(Token): - def __init__( self ): - super(_PositionToken,self).__init__() - self.name=self.__class__.__name__ - self.mayReturnEmpty = True - self.mayIndexError = False - -class GoToColumn(_PositionToken): - """Token to advance to a specific column of input text; useful for - tabular report scraping. - """ - def __init__( self, colno ): - super(GoToColumn,self).__init__() - self.col = colno - - def preParse( self, instring, loc ): - if col(loc,instring) != self.col: - instrlen = len(instring) - if self.ignoreExprs: - loc = self._skipIgnorables( instring, loc ) - while loc < instrlen and instring[loc].isspace() and col( loc, instring ) != self.col : - loc += 1 - return loc - - def parseImpl( self, instring, loc, doActions=True ): - thiscol = col( loc, instring ) - if thiscol > self.col: - raise ParseException( instring, loc, "Text not in expected column", self ) - newloc = loc + self.col - thiscol - ret = instring[ loc: newloc ] - return newloc, ret - - -class LineStart(_PositionToken): - r"""Matches if current position is at the beginning of a line within - the parse string - - Example:: - - test = '''\ - AAA this line - AAA and this line - AAA but not this one - B AAA and definitely not this one - ''' - - for t in (LineStart() + 'AAA' + restOfLine).searchString(test): - print(t) - - prints:: - - ['AAA', ' this line'] - ['AAA', ' and this line'] - - """ - def __init__( self ): - super(LineStart,self).__init__() - self.errmsg = "Expected start of line" - - def parseImpl( self, instring, loc, doActions=True ): - if col(loc, instring) == 1: - return loc, [] - raise ParseException(instring, loc, self.errmsg, self) - -class LineEnd(_PositionToken): - """Matches if current position is at the end of a line within the - parse string - """ - def __init__( self ): - super(LineEnd,self).__init__() - self.setWhitespaceChars( ParserElement.DEFAULT_WHITE_CHARS.replace("\n","") ) - self.errmsg = "Expected end of line" - - def parseImpl( self, instring, loc, doActions=True ): - if loc<len(instring): - if instring[loc] == "\n": - return loc+1, "\n" - else: - raise ParseException(instring, loc, self.errmsg, self) - elif loc == len(instring): - return loc+1, [] - else: - raise ParseException(instring, loc, self.errmsg, self) - -class StringStart(_PositionToken): - """Matches if current position is at the beginning of the parse - string - """ - def __init__( self ): - super(StringStart,self).__init__() - self.errmsg = "Expected start of text" - - def parseImpl( self, instring, loc, doActions=True ): - if loc != 0: - # see if entire string up to here is just whitespace and ignoreables - if loc != self.preParse( instring, 0 ): - raise ParseException(instring, loc, self.errmsg, self) - return loc, [] - -class StringEnd(_PositionToken): - """Matches if current position is at the end of the parse string - """ - def __init__( self ): - super(StringEnd,self).__init__() - self.errmsg = "Expected end of text" - - def parseImpl( self, instring, loc, doActions=True ): - if loc < len(instring): - raise ParseException(instring, loc, self.errmsg, self) - elif loc == len(instring): - return loc+1, [] - elif loc > len(instring): - return loc, [] - else: - raise ParseException(instring, loc, self.errmsg, self) - -class WordStart(_PositionToken): - """Matches if the current position is at the beginning of a Word, - and is not preceded by any character in a given set of - ``wordChars`` (default= ``printables``). To emulate the - ``\b`` behavior of regular expressions, use - ``WordStart(alphanums)``. ``WordStart`` will also match at - the beginning of the string being parsed, or at the beginning of - a line. - """ - def __init__(self, wordChars = printables): - super(WordStart,self).__init__() - self.wordChars = set(wordChars) - self.errmsg = "Not at the start of a word" - - def parseImpl(self, instring, loc, doActions=True ): - if loc != 0: - if (instring[loc-1] in self.wordChars or - instring[loc] not in self.wordChars): - raise ParseException(instring, loc, self.errmsg, self) - return loc, [] - -class WordEnd(_PositionToken): - """Matches if the current position is at the end of a Word, and is - not followed by any character in a given set of ``wordChars`` - (default= ``printables``). To emulate the ``\b`` behavior of - regular expressions, use ``WordEnd(alphanums)``. ``WordEnd`` - will also match at the end of the string being parsed, or at the end - of a line. - """ - def __init__(self, wordChars = printables): - super(WordEnd,self).__init__() - self.wordChars = set(wordChars) - self.skipWhitespace = False - self.errmsg = "Not at the end of a word" - - def parseImpl(self, instring, loc, doActions=True ): - instrlen = len(instring) - if instrlen>0 and loc<instrlen: - if (instring[loc] in self.wordChars or - instring[loc-1] not in self.wordChars): - raise ParseException(instring, loc, self.errmsg, self) - return loc, [] - - -class ParseExpression(ParserElement): - """Abstract subclass of ParserElement, for combining and - post-processing parsed tokens. - """ - def __init__( self, exprs, savelist = False ): - super(ParseExpression,self).__init__(savelist) - if isinstance( exprs, _generatorType ): - exprs = list(exprs) - - if isinstance( exprs, basestring ): - self.exprs = [ ParserElement._literalStringClass( exprs ) ] - elif isinstance( exprs, Iterable ): - exprs = list(exprs) - # if sequence of strings provided, wrap with Literal - if all(isinstance(expr, basestring) for expr in exprs): - exprs = map(ParserElement._literalStringClass, exprs) - self.exprs = list(exprs) - else: - try: - self.exprs = list( exprs ) - except TypeError: - self.exprs = [ exprs ] - self.callPreparse = False - - def __getitem__( self, i ): - return self.exprs[i] - - def append( self, other ): - self.exprs.append( other ) - self.strRepr = None - return self - - def leaveWhitespace( self ): - """Extends ``leaveWhitespace`` defined in base class, and also invokes ``leaveWhitespace`` on - all contained expressions.""" - self.skipWhitespace = False - self.exprs = [ e.copy() for e in self.exprs ] - for e in self.exprs: - e.leaveWhitespace() - return self - - def ignore( self, other ): - if isinstance( other, Suppress ): - if other not in self.ignoreExprs: - super( ParseExpression, self).ignore( other ) - for e in self.exprs: - e.ignore( self.ignoreExprs[-1] ) - else: - super( ParseExpression, self).ignore( other ) - for e in self.exprs: - e.ignore( self.ignoreExprs[-1] ) - return self - - def __str__( self ): - try: - return super(ParseExpression,self).__str__() - except Exception: - pass - - if self.strRepr is None: - self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.exprs) ) - return self.strRepr - - def streamline( self ): - super(ParseExpression,self).streamline() - - for e in self.exprs: - e.streamline() - - # collapse nested And's of the form And( And( And( a,b), c), d) to And( a,b,c,d ) - # but only if there are no parse actions or resultsNames on the nested And's - # (likewise for Or's and MatchFirst's) - if ( len(self.exprs) == 2 ): - other = self.exprs[0] - if ( isinstance( other, self.__class__ ) and - not(other.parseAction) and - other.resultsName is None and - not other.debug ): - self.exprs = other.exprs[:] + [ self.exprs[1] ] - self.strRepr = None - self.mayReturnEmpty |= other.mayReturnEmpty - self.mayIndexError |= other.mayIndexError - - other = self.exprs[-1] - if ( isinstance( other, self.__class__ ) and - not(other.parseAction) and - other.resultsName is None and - not other.debug ): - self.exprs = self.exprs[:-1] + other.exprs[:] - self.strRepr = None - self.mayReturnEmpty |= other.mayReturnEmpty - self.mayIndexError |= other.mayIndexError - - self.errmsg = "Expected " + _ustr(self) - - return self - - def validate( self, validateTrace=[] ): - tmp = validateTrace[:]+[self] - for e in self.exprs: - e.validate(tmp) - self.checkRecursion( [] ) - - def copy(self): - ret = super(ParseExpression,self).copy() - ret.exprs = [e.copy() for e in self.exprs] - return ret - -class And(ParseExpression): - """ - Requires all given :class:`ParseExpression` s to be found in the given order. - Expressions may be separated by whitespace. - May be constructed using the ``'+'`` operator. - May also be constructed using the ``'-'`` operator, which will - suppress backtracking. - - Example:: - - integer = Word(nums) - name_expr = OneOrMore(Word(alphas)) - - expr = And([integer("id"),name_expr("name"),integer("age")]) - # more easily written as: - expr = integer("id") + name_expr("name") + integer("age") - """ - - class _ErrorStop(Empty): - def __init__(self, *args, **kwargs): - super(And._ErrorStop,self).__init__(*args, **kwargs) - self.name = '-' - self.leaveWhitespace() - - def __init__( self, exprs, savelist = True ): - super(And,self).__init__(exprs, savelist) - self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) - self.setWhitespaceChars( self.exprs[0].whiteChars ) - self.skipWhitespace = self.exprs[0].skipWhitespace - self.callPreparse = True - - def streamline(self): - super(And, self).streamline() - self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) - return self - - def parseImpl( self, instring, loc, doActions=True ): - # pass False as last arg to _parse for first element, since we already - # pre-parsed the string as part of our And pre-parsing - loc, resultlist = self.exprs[0]._parse( instring, loc, doActions, callPreParse=False ) - errorStop = False - for e in self.exprs[1:]: - if isinstance(e, And._ErrorStop): - errorStop = True - continue - if errorStop: - try: - loc, exprtokens = e._parse( instring, loc, doActions ) - except ParseSyntaxException: - raise - except ParseBaseException as pe: - pe.__traceback__ = None - raise ParseSyntaxException._from_exception(pe) - except IndexError: - raise ParseSyntaxException(instring, len(instring), self.errmsg, self) - else: - loc, exprtokens = e._parse( instring, loc, doActions ) - if exprtokens or exprtokens.haskeys(): - resultlist += exprtokens - return loc, resultlist - - def __iadd__(self, other ): - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - return self.append( other ) #And( [ self, other ] ) - - def checkRecursion( self, parseElementList ): - subRecCheckList = parseElementList[:] + [ self ] - for e in self.exprs: - e.checkRecursion( subRecCheckList ) - if not e.mayReturnEmpty: - break - - def __str__( self ): - if hasattr(self,"name"): - return self.name - - if self.strRepr is None: - self.strRepr = "{" + " ".join(_ustr(e) for e in self.exprs) + "}" - - return self.strRepr - - -class Or(ParseExpression): - """Requires that at least one :class:`ParseExpression` is found. If - two expressions match, the expression that matches the longest - string will be used. May be constructed using the ``'^'`` - operator. - - Example:: - - # construct Or using '^' operator - - number = Word(nums) ^ Combine(Word(nums) + '.' + Word(nums)) - print(number.searchString("123 3.1416 789")) - - prints:: - - [['123'], ['3.1416'], ['789']] - """ - def __init__( self, exprs, savelist = False ): - super(Or,self).__init__(exprs, savelist) - if self.exprs: - self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs) - else: - self.mayReturnEmpty = True - - def streamline(self): - super(Or, self).streamline() - if __compat__.collect_all_And_tokens: - self.saveAsList = any(e.saveAsList for e in self.exprs) - return self - - def parseImpl( self, instring, loc, doActions=True ): - maxExcLoc = -1 - maxException = None - matches = [] - for e in self.exprs: - try: - loc2 = e.tryParse( instring, loc ) - except ParseException as err: - err.__traceback__ = None - if err.loc > maxExcLoc: - maxException = err - maxExcLoc = err.loc - except IndexError: - if len(instring) > maxExcLoc: - maxException = ParseException(instring,len(instring),e.errmsg,self) - maxExcLoc = len(instring) - else: - # save match among all matches, to retry longest to shortest - matches.append((loc2, e)) - - if matches: - matches.sort(key=lambda x: -x[0]) - for _,e in matches: - try: - return e._parse( instring, loc, doActions ) - except ParseException as err: - err.__traceback__ = None - if err.loc > maxExcLoc: - maxException = err - maxExcLoc = err.loc - - if maxException is not None: - maxException.msg = self.errmsg - raise maxException - else: - raise ParseException(instring, loc, "no defined alternatives to match", self) - - - def __ixor__(self, other ): - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - return self.append( other ) #Or( [ self, other ] ) - - def __str__( self ): - if hasattr(self,"name"): - return self.name - - if self.strRepr is None: - self.strRepr = "{" + " ^ ".join(_ustr(e) for e in self.exprs) + "}" - - return self.strRepr - - def checkRecursion( self, parseElementList ): - subRecCheckList = parseElementList[:] + [ self ] - for e in self.exprs: - e.checkRecursion( subRecCheckList ) - - -class MatchFirst(ParseExpression): - """Requires that at least one :class:`ParseExpression` is found. If - two expressions match, the first one listed is the one that will - match. May be constructed using the ``'|'`` operator. - - Example:: - - # construct MatchFirst using '|' operator - - # watch the order of expressions to match - number = Word(nums) | Combine(Word(nums) + '.' + Word(nums)) - print(number.searchString("123 3.1416 789")) # Fail! -> [['123'], ['3'], ['1416'], ['789']] - - # put more selective expression first - number = Combine(Word(nums) + '.' + Word(nums)) | Word(nums) - print(number.searchString("123 3.1416 789")) # Better -> [['123'], ['3.1416'], ['789']] - """ - def __init__( self, exprs, savelist = False ): - super(MatchFirst,self).__init__(exprs, savelist) - if self.exprs: - self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs) - else: - self.mayReturnEmpty = True - - def streamline(self): - super(MatchFirst, self).streamline() - if __compat__.collect_all_And_tokens: - self.saveAsList = any(e.saveAsList for e in self.exprs) - return self - - def parseImpl( self, instring, loc, doActions=True ): - maxExcLoc = -1 - maxException = None - for e in self.exprs: - try: - ret = e._parse( instring, loc, doActions ) - return ret - except ParseException as err: - if err.loc > maxExcLoc: - maxException = err - maxExcLoc = err.loc - except IndexError: - if len(instring) > maxExcLoc: - maxException = ParseException(instring,len(instring),e.errmsg,self) - maxExcLoc = len(instring) - - # only got here if no expression matched, raise exception for match that made it the furthest - else: - if maxException is not None: - maxException.msg = self.errmsg - raise maxException - else: - raise ParseException(instring, loc, "no defined alternatives to match", self) - - def __ior__(self, other ): - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - return self.append( other ) #MatchFirst( [ self, other ] ) - - def __str__( self ): - if hasattr(self,"name"): - return self.name - - if self.strRepr is None: - self.strRepr = "{" + " | ".join(_ustr(e) for e in self.exprs) + "}" - - return self.strRepr - - def checkRecursion( self, parseElementList ): - subRecCheckList = parseElementList[:] + [ self ] - for e in self.exprs: - e.checkRecursion( subRecCheckList ) - - -class Each(ParseExpression): - """Requires all given :class:`ParseExpression` s to be found, but in - any order. Expressions may be separated by whitespace. - - May be constructed using the ``'&'`` operator. - - Example:: - - color = oneOf("RED ORANGE YELLOW GREEN BLUE PURPLE BLACK WHITE BROWN") - shape_type = oneOf("SQUARE CIRCLE TRIANGLE STAR HEXAGON OCTAGON") - integer = Word(nums) - shape_attr = "shape:" + shape_type("shape") - posn_attr = "posn:" + Group(integer("x") + ',' + integer("y"))("posn") - color_attr = "color:" + color("color") - size_attr = "size:" + integer("size") - - # use Each (using operator '&') to accept attributes in any order - # (shape and posn are required, color and size are optional) - shape_spec = shape_attr & posn_attr & Optional(color_attr) & Optional(size_attr) - - shape_spec.runTests(''' - shape: SQUARE color: BLACK posn: 100, 120 - shape: CIRCLE size: 50 color: BLUE posn: 50,80 - color:GREEN size:20 shape:TRIANGLE posn:20,40 - ''' - ) - - prints:: - - shape: SQUARE color: BLACK posn: 100, 120 - ['shape:', 'SQUARE', 'color:', 'BLACK', 'posn:', ['100', ',', '120']] - - color: BLACK - - posn: ['100', ',', '120'] - - x: 100 - - y: 120 - - shape: SQUARE - - - shape: CIRCLE size: 50 color: BLUE posn: 50,80 - ['shape:', 'CIRCLE', 'size:', '50', 'color:', 'BLUE', 'posn:', ['50', ',', '80']] - - color: BLUE - - posn: ['50', ',', '80'] - - x: 50 - - y: 80 - - shape: CIRCLE - - size: 50 - - - color: GREEN size: 20 shape: TRIANGLE posn: 20,40 - ['color:', 'GREEN', 'size:', '20', 'shape:', 'TRIANGLE', 'posn:', ['20', ',', '40']] - - color: GREEN - - posn: ['20', ',', '40'] - - x: 20 - - y: 40 - - shape: TRIANGLE - - size: 20 - """ - def __init__( self, exprs, savelist = True ): - super(Each,self).__init__(exprs, savelist) - self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) - self.skipWhitespace = True - self.initExprGroups = True - self.saveAsList = True - - def streamline(self): - super(Each, self).streamline() - self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) - return self - - def parseImpl( self, instring, loc, doActions=True ): - if self.initExprGroups: - self.opt1map = dict((id(e.expr),e) for e in self.exprs if isinstance(e,Optional)) - opt1 = [ e.expr for e in self.exprs if isinstance(e,Optional) ] - opt2 = [ e for e in self.exprs if e.mayReturnEmpty and not isinstance(e,Optional)] - self.optionals = opt1 + opt2 - self.multioptionals = [ e.expr for e in self.exprs if isinstance(e,ZeroOrMore) ] - self.multirequired = [ e.expr for e in self.exprs if isinstance(e,OneOrMore) ] - self.required = [ e for e in self.exprs if not isinstance(e,(Optional,ZeroOrMore,OneOrMore)) ] - self.required += self.multirequired - self.initExprGroups = False - tmpLoc = loc - tmpReqd = self.required[:] - tmpOpt = self.optionals[:] - matchOrder = [] - - keepMatching = True - while keepMatching: - tmpExprs = tmpReqd + tmpOpt + self.multioptionals + self.multirequired - failed = [] - for e in tmpExprs: - try: - tmpLoc = e.tryParse( instring, tmpLoc ) - except ParseException: - failed.append(e) - else: - matchOrder.append(self.opt1map.get(id(e),e)) - if e in tmpReqd: - tmpReqd.remove(e) - elif e in tmpOpt: - tmpOpt.remove(e) - if len(failed) == len(tmpExprs): - keepMatching = False - - if tmpReqd: - missing = ", ".join(_ustr(e) for e in tmpReqd) - raise ParseException(instring,loc,"Missing one or more required elements (%s)" % missing ) - - # add any unmatched Optionals, in case they have default values defined - matchOrder += [e for e in self.exprs if isinstance(e,Optional) and e.expr in tmpOpt] - - resultlist = [] - for e in matchOrder: - loc,results = e._parse(instring,loc,doActions) - resultlist.append(results) - - finalResults = sum(resultlist, ParseResults([])) - return loc, finalResults - - def __str__( self ): - if hasattr(self,"name"): - return self.name - - if self.strRepr is None: - self.strRepr = "{" + " & ".join(_ustr(e) for e in self.exprs) + "}" - - return self.strRepr - - def checkRecursion( self, parseElementList ): - subRecCheckList = parseElementList[:] + [ self ] - for e in self.exprs: - e.checkRecursion( subRecCheckList ) - - -class ParseElementEnhance(ParserElement): - """Abstract subclass of :class:`ParserElement`, for combining and - post-processing parsed tokens. - """ - def __init__( self, expr, savelist=False ): - super(ParseElementEnhance,self).__init__(savelist) - if isinstance( expr, basestring ): - if issubclass(ParserElement._literalStringClass, Token): - expr = ParserElement._literalStringClass(expr) - else: - expr = ParserElement._literalStringClass(Literal(expr)) - self.expr = expr - self.strRepr = None - if expr is not None: - self.mayIndexError = expr.mayIndexError - self.mayReturnEmpty = expr.mayReturnEmpty - self.setWhitespaceChars( expr.whiteChars ) - self.skipWhitespace = expr.skipWhitespace - self.saveAsList = expr.saveAsList - self.callPreparse = expr.callPreparse - self.ignoreExprs.extend(expr.ignoreExprs) - - def parseImpl( self, instring, loc, doActions=True ): - if self.expr is not None: - return self.expr._parse( instring, loc, doActions, callPreParse=False ) - else: - raise ParseException("",loc,self.errmsg,self) - - def leaveWhitespace( self ): - self.skipWhitespace = False - self.expr = self.expr.copy() - if self.expr is not None: - self.expr.leaveWhitespace() - return self - - def ignore( self, other ): - if isinstance( other, Suppress ): - if other not in self.ignoreExprs: - super( ParseElementEnhance, self).ignore( other ) - if self.expr is not None: - self.expr.ignore( self.ignoreExprs[-1] ) - else: - super( ParseElementEnhance, self).ignore( other ) - if self.expr is not None: - self.expr.ignore( self.ignoreExprs[-1] ) - return self - - def streamline( self ): - super(ParseElementEnhance,self).streamline() - if self.expr is not None: - self.expr.streamline() - return self - - def checkRecursion( self, parseElementList ): - if self in parseElementList: - raise RecursiveGrammarException( parseElementList+[self] ) - subRecCheckList = parseElementList[:] + [ self ] - if self.expr is not None: - self.expr.checkRecursion( subRecCheckList ) - - def validate( self, validateTrace=[] ): - tmp = validateTrace[:]+[self] - if self.expr is not None: - self.expr.validate(tmp) - self.checkRecursion( [] ) - - def __str__( self ): - try: - return super(ParseElementEnhance,self).__str__() - except Exception: - pass - - if self.strRepr is None and self.expr is not None: - self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.expr) ) - return self.strRepr - - -class FollowedBy(ParseElementEnhance): - """Lookahead matching of the given parse expression. - ``FollowedBy`` does *not* advance the parsing position within - the input string, it only verifies that the specified parse - expression matches at the current position. ``FollowedBy`` - always returns a null token list. If any results names are defined - in the lookahead expression, those *will* be returned for access by - name. - - Example:: - - # use FollowedBy to match a label only if it is followed by a ':' - data_word = Word(alphas) - label = data_word + FollowedBy(':') - attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) - - OneOrMore(attr_expr).parseString("shape: SQUARE color: BLACK posn: upper left").pprint() - - prints:: - - [['shape', 'SQUARE'], ['color', 'BLACK'], ['posn', 'upper left']] - """ - def __init__( self, expr ): - super(FollowedBy,self).__init__(expr) - self.mayReturnEmpty = True - - def parseImpl( self, instring, loc, doActions=True ): - _, ret = self.expr._parse(instring, loc, doActions=doActions) - del ret[:] - return loc, ret - - -class PrecededBy(ParseElementEnhance): - """Lookbehind matching of the given parse expression. - ``PrecededBy`` does not advance the parsing position within the - input string, it only verifies that the specified parse expression - matches prior to the current position. ``PrecededBy`` always - returns a null token list, but if a results name is defined on the - given expression, it is returned. - - Parameters: - - - expr - expression that must match prior to the current parse - location - - retreat - (default= ``None``) - (int) maximum number of characters - to lookbehind prior to the current parse location - - If the lookbehind expression is a string, Literal, Keyword, or - a Word or CharsNotIn with a specified exact or maximum length, then - the retreat parameter is not required. Otherwise, retreat must be - specified to give a maximum number of characters to look back from - the current parse position for a lookbehind match. - - Example:: - - # VB-style variable names with type prefixes - int_var = PrecededBy("#") + pyparsing_common.identifier - str_var = PrecededBy("$") + pyparsing_common.identifier - - """ - def __init__(self, expr, retreat=None): - super(PrecededBy, self).__init__(expr) - self.expr = self.expr().leaveWhitespace() - self.mayReturnEmpty = True - self.mayIndexError = False - self.exact = False - if isinstance(expr, str): - retreat = len(expr) - self.exact = True - elif isinstance(expr, (Literal, Keyword)): - retreat = expr.matchLen - self.exact = True - elif isinstance(expr, (Word, CharsNotIn)) and expr.maxLen != _MAX_INT: - retreat = expr.maxLen - self.exact = True - elif isinstance(expr, _PositionToken): - retreat = 0 - self.exact = True - self.retreat = retreat - self.errmsg = "not preceded by " + str(expr) - self.skipWhitespace = False - - def parseImpl(self, instring, loc=0, doActions=True): - if self.exact: - if loc < self.retreat: - raise ParseException(instring, loc, self.errmsg) - start = loc - self.retreat - _, ret = self.expr._parse(instring, start) - else: - # retreat specified a maximum lookbehind window, iterate - test_expr = self.expr + StringEnd() - instring_slice = instring[:loc] - last_expr = ParseException(instring, loc, self.errmsg) - for offset in range(1, min(loc, self.retreat+1)): - try: - _, ret = test_expr._parse(instring_slice, loc-offset) - except ParseBaseException as pbe: - last_expr = pbe - else: - break - else: - raise last_expr - # return empty list of tokens, but preserve any defined results names - del ret[:] - return loc, ret - - -class NotAny(ParseElementEnhance): - """Lookahead to disallow matching with the given parse expression. - ``NotAny`` does *not* advance the parsing position within the - input string, it only verifies that the specified parse expression - does *not* match at the current position. Also, ``NotAny`` does - *not* skip over leading whitespace. ``NotAny`` always returns - a null token list. May be constructed using the '~' operator. - - Example:: - - AND, OR, NOT = map(CaselessKeyword, "AND OR NOT".split()) - - # take care not to mistake keywords for identifiers - ident = ~(AND | OR | NOT) + Word(alphas) - boolean_term = Optional(NOT) + ident - - # very crude boolean expression - to support parenthesis groups and - # operation hierarchy, use infixNotation - boolean_expr = boolean_term + ZeroOrMore((AND | OR) + boolean_term) - - # integers that are followed by "." are actually floats - integer = Word(nums) + ~Char(".") - """ - def __init__( self, expr ): - super(NotAny,self).__init__(expr) - #~ self.leaveWhitespace() - self.skipWhitespace = False # do NOT use self.leaveWhitespace(), don't want to propagate to exprs - self.mayReturnEmpty = True - self.errmsg = "Found unwanted token, "+_ustr(self.expr) - - def parseImpl( self, instring, loc, doActions=True ): - if self.expr.canParseNext(instring, loc): - raise ParseException(instring, loc, self.errmsg, self) - return loc, [] - - def __str__( self ): - if hasattr(self,"name"): - return self.name - - if self.strRepr is None: - self.strRepr = "~{" + _ustr(self.expr) + "}" - - return self.strRepr - -class _MultipleMatch(ParseElementEnhance): - def __init__( self, expr, stopOn=None): - super(_MultipleMatch, self).__init__(expr) - self.saveAsList = True - ender = stopOn - if isinstance(ender, basestring): - ender = ParserElement._literalStringClass(ender) - self.not_ender = ~ender if ender is not None else None - - def parseImpl( self, instring, loc, doActions=True ): - self_expr_parse = self.expr._parse - self_skip_ignorables = self._skipIgnorables - check_ender = self.not_ender is not None - if check_ender: - try_not_ender = self.not_ender.tryParse - - # must be at least one (but first see if we are the stopOn sentinel; - # if so, fail) - if check_ender: - try_not_ender(instring, loc) - loc, tokens = self_expr_parse( instring, loc, doActions, callPreParse=False ) - try: - hasIgnoreExprs = (not not self.ignoreExprs) - while 1: - if check_ender: - try_not_ender(instring, loc) - if hasIgnoreExprs: - preloc = self_skip_ignorables( instring, loc ) - else: - preloc = loc - loc, tmptokens = self_expr_parse( instring, preloc, doActions ) - if tmptokens or tmptokens.haskeys(): - tokens += tmptokens - except (ParseException,IndexError): - pass - - return loc, tokens - -class OneOrMore(_MultipleMatch): - """Repetition of one or more of the given expression. - - Parameters: - - expr - expression that must match one or more times - - stopOn - (default= ``None``) - expression for a terminating sentinel - (only required if the sentinel would ordinarily match the repetition - expression) - - Example:: - - data_word = Word(alphas) - label = data_word + FollowedBy(':') - attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join)) - - text = "shape: SQUARE posn: upper left color: BLACK" - OneOrMore(attr_expr).parseString(text).pprint() # Fail! read 'color' as data instead of next label -> [['shape', 'SQUARE color']] - - # use stopOn attribute for OneOrMore to avoid reading label string as part of the data - attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) - OneOrMore(attr_expr).parseString(text).pprint() # Better -> [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'BLACK']] - - # could also be written as - (attr_expr * (1,)).parseString(text).pprint() - """ - - def __str__( self ): - if hasattr(self,"name"): - return self.name - - if self.strRepr is None: - self.strRepr = "{" + _ustr(self.expr) + "}..." - - return self.strRepr - -class ZeroOrMore(_MultipleMatch): - """Optional repetition of zero or more of the given expression. - - Parameters: - - expr - expression that must match zero or more times - - stopOn - (default= ``None``) - expression for a terminating sentinel - (only required if the sentinel would ordinarily match the repetition - expression) - - Example: similar to :class:`OneOrMore` - """ - def __init__( self, expr, stopOn=None): - super(ZeroOrMore,self).__init__(expr, stopOn=stopOn) - self.mayReturnEmpty = True - - def parseImpl( self, instring, loc, doActions=True ): - try: - return super(ZeroOrMore, self).parseImpl(instring, loc, doActions) - except (ParseException,IndexError): - return loc, [] - - def __str__( self ): - if hasattr(self,"name"): - return self.name - - if self.strRepr is None: - self.strRepr = "[" + _ustr(self.expr) + "]..." - - return self.strRepr - -class _NullToken(object): - def __bool__(self): - return False - __nonzero__ = __bool__ - def __str__(self): - return "" - -_optionalNotMatched = _NullToken() -class Optional(ParseElementEnhance): - """Optional matching of the given expression. - - Parameters: - - expr - expression that must match zero or more times - - default (optional) - value to be returned if the optional expression is not found. - - Example:: - - # US postal code can be a 5-digit zip, plus optional 4-digit qualifier - zip = Combine(Word(nums, exact=5) + Optional('-' + Word(nums, exact=4))) - zip.runTests(''' - # traditional ZIP code - 12345 - - # ZIP+4 form - 12101-0001 - - # invalid ZIP - 98765- - ''') - - prints:: - - # traditional ZIP code - 12345 - ['12345'] - - # ZIP+4 form - 12101-0001 - ['12101-0001'] - - # invalid ZIP - 98765- - ^ - FAIL: Expected end of text (at char 5), (line:1, col:6) - """ - def __init__( self, expr, default=_optionalNotMatched ): - super(Optional,self).__init__( expr, savelist=False ) - self.saveAsList = self.expr.saveAsList - self.defaultValue = default - self.mayReturnEmpty = True - - def parseImpl( self, instring, loc, doActions=True ): - try: - loc, tokens = self.expr._parse( instring, loc, doActions, callPreParse=False ) - except (ParseException,IndexError): - if self.defaultValue is not _optionalNotMatched: - if self.expr.resultsName: - tokens = ParseResults([ self.defaultValue ]) - tokens[self.expr.resultsName] = self.defaultValue - else: - tokens = [ self.defaultValue ] - else: - tokens = [] - return loc, tokens - - def __str__( self ): - if hasattr(self,"name"): - return self.name - - if self.strRepr is None: - self.strRepr = "[" + _ustr(self.expr) + "]" - - return self.strRepr - -class SkipTo(ParseElementEnhance): - """Token for skipping over all undefined text until the matched - expression is found. - - Parameters: - - expr - target expression marking the end of the data to be skipped - - include - (default= ``False``) if True, the target expression is also parsed - (the skipped text and target expression are returned as a 2-element list). - - ignore - (default= ``None``) used to define grammars (typically quoted strings and - comments) that might contain false matches to the target expression - - failOn - (default= ``None``) define expressions that are not allowed to be - included in the skipped test; if found before the target expression is found, - the SkipTo is not a match - - Example:: - - report = ''' - Outstanding Issues Report - 1 Jan 2000 - - # | Severity | Description | Days Open - -----+----------+-------------------------------------------+----------- - 101 | Critical | Intermittent system crash | 6 - 94 | Cosmetic | Spelling error on Login ('log|n') | 14 - 79 | Minor | System slow when running too many reports | 47 - ''' - integer = Word(nums) - SEP = Suppress('|') - # use SkipTo to simply match everything up until the next SEP - # - ignore quoted strings, so that a '|' character inside a quoted string does not match - # - parse action will call token.strip() for each matched token, i.e., the description body - string_data = SkipTo(SEP, ignore=quotedString) - string_data.setParseAction(tokenMap(str.strip)) - ticket_expr = (integer("issue_num") + SEP - + string_data("sev") + SEP - + string_data("desc") + SEP - + integer("days_open")) - - for tkt in ticket_expr.searchString(report): - print tkt.dump() - - prints:: - - ['101', 'Critical', 'Intermittent system crash', '6'] - - days_open: 6 - - desc: Intermittent system crash - - issue_num: 101 - - sev: Critical - ['94', 'Cosmetic', "Spelling error on Login ('log|n')", '14'] - - days_open: 14 - - desc: Spelling error on Login ('log|n') - - issue_num: 94 - - sev: Cosmetic - ['79', 'Minor', 'System slow when running too many reports', '47'] - - days_open: 47 - - desc: System slow when running too many reports - - issue_num: 79 - - sev: Minor - """ - def __init__( self, other, include=False, ignore=None, failOn=None ): - super( SkipTo, self ).__init__( other ) - self.ignoreExpr = ignore - self.mayReturnEmpty = True - self.mayIndexError = False - self.includeMatch = include - self.saveAsList = False - if isinstance(failOn, basestring): - self.failOn = ParserElement._literalStringClass(failOn) - else: - self.failOn = failOn - self.errmsg = "No match found for "+_ustr(self.expr) - - def parseImpl( self, instring, loc, doActions=True ): - startloc = loc - instrlen = len(instring) - expr = self.expr - expr_parse = self.expr._parse - self_failOn_canParseNext = self.failOn.canParseNext if self.failOn is not None else None - self_ignoreExpr_tryParse = self.ignoreExpr.tryParse if self.ignoreExpr is not None else None - - tmploc = loc - while tmploc <= instrlen: - if self_failOn_canParseNext is not None: - # break if failOn expression matches - if self_failOn_canParseNext(instring, tmploc): - break - - if self_ignoreExpr_tryParse is not None: - # advance past ignore expressions - while 1: - try: - tmploc = self_ignoreExpr_tryParse(instring, tmploc) - except ParseBaseException: - break - - try: - expr_parse(instring, tmploc, doActions=False, callPreParse=False) - except (ParseException, IndexError): - # no match, advance loc in string - tmploc += 1 - else: - # matched skipto expr, done - break - - else: - # ran off the end of the input string without matching skipto expr, fail - raise ParseException(instring, loc, self.errmsg, self) - - # build up return values - loc = tmploc - skiptext = instring[startloc:loc] - skipresult = ParseResults(skiptext) - - if self.includeMatch: - loc, mat = expr_parse(instring,loc,doActions,callPreParse=False) - skipresult += mat - - return loc, skipresult - -class Forward(ParseElementEnhance): - """Forward declaration of an expression to be defined later - - used for recursive grammars, such as algebraic infix notation. - When the expression is known, it is assigned to the ``Forward`` - variable using the '<<' operator. - - Note: take care when assigning to ``Forward`` not to overlook - precedence of operators. - - Specifically, '|' has a lower precedence than '<<', so that:: - - fwdExpr << a | b | c - - will actually be evaluated as:: - - (fwdExpr << a) | b | c - - thereby leaving b and c out as parseable alternatives. It is recommended that you - explicitly group the values inserted into the ``Forward``:: - - fwdExpr << (a | b | c) - - Converting to use the '<<=' operator instead will avoid this problem. - - See :class:`ParseResults.pprint` for an example of a recursive - parser created using ``Forward``. - """ - def __init__( self, other=None ): - super(Forward,self).__init__( other, savelist=False ) - - def __lshift__( self, other ): - if isinstance( other, basestring ): - other = ParserElement._literalStringClass(other) - self.expr = other - self.strRepr = None - self.mayIndexError = self.expr.mayIndexError - self.mayReturnEmpty = self.expr.mayReturnEmpty - self.setWhitespaceChars( self.expr.whiteChars ) - self.skipWhitespace = self.expr.skipWhitespace - self.saveAsList = self.expr.saveAsList - self.ignoreExprs.extend(self.expr.ignoreExprs) - return self - - def __ilshift__(self, other): - return self << other - - def leaveWhitespace( self ): - self.skipWhitespace = False - return self - - def streamline( self ): - if not self.streamlined: - self.streamlined = True - if self.expr is not None: - self.expr.streamline() - return self - - def validate( self, validateTrace=[] ): - if self not in validateTrace: - tmp = validateTrace[:]+[self] - if self.expr is not None: - self.expr.validate(tmp) - self.checkRecursion([]) - - def __str__( self ): - if hasattr(self,"name"): - return self.name - - # Avoid infinite recursion by setting a temporary name - self.name = self.__class__.__name__ + ": ..." - - # Use the string representation of main expression. - try: - if self.expr is not None: - retString = _ustr(self.expr) - else: - retString = "None" - finally: - del self.name - return self.__class__.__name__ + ": " + retString - - def copy(self): - if self.expr is not None: - return super(Forward,self).copy() - else: - ret = Forward() - ret <<= self - return ret - -class TokenConverter(ParseElementEnhance): - """ - Abstract subclass of :class:`ParseExpression`, for converting parsed results. - """ - def __init__( self, expr, savelist=False ): - super(TokenConverter,self).__init__( expr )#, savelist ) - self.saveAsList = False - -class Combine(TokenConverter): - """Converter to concatenate all matching tokens to a single string. - By default, the matching patterns must also be contiguous in the - input string; this can be disabled by specifying - ``'adjacent=False'`` in the constructor. - - Example:: - - real = Word(nums) + '.' + Word(nums) - print(real.parseString('3.1416')) # -> ['3', '.', '1416'] - # will also erroneously match the following - print(real.parseString('3. 1416')) # -> ['3', '.', '1416'] - - real = Combine(Word(nums) + '.' + Word(nums)) - print(real.parseString('3.1416')) # -> ['3.1416'] - # no match when there are internal spaces - print(real.parseString('3. 1416')) # -> Exception: Expected W:(0123...) - """ - def __init__( self, expr, joinString="", adjacent=True ): - super(Combine,self).__init__( expr ) - # suppress whitespace-stripping in contained parse expressions, but re-enable it on the Combine itself - if adjacent: - self.leaveWhitespace() - self.adjacent = adjacent - self.skipWhitespace = True - self.joinString = joinString - self.callPreparse = True - - def ignore( self, other ): - if self.adjacent: - ParserElement.ignore(self, other) - else: - super( Combine, self).ignore( other ) - return self - - def postParse( self, instring, loc, tokenlist ): - retToks = tokenlist.copy() - del retToks[:] - retToks += ParseResults([ "".join(tokenlist._asStringList(self.joinString)) ], modal=self.modalResults) - - if self.resultsName and retToks.haskeys(): - return [ retToks ] - else: - return retToks - -class Group(TokenConverter): - """Converter to return the matched tokens as a list - useful for - returning tokens of :class:`ZeroOrMore` and :class:`OneOrMore` expressions. - - Example:: - - ident = Word(alphas) - num = Word(nums) - term = ident | num - func = ident + Optional(delimitedList(term)) - print(func.parseString("fn a,b,100")) # -> ['fn', 'a', 'b', '100'] - - func = ident + Group(Optional(delimitedList(term))) - print(func.parseString("fn a,b,100")) # -> ['fn', ['a', 'b', '100']] - """ - def __init__( self, expr ): - super(Group,self).__init__( expr ) - self.saveAsList = True - - def postParse( self, instring, loc, tokenlist ): - return [ tokenlist ] - -class Dict(TokenConverter): - """Converter to return a repetitive expression as a list, but also - as a dictionary. Each element can also be referenced using the first - token in the expression as its key. Useful for tabular report - scraping when the first column can be used as a item key. - - Example:: - - data_word = Word(alphas) - label = data_word + FollowedBy(':') - attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join)) - - text = "shape: SQUARE posn: upper left color: light blue texture: burlap" - attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) - - # print attributes as plain groups - print(OneOrMore(attr_expr).parseString(text).dump()) - - # instead of OneOrMore(expr), parse using Dict(OneOrMore(Group(expr))) - Dict will auto-assign names - result = Dict(OneOrMore(Group(attr_expr))).parseString(text) - print(result.dump()) - - # access named fields as dict entries, or output as dict - print(result['shape']) - print(result.asDict()) - - prints:: - - ['shape', 'SQUARE', 'posn', 'upper left', 'color', 'light blue', 'texture', 'burlap'] - [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']] - - color: light blue - - posn: upper left - - shape: SQUARE - - texture: burlap - SQUARE - {'color': 'light blue', 'posn': 'upper left', 'texture': 'burlap', 'shape': 'SQUARE'} - - See more examples at :class:`ParseResults` of accessing fields by results name. - """ - def __init__( self, expr ): - super(Dict,self).__init__( expr ) - self.saveAsList = True - - def postParse( self, instring, loc, tokenlist ): - for i,tok in enumerate(tokenlist): - if len(tok) == 0: - continue - ikey = tok[0] - if isinstance(ikey,int): - ikey = _ustr(tok[0]).strip() - if len(tok)==1: - tokenlist[ikey] = _ParseResultsWithOffset("",i) - elif len(tok)==2 and not isinstance(tok[1],ParseResults): - tokenlist[ikey] = _ParseResultsWithOffset(tok[1],i) - else: - dictvalue = tok.copy() #ParseResults(i) - del dictvalue[0] - if len(dictvalue)!= 1 or (isinstance(dictvalue,ParseResults) and dictvalue.haskeys()): - tokenlist[ikey] = _ParseResultsWithOffset(dictvalue,i) - else: - tokenlist[ikey] = _ParseResultsWithOffset(dictvalue[0],i) - - if self.resultsName: - return [ tokenlist ] - else: - return tokenlist - - -class Suppress(TokenConverter): - """Converter for ignoring the results of a parsed expression. - - Example:: - - source = "a, b, c,d" - wd = Word(alphas) - wd_list1 = wd + ZeroOrMore(',' + wd) - print(wd_list1.parseString(source)) - - # often, delimiters that are useful during parsing are just in the - # way afterward - use Suppress to keep them out of the parsed output - wd_list2 = wd + ZeroOrMore(Suppress(',') + wd) - print(wd_list2.parseString(source)) - - prints:: - - ['a', ',', 'b', ',', 'c', ',', 'd'] - ['a', 'b', 'c', 'd'] - - (See also :class:`delimitedList`.) - """ - def postParse( self, instring, loc, tokenlist ): - return [] - - def suppress( self ): - return self - - -class OnlyOnce(object): - """Wrapper for parse actions, to ensure they are only called once. - """ - def __init__(self, methodCall): - self.callable = _trim_arity(methodCall) - self.called = False - def __call__(self,s,l,t): - if not self.called: - results = self.callable(s,l,t) - self.called = True - return results - raise ParseException(s,l,"") - def reset(self): - self.called = False - -def traceParseAction(f): - """Decorator for debugging parse actions. - - When the parse action is called, this decorator will print - ``">> entering method-name(line:<current_source_line>, <parse_location>, <matched_tokens>)"``. - When the parse action completes, the decorator will print - ``"<<"`` followed by the returned value, or any exception that the parse action raised. - - Example:: - - wd = Word(alphas) - - @traceParseAction - def remove_duplicate_chars(tokens): - return ''.join(sorted(set(''.join(tokens)))) - - wds = OneOrMore(wd).setParseAction(remove_duplicate_chars) - print(wds.parseString("slkdjs sld sldd sdlf sdljf")) - - prints:: - - >>entering remove_duplicate_chars(line: 'slkdjs sld sldd sdlf sdljf', 0, (['slkdjs', 'sld', 'sldd', 'sdlf', 'sdljf'], {})) - <<leaving remove_duplicate_chars (ret: 'dfjkls') - ['dfjkls'] - """ - f = _trim_arity(f) - def z(*paArgs): - thisFunc = f.__name__ - s,l,t = paArgs[-3:] - if len(paArgs)>3: - thisFunc = paArgs[0].__class__.__name__ + '.' + thisFunc - sys.stderr.write( ">>entering %s(line: '%s', %d, %r)\n" % (thisFunc,line(l,s),l,t) ) - try: - ret = f(*paArgs) - except Exception as exc: - sys.stderr.write( "<<leaving %s (exception: %s)\n" % (thisFunc,exc) ) - raise - sys.stderr.write( "<<leaving %s (ret: %r)\n" % (thisFunc,ret) ) - return ret - try: - z.__name__ = f.__name__ - except AttributeError: - pass - return z - -# -# global helpers -# -def delimitedList( expr, delim=",", combine=False ): - """Helper to define a delimited list of expressions - the delimiter - defaults to ','. By default, the list elements and delimiters can - have intervening whitespace, and comments, but this can be - overridden by passing ``combine=True`` in the constructor. If - ``combine`` is set to ``True``, the matching tokens are - returned as a single token string, with the delimiters included; - otherwise, the matching tokens are returned as a list of tokens, - with the delimiters suppressed. - - Example:: - - delimitedList(Word(alphas)).parseString("aa,bb,cc") # -> ['aa', 'bb', 'cc'] - delimitedList(Word(hexnums), delim=':', combine=True).parseString("AA:BB:CC:DD:EE") # -> ['AA:BB:CC:DD:EE'] - """ - dlName = _ustr(expr)+" ["+_ustr(delim)+" "+_ustr(expr)+"]..." - if combine: - return Combine( expr + ZeroOrMore( delim + expr ) ).setName(dlName) - else: - return ( expr + ZeroOrMore( Suppress( delim ) + expr ) ).setName(dlName) - -def countedArray( expr, intExpr=None ): - """Helper to define a counted list of expressions. - - This helper defines a pattern of the form:: - - integer expr expr expr... - - where the leading integer tells how many expr expressions follow. - The matched tokens returns the array of expr tokens as a list - the - leading count token is suppressed. - - If ``intExpr`` is specified, it should be a pyparsing expression - that produces an integer value. - - Example:: - - countedArray(Word(alphas)).parseString('2 ab cd ef') # -> ['ab', 'cd'] - - # in this parser, the leading integer value is given in binary, - # '10' indicating that 2 values are in the array - binaryConstant = Word('01').setParseAction(lambda t: int(t[0], 2)) - countedArray(Word(alphas), intExpr=binaryConstant).parseString('10 ab cd ef') # -> ['ab', 'cd'] - """ - arrayExpr = Forward() - def countFieldParseAction(s,l,t): - n = t[0] - arrayExpr << (n and Group(And([expr]*n)) or Group(empty)) - return [] - if intExpr is None: - intExpr = Word(nums).setParseAction(lambda t:int(t[0])) - else: - intExpr = intExpr.copy() - intExpr.setName("arrayLen") - intExpr.addParseAction(countFieldParseAction, callDuringTry=True) - return ( intExpr + arrayExpr ).setName('(len) ' + _ustr(expr) + '...') - -def _flatten(L): - ret = [] - for i in L: - if isinstance(i,list): - ret.extend(_flatten(i)) - else: - ret.append(i) - return ret - -def matchPreviousLiteral(expr): - """Helper to define an expression that is indirectly defined from - the tokens matched in a previous expression, that is, it looks for - a 'repeat' of a previous expression. For example:: - - first = Word(nums) - second = matchPreviousLiteral(first) - matchExpr = first + ":" + second - - will match ``"1:1"``, but not ``"1:2"``. Because this - matches a previous literal, will also match the leading - ``"1:1"`` in ``"1:10"``. If this is not desired, use - :class:`matchPreviousExpr`. Do *not* use with packrat parsing - enabled. - """ - rep = Forward() - def copyTokenToRepeater(s,l,t): - if t: - if len(t) == 1: - rep << t[0] - else: - # flatten t tokens - tflat = _flatten(t.asList()) - rep << And(Literal(tt) for tt in tflat) - else: - rep << Empty() - expr.addParseAction(copyTokenToRepeater, callDuringTry=True) - rep.setName('(prev) ' + _ustr(expr)) - return rep - -def matchPreviousExpr(expr): - """Helper to define an expression that is indirectly defined from - the tokens matched in a previous expression, that is, it looks for - a 'repeat' of a previous expression. For example:: - - first = Word(nums) - second = matchPreviousExpr(first) - matchExpr = first + ":" + second - - will match ``"1:1"``, but not ``"1:2"``. Because this - matches by expressions, will *not* match the leading ``"1:1"`` - in ``"1:10"``; the expressions are evaluated first, and then - compared, so ``"1"`` is compared with ``"10"``. Do *not* use - with packrat parsing enabled. - """ - rep = Forward() - e2 = expr.copy() - rep <<= e2 - def copyTokenToRepeater(s,l,t): - matchTokens = _flatten(t.asList()) - def mustMatchTheseTokens(s,l,t): - theseTokens = _flatten(t.asList()) - if theseTokens != matchTokens: - raise ParseException("",0,"") - rep.setParseAction( mustMatchTheseTokens, callDuringTry=True ) - expr.addParseAction(copyTokenToRepeater, callDuringTry=True) - rep.setName('(prev) ' + _ustr(expr)) - return rep - -def _escapeRegexRangeChars(s): - #~ escape these chars: ^-] - for c in r"\^-]": - s = s.replace(c,_bslash+c) - s = s.replace("\n",r"\n") - s = s.replace("\t",r"\t") - return _ustr(s) - -def oneOf( strs, caseless=False, useRegex=True ): - """Helper to quickly define a set of alternative Literals, and makes - sure to do longest-first testing when there is a conflict, - regardless of the input order, but returns - a :class:`MatchFirst` for best performance. - - Parameters: - - - strs - a string of space-delimited literals, or a collection of - string literals - - caseless - (default= ``False``) - treat all literals as - caseless - - useRegex - (default= ``True``) - as an optimization, will - generate a Regex object; otherwise, will generate - a :class:`MatchFirst` object (if ``caseless=True``, or if - creating a :class:`Regex` raises an exception) - - Example:: - - comp_oper = oneOf("< = > <= >= !=") - var = Word(alphas) - number = Word(nums) - term = var | number - comparison_expr = term + comp_oper + term - print(comparison_expr.searchString("B = 12 AA=23 B<=AA AA>12")) - - prints:: - - [['B', '=', '12'], ['AA', '=', '23'], ['B', '<=', 'AA'], ['AA', '>', '12']] - """ - if caseless: - isequal = ( lambda a,b: a.upper() == b.upper() ) - masks = ( lambda a,b: b.upper().startswith(a.upper()) ) - parseElementClass = CaselessLiteral - else: - isequal = ( lambda a,b: a == b ) - masks = ( lambda a,b: b.startswith(a) ) - parseElementClass = Literal - - symbols = [] - if isinstance(strs,basestring): - symbols = strs.split() - elif isinstance(strs, Iterable): - symbols = list(strs) - else: - warnings.warn("Invalid argument to oneOf, expected string or iterable", - SyntaxWarning, stacklevel=2) - if not symbols: - return NoMatch() - - i = 0 - while i < len(symbols)-1: - cur = symbols[i] - for j,other in enumerate(symbols[i+1:]): - if ( isequal(other, cur) ): - del symbols[i+j+1] - break - elif ( masks(cur, other) ): - del symbols[i+j+1] - symbols.insert(i,other) - cur = other - break - else: - i += 1 - - if not caseless and useRegex: - #~ print (strs,"->", "|".join( [ _escapeRegexChars(sym) for sym in symbols] )) - try: - if len(symbols)==len("".join(symbols)): - return Regex( "[%s]" % "".join(_escapeRegexRangeChars(sym) for sym in symbols) ).setName(' | '.join(symbols)) - else: - return Regex( "|".join(re.escape(sym) for sym in symbols) ).setName(' | '.join(symbols)) - except Exception: - warnings.warn("Exception creating Regex for oneOf, building MatchFirst", - SyntaxWarning, stacklevel=2) - - - # last resort, just use MatchFirst - return MatchFirst(parseElementClass(sym) for sym in symbols).setName(' | '.join(symbols)) - -def dictOf( key, value ): - """Helper to easily and clearly define a dictionary by specifying - the respective patterns for the key and value. Takes care of - defining the :class:`Dict`, :class:`ZeroOrMore`, and - :class:`Group` tokens in the proper order. The key pattern - can include delimiting markers or punctuation, as long as they are - suppressed, thereby leaving the significant key text. The value - pattern can include named results, so that the :class:`Dict` results - can include named token fields. - - Example:: - - text = "shape: SQUARE posn: upper left color: light blue texture: burlap" - attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) - print(OneOrMore(attr_expr).parseString(text).dump()) - - attr_label = label - attr_value = Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join) - - # similar to Dict, but simpler call format - result = dictOf(attr_label, attr_value).parseString(text) - print(result.dump()) - print(result['shape']) - print(result.shape) # object attribute access works too - print(result.asDict()) - - prints:: - - [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']] - - color: light blue - - posn: upper left - - shape: SQUARE - - texture: burlap - SQUARE - SQUARE - {'color': 'light blue', 'shape': 'SQUARE', 'posn': 'upper left', 'texture': 'burlap'} - """ - return Dict(OneOrMore(Group(key + value))) - -def originalTextFor(expr, asString=True): - """Helper to return the original, untokenized text for a given - expression. Useful to restore the parsed fields of an HTML start - tag into the raw tag text itself, or to revert separate tokens with - intervening whitespace back to the original matching input text. By - default, returns astring containing the original parsed text. - - If the optional ``asString`` argument is passed as - ``False``, then the return value is - a :class:`ParseResults` containing any results names that - were originally matched, and a single token containing the original - matched text from the input string. So if the expression passed to - :class:`originalTextFor` contains expressions with defined - results names, you must set ``asString`` to ``False`` if you - want to preserve those results name values. - - Example:: - - src = "this is test <b> bold <i>text</i> </b> normal text " - for tag in ("b","i"): - opener,closer = makeHTMLTags(tag) - patt = originalTextFor(opener + SkipTo(closer) + closer) - print(patt.searchString(src)[0]) - - prints:: - - ['<b> bold <i>text</i> </b>'] - ['<i>text</i>'] - """ - locMarker = Empty().setParseAction(lambda s,loc,t: loc) - endlocMarker = locMarker.copy() - endlocMarker.callPreparse = False - matchExpr = locMarker("_original_start") + expr + endlocMarker("_original_end") - if asString: - extractText = lambda s,l,t: s[t._original_start:t._original_end] - else: - def extractText(s,l,t): - t[:] = [s[t.pop('_original_start'):t.pop('_original_end')]] - matchExpr.setParseAction(extractText) - matchExpr.ignoreExprs = expr.ignoreExprs - return matchExpr - -def ungroup(expr): - """Helper to undo pyparsing's default grouping of And expressions, - even if all but one are non-empty. - """ - return TokenConverter(expr).addParseAction(lambda t:t[0]) - -def locatedExpr(expr): - """Helper to decorate a returned token with its starting and ending - locations in the input string. - - This helper adds the following results names: - - - locn_start = location where matched expression begins - - locn_end = location where matched expression ends - - value = the actual parsed results - - Be careful if the input text contains ``<TAB>`` characters, you - may want to call :class:`ParserElement.parseWithTabs` - - Example:: - - wd = Word(alphas) - for match in locatedExpr(wd).searchString("ljsdf123lksdjjf123lkkjj1222"): - print(match) - - prints:: - - [[0, 'ljsdf', 5]] - [[8, 'lksdjjf', 15]] - [[18, 'lkkjj', 23]] - """ - locator = Empty().setParseAction(lambda s,l,t: l) - return Group(locator("locn_start") + expr("value") + locator.copy().leaveWhitespace()("locn_end")) - - -# convenience constants for positional expressions -empty = Empty().setName("empty") -lineStart = LineStart().setName("lineStart") -lineEnd = LineEnd().setName("lineEnd") -stringStart = StringStart().setName("stringStart") -stringEnd = StringEnd().setName("stringEnd") - -_escapedPunc = Word( _bslash, r"\[]-*.$+^?()~ ", exact=2 ).setParseAction(lambda s,l,t:t[0][1]) -_escapedHexChar = Regex(r"\\0?[xX][0-9a-fA-F]+").setParseAction(lambda s,l,t:unichr(int(t[0].lstrip(r'\0x'),16))) -_escapedOctChar = Regex(r"\\0[0-7]+").setParseAction(lambda s,l,t:unichr(int(t[0][1:],8))) -_singleChar = _escapedPunc | _escapedHexChar | _escapedOctChar | CharsNotIn(r'\]', exact=1) -_charRange = Group(_singleChar + Suppress("-") + _singleChar) -_reBracketExpr = Literal("[") + Optional("^").setResultsName("negate") + Group( OneOrMore( _charRange | _singleChar ) ).setResultsName("body") + "]" - -def srange(s): - r"""Helper to easily define string ranges for use in Word - construction. Borrows syntax from regexp '[]' string range - definitions:: - - srange("[0-9]") -> "0123456789" - srange("[a-z]") -> "abcdefghijklmnopqrstuvwxyz" - srange("[a-z$_]") -> "abcdefghijklmnopqrstuvwxyz$_" - - The input string must be enclosed in []'s, and the returned string - is the expanded character set joined into a single string. The - values enclosed in the []'s may be: - - - a single character - - an escaped character with a leading backslash (such as ``\-`` - or ``\]``) - - an escaped hex character with a leading ``'\x'`` - (``\x21``, which is a ``'!'`` character) (``\0x##`` - is also supported for backwards compatibility) - - an escaped octal character with a leading ``'\0'`` - (``\041``, which is a ``'!'`` character) - - a range of any of the above, separated by a dash (``'a-z'``, - etc.) - - any combination of the above (``'aeiouy'``, - ``'a-zA-Z0-9_$'``, etc.) - """ - _expanded = lambda p: p if not isinstance(p,ParseResults) else ''.join(unichr(c) for c in range(ord(p[0]),ord(p[1])+1)) - try: - return "".join(_expanded(part) for part in _reBracketExpr.parseString(s).body) - except Exception: - return "" - -def matchOnlyAtCol(n): - """Helper method for defining parse actions that require matching at - a specific column in the input text. - """ - def verifyCol(strg,locn,toks): - if col(locn,strg) != n: - raise ParseException(strg,locn,"matched token not at column %d" % n) - return verifyCol - -def replaceWith(replStr): - """Helper method for common parse actions that simply return - a literal value. Especially useful when used with - :class:`transformString<ParserElement.transformString>` (). - - Example:: - - num = Word(nums).setParseAction(lambda toks: int(toks[0])) - na = oneOf("N/A NA").setParseAction(replaceWith(math.nan)) - term = na | num - - OneOrMore(term).parseString("324 234 N/A 234") # -> [324, 234, nan, 234] - """ - return lambda s,l,t: [replStr] - -def removeQuotes(s,l,t): - """Helper parse action for removing quotation marks from parsed - quoted strings. - - Example:: - - # by default, quotation marks are included in parsed results - quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["'Now is the Winter of our Discontent'"] - - # use removeQuotes to strip quotation marks from parsed results - quotedString.setParseAction(removeQuotes) - quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["Now is the Winter of our Discontent"] - """ - return t[0][1:-1] - -def tokenMap(func, *args): - """Helper to define a parse action by mapping a function to all - elements of a ParseResults list. If any additional args are passed, - they are forwarded to the given function as additional arguments - after the token, as in - ``hex_integer = Word(hexnums).setParseAction(tokenMap(int, 16))``, - which will convert the parsed data to an integer using base 16. - - Example (compare the last to example in :class:`ParserElement.transformString`:: - - hex_ints = OneOrMore(Word(hexnums)).setParseAction(tokenMap(int, 16)) - hex_ints.runTests(''' - 00 11 22 aa FF 0a 0d 1a - ''') - - upperword = Word(alphas).setParseAction(tokenMap(str.upper)) - OneOrMore(upperword).runTests(''' - my kingdom for a horse - ''') - - wd = Word(alphas).setParseAction(tokenMap(str.title)) - OneOrMore(wd).setParseAction(' '.join).runTests(''' - now is the winter of our discontent made glorious summer by this sun of york - ''') - - prints:: - - 00 11 22 aa FF 0a 0d 1a - [0, 17, 34, 170, 255, 10, 13, 26] - - my kingdom for a horse - ['MY', 'KINGDOM', 'FOR', 'A', 'HORSE'] - - now is the winter of our discontent made glorious summer by this sun of york - ['Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York'] - """ - def pa(s,l,t): - return [func(tokn, *args) for tokn in t] - - try: - func_name = getattr(func, '__name__', - getattr(func, '__class__').__name__) - except Exception: - func_name = str(func) - pa.__name__ = func_name - - return pa - -upcaseTokens = tokenMap(lambda t: _ustr(t).upper()) -"""(Deprecated) Helper parse action to convert tokens to upper case. -Deprecated in favor of :class:`pyparsing_common.upcaseTokens`""" - -downcaseTokens = tokenMap(lambda t: _ustr(t).lower()) -"""(Deprecated) Helper parse action to convert tokens to lower case. -Deprecated in favor of :class:`pyparsing_common.downcaseTokens`""" - -def _makeTags(tagStr, xml, - suppress_LT=Suppress("<"), - suppress_GT=Suppress(">")): - """Internal helper to construct opening and closing tag expressions, given a tag name""" - if isinstance(tagStr,basestring): - resname = tagStr - tagStr = Keyword(tagStr, caseless=not xml) - else: - resname = tagStr.name - - tagAttrName = Word(alphas,alphanums+"_-:") - if (xml): - tagAttrValue = dblQuotedString.copy().setParseAction( removeQuotes ) - openTag = (suppress_LT - + tagStr("tag") - + Dict(ZeroOrMore(Group(tagAttrName + Suppress("=") + tagAttrValue ))) - + Optional("/", default=[False])("empty").setParseAction(lambda s,l,t:t[0]=='/') - + suppress_GT) - else: - tagAttrValue = quotedString.copy().setParseAction( removeQuotes ) | Word(printables, excludeChars=">") - openTag = (suppress_LT - + tagStr("tag") - + Dict(ZeroOrMore(Group(tagAttrName.setParseAction(downcaseTokens) - + Optional(Suppress("=") + tagAttrValue)))) - + Optional("/",default=[False])("empty").setParseAction(lambda s,l,t:t[0]=='/') - + suppress_GT) - closeTag = Combine(_L("</") + tagStr + ">", adjacent=False) - - openTag.setName("<%s>" % resname) - # add start<tagname> results name in parse action now that ungrouped names are not reported at two levels - openTag.addParseAction(lambda t: t.__setitem__("start"+"".join(resname.replace(":"," ").title().split()), t.copy())) - closeTag = closeTag("end"+"".join(resname.replace(":"," ").title().split())).setName("</%s>" % resname) - openTag.tag = resname - closeTag.tag = resname - openTag.tag_body = SkipTo(closeTag()) - return openTag, closeTag - -def makeHTMLTags(tagStr): - """Helper to construct opening and closing tag expressions for HTML, - given a tag name. Matches tags in either upper or lower case, - attributes with namespaces and with quoted or unquoted values. - - Example:: - - text = '<td>More info at the <a href="https://github.com/pyparsing/pyparsing/wiki">pyparsing</a> wiki page</td>' - # makeHTMLTags returns pyparsing expressions for the opening and - # closing tags as a 2-tuple - a,a_end = makeHTMLTags("A") - link_expr = a + SkipTo(a_end)("link_text") + a_end - - for link in link_expr.searchString(text): - # attributes in the <A> tag (like "href" shown here) are - # also accessible as named results - print(link.link_text, '->', link.href) - - prints:: - - pyparsing -> https://github.com/pyparsing/pyparsing/wiki - """ - return _makeTags( tagStr, False ) - -def makeXMLTags(tagStr): - """Helper to construct opening and closing tag expressions for XML, - given a tag name. Matches tags only in the given upper/lower case. - - Example: similar to :class:`makeHTMLTags` - """ - return _makeTags( tagStr, True ) - -def withAttribute(*args,**attrDict): - """Helper to create a validating parse action to be used with start - tags created with :class:`makeXMLTags` or - :class:`makeHTMLTags`. Use ``withAttribute`` to qualify - a starting tag with a required attribute value, to avoid false - matches on common tags such as ``<TD>`` or ``<DIV>``. - - Call ``withAttribute`` with a series of attribute names and - values. Specify the list of filter attributes names and values as: - - - keyword arguments, as in ``(align="right")``, or - - as an explicit dict with ``**`` operator, when an attribute - name is also a Python reserved word, as in ``**{"class":"Customer", "align":"right"}`` - - a list of name-value tuples, as in ``(("ns1:class", "Customer"), ("ns2:align","right"))`` - - For attribute names with a namespace prefix, you must use the second - form. Attribute names are matched insensitive to upper/lower case. - - If just testing for ``class`` (with or without a namespace), use - :class:`withClass`. - - To verify that the attribute exists, but without specifying a value, - pass ``withAttribute.ANY_VALUE`` as the value. - - Example:: - - html = ''' - <div> - Some text - <div type="grid">1 4 0 1 0</div> - <div type="graph">1,3 2,3 1,1</div> - <div>this has no type</div> - </div> - - ''' - div,div_end = makeHTMLTags("div") - - # only match div tag having a type attribute with value "grid" - div_grid = div().setParseAction(withAttribute(type="grid")) - grid_expr = div_grid + SkipTo(div | div_end)("body") - for grid_header in grid_expr.searchString(html): - print(grid_header.body) - - # construct a match with any div tag having a type attribute, regardless of the value - div_any_type = div().setParseAction(withAttribute(type=withAttribute.ANY_VALUE)) - div_expr = div_any_type + SkipTo(div | div_end)("body") - for div_header in div_expr.searchString(html): - print(div_header.body) - - prints:: - - 1 4 0 1 0 - - 1 4 0 1 0 - 1,3 2,3 1,1 - """ - if args: - attrs = args[:] - else: - attrs = attrDict.items() - attrs = [(k,v) for k,v in attrs] - def pa(s,l,tokens): - for attrName,attrValue in attrs: - if attrName not in tokens: - raise ParseException(s,l,"no matching attribute " + attrName) - if attrValue != withAttribute.ANY_VALUE and tokens[attrName] != attrValue: - raise ParseException(s,l,"attribute '%s' has value '%s', must be '%s'" % - (attrName, tokens[attrName], attrValue)) - return pa -withAttribute.ANY_VALUE = object() - -def withClass(classname, namespace=''): - """Simplified version of :class:`withAttribute` when - matching on a div class - made difficult because ``class`` is - a reserved word in Python. - - Example:: - - html = ''' - <div> - Some text - <div class="grid">1 4 0 1 0</div> - <div class="graph">1,3 2,3 1,1</div> - <div>this <div> has no class</div> - </div> - - ''' - div,div_end = makeHTMLTags("div") - div_grid = div().setParseAction(withClass("grid")) - - grid_expr = div_grid + SkipTo(div | div_end)("body") - for grid_header in grid_expr.searchString(html): - print(grid_header.body) - - div_any_type = div().setParseAction(withClass(withAttribute.ANY_VALUE)) - div_expr = div_any_type + SkipTo(div | div_end)("body") - for div_header in div_expr.searchString(html): - print(div_header.body) - - prints:: - - 1 4 0 1 0 - - 1 4 0 1 0 - 1,3 2,3 1,1 - """ - classattr = "%s:class" % namespace if namespace else "class" - return withAttribute(**{classattr : classname}) - -opAssoc = SimpleNamespace() -opAssoc.LEFT = object() -opAssoc.RIGHT = object() - -def infixNotation( baseExpr, opList, lpar=Suppress('('), rpar=Suppress(')') ): - """Helper method for constructing grammars of expressions made up of - operators working in a precedence hierarchy. Operators may be unary - or binary, left- or right-associative. Parse actions can also be - attached to operator expressions. The generated parser will also - recognize the use of parentheses to override operator precedences - (see example below). - - Note: if you define a deep operator list, you may see performance - issues when using infixNotation. See - :class:`ParserElement.enablePackrat` for a mechanism to potentially - improve your parser performance. - - Parameters: - - baseExpr - expression representing the most basic element for the - nested - - opList - list of tuples, one for each operator precedence level - in the expression grammar; each tuple is of the form ``(opExpr, - numTerms, rightLeftAssoc, parseAction)``, where: - - - opExpr is the pyparsing expression for the operator; may also - be a string, which will be converted to a Literal; if numTerms - is 3, opExpr is a tuple of two expressions, for the two - operators separating the 3 terms - - numTerms is the number of terms for this operator (must be 1, - 2, or 3) - - rightLeftAssoc is the indicator whether the operator is right - or left associative, using the pyparsing-defined constants - ``opAssoc.RIGHT`` and ``opAssoc.LEFT``. - - parseAction is the parse action to be associated with - expressions matching this operator expression (the parse action - tuple member may be omitted); if the parse action is passed - a tuple or list of functions, this is equivalent to calling - ``setParseAction(*fn)`` - (:class:`ParserElement.setParseAction`) - - lpar - expression for matching left-parentheses - (default= ``Suppress('(')``) - - rpar - expression for matching right-parentheses - (default= ``Suppress(')')``) - - Example:: - - # simple example of four-function arithmetic with ints and - # variable names - integer = pyparsing_common.signed_integer - varname = pyparsing_common.identifier - - arith_expr = infixNotation(integer | varname, - [ - ('-', 1, opAssoc.RIGHT), - (oneOf('* /'), 2, opAssoc.LEFT), - (oneOf('+ -'), 2, opAssoc.LEFT), - ]) - - arith_expr.runTests(''' - 5+3*6 - (5+3)*6 - -2--11 - ''', fullDump=False) - - prints:: - - 5+3*6 - [[5, '+', [3, '*', 6]]] - - (5+3)*6 - [[[5, '+', 3], '*', 6]] - - -2--11 - [[['-', 2], '-', ['-', 11]]] - """ - # captive version of FollowedBy that does not do parse actions or capture results names - class _FB(FollowedBy): - def parseImpl(self, instring, loc, doActions=True): - self.expr.tryParse(instring, loc) - return loc, [] - - ret = Forward() - lastExpr = baseExpr | ( lpar + ret + rpar ) - for i,operDef in enumerate(opList): - opExpr,arity,rightLeftAssoc,pa = (operDef + (None,))[:4] - termName = "%s term" % opExpr if arity < 3 else "%s%s term" % opExpr - if arity == 3: - if opExpr is None or len(opExpr) != 2: - raise ValueError( - "if numterms=3, opExpr must be a tuple or list of two expressions") - opExpr1, opExpr2 = opExpr - thisExpr = Forward().setName(termName) - if rightLeftAssoc == opAssoc.LEFT: - if arity == 1: - matchExpr = _FB(lastExpr + opExpr) + Group( lastExpr + OneOrMore( opExpr ) ) - elif arity == 2: - if opExpr is not None: - matchExpr = _FB(lastExpr + opExpr + lastExpr) + Group( lastExpr + OneOrMore( opExpr + lastExpr ) ) - else: - matchExpr = _FB(lastExpr+lastExpr) + Group( lastExpr + OneOrMore(lastExpr) ) - elif arity == 3: - matchExpr = _FB(lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr) + \ - Group( lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr ) - else: - raise ValueError("operator must be unary (1), binary (2), or ternary (3)") - elif rightLeftAssoc == opAssoc.RIGHT: - if arity == 1: - # try to avoid LR with this extra test - if not isinstance(opExpr, Optional): - opExpr = Optional(opExpr) - matchExpr = _FB(opExpr.expr + thisExpr) + Group( opExpr + thisExpr ) - elif arity == 2: - if opExpr is not None: - matchExpr = _FB(lastExpr + opExpr + thisExpr) + Group( lastExpr + OneOrMore( opExpr + thisExpr ) ) - else: - matchExpr = _FB(lastExpr + thisExpr) + Group( lastExpr + OneOrMore( thisExpr ) ) - elif arity == 3: - matchExpr = _FB(lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr) + \ - Group( lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr ) - else: - raise ValueError("operator must be unary (1), binary (2), or ternary (3)") - else: - raise ValueError("operator must indicate right or left associativity") - if pa: - if isinstance(pa, (tuple, list)): - matchExpr.setParseAction(*pa) - else: - matchExpr.setParseAction(pa) - thisExpr <<= ( matchExpr.setName(termName) | lastExpr ) - lastExpr = thisExpr - ret <<= lastExpr - return ret - -operatorPrecedence = infixNotation -"""(Deprecated) Former name of :class:`infixNotation`, will be -dropped in a future release.""" - -dblQuotedString = Combine(Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*')+'"').setName("string enclosed in double quotes") -sglQuotedString = Combine(Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*")+"'").setName("string enclosed in single quotes") -quotedString = Combine(Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*')+'"'| - Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*")+"'").setName("quotedString using single or double quotes") -unicodeString = Combine(_L('u') + quotedString.copy()).setName("unicode string literal") - -def nestedExpr(opener="(", closer=")", content=None, ignoreExpr=quotedString.copy()): - """Helper method for defining nested lists enclosed in opening and - closing delimiters ("(" and ")" are the default). - - Parameters: - - opener - opening character for a nested list - (default= ``"("``); can also be a pyparsing expression - - closer - closing character for a nested list - (default= ``")"``); can also be a pyparsing expression - - content - expression for items within the nested lists - (default= ``None``) - - ignoreExpr - expression for ignoring opening and closing - delimiters (default= :class:`quotedString`) - - If an expression is not provided for the content argument, the - nested expression will capture all whitespace-delimited content - between delimiters as a list of separate values. - - Use the ``ignoreExpr`` argument to define expressions that may - contain opening or closing characters that should not be treated as - opening or closing characters for nesting, such as quotedString or - a comment expression. Specify multiple expressions using an - :class:`Or` or :class:`MatchFirst`. The default is - :class:`quotedString`, but if no expressions are to be ignored, then - pass ``None`` for this argument. - - Example:: - - data_type = oneOf("void int short long char float double") - decl_data_type = Combine(data_type + Optional(Word('*'))) - ident = Word(alphas+'_', alphanums+'_') - number = pyparsing_common.number - arg = Group(decl_data_type + ident) - LPAR,RPAR = map(Suppress, "()") - - code_body = nestedExpr('{', '}', ignoreExpr=(quotedString | cStyleComment)) - - c_function = (decl_data_type("type") - + ident("name") - + LPAR + Optional(delimitedList(arg), [])("args") + RPAR - + code_body("body")) - c_function.ignore(cStyleComment) - - source_code = ''' - int is_odd(int x) { - return (x%2); - } - - int dec_to_hex(char hchar) { - if (hchar >= '0' && hchar <= '9') { - return (ord(hchar)-ord('0')); - } else { - return (10+ord(hchar)-ord('A')); - } - } - ''' - for func in c_function.searchString(source_code): - print("%(name)s (%(type)s) args: %(args)s" % func) - - - prints:: - - is_odd (int) args: [['int', 'x']] - dec_to_hex (int) args: [['char', 'hchar']] - """ - if opener == closer: - raise ValueError("opening and closing strings cannot be the same") - if content is None: - if isinstance(opener,basestring) and isinstance(closer,basestring): - if len(opener) == 1 and len(closer)==1: - if ignoreExpr is not None: - content = (Combine(OneOrMore(~ignoreExpr + - CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS,exact=1)) - ).setParseAction(lambda t:t[0].strip())) - else: - content = (empty.copy()+CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS - ).setParseAction(lambda t:t[0].strip())) - else: - if ignoreExpr is not None: - content = (Combine(OneOrMore(~ignoreExpr + - ~Literal(opener) + ~Literal(closer) + - CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1)) - ).setParseAction(lambda t:t[0].strip())) - else: - content = (Combine(OneOrMore(~Literal(opener) + ~Literal(closer) + - CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1)) - ).setParseAction(lambda t:t[0].strip())) - else: - raise ValueError("opening and closing arguments must be strings if no content expression is given") - ret = Forward() - if ignoreExpr is not None: - ret <<= Group( Suppress(opener) + ZeroOrMore( ignoreExpr | ret | content ) + Suppress(closer) ) - else: - ret <<= Group( Suppress(opener) + ZeroOrMore( ret | content ) + Suppress(closer) ) - ret.setName('nested %s%s expression' % (opener,closer)) - return ret - -def indentedBlock(blockStatementExpr, indentStack, indent=True): - """Helper method for defining space-delimited indentation blocks, - such as those used to define block statements in Python source code. - - Parameters: - - - blockStatementExpr - expression defining syntax of statement that - is repeated within the indented block - - indentStack - list created by caller to manage indentation stack - (multiple statementWithIndentedBlock expressions within a single - grammar should share a common indentStack) - - indent - boolean indicating whether block must be indented beyond - the the current level; set to False for block of left-most - statements (default= ``True``) - - A valid block must contain at least one ``blockStatement``. - - Example:: - - data = ''' - def A(z): - A1 - B = 100 - G = A2 - A2 - A3 - B - def BB(a,b,c): - BB1 - def BBA(): - bba1 - bba2 - bba3 - C - D - def spam(x,y): - def eggs(z): - pass - ''' - - - indentStack = [1] - stmt = Forward() - - identifier = Word(alphas, alphanums) - funcDecl = ("def" + identifier + Group( "(" + Optional( delimitedList(identifier) ) + ")" ) + ":") - func_body = indentedBlock(stmt, indentStack) - funcDef = Group( funcDecl + func_body ) - - rvalue = Forward() - funcCall = Group(identifier + "(" + Optional(delimitedList(rvalue)) + ")") - rvalue << (funcCall | identifier | Word(nums)) - assignment = Group(identifier + "=" + rvalue) - stmt << ( funcDef | assignment | identifier ) - - module_body = OneOrMore(stmt) - - parseTree = module_body.parseString(data) - parseTree.pprint() - - prints:: - - [['def', - 'A', - ['(', 'z', ')'], - ':', - [['A1'], [['B', '=', '100']], [['G', '=', 'A2']], ['A2'], ['A3']]], - 'B', - ['def', - 'BB', - ['(', 'a', 'b', 'c', ')'], - ':', - [['BB1'], [['def', 'BBA', ['(', ')'], ':', [['bba1'], ['bba2'], ['bba3']]]]]], - 'C', - 'D', - ['def', - 'spam', - ['(', 'x', 'y', ')'], - ':', - [[['def', 'eggs', ['(', 'z', ')'], ':', [['pass']]]]]]] - """ - backup_stack = indentStack[:] - - def reset_stack(): - indentStack[:] = backup_stack - - def checkPeerIndent(s,l,t): - if l >= len(s): return - curCol = col(l,s) - if curCol != indentStack[-1]: - if curCol > indentStack[-1]: - raise ParseException(s,l,"illegal nesting") - raise ParseException(s,l,"not a peer entry") - - def checkSubIndent(s,l,t): - curCol = col(l,s) - if curCol > indentStack[-1]: - indentStack.append( curCol ) - else: - raise ParseException(s,l,"not a subentry") - - def checkUnindent(s,l,t): - if l >= len(s): return - curCol = col(l,s) - if not(indentStack and curCol < indentStack[-1] and curCol <= indentStack[-2]): - raise ParseException(s,l,"not an unindent") - indentStack.pop() - - NL = OneOrMore(LineEnd().setWhitespaceChars("\t ").suppress()) - INDENT = (Empty() + Empty().setParseAction(checkSubIndent)).setName('INDENT') - PEER = Empty().setParseAction(checkPeerIndent).setName('') - UNDENT = Empty().setParseAction(checkUnindent).setName('UNINDENT') - if indent: - smExpr = Group( Optional(NL) + - #~ FollowedBy(blockStatementExpr) + - INDENT + (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) + UNDENT) - else: - smExpr = Group( Optional(NL) + - (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) ) - smExpr.setFailAction(lambda a, b, c, d: reset_stack()) - blockStatementExpr.ignore(_bslash + LineEnd()) - return smExpr.setName('indented block') - -alphas8bit = srange(r"[\0xc0-\0xd6\0xd8-\0xf6\0xf8-\0xff]") -punc8bit = srange(r"[\0xa1-\0xbf\0xd7\0xf7]") - -anyOpenTag,anyCloseTag = makeHTMLTags(Word(alphas,alphanums+"_:").setName('any tag')) -_htmlEntityMap = dict(zip("gt lt amp nbsp quot apos".split(),'><& "\'')) -commonHTMLEntity = Regex('&(?P<entity>' + '|'.join(_htmlEntityMap.keys()) +");").setName("common HTML entity") -def replaceHTMLEntity(t): - """Helper parser action to replace common HTML entities with their special characters""" - return _htmlEntityMap.get(t.entity) - -# it's easy to get these comment structures wrong - they're very common, so may as well make them available -cStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/').setName("C style comment") -"Comment of the form ``/* ... */``" - -htmlComment = Regex(r"<!--[\s\S]*?-->").setName("HTML comment") -"Comment of the form ``<!-- ... -->``" - -restOfLine = Regex(r".*").leaveWhitespace().setName("rest of line") -dblSlashComment = Regex(r"//(?:\\\n|[^\n])*").setName("// comment") -"Comment of the form ``// ... (to end of line)``" - -cppStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/'| dblSlashComment).setName("C++ style comment") -"Comment of either form :class:`cStyleComment` or :class:`dblSlashComment`" - -javaStyleComment = cppStyleComment -"Same as :class:`cppStyleComment`" - -pythonStyleComment = Regex(r"#.*").setName("Python style comment") -"Comment of the form ``# ... (to end of line)``" - -_commasepitem = Combine(OneOrMore(Word(printables, excludeChars=',') + - Optional( Word(" \t") + - ~Literal(",") + ~LineEnd() ) ) ).streamline().setName("commaItem") -commaSeparatedList = delimitedList( Optional( quotedString.copy() | _commasepitem, default="") ).setName("commaSeparatedList") -"""(Deprecated) Predefined expression of 1 or more printable words or -quoted strings, separated by commas. - -This expression is deprecated in favor of :class:`pyparsing_common.comma_separated_list`. -""" - -# some other useful expressions - using lower-case class name since we are really using this as a namespace -class pyparsing_common: - """Here are some common low-level expressions that may be useful in - jump-starting parser development: - - - numeric forms (:class:`integers<integer>`, :class:`reals<real>`, - :class:`scientific notation<sci_real>`) - - common :class:`programming identifiers<identifier>` - - network addresses (:class:`MAC<mac_address>`, - :class:`IPv4<ipv4_address>`, :class:`IPv6<ipv6_address>`) - - ISO8601 :class:`dates<iso8601_date>` and - :class:`datetime<iso8601_datetime>` - - :class:`UUID<uuid>` - - :class:`comma-separated list<comma_separated_list>` - - Parse actions: - - - :class:`convertToInteger` - - :class:`convertToFloat` - - :class:`convertToDate` - - :class:`convertToDatetime` - - :class:`stripHTMLTags` - - :class:`upcaseTokens` - - :class:`downcaseTokens` - - Example:: - - pyparsing_common.number.runTests(''' - # any int or real number, returned as the appropriate type - 100 - -100 - +100 - 3.14159 - 6.02e23 - 1e-12 - ''') - - pyparsing_common.fnumber.runTests(''' - # any int or real number, returned as float - 100 - -100 - +100 - 3.14159 - 6.02e23 - 1e-12 - ''') - - pyparsing_common.hex_integer.runTests(''' - # hex numbers - 100 - FF - ''') - - pyparsing_common.fraction.runTests(''' - # fractions - 1/2 - -3/4 - ''') - - pyparsing_common.mixed_integer.runTests(''' - # mixed fractions - 1 - 1/2 - -3/4 - 1-3/4 - ''') - - import uuid - pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID)) - pyparsing_common.uuid.runTests(''' - # uuid - 12345678-1234-5678-1234-567812345678 - ''') - - prints:: - - # any int or real number, returned as the appropriate type - 100 - [100] - - -100 - [-100] - - +100 - [100] - - 3.14159 - [3.14159] - - 6.02e23 - [6.02e+23] - - 1e-12 - [1e-12] - - # any int or real number, returned as float - 100 - [100.0] - - -100 - [-100.0] - - +100 - [100.0] - - 3.14159 - [3.14159] - - 6.02e23 - [6.02e+23] - - 1e-12 - [1e-12] - - # hex numbers - 100 - [256] - - FF - [255] - - # fractions - 1/2 - [0.5] - - -3/4 - [-0.75] - - # mixed fractions - 1 - [1] - - 1/2 - [0.5] - - -3/4 - [-0.75] - - 1-3/4 - [1.75] - - # uuid - 12345678-1234-5678-1234-567812345678 - [UUID('12345678-1234-5678-1234-567812345678')] - """ - - convertToInteger = tokenMap(int) - """ - Parse action for converting parsed integers to Python int - """ - - convertToFloat = tokenMap(float) - """ - Parse action for converting parsed numbers to Python float - """ - - integer = Word(nums).setName("integer").setParseAction(convertToInteger) - """expression that parses an unsigned integer, returns an int""" - - hex_integer = Word(hexnums).setName("hex integer").setParseAction(tokenMap(int,16)) - """expression that parses a hexadecimal integer, returns an int""" - - signed_integer = Regex(r'[+-]?\d+').setName("signed integer").setParseAction(convertToInteger) - """expression that parses an integer with optional leading sign, returns an int""" - - fraction = (signed_integer().setParseAction(convertToFloat) + '/' + signed_integer().setParseAction(convertToFloat)).setName("fraction") - """fractional expression of an integer divided by an integer, returns a float""" - fraction.addParseAction(lambda t: t[0]/t[-1]) - - mixed_integer = (fraction | signed_integer + Optional(Optional('-').suppress() + fraction)).setName("fraction or mixed integer-fraction") - """mixed integer of the form 'integer - fraction', with optional leading integer, returns float""" - mixed_integer.addParseAction(sum) - - real = Regex(r'[+-]?\d+\.\d*').setName("real number").setParseAction(convertToFloat) - """expression that parses a floating point number and returns a float""" - - sci_real = Regex(r'[+-]?\d+([eE][+-]?\d+|\.\d*([eE][+-]?\d+)?)').setName("real number with scientific notation").setParseAction(convertToFloat) - """expression that parses a floating point number with optional - scientific notation and returns a float""" - - # streamlining this expression makes the docs nicer-looking - number = (sci_real | real | signed_integer).streamline() - """any numeric expression, returns the corresponding Python type""" - - fnumber = Regex(r'[+-]?\d+\.?\d*([eE][+-]?\d+)?').setName("fnumber").setParseAction(convertToFloat) - """any int or real number, returned as float""" - - identifier = Word(alphas+'_', alphanums+'_').setName("identifier") - """typical code identifier (leading alpha or '_', followed by 0 or more alphas, nums, or '_')""" - - ipv4_address = Regex(r'(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})(\.(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})){3}').setName("IPv4 address") - "IPv4 address (``0.0.0.0 - 255.255.255.255``)" - - _ipv6_part = Regex(r'[0-9a-fA-F]{1,4}').setName("hex_integer") - _full_ipv6_address = (_ipv6_part + (':' + _ipv6_part)*7).setName("full IPv6 address") - _short_ipv6_address = (Optional(_ipv6_part + (':' + _ipv6_part)*(0,6)) + "::" + Optional(_ipv6_part + (':' + _ipv6_part)*(0,6))).setName("short IPv6 address") - _short_ipv6_address.addCondition(lambda t: sum(1 for tt in t if pyparsing_common._ipv6_part.matches(tt)) < 8) - _mixed_ipv6_address = ("::ffff:" + ipv4_address).setName("mixed IPv6 address") - ipv6_address = Combine((_full_ipv6_address | _mixed_ipv6_address | _short_ipv6_address).setName("IPv6 address")).setName("IPv6 address") - "IPv6 address (long, short, or mixed form)" - - mac_address = Regex(r'[0-9a-fA-F]{2}([:.-])[0-9a-fA-F]{2}(?:\1[0-9a-fA-F]{2}){4}').setName("MAC address") - "MAC address xx:xx:xx:xx:xx (may also have '-' or '.' delimiters)" - - @staticmethod - def convertToDate(fmt="%Y-%m-%d"): - """ - Helper to create a parse action for converting parsed date string to Python datetime.date - - Params - - - fmt - format to be passed to datetime.strptime (default= ``"%Y-%m-%d"``) - - Example:: - - date_expr = pyparsing_common.iso8601_date.copy() - date_expr.setParseAction(pyparsing_common.convertToDate()) - print(date_expr.parseString("1999-12-31")) - - prints:: - - [datetime.date(1999, 12, 31)] - """ - def cvt_fn(s,l,t): - try: - return datetime.strptime(t[0], fmt).date() - except ValueError as ve: - raise ParseException(s, l, str(ve)) - return cvt_fn - - @staticmethod - def convertToDatetime(fmt="%Y-%m-%dT%H:%M:%S.%f"): - """Helper to create a parse action for converting parsed - datetime string to Python datetime.datetime - - Params - - - fmt - format to be passed to datetime.strptime (default= ``"%Y-%m-%dT%H:%M:%S.%f"``) - - Example:: - - dt_expr = pyparsing_common.iso8601_datetime.copy() - dt_expr.setParseAction(pyparsing_common.convertToDatetime()) - print(dt_expr.parseString("1999-12-31T23:59:59.999")) - - prints:: - - [datetime.datetime(1999, 12, 31, 23, 59, 59, 999000)] - """ - def cvt_fn(s,l,t): - try: - return datetime.strptime(t[0], fmt) - except ValueError as ve: - raise ParseException(s, l, str(ve)) - return cvt_fn - - iso8601_date = Regex(r'(?P<year>\d{4})(?:-(?P<month>\d\d)(?:-(?P<day>\d\d))?)?').setName("ISO8601 date") - "ISO8601 date (``yyyy-mm-dd``)" - - iso8601_datetime = Regex(r'(?P<year>\d{4})-(?P<month>\d\d)-(?P<day>\d\d)[T ](?P<hour>\d\d):(?P<minute>\d\d)(:(?P<second>\d\d(\.\d*)?)?)?(?P<tz>Z|[+-]\d\d:?\d\d)?').setName("ISO8601 datetime") - "ISO8601 datetime (``yyyy-mm-ddThh:mm:ss.s(Z|+-00:00)``) - trailing seconds, milliseconds, and timezone optional; accepts separating ``'T'`` or ``' '``" - - uuid = Regex(r'[0-9a-fA-F]{8}(-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}').setName("UUID") - "UUID (``xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx``)" - - _html_stripper = anyOpenTag.suppress() | anyCloseTag.suppress() - @staticmethod - def stripHTMLTags(s, l, tokens): - """Parse action to remove HTML tags from web page HTML source - - Example:: - - # strip HTML links from normal text - text = '<td>More info at the <a href="https://github.com/pyparsing/pyparsing/wiki">pyparsing</a> wiki page</td>' - td,td_end = makeHTMLTags("TD") - table_text = td + SkipTo(td_end).setParseAction(pyparsing_common.stripHTMLTags)("body") + td_end - print(table_text.parseString(text).body) - - Prints:: - - More info at the pyparsing wiki page - """ - return pyparsing_common._html_stripper.transformString(tokens[0]) - - _commasepitem = Combine(OneOrMore(~Literal(",") + ~LineEnd() + Word(printables, excludeChars=',') - + Optional( White(" \t") ) ) ).streamline().setName("commaItem") - comma_separated_list = delimitedList( Optional( quotedString.copy() | _commasepitem, default="") ).setName("comma separated list") - """Predefined expression of 1 or more printable words or quoted strings, separated by commas.""" - - upcaseTokens = staticmethod(tokenMap(lambda t: _ustr(t).upper())) - """Parse action to convert tokens to upper case.""" - - downcaseTokens = staticmethod(tokenMap(lambda t: _ustr(t).lower())) - """Parse action to convert tokens to lower case.""" - - -class _lazyclassproperty(object): - def __init__(self, fn): - self.fn = fn - self.__doc__ = fn.__doc__ - self.__name__ = fn.__name__ - - def __get__(self, obj, cls): - if cls is None: - cls = type(obj) - if not hasattr(cls, '_intern') or any(cls._intern is getattr(superclass, '_intern', []) for superclass in cls.__mro__[1:]): - cls._intern = {} - attrname = self.fn.__name__ - if attrname not in cls._intern: - cls._intern[attrname] = self.fn(cls) - return cls._intern[attrname] - - -class unicode_set(object): - """ - A set of Unicode characters, for language-specific strings for - ``alphas``, ``nums``, ``alphanums``, and ``printables``. - A unicode_set is defined by a list of ranges in the Unicode character - set, in a class attribute ``_ranges``, such as:: - - _ranges = [(0x0020, 0x007e), (0x00a0, 0x00ff),] - - A unicode set can also be defined using multiple inheritance of other unicode sets:: - - class CJK(Chinese, Japanese, Korean): - pass - """ - _ranges = [] - - @classmethod - def _get_chars_for_ranges(cls): - ret = [] - for cc in cls.__mro__: - if cc is unicode_set: - break - for rr in cc._ranges: - ret.extend(range(rr[0], rr[-1]+1)) - return [unichr(c) for c in sorted(set(ret))] - - @_lazyclassproperty - def printables(cls): - "all non-whitespace characters in this range" - return u''.join(filterfalse(unicode.isspace, cls._get_chars_for_ranges())) - - @_lazyclassproperty - def alphas(cls): - "all alphabetic characters in this range" - return u''.join(filter(unicode.isalpha, cls._get_chars_for_ranges())) - - @_lazyclassproperty - def nums(cls): - "all numeric digit characters in this range" - return u''.join(filter(unicode.isdigit, cls._get_chars_for_ranges())) - - @_lazyclassproperty - def alphanums(cls): - "all alphanumeric characters in this range" - return cls.alphas + cls.nums - - -class pyparsing_unicode(unicode_set): - """ - A namespace class for defining common language unicode_sets. - """ - _ranges = [(32, sys.maxunicode)] - - class Latin1(unicode_set): - "Unicode set for Latin-1 Unicode Character Range" - _ranges = [(0x0020, 0x007e), (0x00a0, 0x00ff),] - - class LatinA(unicode_set): - "Unicode set for Latin-A Unicode Character Range" - _ranges = [(0x0100, 0x017f),] - - class LatinB(unicode_set): - "Unicode set for Latin-B Unicode Character Range" - _ranges = [(0x0180, 0x024f),] - - class Greek(unicode_set): - "Unicode set for Greek Unicode Character Ranges" - _ranges = [ - (0x0370, 0x03ff), (0x1f00, 0x1f15), (0x1f18, 0x1f1d), (0x1f20, 0x1f45), (0x1f48, 0x1f4d), - (0x1f50, 0x1f57), (0x1f59,), (0x1f5b,), (0x1f5d,), (0x1f5f, 0x1f7d), (0x1f80, 0x1fb4), (0x1fb6, 0x1fc4), - (0x1fc6, 0x1fd3), (0x1fd6, 0x1fdb), (0x1fdd, 0x1fef), (0x1ff2, 0x1ff4), (0x1ff6, 0x1ffe), - ] - - class Cyrillic(unicode_set): - "Unicode set for Cyrillic Unicode Character Range" - _ranges = [(0x0400, 0x04ff)] - - class Chinese(unicode_set): - "Unicode set for Chinese Unicode Character Range" - _ranges = [(0x4e00, 0x9fff), (0x3000, 0x303f), ] - - class Japanese(unicode_set): - "Unicode set for Japanese Unicode Character Range, combining Kanji, Hiragana, and Katakana ranges" - _ranges = [ ] - - class Kanji(unicode_set): - "Unicode set for Kanji Unicode Character Range" - _ranges = [(0x4E00, 0x9Fbf), (0x3000, 0x303f), ] - - class Hiragana(unicode_set): - "Unicode set for Hiragana Unicode Character Range" - _ranges = [(0x3040, 0x309f), ] - - class Katakana(unicode_set): - "Unicode set for Katakana Unicode Character Range" - _ranges = [(0x30a0, 0x30ff), ] - - class Korean(unicode_set): - "Unicode set for Korean Unicode Character Range" - _ranges = [(0xac00, 0xd7af), (0x1100, 0x11ff), (0x3130, 0x318f), (0xa960, 0xa97f), (0xd7b0, 0xd7ff), (0x3000, 0x303f), ] - - class CJK(Chinese, Japanese, Korean): - "Unicode set for combined Chinese, Japanese, and Korean (CJK) Unicode Character Range" - pass - - class Thai(unicode_set): - "Unicode set for Thai Unicode Character Range" - _ranges = [(0x0e01, 0x0e3a), (0x0e3f, 0x0e5b), ] - - class Arabic(unicode_set): - "Unicode set for Arabic Unicode Character Range" - _ranges = [(0x0600, 0x061b), (0x061e, 0x06ff), (0x0700, 0x077f), ] - - class Hebrew(unicode_set): - "Unicode set for Hebrew Unicode Character Range" - _ranges = [(0x0590, 0x05ff), ] - - class Devanagari(unicode_set): - "Unicode set for Devanagari Unicode Character Range" - _ranges = [(0x0900, 0x097f), (0xa8e0, 0xa8ff)] - -pyparsing_unicode.Japanese._ranges = (pyparsing_unicode.Japanese.Kanji._ranges - + pyparsing_unicode.Japanese.Hiragana._ranges - + pyparsing_unicode.Japanese.Katakana._ranges) - -# define ranges in language character sets -if PY_3: - setattr(pyparsing_unicode, "العربية", pyparsing_unicode.Arabic) - setattr(pyparsing_unicode, "中文", pyparsing_unicode.Chinese) - setattr(pyparsing_unicode, "кириллица", pyparsing_unicode.Cyrillic) - setattr(pyparsing_unicode, "Ελληνικά", pyparsing_unicode.Greek) - setattr(pyparsing_unicode, "עִברִית", pyparsing_unicode.Hebrew) - setattr(pyparsing_unicode, "日本語", pyparsing_unicode.Japanese) - setattr(pyparsing_unicode.Japanese, "漢字", pyparsing_unicode.Japanese.Kanji) - setattr(pyparsing_unicode.Japanese, "カタカナ", pyparsing_unicode.Japanese.Katakana) - setattr(pyparsing_unicode.Japanese, "ひらがな", pyparsing_unicode.Japanese.Hiragana) - setattr(pyparsing_unicode, "한국어", pyparsing_unicode.Korean) - setattr(pyparsing_unicode, "ไทย", pyparsing_unicode.Thai) - setattr(pyparsing_unicode, "देवनागरी", pyparsing_unicode.Devanagari) - - -if __name__ == "__main__": - - selectToken = CaselessLiteral("select") - fromToken = CaselessLiteral("from") - - ident = Word(alphas, alphanums + "_$") - - columnName = delimitedList(ident, ".", combine=True).setParseAction(upcaseTokens) - columnNameList = Group(delimitedList(columnName)).setName("columns") - columnSpec = ('*' | columnNameList) - - tableName = delimitedList(ident, ".", combine=True).setParseAction(upcaseTokens) - tableNameList = Group(delimitedList(tableName)).setName("tables") - - simpleSQL = selectToken("command") + columnSpec("columns") + fromToken + tableNameList("tables") - - # demo runTests method, including embedded comments in test string - simpleSQL.runTests(""" - # '*' as column list and dotted table name - select * from SYS.XYZZY - - # caseless match on "SELECT", and casts back to "select" - SELECT * from XYZZY, ABC - - # list of column names, and mixed case SELECT keyword - Select AA,BB,CC from Sys.dual - - # multiple tables - Select A, B, C from Sys.dual, Table2 - - # invalid SELECT keyword - should fail - Xelect A, B, C from Sys.dual - - # incomplete command - should fail - Select - - # invalid column name - should fail - Select ^^^ frox Sys.dual - - """) - - pyparsing_common.number.runTests(""" - 100 - -100 - +100 - 3.14159 - 6.02e23 - 1e-12 - """) - - # any int or real number, returned as float - pyparsing_common.fnumber.runTests(""" - 100 - -100 - +100 - 3.14159 - 6.02e23 - 1e-12 - """) - - pyparsing_common.hex_integer.runTests(""" - 100 - FF - """) - - import uuid - pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID)) - pyparsing_common.uuid.runTests(""" - 12345678-1234-5678-1234-567812345678 - """) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pyparsing.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/pyparsing.pyc deleted file mode 100644 index fc14a8be3f3f372a4b06532ab6b40f854cc2fc05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 277107 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 v8D;~#n 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 B>umr4 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pytoml/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/pytoml/__init__.py deleted file mode 100644 index 8ed060f..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/pytoml/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -from .core import TomlError -from .parser import load, loads -from .test import translate_to_test -from .writer import dump, dumps \ No newline at end of file diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pytoml/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/pytoml/__init__.pyc deleted file mode 100644 index 0c605a63e53d1203a3d93cb745abff850246696b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 448 zcmYjN+e!m55S?_lwJj+1#cx=Unii!fi1^Y+rL28gkgztf1e47=Nw05yvp?XZ7d2!~ z=1gYhOp<(`b}zrqUT1Jv4LTpm{DeT#W?%p;gMtBzyaA>GHi04mn?jN9qY0QM*cKG6 zJx{@$fNew32HSz6L(wL@WG!l{89^2ybO@%-nlYloEJ}xzz_?O|=E3p%)bn_WW#vs7 zln71)<-=czT-bV75*`1Xb&tJf4pmMBLe#EH^a}GRp8v|lPI+=nS)mS;66eU{3>n!! z@D)*Bqh8V+d|4uYcSb7oe7okGYkaF#AH&gSH5lQ|Xm;z@cXEpZTJxGud9CZdu6!ts w>4)LdTufqUXJV-;>5$i(KtIBT(3K8CToG@R<h^xrVbnt$-N&c&*ahpcA1TgW*Z=?k diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pytoml/core.py b/venv/lib/python2.7/site-packages/pip/_vendor/pytoml/core.py deleted file mode 100644 index c182734..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/pytoml/core.py +++ /dev/null @@ -1,13 +0,0 @@ -class TomlError(RuntimeError): - def __init__(self, message, line, col, filename): - RuntimeError.__init__(self, message, line, col, filename) - self.message = message - self.line = line - self.col = col - self.filename = filename - - def __str__(self): - return '{}({}, {}): {}'.format(self.filename, self.line, self.col, self.message) - - def __repr__(self): - return 'TomlError({!r}, {!r}, {!r}, {!r})'.format(self.message, self.line, self.col, self.filename) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pytoml/core.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/pytoml/core.pyc deleted file mode 100644 index 701e107745a8ad5190fb9801084886b95fb8a1c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1400 zcmc(fO>fgc5QfLG(>4|K4yU$UTtRUwP*hNbpok+8+V(;uv@-TOvhf$Y+t4)0p(_8F zKfpWds361*i8!9g?Ck7#_Sv!hANRK(-|T!!Xm$Dce+@AYp;976lzEhT^quII=;IiJ z9-W6AX9rLhO;x_ry3uzjJb2F_<`ERu^Ah6q<K8OK*ykkd2}pFgl0Jf2HXv^y<_(l3 zDm+>cEued}@M#gyZJ#_I6G^ym!@vY?7y(DH(dUPrhg{4k<fQf<l(?*IUMW|w-GW2P zyw0tZb`yh2852*G4Pcjftt{^{X-XHF<)y0QN`+jd3o)w91cwM-AlNVXNg<?DrhpZ- zI-kZ?MblVESyQG;o9Ox~nmyB>>u+C<hhOWXp?*G0PR!Md^jaU`nzYeH)aLDBUK<;i z<)J-(Kan5U<wQ<Zoi;jZXBPaUq|xeWI}<%Tj>T+4k@vtGxL?8)Shz$7cOM2073G0d zhq!Pg3x}})<pA_J*U0QZ&zIqR`DAy#Ja`G!G2p#sjjm$rw*4CghT_l*#=15h?og#P zR!hmfYIr~7{UeS&<hbklaK5LR%OCo{5fa>Cf9()Hj5V|Ax?ignaQM|&!Rd~+o8)%K ztHI4AW!0pYC5Eoa1mhGu@#}D%^}jnF6}Zke+>9IEU~}M)T-yqVn5WlUq5F26cJN+t IO@?dw35a?+761SM diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pytoml/parser.py b/venv/lib/python2.7/site-packages/pip/_vendor/pytoml/parser.py deleted file mode 100644 index 3493aa6..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/pytoml/parser.py +++ /dev/null @@ -1,341 +0,0 @@ -import string, re, sys, datetime -from .core import TomlError -from .utils import rfc3339_re, parse_rfc3339_re - -if sys.version_info[0] == 2: - _chr = unichr -else: - _chr = chr - -def load(fin, translate=lambda t, x, v: v, object_pairs_hook=dict): - return loads(fin.read(), translate=translate, object_pairs_hook=object_pairs_hook, filename=getattr(fin, 'name', repr(fin))) - -def loads(s, filename='<string>', translate=lambda t, x, v: v, object_pairs_hook=dict): - if isinstance(s, bytes): - s = s.decode('utf-8') - - s = s.replace('\r\n', '\n') - - root = object_pairs_hook() - tables = object_pairs_hook() - scope = root - - src = _Source(s, filename=filename) - ast = _p_toml(src, object_pairs_hook=object_pairs_hook) - - def error(msg): - raise TomlError(msg, pos[0], pos[1], filename) - - def process_value(v, object_pairs_hook): - kind, text, value, pos = v - if kind == 'str' and value.startswith('\n'): - value = value[1:] - if kind == 'array': - if value and any(k != value[0][0] for k, t, v, p in value[1:]): - error('array-type-mismatch') - value = [process_value(item, object_pairs_hook=object_pairs_hook) for item in value] - elif kind == 'table': - value = object_pairs_hook([(k, process_value(value[k], object_pairs_hook=object_pairs_hook)) for k in value]) - return translate(kind, text, value) - - for kind, value, pos in ast: - if kind == 'kv': - k, v = value - if k in scope: - error('duplicate_keys. Key "{0}" was used more than once.'.format(k)) - scope[k] = process_value(v, object_pairs_hook=object_pairs_hook) - else: - is_table_array = (kind == 'table_array') - cur = tables - for name in value[:-1]: - if isinstance(cur.get(name), list): - d, cur = cur[name][-1] - else: - d, cur = cur.setdefault(name, (None, object_pairs_hook())) - - scope = object_pairs_hook() - name = value[-1] - if name not in cur: - if is_table_array: - cur[name] = [(scope, object_pairs_hook())] - else: - cur[name] = (scope, object_pairs_hook()) - elif isinstance(cur[name], list): - if not is_table_array: - error('table_type_mismatch') - cur[name].append((scope, object_pairs_hook())) - else: - if is_table_array: - error('table_type_mismatch') - old_scope, next_table = cur[name] - if old_scope is not None: - error('duplicate_tables') - cur[name] = (scope, next_table) - - def merge_tables(scope, tables): - if scope is None: - scope = object_pairs_hook() - for k in tables: - if k in scope: - error('key_table_conflict') - v = tables[k] - if isinstance(v, list): - scope[k] = [merge_tables(sc, tbl) for sc, tbl in v] - else: - scope[k] = merge_tables(v[0], v[1]) - return scope - - return merge_tables(root, tables) - -class _Source: - def __init__(self, s, filename=None): - self.s = s - self._pos = (1, 1) - self._last = None - self._filename = filename - self.backtrack_stack = [] - - def last(self): - return self._last - - def pos(self): - return self._pos - - def fail(self): - return self._expect(None) - - def consume_dot(self): - if self.s: - self._last = self.s[0] - self.s = self[1:] - self._advance(self._last) - return self._last - return None - - def expect_dot(self): - return self._expect(self.consume_dot()) - - def consume_eof(self): - if not self.s: - self._last = '' - return True - return False - - def expect_eof(self): - return self._expect(self.consume_eof()) - - def consume(self, s): - if self.s.startswith(s): - self.s = self.s[len(s):] - self._last = s - self._advance(s) - return True - return False - - def expect(self, s): - return self._expect(self.consume(s)) - - def consume_re(self, re): - m = re.match(self.s) - if m: - self.s = self.s[len(m.group(0)):] - self._last = m - self._advance(m.group(0)) - return m - return None - - def expect_re(self, re): - return self._expect(self.consume_re(re)) - - def __enter__(self): - self.backtrack_stack.append((self.s, self._pos)) - - def __exit__(self, type, value, traceback): - if type is None: - self.backtrack_stack.pop() - else: - self.s, self._pos = self.backtrack_stack.pop() - return type == TomlError - - def commit(self): - self.backtrack_stack[-1] = (self.s, self._pos) - - def _expect(self, r): - if not r: - raise TomlError('msg', self._pos[0], self._pos[1], self._filename) - return r - - def _advance(self, s): - suffix_pos = s.rfind('\n') - if suffix_pos == -1: - self._pos = (self._pos[0], self._pos[1] + len(s)) - else: - self._pos = (self._pos[0] + s.count('\n'), len(s) - suffix_pos) - -_ews_re = re.compile(r'(?:[ \t]|#[^\n]*\n|#[^\n]*\Z|\n)*') -def _p_ews(s): - s.expect_re(_ews_re) - -_ws_re = re.compile(r'[ \t]*') -def _p_ws(s): - s.expect_re(_ws_re) - -_escapes = { 'b': '\b', 'n': '\n', 'r': '\r', 't': '\t', '"': '"', - '\\': '\\', 'f': '\f' } - -_basicstr_re = re.compile(r'[^"\\\000-\037]*') -_short_uni_re = re.compile(r'u([0-9a-fA-F]{4})') -_long_uni_re = re.compile(r'U([0-9a-fA-F]{8})') -_escapes_re = re.compile(r'[btnfr\"\\]') -_newline_esc_re = re.compile('\n[ \t\n]*') -def _p_basicstr_content(s, content=_basicstr_re): - res = [] - while True: - res.append(s.expect_re(content).group(0)) - if not s.consume('\\'): - break - if s.consume_re(_newline_esc_re): - pass - elif s.consume_re(_short_uni_re) or s.consume_re(_long_uni_re): - v = int(s.last().group(1), 16) - if 0xd800 <= v < 0xe000: - s.fail() - res.append(_chr(v)) - else: - s.expect_re(_escapes_re) - res.append(_escapes[s.last().group(0)]) - return ''.join(res) - -_key_re = re.compile(r'[0-9a-zA-Z-_]+') -def _p_key(s): - with s: - s.expect('"') - r = _p_basicstr_content(s, _basicstr_re) - s.expect('"') - return r - if s.consume('\''): - if s.consume('\'\''): - r = s.expect_re(_litstr_ml_re).group(0) - s.expect('\'\'\'') - else: - r = s.expect_re(_litstr_re).group(0) - s.expect('\'') - return r - return s.expect_re(_key_re).group(0) - -_float_re = re.compile(r'[+-]?(?:0|[1-9](?:_?\d)*)(?:\.\d(?:_?\d)*)?(?:[eE][+-]?(?:\d(?:_?\d)*))?') - -_basicstr_ml_re = re.compile(r'(?:""?(?!")|[^"\\\000-\011\013-\037])*') -_litstr_re = re.compile(r"[^'\000\010\012-\037]*") -_litstr_ml_re = re.compile(r"(?:(?:|'|'')(?:[^'\000-\010\013-\037]))*") -def _p_value(s, object_pairs_hook): - pos = s.pos() - - if s.consume('true'): - return 'bool', s.last(), True, pos - if s.consume('false'): - return 'bool', s.last(), False, pos - - if s.consume('"'): - if s.consume('""'): - r = _p_basicstr_content(s, _basicstr_ml_re) - s.expect('"""') - else: - r = _p_basicstr_content(s, _basicstr_re) - s.expect('"') - return 'str', r, r, pos - - if s.consume('\''): - if s.consume('\'\''): - r = s.expect_re(_litstr_ml_re).group(0) - s.expect('\'\'\'') - else: - r = s.expect_re(_litstr_re).group(0) - s.expect('\'') - return 'str', r, r, pos - - if s.consume_re(rfc3339_re): - m = s.last() - return 'datetime', m.group(0), parse_rfc3339_re(m), pos - - if s.consume_re(_float_re): - m = s.last().group(0) - r = m.replace('_','') - if '.' in m or 'e' in m or 'E' in m: - return 'float', m, float(r), pos - else: - return 'int', m, int(r, 10), pos - - if s.consume('['): - items = [] - with s: - while True: - _p_ews(s) - items.append(_p_value(s, object_pairs_hook=object_pairs_hook)) - s.commit() - _p_ews(s) - s.expect(',') - s.commit() - _p_ews(s) - s.expect(']') - return 'array', None, items, pos - - if s.consume('{'): - _p_ws(s) - items = object_pairs_hook() - if not s.consume('}'): - k = _p_key(s) - _p_ws(s) - s.expect('=') - _p_ws(s) - items[k] = _p_value(s, object_pairs_hook=object_pairs_hook) - _p_ws(s) - while s.consume(','): - _p_ws(s) - k = _p_key(s) - _p_ws(s) - s.expect('=') - _p_ws(s) - items[k] = _p_value(s, object_pairs_hook=object_pairs_hook) - _p_ws(s) - s.expect('}') - return 'table', None, items, pos - - s.fail() - -def _p_stmt(s, object_pairs_hook): - pos = s.pos() - if s.consume( '['): - is_array = s.consume('[') - _p_ws(s) - keys = [_p_key(s)] - _p_ws(s) - while s.consume('.'): - _p_ws(s) - keys.append(_p_key(s)) - _p_ws(s) - s.expect(']') - if is_array: - s.expect(']') - return 'table_array' if is_array else 'table', keys, pos - - key = _p_key(s) - _p_ws(s) - s.expect('=') - _p_ws(s) - value = _p_value(s, object_pairs_hook=object_pairs_hook) - return 'kv', (key, value), pos - -_stmtsep_re = re.compile(r'(?:[ \t]*(?:#[^\n]*)?\n)+[ \t]*') -def _p_toml(s, object_pairs_hook): - stmts = [] - _p_ews(s) - with s: - stmts.append(_p_stmt(s, object_pairs_hook=object_pairs_hook)) - while True: - s.commit() - s.expect_re(_stmtsep_re) - stmts.append(_p_stmt(s, object_pairs_hook=object_pairs_hook)) - _p_ews(s) - s.expect_eof() - return stmts diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pytoml/parser.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/pytoml/parser.pyc deleted file mode 100644 index a0d767b758e565d5eab8fe2256cc6e4ca24ad444..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14699 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 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pytoml/test.py b/venv/lib/python2.7/site-packages/pip/_vendor/pytoml/test.py deleted file mode 100644 index ec8abfc..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/pytoml/test.py +++ /dev/null @@ -1,30 +0,0 @@ -import datetime -from .utils import format_rfc3339 - -try: - _string_types = (str, unicode) - _int_types = (int, long) -except NameError: - _string_types = str - _int_types = int - -def translate_to_test(v): - if isinstance(v, dict): - return { k: translate_to_test(v) for k, v in v.items() } - if isinstance(v, list): - a = [translate_to_test(x) for x in v] - if v and isinstance(v[0], dict): - return a - else: - return {'type': 'array', 'value': a} - if isinstance(v, datetime.datetime): - return {'type': 'datetime', 'value': format_rfc3339(v)} - if isinstance(v, bool): - return {'type': 'bool', 'value': 'true' if v else 'false'} - if isinstance(v, _int_types): - return {'type': 'integer', 'value': str(v)} - if isinstance(v, float): - return {'type': 'float', 'value': '{:.17}'.format(v)} - if isinstance(v, _string_types): - return {'type': 'string', 'value': v} - raise RuntimeError('unexpected value: {!r}'.format(v)) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pytoml/test.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/pytoml/test.pyc deleted file mode 100644 index 94397a04f925a85a1cd2c695e7d9ddfae225ef9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1551 zcmc&zZEq7t5S~51Bz9h)DWIazHmD$3Ldhj^We7r1rNTEFRhLSjh}1gn*48=az02;} zjUo8}=|A9i@MrkQ-{=o0&&;`{mGZegdB(eQ&(1va%wFw}mG-?it49gVp9cPafH@79 z;-@GlI>aKNv_`q2aX^Owso5>kHPUq&VBa9!B)uT(MS5nwrn+v?ahvQjQc3|>K@Jzm zD0-gO>31Y;bM}J{m(2dev!5v}JM8=_+@P@I*!S%q>2|xj3CC-&I_yW7(};MYGk8T8 z0om_3Au=N}3h099@dXOZAvJ+q&`{n#K3b!5MZQjFIIHN_fKGPlJm9m|%+sRhoAcC$ z&H_5fL<G?9VV5?jcVPae(4bL6O1vkAHHl%q$qA8Pz;h-G0{bYi1%YwV50pZk8l|m& zffog=6z7CsoU?UF&bGkr32aGV=`xL$E<r8}@~I$K{;FQl!*=!aA+UZ6;)D@hf!zDa zKL>EY1Go#9iJV94^dewEp&)k&^%X1o4zf0p0KoZRzrf1d*tk6Qy6=m=*Uoo%u0DX< z+J@jn$Kt2eIqb=e;KI^oQydGYu?+`Bo@(pDSEu2uYhRk*j(2(|X1iy<?<Ei1>2CVU zZsQr2;V)sCm7AGyKF;$^zw^_u|1*cg`crMv!iMF{7vnr+He2P)wNdU-nk7Cd#^v4$ zGhlix?iW<~&c@cpGh85SXQh_VG|ng5FCvtJrq9M&-oGr0yaHOh=Cgx1ciJytl^L&x z+E&rLh`nnf`ugG4&i!-T9@O<VGedU+%ZbsarB1v~H>A?Tjn}vBd56Ch&xA84O`4=C z%k(90=JnVKfjo0QVu2$j8Nn!O!O8JHxb(Rf=Xo9|9C72qqWTs+@B0;_IdU11Xkxh6 zC)O5LMj44JT<25<8UJsClxCMe#NB}-bwyo+eXDM&dT?E>sjsm62FCyEur<|Tw8$gc zO?;NSN~mjiAv2qpEGbeQ@k~T22v^Blm|^rKM_JVUc&>?%_$+~}{^JWRm-5lLNGG}8 V<H5MAaLejyP*d<~MKx7B_ymg1OuqmC diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pytoml/utils.py b/venv/lib/python2.7/site-packages/pip/_vendor/pytoml/utils.py deleted file mode 100644 index 636a680..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/pytoml/utils.py +++ /dev/null @@ -1,67 +0,0 @@ -import datetime -import re - -rfc3339_re = re.compile(r'(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(\.\d+)?(?:Z|([+-]\d{2}):(\d{2}))') - -def parse_rfc3339(v): - m = rfc3339_re.match(v) - if not m or m.group(0) != v: - return None - return parse_rfc3339_re(m) - -def parse_rfc3339_re(m): - r = map(int, m.groups()[:6]) - if m.group(7): - micro = float(m.group(7)) - else: - micro = 0 - - if m.group(8): - g = int(m.group(8), 10) * 60 + int(m.group(9), 10) - tz = _TimeZone(datetime.timedelta(0, g * 60)) - else: - tz = _TimeZone(datetime.timedelta(0, 0)) - - y, m, d, H, M, S = r - return datetime.datetime(y, m, d, H, M, S, int(micro * 1000000), tz) - - -def format_rfc3339(v): - offs = v.utcoffset() - offs = int(offs.total_seconds()) // 60 if offs is not None else 0 - - if offs == 0: - suffix = 'Z' - else: - if offs > 0: - suffix = '+' - else: - suffix = '-' - offs = -offs - suffix = '{0}{1:02}:{2:02}'.format(suffix, offs // 60, offs % 60) - - if v.microsecond: - return v.strftime('%Y-%m-%dT%H:%M:%S.%f') + suffix - else: - return v.strftime('%Y-%m-%dT%H:%M:%S') + suffix - -class _TimeZone(datetime.tzinfo): - def __init__(self, offset): - self._offset = offset - - def utcoffset(self, dt): - return self._offset - - def dst(self, dt): - return None - - def tzname(self, dt): - m = self._offset.total_seconds() // 60 - if m < 0: - res = '-' - m = -m - else: - res = '+' - h = m // 60 - m = m - h * 60 - return '{}{:.02}{:.02}'.format(res, h, m) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pytoml/utils.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/pytoml/utils.pyc deleted file mode 100644 index 6d0c58f1e6007dcd8d17862082f23b0295aa2e75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3298 zcmc&$&2ke*5bjz1gTbM21w){cN}^;bN0xsm5>!;6;6e_#sFg1`CL2Y&GHXk_%FfsU zTRNo7ljM+B$b;nplJD!4Z6K8^mOZ^aJu|)CJzsZk>F-MymVUqdqA#;w3D1WZHUx?A zZ)7O4b;=vrG7=lv^(6A-7}JtOC3%BAWr@nlR3xe>Q<bPHvB+*s21cS9g~uY#x9Zf} z_3L;?@(+F+_8C}zJ36{Ez1`w-?d-WZn|I!O`rFIf(bDY){)5ie#Q$-r^`ba;vhQ}^ zK&dwykMXqkKpgBbGJz#VreKWB*(E;clA#o9dnL)+^uO!MT!XahQ`JTSB7TL6E`a2N z{`&g*y)cg*Wuu<!zf^7~&-TYSj3ZeZyN|$(d%2CnvlFV&(Z~a(BOk0Nv3ua!<2*U& zxww7M%iDu&7{$45AHHh8UeA9?f7@HV`)j&#H@|bY|DAnxFFMRu@Y@-;H{0W6+)7gG zdc$GMtv=lepHZYEJc!dM%iH7EE*lNo`z{&UWlS#Neec*;g~0NH#LSzUrff8tbeTh= z>A`eF6SgB_h#syM0sQRP)3`zeXedVVhr%$vC1LD6Ndb@&nb}gAanAod(TL+J0h*u_ zP+FM13JW!EEf%g#OM;NQDscvV6D(sdj_@sINf+N)#*Wh^-0XH$rWKirOu^J-T9;`< zbya0jp<xp+HJQ|90y$iTC3R>A2jl91MFa8JNEolAMuH)ULYt9F?vrp&^6=5TDCS)W z(@}4%&m?s)T|@z61A<HeG#F+*=XfyOOh)k*QADi~5aA%uB{ESwbUmN%3aCe+lox1B z`gx}F9jAH^b@Ezir1Xi>r%JmDJtZF+e*qI^4#O^hh`A2XEqYaN-mIBVy+v=afFI+= zG*kHf1%|-Uno?vk5_Yd4`Le)WW;Cu^^Bl0ekt!Nz`#jn6B>!Oszw`lj1FL&w$$uj1 z2+m8y7r|-dB8~x5y8yAysgEa&e0+Qg;ELpbs6jxr!V`P1b!j04b%Id^EGje1C^X<j zac5h42}?>_mIdQzWqP#QSy`KQj@J0l;547Nnxj@T+H5}QG@o{w-R0)MUcv7FEck?@ z!erm|v%$c|E?@)$f=V;qWvCIMjr&;|Sw-O>%TdGJMeG<6J;j;=&$@g-y!om_D<E%; ziuI`79}JRL=Z7J88P*i`pA^|!kk~~KF>}WE=1fCJ)zr)_uVJou0WsI-2L4!zA7R*U zKw`8sT(M{;)7J0?5(N<%bi1PMRV3*83`CzPb}}AQ4T~yZ0tld+LQ~i08#a_WUQSrt zO3?_Y!^Xpb26MIm(K$5)mYOh3(!_<~DlMaDVosf;C+Z~qDAMq4_ku4VR=<KT!D;!4 z-1&hc_yktm!T4W482<O}NVDb4iQsE&IX@S)TOdupea{PKB8}JE_!&%b8~DgM)`on8 zH4FeodBgV#zG_gh&?P-owW0;1-07TE4gC@;Xl<A*EMfy{AX+<mDr8tex$F9DGaE%? z11G@^lItLrDR?wJ>MWyL6||@pL_=_sgej??Pl^i-Y0<VySjc0m<?rP=Mp=94VcHwT z9ayAwSj<(_kE*%gVVKKC1E4iA47o83^;<9uM_IH##5DMdt`c$qJqeaT&RkONgLha~ zx)lulsH>VriGSLN0@f+bP<+KQo%`8noDAattOOKjdk#Jar^U$~Cg~v4+Ih}i=_TAR X!u~x=lBJt-X3m@U8r8;?#?^lTYR|)a diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pytoml/writer.py b/venv/lib/python2.7/site-packages/pip/_vendor/pytoml/writer.py deleted file mode 100644 index 73b5089..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/pytoml/writer.py +++ /dev/null @@ -1,106 +0,0 @@ -from __future__ import unicode_literals -import io, datetime, math, string, sys - -from .utils import format_rfc3339 - -if sys.version_info[0] == 3: - long = int - unicode = str - - -def dumps(obj, sort_keys=False): - fout = io.StringIO() - dump(obj, fout, sort_keys=sort_keys) - return fout.getvalue() - - -_escapes = {'\n': 'n', '\r': 'r', '\\': '\\', '\t': 't', '\b': 'b', '\f': 'f', '"': '"'} - - -def _escape_string(s): - res = [] - start = 0 - - def flush(): - if start != i: - res.append(s[start:i]) - return i + 1 - - i = 0 - while i < len(s): - c = s[i] - if c in '"\\\n\r\t\b\f': - start = flush() - res.append('\\' + _escapes[c]) - elif ord(c) < 0x20: - start = flush() - res.append('\\u%04x' % ord(c)) - i += 1 - - flush() - return '"' + ''.join(res) + '"' - - -_key_chars = string.digits + string.ascii_letters + '-_' -def _escape_id(s): - if any(c not in _key_chars for c in s): - return _escape_string(s) - return s - - -def _format_value(v): - if isinstance(v, bool): - return 'true' if v else 'false' - if isinstance(v, int) or isinstance(v, long): - return unicode(v) - if isinstance(v, float): - if math.isnan(v) or math.isinf(v): - raise ValueError("{0} is not a valid TOML value".format(v)) - else: - return repr(v) - elif isinstance(v, unicode) or isinstance(v, bytes): - return _escape_string(v) - elif isinstance(v, datetime.datetime): - return format_rfc3339(v) - elif isinstance(v, list): - return '[{0}]'.format(', '.join(_format_value(obj) for obj in v)) - elif isinstance(v, dict): - return '{{{0}}}'.format(', '.join('{} = {}'.format(_escape_id(k), _format_value(obj)) for k, obj in v.items())) - else: - raise RuntimeError(v) - - -def dump(obj, fout, sort_keys=False): - tables = [((), obj, False)] - - while tables: - name, table, is_array = tables.pop() - if name: - section_name = '.'.join(_escape_id(c) for c in name) - if is_array: - fout.write('[[{0}]]\n'.format(section_name)) - else: - fout.write('[{0}]\n'.format(section_name)) - - table_keys = sorted(table.keys()) if sort_keys else table.keys() - new_tables = [] - has_kv = False - for k in table_keys: - v = table[k] - if isinstance(v, dict): - new_tables.append((name + (k,), v, False)) - elif isinstance(v, list) and v and all(isinstance(o, dict) for o in v): - new_tables.extend((name + (k,), d, True) for d in v) - elif v is None: - # based on mojombo's comment: https://github.com/toml-lang/toml/issues/146#issuecomment-25019344 - fout.write( - '#{} = null # To use: uncomment and replace null with value\n'.format(_escape_id(k))) - has_kv = True - else: - fout.write('{0} = {1}\n'.format(_escape_id(k), _format_value(v))) - has_kv = True - - tables.extend(reversed(new_tables)) - - if (name or has_kv) and tables: - fout.write('\n') diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pytoml/writer.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/pytoml/writer.pyc deleted file mode 100644 index 9e061459bdfaea55893a4bee8b523f44d537e83c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5606 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 Lm*z~lSYG%y#=xt+ diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/requests/__init__.py deleted file mode 100644 index 80c4ce1..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/requests/__init__.py +++ /dev/null @@ -1,133 +0,0 @@ -# -*- coding: utf-8 -*- - -# __ -# /__) _ _ _ _ _/ _ -# / ( (- (/ (/ (- _) / _) -# / - -""" -Requests HTTP Library -~~~~~~~~~~~~~~~~~~~~~ - -Requests is an HTTP library, written in Python, for human beings. Basic GET -usage: - - >>> import requests - >>> r = requests.get('https://www.python.org') - >>> r.status_code - 200 - >>> 'Python is a programming language' in r.content - True - -... or POST: - - >>> payload = dict(key1='value1', key2='value2') - >>> r = requests.post('https://httpbin.org/post', data=payload) - >>> print(r.text) - { - ... - "form": { - "key2": "value2", - "key1": "value1" - }, - ... - } - -The other HTTP methods are supported - see `requests.api`. Full documentation -is at <http://python-requests.org>. - -:copyright: (c) 2017 by Kenneth Reitz. -:license: Apache 2.0, see LICENSE for more details. -""" - -from pip._vendor import urllib3 -from pip._vendor import chardet -import warnings -from .exceptions import RequestsDependencyWarning - - -def check_compatibility(urllib3_version, chardet_version): - urllib3_version = urllib3_version.split('.') - assert urllib3_version != ['dev'] # Verify urllib3 isn't installed from git. - - # Sometimes, urllib3 only reports its version as 16.1. - if len(urllib3_version) == 2: - urllib3_version.append('0') - - # Check urllib3 for compatibility. - major, minor, patch = urllib3_version # noqa: F811 - major, minor, patch = int(major), int(minor), int(patch) - # urllib3 >= 1.21.1, <= 1.24 - assert major == 1 - assert minor >= 21 - assert minor <= 24 - - # Check chardet for compatibility. - major, minor, patch = chardet_version.split('.')[:3] - major, minor, patch = int(major), int(minor), int(patch) - # chardet >= 3.0.2, < 3.1.0 - assert major == 3 - assert minor < 1 - assert patch >= 2 - - -def _check_cryptography(cryptography_version): - # cryptography < 1.3.4 - try: - cryptography_version = list(map(int, cryptography_version.split('.'))) - except ValueError: - return - - if cryptography_version < [1, 3, 4]: - warning = 'Old version of cryptography ({}) may cause slowdown.'.format(cryptography_version) - warnings.warn(warning, RequestsDependencyWarning) - -# Check imported dependencies for compatibility. -try: - check_compatibility(urllib3.__version__, chardet.__version__) -except (AssertionError, ValueError): - warnings.warn("urllib3 ({}) or chardet ({}) doesn't match a supported " - "version!".format(urllib3.__version__, chardet.__version__), - RequestsDependencyWarning) - -# Attempt to enable urllib3's SNI support, if possible -from pip._internal.utils.compat import WINDOWS -if not WINDOWS: - try: - from pip._vendor.urllib3.contrib import pyopenssl - pyopenssl.inject_into_urllib3() - - # Check cryptography version - from cryptography import __version__ as cryptography_version - _check_cryptography(cryptography_version) - except ImportError: - pass - -# urllib3's DependencyWarnings should be silenced. -from pip._vendor.urllib3.exceptions import DependencyWarning -warnings.simplefilter('ignore', DependencyWarning) - -from .__version__ import __title__, __description__, __url__, __version__ -from .__version__ import __build__, __author__, __author_email__, __license__ -from .__version__ import __copyright__, __cake__ - -from . import utils -from . import packages -from .models import Request, Response, PreparedRequest -from .api import request, get, head, post, patch, put, delete, options -from .sessions import session, Session -from .status_codes import codes -from .exceptions import ( - RequestException, Timeout, URLRequired, - TooManyRedirects, HTTPError, ConnectionError, - FileModeWarning, ConnectTimeout, ReadTimeout -) - -# Set default logging handler to avoid "No handler found" warnings. -import logging -from logging import NullHandler - -logging.getLogger(__name__).addHandler(NullHandler()) - -# FileModeWarnings go off per the default. -warnings.simplefilter('default', FileModeWarning, append=True) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/requests/__init__.pyc deleted file mode 100644 index 116362f9af35f32c12e9e11e80ab646f7909961f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4332 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 Zcd{~r@_*LqTy$2Pvshmrg?44S`cEy)`~d&} diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/__version__.py b/venv/lib/python2.7/site-packages/pip/_vendor/requests/__version__.py deleted file mode 100644 index f5b5d03..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/requests/__version__.py +++ /dev/null @@ -1,14 +0,0 @@ -# .-. .-. .-. . . .-. .-. .-. .-. -# |( |- |.| | | |- `-. | `-. -# ' ' `-' `-`.`-' `-' `-' ' `-' - -__title__ = 'requests' -__description__ = 'Python HTTP for Humans.' -__url__ = 'http://python-requests.org' -__version__ = '2.21.0' -__build__ = 0x022100 -__author__ = 'Kenneth Reitz' -__author_email__ = 'me@kennethreitz.org' -__license__ = 'Apache 2.0' -__copyright__ = 'Copyright 2018 Kenneth Reitz' -__cake__ = u'\u2728 \U0001f370 \u2728' diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/__version__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/requests/__version__.pyc deleted file mode 100644 index 1444876e32f66f59de7c9fe4582a9c65bb9bba71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 634 zcmZ8e&2AGh5S}E>FBDKYAR!Ls771m&2`Fk2LPcCEAy5Q4SwgGr+Ra+ocwLV-G`aBr zya5tdjyw}jfW!+h-Vn85%b(}_#xtI=TfYwnPd?xIn8DxCp#78<29N-PumPe0vI(LI zvIU|A@&LpE$To;J$PS1O$S#O3$R3Cu$UcZZ$N_v9-l8PFN8r?DrO+cjATrzdyfo}= zKA*9R(y_B@l^TrjA^CFe?Q_m;ePpx`i%Pe^4!I}MWE{mB9yb9GiN8_CD4(<UO8YI| zCuOBhmpjn~t&SX!{>r9VuGl1s@e$G2rQJBa$UU3H<74(up6WIo`1$oa`}OV14@Snj zVaVY71WDqxFBENeYbF(DPFt@_Lt3}iDp!yldQXzIa=7#DqR%T`Nb-h+Ns?Cd5{~G- zn^dh*eVw7unKBq|3=Jnqwy&I&@U*0)OL7m%hHF41%B|Du)GNMD9lt0GN!9S}72iB{ z=jPLLJiRpW)IFPK$9Q!jw=Sl!uzb#~wj*uOr$sUH<F|`s7NmMnOGcKC@BfD1XfmRI W3pKr1m9i?-%Qo3~M9^vcKmP!++NquZ diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/_internal_utils.py b/venv/lib/python2.7/site-packages/pip/_vendor/requests/_internal_utils.py deleted file mode 100644 index 759d9a5..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/requests/_internal_utils.py +++ /dev/null @@ -1,42 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests._internal_utils -~~~~~~~~~~~~~~ - -Provides utility functions that are consumed internally by Requests -which depend on extremely few external helpers (such as compat) -""" - -from .compat import is_py2, builtin_str, str - - -def to_native_string(string, encoding='ascii'): - """Given a string object, regardless of type, returns a representation of - that string in the native string type, encoding and decoding where - necessary. This assumes ASCII unless told otherwise. - """ - if isinstance(string, builtin_str): - out = string - else: - if is_py2: - out = string.encode(encoding) - else: - out = string.decode(encoding) - - return out - - -def unicode_is_ascii(u_string): - """Determine if unicode string only contains ASCII characters. - - :param str u_string: unicode string to check. Must be unicode - and not Python 2 `str`. - :rtype: bool - """ - assert isinstance(u_string, str) - try: - u_string.encode('ascii') - return True - except UnicodeEncodeError: - return False diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/_internal_utils.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/requests/_internal_utils.pyc deleted file mode 100644 index da4f276eaee3ef17d6821b24c545e2afc741d630..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1676 zcmd5+Uys~05O<Qj?KQN$>ZFr+K$YKE1l?Q<I>CXeR;8dm6rHk%Kr5lto6KI^OPti6 z>|UyCC7_>&C%y$AhcCd4v&)H!cd+D%?TqKoZ+_$G&ztebKi~Q(7n>2%_aRO9C5b|a zImtj2p{N2;hhiRzIui3p)FUw;iJ*u?F%oYBG2aozj(AHK#-bRD+2k4<`He(u;bjL7 z-89n%!5UR%9qP)(Z~igj_{26VU4WDPTVpSmoyk!*#z`y{N@YRjwCidp<knWz%SA8K zjgNR;>b#T%v|tL^7zr0>p$5`g!kTwJ09iuSf^~A@I#O4T?AEQqk76BA$diZ!j!9^j zwf%j3kCuy0SEx<q&?5im?+$&H%eBrKH$LV0n5JWaLR^vz#IK>S@ALX~D9ncfX?w`q z7m>K6zkxsB^CzRLlgp5B<apd4B)-)vFj7hKtIe5g7B3*jPo#x2Ws3@&lg(0M-vXau zX9+b$tJZ=8gNkt^jabs~Xm0FiLtBuB6jrb`K9~WMHwF7rgk=Gn&AJ2&-i(2q+$!5o z<!PzOo#WCt`Dpg|=~LMm9~3qf6@pyYwRSM|7blDx#w4`U#-TDfq?~9<a{%7^244g3 z8LnzF1dh9;x{c5mr0H<N_q}jyS|zR3D}|7(luect2$ei}b&>R++J#x4-#dC~4v*|- zNBQUO;)~*yJ*08gCZ|cO+q*uns=AB!o}FbUeB@_FRVW&pY+0SW!|G|<<8AVdO*UZ4 zgdq@b(V4qJLhS4X*TZqJAMS-YC(V-q`B&Pw17^!Ff#?r5grRmM!UQ-Hvmea97!e82 zV__eNAP5Mr*^kt$Gmn=0oveNhMEP19ka|fq(Nx91%iI|13+gCTl<cN#d8w?*>5iMm zzF5aC9n{PW*==$;e%BB-GA|)NpUP*QL%D#hg15kwV+xrD<w=hv5%Io!P6nS3bU3!m zw_~|zn#x~DBMSUG|AeF?TBh7x$Ot}i4lGmoiM5SQJ&#!9)OLXTwD^9=@Cj2FypnIy zZ&c;L_mbz$Hj)1kUpA%5=*96b${k8(;LEjxAPQ~<yEF$(kl)rUE1EpZe1{B=mv5e- njTo<#`zvKCUS;{;x5h5T^HtpxT?G%W)7tSXI}SgHZruJ0j7iD~ diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/adapters.py b/venv/lib/python2.7/site-packages/pip/_vendor/requests/adapters.py deleted file mode 100644 index c30e7c9..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/requests/adapters.py +++ /dev/null @@ -1,533 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.adapters -~~~~~~~~~~~~~~~~~ - -This module contains the transport adapters that Requests uses to define -and maintain connections. -""" - -import os.path -import socket - -from pip._vendor.urllib3.poolmanager import PoolManager, proxy_from_url -from pip._vendor.urllib3.response import HTTPResponse -from pip._vendor.urllib3.util import parse_url -from pip._vendor.urllib3.util import Timeout as TimeoutSauce -from pip._vendor.urllib3.util.retry import Retry -from pip._vendor.urllib3.exceptions import ClosedPoolError -from pip._vendor.urllib3.exceptions import ConnectTimeoutError -from pip._vendor.urllib3.exceptions import HTTPError as _HTTPError -from pip._vendor.urllib3.exceptions import MaxRetryError -from pip._vendor.urllib3.exceptions import NewConnectionError -from pip._vendor.urllib3.exceptions import ProxyError as _ProxyError -from pip._vendor.urllib3.exceptions import ProtocolError -from pip._vendor.urllib3.exceptions import ReadTimeoutError -from pip._vendor.urllib3.exceptions import SSLError as _SSLError -from pip._vendor.urllib3.exceptions import ResponseError -from pip._vendor.urllib3.exceptions import LocationValueError - -from .models import Response -from .compat import urlparse, basestring -from .utils import (DEFAULT_CA_BUNDLE_PATH, extract_zipped_paths, - get_encoding_from_headers, prepend_scheme_if_needed, - get_auth_from_url, urldefragauth, select_proxy) -from .structures import CaseInsensitiveDict -from .cookies import extract_cookies_to_jar -from .exceptions import (ConnectionError, ConnectTimeout, ReadTimeout, SSLError, - ProxyError, RetryError, InvalidSchema, InvalidProxyURL, - InvalidURL) -from .auth import _basic_auth_str - -try: - from pip._vendor.urllib3.contrib.socks import SOCKSProxyManager -except ImportError: - def SOCKSProxyManager(*args, **kwargs): - raise InvalidSchema("Missing dependencies for SOCKS support.") - -DEFAULT_POOLBLOCK = False -DEFAULT_POOLSIZE = 10 -DEFAULT_RETRIES = 0 -DEFAULT_POOL_TIMEOUT = None - - -class BaseAdapter(object): - """The Base Transport Adapter""" - - def __init__(self): - super(BaseAdapter, self).__init__() - - def send(self, request, stream=False, timeout=None, verify=True, - cert=None, proxies=None): - """Sends PreparedRequest object. Returns Response object. - - :param request: The :class:`PreparedRequest <PreparedRequest>` being sent. - :param stream: (optional) Whether to stream the request content. - :param timeout: (optional) How long to wait for the server to send - data before giving up, as a float, or a :ref:`(connect timeout, - read timeout) <timeouts>` tuple. - :type timeout: float or tuple - :param verify: (optional) Either a boolean, in which case it controls whether we verify - the server's TLS certificate, or a string, in which case it must be a path - to a CA bundle to use - :param cert: (optional) Any user-provided SSL certificate to be trusted. - :param proxies: (optional) The proxies dictionary to apply to the request. - """ - raise NotImplementedError - - def close(self): - """Cleans up adapter specific items.""" - raise NotImplementedError - - -class HTTPAdapter(BaseAdapter): - """The built-in HTTP Adapter for urllib3. - - Provides a general-case interface for Requests sessions to contact HTTP and - HTTPS urls by implementing the Transport Adapter interface. This class will - usually be created by the :class:`Session <Session>` class under the - covers. - - :param pool_connections: The number of urllib3 connection pools to cache. - :param pool_maxsize: The maximum number of connections to save in the pool. - :param max_retries: The maximum number of retries each connection - should attempt. Note, this applies only to failed DNS lookups, socket - connections and connection timeouts, never to requests where data has - made it to the server. By default, Requests does not retry failed - connections. If you need granular control over the conditions under - which we retry a request, import urllib3's ``Retry`` class and pass - that instead. - :param pool_block: Whether the connection pool should block for connections. - - Usage:: - - >>> import requests - >>> s = requests.Session() - >>> a = requests.adapters.HTTPAdapter(max_retries=3) - >>> s.mount('http://', a) - """ - __attrs__ = ['max_retries', 'config', '_pool_connections', '_pool_maxsize', - '_pool_block'] - - def __init__(self, pool_connections=DEFAULT_POOLSIZE, - pool_maxsize=DEFAULT_POOLSIZE, max_retries=DEFAULT_RETRIES, - pool_block=DEFAULT_POOLBLOCK): - if max_retries == DEFAULT_RETRIES: - self.max_retries = Retry(0, read=False) - else: - self.max_retries = Retry.from_int(max_retries) - self.config = {} - self.proxy_manager = {} - - super(HTTPAdapter, self).__init__() - - self._pool_connections = pool_connections - self._pool_maxsize = pool_maxsize - self._pool_block = pool_block - - self.init_poolmanager(pool_connections, pool_maxsize, block=pool_block) - - def __getstate__(self): - return {attr: getattr(self, attr, None) for attr in self.__attrs__} - - def __setstate__(self, state): - # Can't handle by adding 'proxy_manager' to self.__attrs__ because - # self.poolmanager uses a lambda function, which isn't pickleable. - self.proxy_manager = {} - self.config = {} - - for attr, value in state.items(): - setattr(self, attr, value) - - self.init_poolmanager(self._pool_connections, self._pool_maxsize, - block=self._pool_block) - - def init_poolmanager(self, connections, maxsize, block=DEFAULT_POOLBLOCK, **pool_kwargs): - """Initializes a urllib3 PoolManager. - - This method should not be called from user code, and is only - exposed for use when subclassing the - :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. - - :param connections: The number of urllib3 connection pools to cache. - :param maxsize: The maximum number of connections to save in the pool. - :param block: Block when no free connections are available. - :param pool_kwargs: Extra keyword arguments used to initialize the Pool Manager. - """ - # save these values for pickling - self._pool_connections = connections - self._pool_maxsize = maxsize - self._pool_block = block - - self.poolmanager = PoolManager(num_pools=connections, maxsize=maxsize, - block=block, strict=True, **pool_kwargs) - - def proxy_manager_for(self, proxy, **proxy_kwargs): - """Return urllib3 ProxyManager for the given proxy. - - This method should not be called from user code, and is only - exposed for use when subclassing the - :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. - - :param proxy: The proxy to return a urllib3 ProxyManager for. - :param proxy_kwargs: Extra keyword arguments used to configure the Proxy Manager. - :returns: ProxyManager - :rtype: urllib3.ProxyManager - """ - if proxy in self.proxy_manager: - manager = self.proxy_manager[proxy] - elif proxy.lower().startswith('socks'): - username, password = get_auth_from_url(proxy) - manager = self.proxy_manager[proxy] = SOCKSProxyManager( - proxy, - username=username, - password=password, - num_pools=self._pool_connections, - maxsize=self._pool_maxsize, - block=self._pool_block, - **proxy_kwargs - ) - else: - proxy_headers = self.proxy_headers(proxy) - manager = self.proxy_manager[proxy] = proxy_from_url( - proxy, - proxy_headers=proxy_headers, - num_pools=self._pool_connections, - maxsize=self._pool_maxsize, - block=self._pool_block, - **proxy_kwargs) - - return manager - - def cert_verify(self, conn, url, verify, cert): - """Verify a SSL certificate. This method should not be called from user - code, and is only exposed for use when subclassing the - :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. - - :param conn: The urllib3 connection object associated with the cert. - :param url: The requested URL. - :param verify: Either a boolean, in which case it controls whether we verify - the server's TLS certificate, or a string, in which case it must be a path - to a CA bundle to use - :param cert: The SSL certificate to verify. - """ - if url.lower().startswith('https') and verify: - - cert_loc = None - - # Allow self-specified cert location. - if verify is not True: - cert_loc = verify - - if not cert_loc: - cert_loc = extract_zipped_paths(DEFAULT_CA_BUNDLE_PATH) - - if not cert_loc or not os.path.exists(cert_loc): - raise IOError("Could not find a suitable TLS CA certificate bundle, " - "invalid path: {}".format(cert_loc)) - - conn.cert_reqs = 'CERT_REQUIRED' - - if not os.path.isdir(cert_loc): - conn.ca_certs = cert_loc - else: - conn.ca_cert_dir = cert_loc - else: - conn.cert_reqs = 'CERT_NONE' - conn.ca_certs = None - conn.ca_cert_dir = None - - if cert: - if not isinstance(cert, basestring): - conn.cert_file = cert[0] - conn.key_file = cert[1] - else: - conn.cert_file = cert - conn.key_file = None - if conn.cert_file and not os.path.exists(conn.cert_file): - raise IOError("Could not find the TLS certificate file, " - "invalid path: {}".format(conn.cert_file)) - if conn.key_file and not os.path.exists(conn.key_file): - raise IOError("Could not find the TLS key file, " - "invalid path: {}".format(conn.key_file)) - - def build_response(self, req, resp): - """Builds a :class:`Response <requests.Response>` object from a urllib3 - response. This should not be called from user code, and is only exposed - for use when subclassing the - :class:`HTTPAdapter <requests.adapters.HTTPAdapter>` - - :param req: The :class:`PreparedRequest <PreparedRequest>` used to generate the response. - :param resp: The urllib3 response object. - :rtype: requests.Response - """ - response = Response() - - # Fallback to None if there's no status_code, for whatever reason. - response.status_code = getattr(resp, 'status', None) - - # Make headers case-insensitive. - response.headers = CaseInsensitiveDict(getattr(resp, 'headers', {})) - - # Set encoding. - response.encoding = get_encoding_from_headers(response.headers) - response.raw = resp - response.reason = response.raw.reason - - if isinstance(req.url, bytes): - response.url = req.url.decode('utf-8') - else: - response.url = req.url - - # Add new cookies from the server. - extract_cookies_to_jar(response.cookies, req, resp) - - # Give the Response some context. - response.request = req - response.connection = self - - return response - - def get_connection(self, url, proxies=None): - """Returns a urllib3 connection for the given URL. This should not be - called from user code, and is only exposed for use when subclassing the - :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. - - :param url: The URL to connect to. - :param proxies: (optional) A Requests-style dictionary of proxies used on this request. - :rtype: urllib3.ConnectionPool - """ - proxy = select_proxy(url, proxies) - - if proxy: - proxy = prepend_scheme_if_needed(proxy, 'http') - proxy_url = parse_url(proxy) - if not proxy_url.host: - raise InvalidProxyURL("Please check proxy URL. It is malformed" - " and could be missing the host.") - proxy_manager = self.proxy_manager_for(proxy) - conn = proxy_manager.connection_from_url(url) - else: - # Only scheme should be lower case - parsed = urlparse(url) - url = parsed.geturl() - conn = self.poolmanager.connection_from_url(url) - - return conn - - def close(self): - """Disposes of any internal state. - - Currently, this closes the PoolManager and any active ProxyManager, - which closes any pooled connections. - """ - self.poolmanager.clear() - for proxy in self.proxy_manager.values(): - proxy.clear() - - def request_url(self, request, proxies): - """Obtain the url to use when making the final request. - - If the message is being sent through a HTTP proxy, the full URL has to - be used. Otherwise, we should only use the path portion of the URL. - - This should not be called from user code, and is only exposed for use - when subclassing the - :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. - - :param request: The :class:`PreparedRequest <PreparedRequest>` being sent. - :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs. - :rtype: str - """ - proxy = select_proxy(request.url, proxies) - scheme = urlparse(request.url).scheme - - is_proxied_http_request = (proxy and scheme != 'https') - using_socks_proxy = False - if proxy: - proxy_scheme = urlparse(proxy).scheme.lower() - using_socks_proxy = proxy_scheme.startswith('socks') - - url = request.path_url - if is_proxied_http_request and not using_socks_proxy: - url = urldefragauth(request.url) - - return url - - def add_headers(self, request, **kwargs): - """Add any headers needed by the connection. As of v2.0 this does - nothing by default, but is left for overriding by users that subclass - the :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. - - This should not be called from user code, and is only exposed for use - when subclassing the - :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. - - :param request: The :class:`PreparedRequest <PreparedRequest>` to add headers to. - :param kwargs: The keyword arguments from the call to send(). - """ - pass - - def proxy_headers(self, proxy): - """Returns a dictionary of the headers to add to any request sent - through a proxy. This works with urllib3 magic to ensure that they are - correctly sent to the proxy, rather than in a tunnelled request if - CONNECT is being used. - - This should not be called from user code, and is only exposed for use - when subclassing the - :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. - - :param proxy: The url of the proxy being used for this request. - :rtype: dict - """ - headers = {} - username, password = get_auth_from_url(proxy) - - if username: - headers['Proxy-Authorization'] = _basic_auth_str(username, - password) - - return headers - - def send(self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None): - """Sends PreparedRequest object. Returns Response object. - - :param request: The :class:`PreparedRequest <PreparedRequest>` being sent. - :param stream: (optional) Whether to stream the request content. - :param timeout: (optional) How long to wait for the server to send - data before giving up, as a float, or a :ref:`(connect timeout, - read timeout) <timeouts>` tuple. - :type timeout: float or tuple or urllib3 Timeout object - :param verify: (optional) Either a boolean, in which case it controls whether - we verify the server's TLS certificate, or a string, in which case it - must be a path to a CA bundle to use - :param cert: (optional) Any user-provided SSL certificate to be trusted. - :param proxies: (optional) The proxies dictionary to apply to the request. - :rtype: requests.Response - """ - - try: - conn = self.get_connection(request.url, proxies) - except LocationValueError as e: - raise InvalidURL(e, request=request) - - self.cert_verify(conn, request.url, verify, cert) - url = self.request_url(request, proxies) - self.add_headers(request, stream=stream, timeout=timeout, verify=verify, cert=cert, proxies=proxies) - - chunked = not (request.body is None or 'Content-Length' in request.headers) - - if isinstance(timeout, tuple): - try: - connect, read = timeout - timeout = TimeoutSauce(connect=connect, read=read) - except ValueError as e: - # this may raise a string formatting error. - err = ("Invalid timeout {}. Pass a (connect, read) " - "timeout tuple, or a single float to set " - "both timeouts to the same value".format(timeout)) - raise ValueError(err) - elif isinstance(timeout, TimeoutSauce): - pass - else: - timeout = TimeoutSauce(connect=timeout, read=timeout) - - try: - if not chunked: - resp = conn.urlopen( - method=request.method, - url=url, - body=request.body, - headers=request.headers, - redirect=False, - assert_same_host=False, - preload_content=False, - decode_content=False, - retries=self.max_retries, - timeout=timeout - ) - - # Send the request. - else: - if hasattr(conn, 'proxy_pool'): - conn = conn.proxy_pool - - low_conn = conn._get_conn(timeout=DEFAULT_POOL_TIMEOUT) - - try: - low_conn.putrequest(request.method, - url, - skip_accept_encoding=True) - - for header, value in request.headers.items(): - low_conn.putheader(header, value) - - low_conn.endheaders() - - for i in request.body: - low_conn.send(hex(len(i))[2:].encode('utf-8')) - low_conn.send(b'\r\n') - low_conn.send(i) - low_conn.send(b'\r\n') - low_conn.send(b'0\r\n\r\n') - - # Receive the response from the server - try: - # For Python 2.7, use buffering of HTTP responses - r = low_conn.getresponse(buffering=True) - except TypeError: - # For compatibility with Python 3.3+ - r = low_conn.getresponse() - - resp = HTTPResponse.from_httplib( - r, - pool=conn, - connection=low_conn, - preload_content=False, - decode_content=False - ) - except: - # If we hit any problems here, clean up the connection. - # Then, reraise so that we can handle the actual exception. - low_conn.close() - raise - - except (ProtocolError, socket.error) as err: - raise ConnectionError(err, request=request) - - except MaxRetryError as e: - if isinstance(e.reason, ConnectTimeoutError): - # TODO: Remove this in 3.0.0: see #2811 - if not isinstance(e.reason, NewConnectionError): - raise ConnectTimeout(e, request=request) - - if isinstance(e.reason, ResponseError): - raise RetryError(e, request=request) - - if isinstance(e.reason, _ProxyError): - raise ProxyError(e, request=request) - - if isinstance(e.reason, _SSLError): - # This branch is for urllib3 v1.22 and later. - raise SSLError(e, request=request) - - raise ConnectionError(e, request=request) - - except ClosedPoolError as e: - raise ConnectionError(e, request=request) - - except _ProxyError as e: - raise ProxyError(e) - - except (_SSLError, _HTTPError) as e: - if isinstance(e, _SSLError): - # This branch is for urllib3 versions earlier than v1.22 - raise SSLError(e, request=request) - elif isinstance(e, ReadTimeoutError): - raise ReadTimeout(e, request=request) - else: - raise - - return self.build_response(request, resp) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/adapters.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/requests/adapters.pyc deleted file mode 100644 index 17550e2826b3f4f7d755cc284dcdff7ba9e29e33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20399 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 J4do|J{1@?}p1=SA diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/api.py b/venv/lib/python2.7/site-packages/pip/_vendor/requests/api.py deleted file mode 100644 index abada96..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/requests/api.py +++ /dev/null @@ -1,158 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.api -~~~~~~~~~~~~ - -This module implements the Requests API. - -:copyright: (c) 2012 by Kenneth Reitz. -:license: Apache2, see LICENSE for more details. -""" - -from . import sessions - - -def request(method, url, **kwargs): - """Constructs and sends a :class:`Request <Request>`. - - :param method: method for the new :class:`Request` object. - :param url: URL for the new :class:`Request` object. - :param params: (optional) Dictionary, list of tuples or bytes to send - in the body of the :class:`Request`. - :param data: (optional) Dictionary, list of tuples, bytes, or file-like - object to send in the body of the :class:`Request`. - :param json: (optional) A JSON serializable Python object to send in the body of the :class:`Request`. - :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`. - :param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`. - :param files: (optional) Dictionary of ``'name': file-like-objects`` (or ``{'name': file-tuple}``) for multipart encoding upload. - ``file-tuple`` can be a 2-tuple ``('filename', fileobj)``, 3-tuple ``('filename', fileobj, 'content_type')`` - or a 4-tuple ``('filename', fileobj, 'content_type', custom_headers)``, where ``'content-type'`` is a string - defining the content type of the given file and ``custom_headers`` a dict-like object containing additional headers - to add for the file. - :param auth: (optional) Auth tuple to enable Basic/Digest/Custom HTTP Auth. - :param timeout: (optional) How many seconds to wait for the server to send data - before giving up, as a float, or a :ref:`(connect timeout, read - timeout) <timeouts>` tuple. - :type timeout: float or tuple - :param allow_redirects: (optional) Boolean. Enable/disable GET/OPTIONS/POST/PUT/PATCH/DELETE/HEAD redirection. Defaults to ``True``. - :type allow_redirects: bool - :param proxies: (optional) Dictionary mapping protocol to the URL of the proxy. - :param verify: (optional) Either a boolean, in which case it controls whether we verify - the server's TLS certificate, or a string, in which case it must be a path - to a CA bundle to use. Defaults to ``True``. - :param stream: (optional) if ``False``, the response content will be immediately downloaded. - :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair. - :return: :class:`Response <Response>` object - :rtype: requests.Response - - Usage:: - - >>> import requests - >>> req = requests.request('GET', 'https://httpbin.org/get') - <Response [200]> - """ - - # By using the 'with' statement we are sure the session is closed, thus we - # avoid leaving sockets open which can trigger a ResourceWarning in some - # cases, and look like a memory leak in others. - with sessions.Session() as session: - return session.request(method=method, url=url, **kwargs) - - -def get(url, params=None, **kwargs): - r"""Sends a GET request. - - :param url: URL for the new :class:`Request` object. - :param params: (optional) Dictionary, list of tuples or bytes to send - in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :return: :class:`Response <Response>` object - :rtype: requests.Response - """ - - kwargs.setdefault('allow_redirects', True) - return request('get', url, params=params, **kwargs) - - -def options(url, **kwargs): - r"""Sends an OPTIONS request. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :return: :class:`Response <Response>` object - :rtype: requests.Response - """ - - kwargs.setdefault('allow_redirects', True) - return request('options', url, **kwargs) - - -def head(url, **kwargs): - r"""Sends a HEAD request. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :return: :class:`Response <Response>` object - :rtype: requests.Response - """ - - kwargs.setdefault('allow_redirects', False) - return request('head', url, **kwargs) - - -def post(url, data=None, json=None, **kwargs): - r"""Sends a POST request. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, list of tuples, bytes, or file-like - object to send in the body of the :class:`Request`. - :param json: (optional) json data to send in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :return: :class:`Response <Response>` object - :rtype: requests.Response - """ - - return request('post', url, data=data, json=json, **kwargs) - - -def put(url, data=None, **kwargs): - r"""Sends a PUT request. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, list of tuples, bytes, or file-like - object to send in the body of the :class:`Request`. - :param json: (optional) json data to send in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :return: :class:`Response <Response>` object - :rtype: requests.Response - """ - - return request('put', url, data=data, **kwargs) - - -def patch(url, data=None, **kwargs): - r"""Sends a PATCH request. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, list of tuples, bytes, or file-like - object to send in the body of the :class:`Request`. - :param json: (optional) json data to send in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :return: :class:`Response <Response>` object - :rtype: requests.Response - """ - - return request('patch', url, data=data, **kwargs) - - -def delete(url, **kwargs): - r"""Sends a DELETE request. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :return: :class:`Response <Response>` object - :rtype: requests.Response - """ - - return request('delete', url, **kwargs) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/api.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/requests/api.pyc deleted file mode 100644 index 959352d66a1813a06e464dee167c86dab097d443..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7499 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 Bp_2dr diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/auth.py b/venv/lib/python2.7/site-packages/pip/_vendor/requests/auth.py deleted file mode 100644 index bdde51c..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/requests/auth.py +++ /dev/null @@ -1,305 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.auth -~~~~~~~~~~~~~ - -This module contains the authentication handlers for Requests. -""" - -import os -import re -import time -import hashlib -import threading -import warnings - -from base64 import b64encode - -from .compat import urlparse, str, basestring -from .cookies import extract_cookies_to_jar -from ._internal_utils import to_native_string -from .utils import parse_dict_header - -CONTENT_TYPE_FORM_URLENCODED = 'application/x-www-form-urlencoded' -CONTENT_TYPE_MULTI_PART = 'multipart/form-data' - - -def _basic_auth_str(username, password): - """Returns a Basic Auth string.""" - - # "I want us to put a big-ol' comment on top of it that - # says that this behaviour is dumb but we need to preserve - # it because people are relying on it." - # - Lukasa - # - # These are here solely to maintain backwards compatibility - # for things like ints. This will be removed in 3.0.0. - if not isinstance(username, basestring): - warnings.warn( - "Non-string usernames will no longer be supported in Requests " - "3.0.0. Please convert the object you've passed in ({!r}) to " - "a string or bytes object in the near future to avoid " - "problems.".format(username), - category=DeprecationWarning, - ) - username = str(username) - - if not isinstance(password, basestring): - warnings.warn( - "Non-string passwords will no longer be supported in Requests " - "3.0.0. Please convert the object you've passed in ({!r}) to " - "a string or bytes object in the near future to avoid " - "problems.".format(password), - category=DeprecationWarning, - ) - password = str(password) - # -- End Removal -- - - if isinstance(username, str): - username = username.encode('latin1') - - if isinstance(password, str): - password = password.encode('latin1') - - authstr = 'Basic ' + to_native_string( - b64encode(b':'.join((username, password))).strip() - ) - - return authstr - - -class AuthBase(object): - """Base class that all auth implementations derive from""" - - def __call__(self, r): - raise NotImplementedError('Auth hooks must be callable.') - - -class HTTPBasicAuth(AuthBase): - """Attaches HTTP Basic Authentication to the given Request object.""" - - def __init__(self, username, password): - self.username = username - self.password = password - - def __eq__(self, other): - return all([ - self.username == getattr(other, 'username', None), - self.password == getattr(other, 'password', None) - ]) - - def __ne__(self, other): - return not self == other - - def __call__(self, r): - r.headers['Authorization'] = _basic_auth_str(self.username, self.password) - return r - - -class HTTPProxyAuth(HTTPBasicAuth): - """Attaches HTTP Proxy Authentication to a given Request object.""" - - def __call__(self, r): - r.headers['Proxy-Authorization'] = _basic_auth_str(self.username, self.password) - return r - - -class HTTPDigestAuth(AuthBase): - """Attaches HTTP Digest Authentication to the given Request object.""" - - def __init__(self, username, password): - self.username = username - self.password = password - # Keep state in per-thread local storage - self._thread_local = threading.local() - - def init_per_thread_state(self): - # Ensure state is initialized just once per-thread - if not hasattr(self._thread_local, 'init'): - self._thread_local.init = True - self._thread_local.last_nonce = '' - self._thread_local.nonce_count = 0 - self._thread_local.chal = {} - self._thread_local.pos = None - self._thread_local.num_401_calls = None - - def build_digest_header(self, method, url): - """ - :rtype: str - """ - - realm = self._thread_local.chal['realm'] - nonce = self._thread_local.chal['nonce'] - qop = self._thread_local.chal.get('qop') - algorithm = self._thread_local.chal.get('algorithm') - opaque = self._thread_local.chal.get('opaque') - hash_utf8 = None - - if algorithm is None: - _algorithm = 'MD5' - else: - _algorithm = algorithm.upper() - # lambdas assume digest modules are imported at the top level - if _algorithm == 'MD5' or _algorithm == 'MD5-SESS': - def md5_utf8(x): - if isinstance(x, str): - x = x.encode('utf-8') - return hashlib.md5(x).hexdigest() - hash_utf8 = md5_utf8 - elif _algorithm == 'SHA': - def sha_utf8(x): - if isinstance(x, str): - x = x.encode('utf-8') - return hashlib.sha1(x).hexdigest() - hash_utf8 = sha_utf8 - elif _algorithm == 'SHA-256': - def sha256_utf8(x): - if isinstance(x, str): - x = x.encode('utf-8') - return hashlib.sha256(x).hexdigest() - hash_utf8 = sha256_utf8 - elif _algorithm == 'SHA-512': - def sha512_utf8(x): - if isinstance(x, str): - x = x.encode('utf-8') - return hashlib.sha512(x).hexdigest() - hash_utf8 = sha512_utf8 - - KD = lambda s, d: hash_utf8("%s:%s" % (s, d)) - - if hash_utf8 is None: - return None - - # XXX not implemented yet - entdig = None - p_parsed = urlparse(url) - #: path is request-uri defined in RFC 2616 which should not be empty - path = p_parsed.path or "/" - if p_parsed.query: - path += '?' + p_parsed.query - - A1 = '%s:%s:%s' % (self.username, realm, self.password) - A2 = '%s:%s' % (method, path) - - HA1 = hash_utf8(A1) - HA2 = hash_utf8(A2) - - if nonce == self._thread_local.last_nonce: - self._thread_local.nonce_count += 1 - else: - self._thread_local.nonce_count = 1 - ncvalue = '%08x' % self._thread_local.nonce_count - s = str(self._thread_local.nonce_count).encode('utf-8') - s += nonce.encode('utf-8') - s += time.ctime().encode('utf-8') - s += os.urandom(8) - - cnonce = (hashlib.sha1(s).hexdigest()[:16]) - if _algorithm == 'MD5-SESS': - HA1 = hash_utf8('%s:%s:%s' % (HA1, nonce, cnonce)) - - if not qop: - respdig = KD(HA1, "%s:%s" % (nonce, HA2)) - elif qop == 'auth' or 'auth' in qop.split(','): - noncebit = "%s:%s:%s:%s:%s" % ( - nonce, ncvalue, cnonce, 'auth', HA2 - ) - respdig = KD(HA1, noncebit) - else: - # XXX handle auth-int. - return None - - self._thread_local.last_nonce = nonce - - # XXX should the partial digests be encoded too? - base = 'username="%s", realm="%s", nonce="%s", uri="%s", ' \ - 'response="%s"' % (self.username, realm, nonce, path, respdig) - if opaque: - base += ', opaque="%s"' % opaque - if algorithm: - base += ', algorithm="%s"' % algorithm - if entdig: - base += ', digest="%s"' % entdig - if qop: - base += ', qop="auth", nc=%s, cnonce="%s"' % (ncvalue, cnonce) - - return 'Digest %s' % (base) - - def handle_redirect(self, r, **kwargs): - """Reset num_401_calls counter on redirects.""" - if r.is_redirect: - self._thread_local.num_401_calls = 1 - - def handle_401(self, r, **kwargs): - """ - Takes the given response and tries digest-auth, if needed. - - :rtype: requests.Response - """ - - # If response is not 4xx, do not auth - # See https://github.com/requests/requests/issues/3772 - if not 400 <= r.status_code < 500: - self._thread_local.num_401_calls = 1 - return r - - if self._thread_local.pos is not None: - # Rewind the file position indicator of the body to where - # it was to resend the request. - r.request.body.seek(self._thread_local.pos) - s_auth = r.headers.get('www-authenticate', '') - - if 'digest' in s_auth.lower() and self._thread_local.num_401_calls < 2: - - self._thread_local.num_401_calls += 1 - pat = re.compile(r'digest ', flags=re.IGNORECASE) - self._thread_local.chal = parse_dict_header(pat.sub('', s_auth, count=1)) - - # Consume content and release the original connection - # to allow our new request to reuse the same one. - r.content - r.close() - prep = r.request.copy() - extract_cookies_to_jar(prep._cookies, r.request, r.raw) - prep.prepare_cookies(prep._cookies) - - prep.headers['Authorization'] = self.build_digest_header( - prep.method, prep.url) - _r = r.connection.send(prep, **kwargs) - _r.history.append(r) - _r.request = prep - - return _r - - self._thread_local.num_401_calls = 1 - return r - - def __call__(self, r): - # Initialize per-thread state, if needed - self.init_per_thread_state() - # If we have a saved nonce, skip the 401 - if self._thread_local.last_nonce: - r.headers['Authorization'] = self.build_digest_header(r.method, r.url) - try: - self._thread_local.pos = r.body.tell() - except AttributeError: - # In the case of HTTPDigestAuth being reused and the body of - # the previous request was a file-like object, pos has the - # file position of the previous body. Ensure it's set to - # None. - self._thread_local.pos = None - r.register_hook('response', self.handle_401) - r.register_hook('response', self.handle_redirect) - self._thread_local.num_401_calls = 1 - - return r - - def __eq__(self, other): - return all([ - self.username == getattr(other, 'username', None), - self.password == getattr(other, 'password', None) - ]) - - def __ne__(self, other): - return not self == other diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/auth.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/requests/auth.pyc deleted file mode 100644 index 5f20919280848bda4d3e2988e844c582b0993313..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11699 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 Y?HPL+S_Qw*FnA@mx-hzMc46%Q0sPe~PXGV_ diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/certs.py b/venv/lib/python2.7/site-packages/pip/_vendor/requests/certs.py deleted file mode 100644 index 06a594e..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/requests/certs.py +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -""" -requests.certs -~~~~~~~~~~~~~~ - -This module returns the preferred default CA certificate bundle. There is -only one — the one from the certifi package. - -If you are packaging Requests, e.g., for a Linux distribution or a managed -environment, you can change the definition of where() to return a separately -packaged CA bundle. -""" -from pip._vendor.certifi import where - -if __name__ == '__main__': - print(where()) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/certs.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/requests/certs.pyc deleted file mode 100644 index bbd06716300e185d0b6b643cd760ff2fbe9ce2d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 665 zcmY*X|BBQw5Kg=2DM1gx7nna++-+}B76lPS@CT^Kxqlr<$u`q&*mlxO(!JgLLlj@Z zC-fD30G;M4;y|X8FP(3`8D{e9j(qU#<Z~%TOZoepk6*CULY%Wtgib}1h&C1HsYq}l z^h9h^;pPHU@m+}5Z-{?85}&3whSXPy5YpjAk3RUUL>IjL@}Eh$+87V5)qR8DF!YW* zgbhOHutMihgT_krO@Nm#V4yISDOEsN_oN%lV6{PqV7#={9KaI7&#yls#SmA{w(&Bi zLZ`~Dsxg!DZ3PG0gW~LK&`=F$quLo@R%bJ)tOEt_4E1}^#s_ECeK3|F;;ka)(h_NB zoTU~i%pz&22+ED38e?&8!H~JmtKf1_JiQOWjvaFakDYSdR&$V}LOnD*HYv?-wkeNO zgkiFgA>87qC|YHxC_YS&hR2%`(zYy$aF658bXl=O($>ZK^YG3X7Go}{7K>s!Ape|i z`I>jm>{w5}Q!cM;qtW^NYM&n-x;0&H7t0GeUAjlh^0D7P(O2%2t?u$w&K2i|d{9j@ p4~zG8@o|9S8HMD3HzJQ4k#&ct=IQkkJUij){+QiyayPx5`~fBW$m#$9 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/compat.py b/venv/lib/python2.7/site-packages/pip/_vendor/requests/compat.py deleted file mode 100644 index 6a86893..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/requests/compat.py +++ /dev/null @@ -1,74 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.compat -~~~~~~~~~~~~~~~ - -This module handles import compatibility issues between Python 2 and -Python 3. -""" - -from pip._vendor import chardet - -import sys - -# ------- -# Pythons -# ------- - -# Syntax sugar. -_ver = sys.version_info - -#: Python 2.x? -is_py2 = (_ver[0] == 2) - -#: Python 3.x? -is_py3 = (_ver[0] == 3) - -# Note: We've patched out simplejson support in pip because it prevents -# upgrading simplejson on Windows. -# try: -# import simplejson as json -# except (ImportError, SyntaxError): -# # simplejson does not support Python 3.2, it throws a SyntaxError -# # because of u'...' Unicode literals. -import json - -# --------- -# Specifics -# --------- - -if is_py2: - from urllib import ( - quote, unquote, quote_plus, unquote_plus, urlencode, getproxies, - proxy_bypass, proxy_bypass_environment, getproxies_environment) - from urlparse import urlparse, urlunparse, urljoin, urlsplit, urldefrag - from urllib2 import parse_http_list - import cookielib - from Cookie import Morsel - from StringIO import StringIO - from collections import Callable, Mapping, MutableMapping, OrderedDict - - - builtin_str = str - bytes = str - str = unicode - basestring = basestring - numeric_types = (int, long, float) - integer_types = (int, long) - -elif is_py3: - from urllib.parse import urlparse, urlunparse, urljoin, urlsplit, urlencode, quote, unquote, quote_plus, unquote_plus, urldefrag - from urllib.request import parse_http_list, getproxies, proxy_bypass, proxy_bypass_environment, getproxies_environment - from http import cookiejar as cookielib - from http.cookies import Morsel - from io import StringIO - from collections import OrderedDict - from collections.abc import Callable, Mapping, MutableMapping - - builtin_str = str - str = str - bytes = bytes - basestring = (str, bytes) - numeric_types = (int, float) - integer_types = (int,) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/compat.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/requests/compat.pyc deleted file mode 100644 index 675da4bcf6ccc846dd23d93c29a60533c1d4375c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2003 zcmaJ>+in{-5S^85$(ChHz9vrXMsb=(ZEDGvz-WP@2#}yaAKV0+yp%w(SnX0WZIZht zDaXn~fqrv8pq(M*Ti|pT8gZ_ib2!}UKZ}hQe=q%+!St!(|1132tOAe&Fq9GG6_63A z3a|=9q*p;!fmMN5;dBPrEbv*#XJ9j*g)@w*UF$Wk*L@L8ngccmyawhEU#1Rn9#jKZ z1JnYr1yD_3O;C%#7C|imTLRSr)&kWA)&{i<Y#G!Fu$9op9LQBrtH4mM0b2vL4s0FN z2CxlK4}d)gaq}P_g4zVOdENdaV2^xP4Uk`f+5)x}d<!7AL2U!u4tf*h*PtE)dkm@r ztOM!^uqU8)fbBrUp91>^NInDpEwHD+p96aiybJt0;NQa#d3rHbhe*v2plcDYgGnkx z<RZx3FCz#He2JeMd`lpEQ+)r+R|{kx)E+_i{3G`L&#)id#@_bW15)aC8RX$TT-;&- z@jvri_yqwDTp$s+_CyRL&jJos72bDOXxPqCGz>o<bL(s`D^!`f#$R`zM&rYYupL$8 zW63)wsm>+09ihs?xK2nB10jW*bcD57sWag2Bj>vFZsJY~-8txBPGhPZ_8Q_}e7X^C z?dmA9lhowg{Vs3~0;eAYU54&F3O9@5d|Wv0L&rL-8&}q(lw<3fs7_tMK&fLRxy}l# zOwl9mN>f}4#7WV#o+N`wnOf@}er8Cxz7VF+ifiXK?j+xKb*VQuhXS`MQ)9zUsEl<` z2_34Zh0s@VwnU=bw7;AWO*#rpv@q6ZB`406i4@iaM-3gv1y+|qrw!jbBlPIEx7`_3 zeCgMzl<7bQnvT=5M88|2)UhM`m1zM@Z;@`p^EV=MUE(J8f;=&C6EBh=a50@xOeYf4 ziNv&9OhrBPm|Bjhy_kT;)L2Z&LZ7tCisDT0)6{rVyiQJEiH0v;C9y`fmni%JCrMsp zN#dxPQk1>qg6q66F{<Dw(@w$xUT|YYp%bBpg`>VO(l}~H*rc2s+$;~h`_vZN+weT3 z7~G4@L%s*kz5EajVJ3aS1J8y(*Z>+g@%z2@6vS-|kC!Qjpk;-WJaY)Z#&@ak90jD# z_}IZ%NGEh+QKt?E6Nf|WM@x(A`5vSetuz%r83)e8mIWFpYbcA<IXYQAR@{gzag!1= z$b!Lq#Ld*=FO$dA3sX!;18cqMm%^8(F^%bV_zOiEen05At@C%da5NvckoM9+)<qNC z2&+-;mquKqj`uH8(;pTRhtu{yUG^u3W}rWw?H`@%y(9DTDErY~{*-?*d-#mX{)ave z$ga@V;pp$W{o_&cj!gbHotysEr>!5pQ@wKHZ_Cf&WA+QpsC|Q?R%ut7_4#VM+MaLL kYSF7|H)=;s{I#Q<YAp(HD{570(XSEt!n=h!y-j@o1NX14N&o-= diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/cookies.py b/venv/lib/python2.7/site-packages/pip/_vendor/requests/cookies.py deleted file mode 100644 index 56fccd9..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/requests/cookies.py +++ /dev/null @@ -1,549 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.cookies -~~~~~~~~~~~~~~~~ - -Compatibility code to be able to use `cookielib.CookieJar` with requests. - -requests.utils imports from here, so be careful with imports. -""" - -import copy -import time -import calendar - -from ._internal_utils import to_native_string -from .compat import cookielib, urlparse, urlunparse, Morsel, MutableMapping - -try: - import threading -except ImportError: - import dummy_threading as threading - - -class MockRequest(object): - """Wraps a `requests.Request` to mimic a `urllib2.Request`. - - The code in `cookielib.CookieJar` expects this interface in order to correctly - manage cookie policies, i.e., determine whether a cookie can be set, given the - domains of the request and the cookie. - - The original request object is read-only. The client is responsible for collecting - the new headers via `get_new_headers()` and interpreting them appropriately. You - probably want `get_cookie_header`, defined below. - """ - - def __init__(self, request): - self._r = request - self._new_headers = {} - self.type = urlparse(self._r.url).scheme - - def get_type(self): - return self.type - - def get_host(self): - return urlparse(self._r.url).netloc - - def get_origin_req_host(self): - return self.get_host() - - def get_full_url(self): - # Only return the response's URL if the user hadn't set the Host - # header - if not self._r.headers.get('Host'): - return self._r.url - # If they did set it, retrieve it and reconstruct the expected domain - host = to_native_string(self._r.headers['Host'], encoding='utf-8') - parsed = urlparse(self._r.url) - # Reconstruct the URL as we expect it - return urlunparse([ - parsed.scheme, host, parsed.path, parsed.params, parsed.query, - parsed.fragment - ]) - - def is_unverifiable(self): - return True - - def has_header(self, name): - return name in self._r.headers or name in self._new_headers - - def get_header(self, name, default=None): - return self._r.headers.get(name, self._new_headers.get(name, default)) - - def add_header(self, key, val): - """cookielib has no legitimate use for this method; add it back if you find one.""" - raise NotImplementedError("Cookie headers should be added with add_unredirected_header()") - - def add_unredirected_header(self, name, value): - self._new_headers[name] = value - - def get_new_headers(self): - return self._new_headers - - @property - def unverifiable(self): - return self.is_unverifiable() - - @property - def origin_req_host(self): - return self.get_origin_req_host() - - @property - def host(self): - return self.get_host() - - -class MockResponse(object): - """Wraps a `httplib.HTTPMessage` to mimic a `urllib.addinfourl`. - - ...what? Basically, expose the parsed HTTP headers from the server response - the way `cookielib` expects to see them. - """ - - def __init__(self, headers): - """Make a MockResponse for `cookielib` to read. - - :param headers: a httplib.HTTPMessage or analogous carrying the headers - """ - self._headers = headers - - def info(self): - return self._headers - - def getheaders(self, name): - self._headers.getheaders(name) - - -def extract_cookies_to_jar(jar, request, response): - """Extract the cookies from the response into a CookieJar. - - :param jar: cookielib.CookieJar (not necessarily a RequestsCookieJar) - :param request: our own requests.Request object - :param response: urllib3.HTTPResponse object - """ - if not (hasattr(response, '_original_response') and - response._original_response): - return - # the _original_response field is the wrapped httplib.HTTPResponse object, - req = MockRequest(request) - # pull out the HTTPMessage with the headers and put it in the mock: - res = MockResponse(response._original_response.msg) - jar.extract_cookies(res, req) - - -def get_cookie_header(jar, request): - """ - Produce an appropriate Cookie header string to be sent with `request`, or None. - - :rtype: str - """ - r = MockRequest(request) - jar.add_cookie_header(r) - return r.get_new_headers().get('Cookie') - - -def remove_cookie_by_name(cookiejar, name, domain=None, path=None): - """Unsets a cookie by name, by default over all domains and paths. - - Wraps CookieJar.clear(), is O(n). - """ - clearables = [] - for cookie in cookiejar: - if cookie.name != name: - continue - if domain is not None and domain != cookie.domain: - continue - if path is not None and path != cookie.path: - continue - clearables.append((cookie.domain, cookie.path, cookie.name)) - - for domain, path, name in clearables: - cookiejar.clear(domain, path, name) - - -class CookieConflictError(RuntimeError): - """There are two cookies that meet the criteria specified in the cookie jar. - Use .get and .set and include domain and path args in order to be more specific. - """ - - -class RequestsCookieJar(cookielib.CookieJar, MutableMapping): - """Compatibility class; is a cookielib.CookieJar, but exposes a dict - interface. - - This is the CookieJar we create by default for requests and sessions that - don't specify one, since some clients may expect response.cookies and - session.cookies to support dict operations. - - Requests does not use the dict interface internally; it's just for - compatibility with external client code. All requests code should work - out of the box with externally provided instances of ``CookieJar``, e.g. - ``LWPCookieJar`` and ``FileCookieJar``. - - Unlike a regular CookieJar, this class is pickleable. - - .. warning:: dictionary operations that are normally O(1) may be O(n). - """ - - def get(self, name, default=None, domain=None, path=None): - """Dict-like get() that also supports optional domain and path args in - order to resolve naming collisions from using one cookie jar over - multiple domains. - - .. warning:: operation is O(n), not O(1). - """ - try: - return self._find_no_duplicates(name, domain, path) - except KeyError: - return default - - def set(self, name, value, **kwargs): - """Dict-like set() that also supports optional domain and path args in - order to resolve naming collisions from using one cookie jar over - multiple domains. - """ - # support client code that unsets cookies by assignment of a None value: - if value is None: - remove_cookie_by_name(self, name, domain=kwargs.get('domain'), path=kwargs.get('path')) - return - - if isinstance(value, Morsel): - c = morsel_to_cookie(value) - else: - c = create_cookie(name, value, **kwargs) - self.set_cookie(c) - return c - - def iterkeys(self): - """Dict-like iterkeys() that returns an iterator of names of cookies - from the jar. - - .. seealso:: itervalues() and iteritems(). - """ - for cookie in iter(self): - yield cookie.name - - def keys(self): - """Dict-like keys() that returns a list of names of cookies from the - jar. - - .. seealso:: values() and items(). - """ - return list(self.iterkeys()) - - def itervalues(self): - """Dict-like itervalues() that returns an iterator of values of cookies - from the jar. - - .. seealso:: iterkeys() and iteritems(). - """ - for cookie in iter(self): - yield cookie.value - - def values(self): - """Dict-like values() that returns a list of values of cookies from the - jar. - - .. seealso:: keys() and items(). - """ - return list(self.itervalues()) - - def iteritems(self): - """Dict-like iteritems() that returns an iterator of name-value tuples - from the jar. - - .. seealso:: iterkeys() and itervalues(). - """ - for cookie in iter(self): - yield cookie.name, cookie.value - - def items(self): - """Dict-like items() that returns a list of name-value tuples from the - jar. Allows client-code to call ``dict(RequestsCookieJar)`` and get a - vanilla python dict of key value pairs. - - .. seealso:: keys() and values(). - """ - return list(self.iteritems()) - - def list_domains(self): - """Utility method to list all the domains in the jar.""" - domains = [] - for cookie in iter(self): - if cookie.domain not in domains: - domains.append(cookie.domain) - return domains - - def list_paths(self): - """Utility method to list all the paths in the jar.""" - paths = [] - for cookie in iter(self): - if cookie.path not in paths: - paths.append(cookie.path) - return paths - - def multiple_domains(self): - """Returns True if there are multiple domains in the jar. - Returns False otherwise. - - :rtype: bool - """ - domains = [] - for cookie in iter(self): - if cookie.domain is not None and cookie.domain in domains: - return True - domains.append(cookie.domain) - return False # there is only one domain in jar - - def get_dict(self, domain=None, path=None): - """Takes as an argument an optional domain and path and returns a plain - old Python dict of name-value pairs of cookies that meet the - requirements. - - :rtype: dict - """ - dictionary = {} - for cookie in iter(self): - if ( - (domain is None or cookie.domain == domain) and - (path is None or cookie.path == path) - ): - dictionary[cookie.name] = cookie.value - return dictionary - - def __contains__(self, name): - try: - return super(RequestsCookieJar, self).__contains__(name) - except CookieConflictError: - return True - - def __getitem__(self, name): - """Dict-like __getitem__() for compatibility with client code. Throws - exception if there are more than one cookie with name. In that case, - use the more explicit get() method instead. - - .. warning:: operation is O(n), not O(1). - """ - return self._find_no_duplicates(name) - - def __setitem__(self, name, value): - """Dict-like __setitem__ for compatibility with client code. Throws - exception if there is already a cookie of that name in the jar. In that - case, use the more explicit set() method instead. - """ - self.set(name, value) - - def __delitem__(self, name): - """Deletes a cookie given a name. Wraps ``cookielib.CookieJar``'s - ``remove_cookie_by_name()``. - """ - remove_cookie_by_name(self, name) - - def set_cookie(self, cookie, *args, **kwargs): - if hasattr(cookie.value, 'startswith') and cookie.value.startswith('"') and cookie.value.endswith('"'): - cookie.value = cookie.value.replace('\\"', '') - return super(RequestsCookieJar, self).set_cookie(cookie, *args, **kwargs) - - def update(self, other): - """Updates this jar with cookies from another CookieJar or dict-like""" - if isinstance(other, cookielib.CookieJar): - for cookie in other: - self.set_cookie(copy.copy(cookie)) - else: - super(RequestsCookieJar, self).update(other) - - def _find(self, name, domain=None, path=None): - """Requests uses this method internally to get cookie values. - - If there are conflicting cookies, _find arbitrarily chooses one. - See _find_no_duplicates if you want an exception thrown if there are - conflicting cookies. - - :param name: a string containing name of cookie - :param domain: (optional) string containing domain of cookie - :param path: (optional) string containing path of cookie - :return: cookie.value - """ - for cookie in iter(self): - if cookie.name == name: - if domain is None or cookie.domain == domain: - if path is None or cookie.path == path: - return cookie.value - - raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path)) - - def _find_no_duplicates(self, name, domain=None, path=None): - """Both ``__get_item__`` and ``get`` call this function: it's never - used elsewhere in Requests. - - :param name: a string containing name of cookie - :param domain: (optional) string containing domain of cookie - :param path: (optional) string containing path of cookie - :raises KeyError: if cookie is not found - :raises CookieConflictError: if there are multiple cookies - that match name and optionally domain and path - :return: cookie.value - """ - toReturn = None - for cookie in iter(self): - if cookie.name == name: - if domain is None or cookie.domain == domain: - if path is None or cookie.path == path: - if toReturn is not None: # if there are multiple cookies that meet passed in criteria - raise CookieConflictError('There are multiple cookies with name, %r' % (name)) - toReturn = cookie.value # we will eventually return this as long as no cookie conflict - - if toReturn: - return toReturn - raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path)) - - def __getstate__(self): - """Unlike a normal CookieJar, this class is pickleable.""" - state = self.__dict__.copy() - # remove the unpickleable RLock object - state.pop('_cookies_lock') - return state - - def __setstate__(self, state): - """Unlike a normal CookieJar, this class is pickleable.""" - self.__dict__.update(state) - if '_cookies_lock' not in self.__dict__: - self._cookies_lock = threading.RLock() - - def copy(self): - """Return a copy of this RequestsCookieJar.""" - new_cj = RequestsCookieJar() - new_cj.set_policy(self.get_policy()) - new_cj.update(self) - return new_cj - - def get_policy(self): - """Return the CookiePolicy instance used.""" - return self._policy - - -def _copy_cookie_jar(jar): - if jar is None: - return None - - if hasattr(jar, 'copy'): - # We're dealing with an instance of RequestsCookieJar - return jar.copy() - # We're dealing with a generic CookieJar instance - new_jar = copy.copy(jar) - new_jar.clear() - for cookie in jar: - new_jar.set_cookie(copy.copy(cookie)) - return new_jar - - -def create_cookie(name, value, **kwargs): - """Make a cookie from underspecified parameters. - - By default, the pair of `name` and `value` will be set for the domain '' - and sent on every request (this is sometimes called a "supercookie"). - """ - result = { - 'version': 0, - 'name': name, - 'value': value, - 'port': None, - 'domain': '', - 'path': '/', - 'secure': False, - 'expires': None, - 'discard': True, - 'comment': None, - 'comment_url': None, - 'rest': {'HttpOnly': None}, - 'rfc2109': False, - } - - badargs = set(kwargs) - set(result) - if badargs: - err = 'create_cookie() got unexpected keyword arguments: %s' - raise TypeError(err % list(badargs)) - - result.update(kwargs) - result['port_specified'] = bool(result['port']) - result['domain_specified'] = bool(result['domain']) - result['domain_initial_dot'] = result['domain'].startswith('.') - result['path_specified'] = bool(result['path']) - - return cookielib.Cookie(**result) - - -def morsel_to_cookie(morsel): - """Convert a Morsel object into a Cookie containing the one k/v pair.""" - - expires = None - if morsel['max-age']: - try: - expires = int(time.time() + int(morsel['max-age'])) - except ValueError: - raise TypeError('max-age: %s must be integer' % morsel['max-age']) - elif morsel['expires']: - time_template = '%a, %d-%b-%Y %H:%M:%S GMT' - expires = calendar.timegm( - time.strptime(morsel['expires'], time_template) - ) - return create_cookie( - comment=morsel['comment'], - comment_url=bool(morsel['comment']), - discard=False, - domain=morsel['domain'], - expires=expires, - name=morsel.key, - path=morsel['path'], - port=None, - rest={'HttpOnly': morsel['httponly']}, - rfc2109=False, - secure=bool(morsel['secure']), - value=morsel.value, - version=morsel['version'] or 0, - ) - - -def cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True): - """Returns a CookieJar from a key/value dictionary. - - :param cookie_dict: Dict of key/values to insert into CookieJar. - :param cookiejar: (optional) A cookiejar to add the cookies to. - :param overwrite: (optional) If False, will not replace cookies - already in the jar with new ones. - :rtype: CookieJar - """ - if cookiejar is None: - cookiejar = RequestsCookieJar() - - if cookie_dict is not None: - names_from_jar = [cookie.name for cookie in cookiejar] - for name in cookie_dict: - if overwrite or (name not in names_from_jar): - cookiejar.set_cookie(create_cookie(name, cookie_dict[name])) - - return cookiejar - - -def merge_cookies(cookiejar, cookies): - """Add cookies to cookiejar and returns a merged CookieJar. - - :param cookiejar: CookieJar object to add the cookies to. - :param cookies: Dictionary or CookieJar object to be added. - :rtype: CookieJar - """ - if not isinstance(cookiejar, cookielib.CookieJar): - raise ValueError('You can only merge into CookieJar') - - if isinstance(cookies, dict): - cookiejar = cookiejar_from_dict( - cookies, cookiejar=cookiejar, overwrite=False) - elif isinstance(cookies, cookielib.CookieJar): - try: - cookiejar.update(cookies) - except AttributeError: - for cookie_in_jar in cookies: - cookiejar.set_cookie(cookie_in_jar) - - return cookiejar diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/cookies.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/requests/cookies.pyc deleted file mode 100644 index 7df645cb669a900eb63cc05cd229730da7e94201..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25235 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 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/exceptions.py b/venv/lib/python2.7/site-packages/pip/_vendor/requests/exceptions.py deleted file mode 100644 index a91e1fd..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/requests/exceptions.py +++ /dev/null @@ -1,126 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.exceptions -~~~~~~~~~~~~~~~~~~~ - -This module contains the set of Requests' exceptions. -""" -from pip._vendor.urllib3.exceptions import HTTPError as BaseHTTPError - - -class RequestException(IOError): - """There was an ambiguous exception that occurred while handling your - request. - """ - - def __init__(self, *args, **kwargs): - """Initialize RequestException with `request` and `response` objects.""" - response = kwargs.pop('response', None) - self.response = response - self.request = kwargs.pop('request', None) - if (response is not None and not self.request and - hasattr(response, 'request')): - self.request = self.response.request - super(RequestException, self).__init__(*args, **kwargs) - - -class HTTPError(RequestException): - """An HTTP error occurred.""" - - -class ConnectionError(RequestException): - """A Connection error occurred.""" - - -class ProxyError(ConnectionError): - """A proxy error occurred.""" - - -class SSLError(ConnectionError): - """An SSL error occurred.""" - - -class Timeout(RequestException): - """The request timed out. - - Catching this error will catch both - :exc:`~requests.exceptions.ConnectTimeout` and - :exc:`~requests.exceptions.ReadTimeout` errors. - """ - - -class ConnectTimeout(ConnectionError, Timeout): - """The request timed out while trying to connect to the remote server. - - Requests that produced this error are safe to retry. - """ - - -class ReadTimeout(Timeout): - """The server did not send any data in the allotted amount of time.""" - - -class URLRequired(RequestException): - """A valid URL is required to make a request.""" - - -class TooManyRedirects(RequestException): - """Too many redirects.""" - - -class MissingSchema(RequestException, ValueError): - """The URL schema (e.g. http or https) is missing.""" - - -class InvalidSchema(RequestException, ValueError): - """See defaults.py for valid schemas.""" - - -class InvalidURL(RequestException, ValueError): - """The URL provided was somehow invalid.""" - - -class InvalidHeader(RequestException, ValueError): - """The header value provided was somehow invalid.""" - - -class InvalidProxyURL(InvalidURL): - """The proxy URL provided is invalid.""" - - -class ChunkedEncodingError(RequestException): - """The server declared chunked encoding but sent an invalid chunk.""" - - -class ContentDecodingError(RequestException, BaseHTTPError): - """Failed to decode response content""" - - -class StreamConsumedError(RequestException, TypeError): - """The content for this response was already consumed""" - - -class RetryError(RequestException): - """Custom retries logic failed""" - - -class UnrewindableBodyError(RequestException): - """Requests encountered an error when trying to rewind a body""" - -# Warnings - - -class RequestsWarning(Warning): - """Base warning for Requests.""" - pass - - -class FileModeWarning(RequestsWarning, DeprecationWarning): - """A file was opened in text mode, but Requests determined its binary length.""" - pass - - -class RequestsDependencyWarning(RequestsWarning): - """An imported dependency doesn't match the expected version range.""" - pass diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/exceptions.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/requests/exceptions.pyc deleted file mode 100644 index f1cf504049c85e8e8f3c3d05ea5b99d99fc480c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8345 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 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/help.py b/venv/lib/python2.7/site-packages/pip/_vendor/requests/help.py deleted file mode 100644 index 3c3072b..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/requests/help.py +++ /dev/null @@ -1,119 +0,0 @@ -"""Module containing bug report helper(s).""" -from __future__ import print_function - -import json -import platform -import sys -import ssl - -from pip._vendor import idna -from pip._vendor import urllib3 -from pip._vendor import chardet - -from . import __version__ as requests_version - -try: - from pip._vendor.urllib3.contrib import pyopenssl -except ImportError: - pyopenssl = None - OpenSSL = None - cryptography = None -else: - import OpenSSL - import cryptography - - -def _implementation(): - """Return a dict with the Python implementation and version. - - Provide both the name and the version of the Python implementation - currently running. For example, on CPython 2.7.5 it will return - {'name': 'CPython', 'version': '2.7.5'}. - - This function works best on CPython and PyPy: in particular, it probably - doesn't work for Jython or IronPython. Future investigation should be done - to work out the correct shape of the code for those platforms. - """ - implementation = platform.python_implementation() - - if implementation == 'CPython': - implementation_version = platform.python_version() - elif implementation == 'PyPy': - implementation_version = '%s.%s.%s' % (sys.pypy_version_info.major, - sys.pypy_version_info.minor, - sys.pypy_version_info.micro) - if sys.pypy_version_info.releaselevel != 'final': - implementation_version = ''.join([ - implementation_version, sys.pypy_version_info.releaselevel - ]) - elif implementation == 'Jython': - implementation_version = platform.python_version() # Complete Guess - elif implementation == 'IronPython': - implementation_version = platform.python_version() # Complete Guess - else: - implementation_version = 'Unknown' - - return {'name': implementation, 'version': implementation_version} - - -def info(): - """Generate information for a bug report.""" - try: - platform_info = { - 'system': platform.system(), - 'release': platform.release(), - } - except IOError: - platform_info = { - 'system': 'Unknown', - 'release': 'Unknown', - } - - implementation_info = _implementation() - urllib3_info = {'version': urllib3.__version__} - chardet_info = {'version': chardet.__version__} - - pyopenssl_info = { - 'version': None, - 'openssl_version': '', - } - if OpenSSL: - pyopenssl_info = { - 'version': OpenSSL.__version__, - 'openssl_version': '%x' % OpenSSL.SSL.OPENSSL_VERSION_NUMBER, - } - cryptography_info = { - 'version': getattr(cryptography, '__version__', ''), - } - idna_info = { - 'version': getattr(idna, '__version__', ''), - } - - system_ssl = ssl.OPENSSL_VERSION_NUMBER - system_ssl_info = { - 'version': '%x' % system_ssl if system_ssl is not None else '' - } - - return { - 'platform': platform_info, - 'implementation': implementation_info, - 'system_ssl': system_ssl_info, - 'using_pyopenssl': pyopenssl is not None, - 'pyOpenSSL': pyopenssl_info, - 'urllib3': urllib3_info, - 'chardet': chardet_info, - 'cryptography': cryptography_info, - 'idna': idna_info, - 'requests': { - 'version': requests_version, - }, - } - - -def main(): - """Pretty-print the bug information as JSON.""" - print(json.dumps(info(), sort_keys=True, indent=2)) - - -if __name__ == '__main__': - main() diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/help.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/requests/help.pyc deleted file mode 100644 index df2a75c039adb5453734f90610e7257658307672..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3572 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 S;SK!SJXdSI)f%=|*41|iKu+TT diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/hooks.py b/venv/lib/python2.7/site-packages/pip/_vendor/requests/hooks.py deleted file mode 100644 index 7a51f21..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/requests/hooks.py +++ /dev/null @@ -1,34 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.hooks -~~~~~~~~~~~~~~ - -This module provides the capabilities for the Requests hooks system. - -Available hooks: - -``response``: - The response generated from a Request. -""" -HOOKS = ['response'] - - -def default_hooks(): - return {event: [] for event in HOOKS} - -# TODO: response is the only one - - -def dispatch_hook(key, hooks, hook_data, **kwargs): - """Dispatches a hook dictionary on a given piece of data.""" - hooks = hooks or {} - hooks = hooks.get(key) - if hooks: - if hasattr(hooks, '__call__'): - hooks = [hooks] - for hook in hooks: - _hook_data = hook(hook_data, **kwargs) - if _hook_data is not None: - hook_data = _hook_data - return hook_data diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/hooks.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/requests/hooks.pyc deleted file mode 100644 index 13b2e21d0f6df73423db4895f234875ae52df6d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1398 zcmc&!UuzRV5T8rh*c|<%B8YGMA_S$m7By%oMQI;|Vk&7tD3r_gZj-D@?ykGrG%2Yd z_0=aoiJ#3c;BPjm)h}R|o8Rrt%+AfsZ|=&!R>J3BS5Fd}uK@SA5c?F65*-5r>IQTi zP+FpI(3B`G`%RhB1v;!Pvina!Xw=!cvd-3fdEU3-mw#3m9`&>p!#q77C{dVvq*G;u z>nV}QLZ0e@b{dLKZoINJ4<>vtVJFt9VLc4rjiesPQ^fFwtuSo2jj~0aS=DZDg#zmc zL2q=Tt1@MzQ>o~fd?=)tN3Mr%30dFx{b@l7%3ZE$6@cPVvm@HO4p1xGnh7_FcMFh1 zh<yUkL{p-ZHM&B-un*`*iOwoG1S8FW4>^YVhU2!Wk;>ey-43CP3Zq9zHyTM3b@D-~ zjEyeG(d30W%`W<zjk9c{VO}<p*LM6Sy)+wG-6A@Q3SF%0%sM$3th>z*-S{J`yu^4< znw#i`pvbqbUQBF=H*TjoaY;Tbb{^u%a(-2+agjdB_Xh|2e-{Bg{r^ne3SOJ4jyxZ@ z*r)%1^WbDDNXozpgc;d~*f9VU6jkO0j9~xS69gJ(kH(SndQf~_BD2jt7<5=OqVX$! z+&g(jR|_=7RibH`zQepo(?$Li`c*Q!yuSj?yL^4ZIrtscI2+pl>}gv_m-H~!(vPd) zR_i>IW+L(o%B}`AqR=W)BJYS)I$8H)8OI5TjN_({<~U?mId>2Dp0v_A<G9#no~asF z?mhZy;wkg}aaH!kml$(Y$4>nVX}Z=QWP@Y&eKWnwT@K=m-g&!xN{^A7eFUJ=a<CRu zAj`pu$NNFE#>M+?#BrJ@aopk#wOHF)1Kif)cXu$aOUPn-_P5*N*|khSC8(CGmEY4@ BWUv4L diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/models.py b/venv/lib/python2.7/site-packages/pip/_vendor/requests/models.py deleted file mode 100644 index 0839957..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/requests/models.py +++ /dev/null @@ -1,953 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.models -~~~~~~~~~~~~~~~ - -This module contains the primary objects that power Requests. -""" - -import datetime -import sys - -# Import encoding now, to avoid implicit import later. -# Implicit import within threads may cause LookupError when standard library is in a ZIP, -# such as in Embedded Python. See https://github.com/requests/requests/issues/3578. -import encodings.idna - -from pip._vendor.urllib3.fields import RequestField -from pip._vendor.urllib3.filepost import encode_multipart_formdata -from pip._vendor.urllib3.util import parse_url -from pip._vendor.urllib3.exceptions import ( - DecodeError, ReadTimeoutError, ProtocolError, LocationParseError) - -from io import UnsupportedOperation -from .hooks import default_hooks -from .structures import CaseInsensitiveDict - -from .auth import HTTPBasicAuth -from .cookies import cookiejar_from_dict, get_cookie_header, _copy_cookie_jar -from .exceptions import ( - HTTPError, MissingSchema, InvalidURL, ChunkedEncodingError, - ContentDecodingError, ConnectionError, StreamConsumedError) -from ._internal_utils import to_native_string, unicode_is_ascii -from .utils import ( - guess_filename, get_auth_from_url, requote_uri, - stream_decode_response_unicode, to_key_val_list, parse_header_links, - iter_slices, guess_json_utf, super_len, check_header_validity) -from .compat import ( - Callable, Mapping, - cookielib, urlunparse, urlsplit, urlencode, str, bytes, - is_py2, chardet, builtin_str, basestring) -from .compat import json as complexjson -from .status_codes import codes - -#: The set of HTTP status codes that indicate an automatically -#: processable redirect. -REDIRECT_STATI = ( - codes.moved, # 301 - codes.found, # 302 - codes.other, # 303 - codes.temporary_redirect, # 307 - codes.permanent_redirect, # 308 -) - -DEFAULT_REDIRECT_LIMIT = 30 -CONTENT_CHUNK_SIZE = 10 * 1024 -ITER_CHUNK_SIZE = 512 - - -class RequestEncodingMixin(object): - @property - def path_url(self): - """Build the path URL to use.""" - - url = [] - - p = urlsplit(self.url) - - path = p.path - if not path: - path = '/' - - url.append(path) - - query = p.query - if query: - url.append('?') - url.append(query) - - return ''.join(url) - - @staticmethod - def _encode_params(data): - """Encode parameters in a piece of data. - - Will successfully encode parameters when passed as a dict or a list of - 2-tuples. Order is retained if data is a list of 2-tuples but arbitrary - if parameters are supplied as a dict. - """ - - if isinstance(data, (str, bytes)): - return data - elif hasattr(data, 'read'): - return data - elif hasattr(data, '__iter__'): - result = [] - for k, vs in to_key_val_list(data): - if isinstance(vs, basestring) or not hasattr(vs, '__iter__'): - vs = [vs] - for v in vs: - if v is not None: - result.append( - (k.encode('utf-8') if isinstance(k, str) else k, - v.encode('utf-8') if isinstance(v, str) else v)) - return urlencode(result, doseq=True) - else: - return data - - @staticmethod - def _encode_files(files, data): - """Build the body for a multipart/form-data request. - - Will successfully encode files when passed as a dict or a list of - tuples. Order is retained if data is a list of tuples but arbitrary - if parameters are supplied as a dict. - The tuples may be 2-tuples (filename, fileobj), 3-tuples (filename, fileobj, contentype) - or 4-tuples (filename, fileobj, contentype, custom_headers). - """ - if (not files): - raise ValueError("Files must be provided.") - elif isinstance(data, basestring): - raise ValueError("Data must not be a string.") - - new_fields = [] - fields = to_key_val_list(data or {}) - files = to_key_val_list(files or {}) - - for field, val in fields: - if isinstance(val, basestring) or not hasattr(val, '__iter__'): - val = [val] - for v in val: - if v is not None: - # Don't call str() on bytestrings: in Py3 it all goes wrong. - if not isinstance(v, bytes): - v = str(v) - - new_fields.append( - (field.decode('utf-8') if isinstance(field, bytes) else field, - v.encode('utf-8') if isinstance(v, str) else v)) - - for (k, v) in files: - # support for explicit filename - ft = None - fh = None - if isinstance(v, (tuple, list)): - if len(v) == 2: - fn, fp = v - elif len(v) == 3: - fn, fp, ft = v - else: - fn, fp, ft, fh = v - else: - fn = guess_filename(v) or k - fp = v - - if isinstance(fp, (str, bytes, bytearray)): - fdata = fp - elif hasattr(fp, 'read'): - fdata = fp.read() - elif fp is None: - continue - else: - fdata = fp - - rf = RequestField(name=k, data=fdata, filename=fn, headers=fh) - rf.make_multipart(content_type=ft) - new_fields.append(rf) - - body, content_type = encode_multipart_formdata(new_fields) - - return body, content_type - - -class RequestHooksMixin(object): - def register_hook(self, event, hook): - """Properly register a hook.""" - - if event not in self.hooks: - raise ValueError('Unsupported event specified, with event name "%s"' % (event)) - - if isinstance(hook, Callable): - self.hooks[event].append(hook) - elif hasattr(hook, '__iter__'): - self.hooks[event].extend(h for h in hook if isinstance(h, Callable)) - - def deregister_hook(self, event, hook): - """Deregister a previously registered hook. - Returns True if the hook existed, False if not. - """ - - try: - self.hooks[event].remove(hook) - return True - except ValueError: - return False - - -class Request(RequestHooksMixin): - """A user-created :class:`Request <Request>` object. - - Used to prepare a :class:`PreparedRequest <PreparedRequest>`, which is sent to the server. - - :param method: HTTP method to use. - :param url: URL to send. - :param headers: dictionary of headers to send. - :param files: dictionary of {filename: fileobject} files to multipart upload. - :param data: the body to attach to the request. If a dictionary or - list of tuples ``[(key, value)]`` is provided, form-encoding will - take place. - :param json: json for the body to attach to the request (if files or data is not specified). - :param params: URL parameters to append to the URL. If a dictionary or - list of tuples ``[(key, value)]`` is provided, form-encoding will - take place. - :param auth: Auth handler or (user, pass) tuple. - :param cookies: dictionary or CookieJar of cookies to attach to this request. - :param hooks: dictionary of callback hooks, for internal usage. - - Usage:: - - >>> import requests - >>> req = requests.Request('GET', 'https://httpbin.org/get') - >>> req.prepare() - <PreparedRequest [GET]> - """ - - def __init__(self, - method=None, url=None, headers=None, files=None, data=None, - params=None, auth=None, cookies=None, hooks=None, json=None): - - # Default empty dicts for dict params. - data = [] if data is None else data - files = [] if files is None else files - headers = {} if headers is None else headers - params = {} if params is None else params - hooks = {} if hooks is None else hooks - - self.hooks = default_hooks() - for (k, v) in list(hooks.items()): - self.register_hook(event=k, hook=v) - - self.method = method - self.url = url - self.headers = headers - self.files = files - self.data = data - self.json = json - self.params = params - self.auth = auth - self.cookies = cookies - - def __repr__(self): - return '<Request [%s]>' % (self.method) - - def prepare(self): - """Constructs a :class:`PreparedRequest <PreparedRequest>` for transmission and returns it.""" - p = PreparedRequest() - p.prepare( - method=self.method, - url=self.url, - headers=self.headers, - files=self.files, - data=self.data, - json=self.json, - params=self.params, - auth=self.auth, - cookies=self.cookies, - hooks=self.hooks, - ) - return p - - -class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): - """The fully mutable :class:`PreparedRequest <PreparedRequest>` object, - containing the exact bytes that will be sent to the server. - - Generated from either a :class:`Request <Request>` object or manually. - - Usage:: - - >>> import requests - >>> req = requests.Request('GET', 'https://httpbin.org/get') - >>> r = req.prepare() - <PreparedRequest [GET]> - - >>> s = requests.Session() - >>> s.send(r) - <Response [200]> - """ - - def __init__(self): - #: HTTP verb to send to the server. - self.method = None - #: HTTP URL to send the request to. - self.url = None - #: dictionary of HTTP headers. - self.headers = None - # The `CookieJar` used to create the Cookie header will be stored here - # after prepare_cookies is called - self._cookies = None - #: request body to send to the server. - self.body = None - #: dictionary of callback hooks, for internal usage. - self.hooks = default_hooks() - #: integer denoting starting position of a readable file-like body. - self._body_position = None - - def prepare(self, - method=None, url=None, headers=None, files=None, data=None, - params=None, auth=None, cookies=None, hooks=None, json=None): - """Prepares the entire request with the given parameters.""" - - self.prepare_method(method) - self.prepare_url(url, params) - self.prepare_headers(headers) - self.prepare_cookies(cookies) - self.prepare_body(data, files, json) - self.prepare_auth(auth, url) - - # Note that prepare_auth must be last to enable authentication schemes - # such as OAuth to work on a fully prepared request. - - # This MUST go after prepare_auth. Authenticators could add a hook - self.prepare_hooks(hooks) - - def __repr__(self): - return '<PreparedRequest [%s]>' % (self.method) - - def copy(self): - p = PreparedRequest() - p.method = self.method - p.url = self.url - p.headers = self.headers.copy() if self.headers is not None else None - p._cookies = _copy_cookie_jar(self._cookies) - p.body = self.body - p.hooks = self.hooks - p._body_position = self._body_position - return p - - def prepare_method(self, method): - """Prepares the given HTTP method.""" - self.method = method - if self.method is not None: - self.method = to_native_string(self.method.upper()) - - @staticmethod - def _get_idna_encoded_host(host): - from pip._vendor import idna - - try: - host = idna.encode(host, uts46=True).decode('utf-8') - except idna.IDNAError: - raise UnicodeError - return host - - def prepare_url(self, url, params): - """Prepares the given HTTP URL.""" - #: Accept objects that have string representations. - #: We're unable to blindly call unicode/str functions - #: as this will include the bytestring indicator (b'') - #: on python 3.x. - #: https://github.com/requests/requests/pull/2238 - if isinstance(url, bytes): - url = url.decode('utf8') - else: - url = unicode(url) if is_py2 else str(url) - - # Remove leading whitespaces from url - url = url.lstrip() - - # Don't do any URL preparation for non-HTTP schemes like `mailto`, - # `data` etc to work around exceptions from `url_parse`, which - # handles RFC 3986 only. - if ':' in url and not url.lower().startswith('http'): - self.url = url - return - - # Support for unicode domain names and paths. - try: - scheme, auth, host, port, path, query, fragment = parse_url(url) - except LocationParseError as e: - raise InvalidURL(*e.args) - - if not scheme: - error = ("Invalid URL {0!r}: No schema supplied. Perhaps you meant http://{0}?") - error = error.format(to_native_string(url, 'utf8')) - - raise MissingSchema(error) - - if not host: - raise InvalidURL("Invalid URL %r: No host supplied" % url) - - # In general, we want to try IDNA encoding the hostname if the string contains - # non-ASCII characters. This allows users to automatically get the correct IDNA - # behaviour. For strings containing only ASCII characters, we need to also verify - # it doesn't start with a wildcard (*), before allowing the unencoded hostname. - if not unicode_is_ascii(host): - try: - host = self._get_idna_encoded_host(host) - except UnicodeError: - raise InvalidURL('URL has an invalid label.') - elif host.startswith(u'*'): - raise InvalidURL('URL has an invalid label.') - - # Carefully reconstruct the network location - netloc = auth or '' - if netloc: - netloc += '@' - netloc += host - if port: - netloc += ':' + str(port) - - # Bare domains aren't valid URLs. - if not path: - path = '/' - - if is_py2: - if isinstance(scheme, str): - scheme = scheme.encode('utf-8') - if isinstance(netloc, str): - netloc = netloc.encode('utf-8') - if isinstance(path, str): - path = path.encode('utf-8') - if isinstance(query, str): - query = query.encode('utf-8') - if isinstance(fragment, str): - fragment = fragment.encode('utf-8') - - if isinstance(params, (str, bytes)): - params = to_native_string(params) - - enc_params = self._encode_params(params) - if enc_params: - if query: - query = '%s&%s' % (query, enc_params) - else: - query = enc_params - - url = requote_uri(urlunparse([scheme, netloc, path, None, query, fragment])) - self.url = url - - def prepare_headers(self, headers): - """Prepares the given HTTP headers.""" - - self.headers = CaseInsensitiveDict() - if headers: - for header in headers.items(): - # Raise exception on invalid header value. - check_header_validity(header) - name, value = header - self.headers[to_native_string(name)] = value - - def prepare_body(self, data, files, json=None): - """Prepares the given HTTP body data.""" - - # Check if file, fo, generator, iterator. - # If not, run through normal process. - - # Nottin' on you. - body = None - content_type = None - - if not data and json is not None: - # urllib3 requires a bytes-like body. Python 2's json.dumps - # provides this natively, but Python 3 gives a Unicode string. - content_type = 'application/json' - body = complexjson.dumps(json) - if not isinstance(body, bytes): - body = body.encode('utf-8') - - is_stream = all([ - hasattr(data, '__iter__'), - not isinstance(data, (basestring, list, tuple, Mapping)) - ]) - - try: - length = super_len(data) - except (TypeError, AttributeError, UnsupportedOperation): - length = None - - if is_stream: - body = data - - if getattr(body, 'tell', None) is not None: - # Record the current file position before reading. - # This will allow us to rewind a file in the event - # of a redirect. - try: - self._body_position = body.tell() - except (IOError, OSError): - # This differentiates from None, allowing us to catch - # a failed `tell()` later when trying to rewind the body - self._body_position = object() - - if files: - raise NotImplementedError('Streamed bodies and files are mutually exclusive.') - - if length: - self.headers['Content-Length'] = builtin_str(length) - else: - self.headers['Transfer-Encoding'] = 'chunked' - else: - # Multi-part file uploads. - if files: - (body, content_type) = self._encode_files(files, data) - else: - if data: - body = self._encode_params(data) - if isinstance(data, basestring) or hasattr(data, 'read'): - content_type = None - else: - content_type = 'application/x-www-form-urlencoded' - - self.prepare_content_length(body) - - # Add content-type if it wasn't explicitly provided. - if content_type and ('content-type' not in self.headers): - self.headers['Content-Type'] = content_type - - self.body = body - - def prepare_content_length(self, body): - """Prepare Content-Length header based on request method and body""" - if body is not None: - length = super_len(body) - if length: - # If length exists, set it. Otherwise, we fallback - # to Transfer-Encoding: chunked. - self.headers['Content-Length'] = builtin_str(length) - elif self.method not in ('GET', 'HEAD') and self.headers.get('Content-Length') is None: - # Set Content-Length to 0 for methods that can have a body - # but don't provide one. (i.e. not GET or HEAD) - self.headers['Content-Length'] = '0' - - def prepare_auth(self, auth, url=''): - """Prepares the given HTTP auth data.""" - - # If no Auth is explicitly provided, extract it from the URL first. - if auth is None: - url_auth = get_auth_from_url(self.url) - auth = url_auth if any(url_auth) else None - - if auth: - if isinstance(auth, tuple) and len(auth) == 2: - # special-case basic HTTP auth - auth = HTTPBasicAuth(*auth) - - # Allow auth to make its changes. - r = auth(self) - - # Update self to reflect the auth changes. - self.__dict__.update(r.__dict__) - - # Recompute Content-Length - self.prepare_content_length(self.body) - - def prepare_cookies(self, cookies): - """Prepares the given HTTP cookie data. - - This function eventually generates a ``Cookie`` header from the - given cookies using cookielib. Due to cookielib's design, the header - will not be regenerated if it already exists, meaning this function - can only be called once for the life of the - :class:`PreparedRequest <PreparedRequest>` object. Any subsequent calls - to ``prepare_cookies`` will have no actual effect, unless the "Cookie" - header is removed beforehand. - """ - if isinstance(cookies, cookielib.CookieJar): - self._cookies = cookies - else: - self._cookies = cookiejar_from_dict(cookies) - - cookie_header = get_cookie_header(self._cookies, self) - if cookie_header is not None: - self.headers['Cookie'] = cookie_header - - def prepare_hooks(self, hooks): - """Prepares the given hooks.""" - # hooks can be passed as None to the prepare method and to this - # method. To prevent iterating over None, simply use an empty list - # if hooks is False-y - hooks = hooks or [] - for event in hooks: - self.register_hook(event, hooks[event]) - - -class Response(object): - """The :class:`Response <Response>` object, which contains a - server's response to an HTTP request. - """ - - __attrs__ = [ - '_content', 'status_code', 'headers', 'url', 'history', - 'encoding', 'reason', 'cookies', 'elapsed', 'request' - ] - - def __init__(self): - self._content = False - self._content_consumed = False - self._next = None - - #: Integer Code of responded HTTP Status, e.g. 404 or 200. - self.status_code = None - - #: Case-insensitive Dictionary of Response Headers. - #: For example, ``headers['content-encoding']`` will return the - #: value of a ``'Content-Encoding'`` response header. - self.headers = CaseInsensitiveDict() - - #: File-like object representation of response (for advanced usage). - #: Use of ``raw`` requires that ``stream=True`` be set on the request. - # This requirement does not apply for use internally to Requests. - self.raw = None - - #: Final URL location of Response. - self.url = None - - #: Encoding to decode with when accessing r.text. - self.encoding = None - - #: A list of :class:`Response <Response>` objects from - #: the history of the Request. Any redirect responses will end - #: up here. The list is sorted from the oldest to the most recent request. - self.history = [] - - #: Textual reason of responded HTTP Status, e.g. "Not Found" or "OK". - self.reason = None - - #: A CookieJar of Cookies the server sent back. - self.cookies = cookiejar_from_dict({}) - - #: The amount of time elapsed between sending the request - #: and the arrival of the response (as a timedelta). - #: This property specifically measures the time taken between sending - #: the first byte of the request and finishing parsing the headers. It - #: is therefore unaffected by consuming the response content or the - #: value of the ``stream`` keyword argument. - self.elapsed = datetime.timedelta(0) - - #: The :class:`PreparedRequest <PreparedRequest>` object to which this - #: is a response. - self.request = None - - def __enter__(self): - return self - - def __exit__(self, *args): - self.close() - - def __getstate__(self): - # Consume everything; accessing the content attribute makes - # sure the content has been fully read. - if not self._content_consumed: - self.content - - return {attr: getattr(self, attr, None) for attr in self.__attrs__} - - def __setstate__(self, state): - for name, value in state.items(): - setattr(self, name, value) - - # pickled objects do not have .raw - setattr(self, '_content_consumed', True) - setattr(self, 'raw', None) - - def __repr__(self): - return '<Response [%s]>' % (self.status_code) - - def __bool__(self): - """Returns True if :attr:`status_code` is less than 400. - - This attribute checks if the status code of the response is between - 400 and 600 to see if there was a client error or a server error. If - the status code, is between 200 and 400, this will return True. This - is **not** a check to see if the response code is ``200 OK``. - """ - return self.ok - - def __nonzero__(self): - """Returns True if :attr:`status_code` is less than 400. - - This attribute checks if the status code of the response is between - 400 and 600 to see if there was a client error or a server error. If - the status code, is between 200 and 400, this will return True. This - is **not** a check to see if the response code is ``200 OK``. - """ - return self.ok - - def __iter__(self): - """Allows you to use a response as an iterator.""" - return self.iter_content(128) - - @property - def ok(self): - """Returns True if :attr:`status_code` is less than 400, False if not. - - This attribute checks if the status code of the response is between - 400 and 600 to see if there was a client error or a server error. If - the status code is between 200 and 400, this will return True. This - is **not** a check to see if the response code is ``200 OK``. - """ - try: - self.raise_for_status() - except HTTPError: - return False - return True - - @property - def is_redirect(self): - """True if this Response is a well-formed HTTP redirect that could have - been processed automatically (by :meth:`Session.resolve_redirects`). - """ - return ('location' in self.headers and self.status_code in REDIRECT_STATI) - - @property - def is_permanent_redirect(self): - """True if this Response one of the permanent versions of redirect.""" - return ('location' in self.headers and self.status_code in (codes.moved_permanently, codes.permanent_redirect)) - - @property - def next(self): - """Returns a PreparedRequest for the next request in a redirect chain, if there is one.""" - return self._next - - @property - def apparent_encoding(self): - """The apparent encoding, provided by the chardet library.""" - return chardet.detect(self.content)['encoding'] - - def iter_content(self, chunk_size=1, decode_unicode=False): - """Iterates over the response data. When stream=True is set on the - request, this avoids reading the content at once into memory for - large responses. The chunk size is the number of bytes it should - read into memory. This is not necessarily the length of each item - returned as decoding can take place. - - chunk_size must be of type int or None. A value of None will - function differently depending on the value of `stream`. - stream=True will read data as it arrives in whatever size the - chunks are received. If stream=False, data is returned as - a single chunk. - - If decode_unicode is True, content will be decoded using the best - available encoding based on the response. - """ - - def generate(): - # Special case for urllib3. - if hasattr(self.raw, 'stream'): - try: - for chunk in self.raw.stream(chunk_size, decode_content=True): - yield chunk - except ProtocolError as e: - raise ChunkedEncodingError(e) - except DecodeError as e: - raise ContentDecodingError(e) - except ReadTimeoutError as e: - raise ConnectionError(e) - else: - # Standard file-like object. - while True: - chunk = self.raw.read(chunk_size) - if not chunk: - break - yield chunk - - self._content_consumed = True - - if self._content_consumed and isinstance(self._content, bool): - raise StreamConsumedError() - elif chunk_size is not None and not isinstance(chunk_size, int): - raise TypeError("chunk_size must be an int, it is instead a %s." % type(chunk_size)) - # simulate reading small chunks of the content - reused_chunks = iter_slices(self._content, chunk_size) - - stream_chunks = generate() - - chunks = reused_chunks if self._content_consumed else stream_chunks - - if decode_unicode: - chunks = stream_decode_response_unicode(chunks, self) - - return chunks - - def iter_lines(self, chunk_size=ITER_CHUNK_SIZE, decode_unicode=False, delimiter=None): - """Iterates over the response data, one line at a time. When - stream=True is set on the request, this avoids reading the - content at once into memory for large responses. - - .. note:: This method is not reentrant safe. - """ - - pending = None - - for chunk in self.iter_content(chunk_size=chunk_size, decode_unicode=decode_unicode): - - if pending is not None: - chunk = pending + chunk - - if delimiter: - lines = chunk.split(delimiter) - else: - lines = chunk.splitlines() - - if lines and lines[-1] and chunk and lines[-1][-1] == chunk[-1]: - pending = lines.pop() - else: - pending = None - - for line in lines: - yield line - - if pending is not None: - yield pending - - @property - def content(self): - """Content of the response, in bytes.""" - - if self._content is False: - # Read the contents. - if self._content_consumed: - raise RuntimeError( - 'The content for this response was already consumed') - - if self.status_code == 0 or self.raw is None: - self._content = None - else: - self._content = b''.join(self.iter_content(CONTENT_CHUNK_SIZE)) or b'' - - self._content_consumed = True - # don't need to release the connection; that's been handled by urllib3 - # since we exhausted the data. - return self._content - - @property - def text(self): - """Content of the response, in unicode. - - If Response.encoding is None, encoding will be guessed using - ``chardet``. - - The encoding of the response content is determined based solely on HTTP - headers, following RFC 2616 to the letter. If you can take advantage of - non-HTTP knowledge to make a better guess at the encoding, you should - set ``r.encoding`` appropriately before accessing this property. - """ - - # Try charset from content-type - content = None - encoding = self.encoding - - if not self.content: - return str('') - - # Fallback to auto-detected encoding. - if self.encoding is None: - encoding = self.apparent_encoding - - # Decode unicode from given encoding. - try: - content = str(self.content, encoding, errors='replace') - except (LookupError, TypeError): - # A LookupError is raised if the encoding was not found which could - # indicate a misspelling or similar mistake. - # - # A TypeError can be raised if encoding is None - # - # So we try blindly encoding. - content = str(self.content, errors='replace') - - return content - - def json(self, **kwargs): - r"""Returns the json-encoded content of a response, if any. - - :param \*\*kwargs: Optional arguments that ``json.loads`` takes. - :raises ValueError: If the response body does not contain valid json. - """ - - if not self.encoding and self.content and len(self.content) > 3: - # No encoding set. JSON RFC 4627 section 3 states we should expect - # UTF-8, -16 or -32. Detect which one to use; If the detection or - # decoding fails, fall back to `self.text` (using chardet to make - # a best guess). - encoding = guess_json_utf(self.content) - if encoding is not None: - try: - return complexjson.loads( - self.content.decode(encoding), **kwargs - ) - except UnicodeDecodeError: - # Wrong UTF codec detected; usually because it's not UTF-8 - # but some other 8-bit codec. This is an RFC violation, - # and the server didn't bother to tell us what codec *was* - # used. - pass - return complexjson.loads(self.text, **kwargs) - - @property - def links(self): - """Returns the parsed header links of the response, if any.""" - - header = self.headers.get('link') - - # l = MultiDict() - l = {} - - if header: - links = parse_header_links(header) - - for link in links: - key = link.get('rel') or link.get('url') - l[key] = link - - return l - - def raise_for_status(self): - """Raises stored :class:`HTTPError`, if one occurred.""" - - http_error_msg = '' - if isinstance(self.reason, bytes): - # We attempt to decode utf-8 first because some servers - # choose to localize their reason strings. If the string - # isn't utf-8, we fall back to iso-8859-1 for all other - # encodings. (See PR #3538) - try: - reason = self.reason.decode('utf-8') - except UnicodeDecodeError: - reason = self.reason.decode('iso-8859-1') - else: - reason = self.reason - - if 400 <= self.status_code < 500: - http_error_msg = u'%s Client Error: %s for url: %s' % (self.status_code, reason, self.url) - - elif 500 <= self.status_code < 600: - http_error_msg = u'%s Server Error: %s for url: %s' % (self.status_code, reason, self.url) - - if http_error_msg: - raise HTTPError(http_error_msg, response=self) - - def close(self): - """Releases the connection back to the pool. Once this method has been - called the underlying ``raw`` object must not be accessed again. - - *Note: Should not normally need to be called explicitly.* - """ - if not self._content_consumed: - self.raw.close() - - release_conn = getattr(self.raw, 'release_conn', None) - if release_conn is not None: - release_conn() diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/models.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/requests/models.pyc deleted file mode 100644 index e2fa51c43d1ba6c6518d9e12573c766902111363..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31863 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 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/packages.py b/venv/lib/python2.7/site-packages/pip/_vendor/requests/packages.py deleted file mode 100644 index 9582fa7..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/requests/packages.py +++ /dev/null @@ -1,16 +0,0 @@ -import sys - -# This code exists for backwards compatibility reasons. -# I don't like it either. Just look the other way. :) - -for package in ('urllib3', 'idna', 'chardet'): - vendored_package = "pip._vendor." + package - locals()[package] = __import__(vendored_package) - # This traversal is apparently necessary such that the identities are - # preserved (requests.packages.urllib3.* is urllib3.*) - for mod in list(sys.modules): - if mod == vendored_package or mod.startswith(vendored_package + '.'): - unprefixed_mod = mod[len("pip._vendor."):] - sys.modules['pip._vendor.requests.packages.' + unprefixed_mod] = sys.modules[mod] - -# Kinda cool, though, right? diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/packages.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/requests/packages.pyc deleted file mode 100644 index 3eff32abb2bfbf925409ac35ec6289de17487508..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 643 zcmZ9IQA->#5XUEXdY)SqLGb8{z8(}eisi6y6d%O57QuqBa4c~X&v<b+m&~1ezKIV$ z_B-?|_5-w&++JH6CfVdSGyj>L_RsC)!^_U7fM#{*drsT`phJ=|FaQ}q{T*Z%E=F&V zF_7z^81%9hs5Yn;yfRR0@CtzrYXOS<01utuxENhQwgHN)1(O!|Nw`0B!&7#kM<MPq zx;KL^JrA>_NvFW~OCd?=3G{~3OCY<M?!gVUcHQ5kHuW!BUvY!3GiQvxJ;k+vWho*o z?uC;I{T4y1ZJN(jDJz#EBar%o|FBcjneymUD~gF2E1&k;6ypEU_bdGf8~y$}iozJW z@Ud_sfV<>a)>JZI!GvI*>qlET%ySHbH&r2wkIftHF={+ka%QNVpi6fQX&!|`|D^Fg zVxvmjAv`OsQ+K+iA{5yt0)G#0>B+6rbAgJ_h2wXXk;-}gT=T`LyDgt4CxdBuJa8We z#hI@^$!B*=Yi#*9PGdXLCDk?N2v5F@^Q(a3Zl=jsW8;6uW*69{qQm7cd=At0q0g=L OZI-aT_C7mgyX-ebYn_4s diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/sessions.py b/venv/lib/python2.7/site-packages/pip/_vendor/requests/sessions.py deleted file mode 100644 index d73d700..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/requests/sessions.py +++ /dev/null @@ -1,770 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.session -~~~~~~~~~~~~~~~~ - -This module provides a Session object to manage and persist settings across -requests (cookies, auth, proxies). -""" -import os -import sys -import time -from datetime import timedelta - -from .auth import _basic_auth_str -from .compat import cookielib, is_py3, OrderedDict, urljoin, urlparse, Mapping -from .cookies import ( - cookiejar_from_dict, extract_cookies_to_jar, RequestsCookieJar, merge_cookies) -from .models import Request, PreparedRequest, DEFAULT_REDIRECT_LIMIT -from .hooks import default_hooks, dispatch_hook -from ._internal_utils import to_native_string -from .utils import to_key_val_list, default_headers, DEFAULT_PORTS -from .exceptions import ( - TooManyRedirects, InvalidSchema, ChunkedEncodingError, ContentDecodingError) - -from .structures import CaseInsensitiveDict -from .adapters import HTTPAdapter - -from .utils import ( - requote_uri, get_environ_proxies, get_netrc_auth, should_bypass_proxies, - get_auth_from_url, rewind_body -) - -from .status_codes import codes - -# formerly defined here, reexposed here for backward compatibility -from .models import REDIRECT_STATI - -# Preferred clock, based on which one is more accurate on a given system. -if sys.platform == 'win32': - try: # Python 3.4+ - preferred_clock = time.perf_counter - except AttributeError: # Earlier than Python 3. - preferred_clock = time.clock -else: - preferred_clock = time.time - - -def merge_setting(request_setting, session_setting, dict_class=OrderedDict): - """Determines appropriate setting for a given request, taking into account - the explicit setting on that request, and the setting in the session. If a - setting is a dictionary, they will be merged together using `dict_class` - """ - - if session_setting is None: - return request_setting - - if request_setting is None: - return session_setting - - # Bypass if not a dictionary (e.g. verify) - if not ( - isinstance(session_setting, Mapping) and - isinstance(request_setting, Mapping) - ): - return request_setting - - merged_setting = dict_class(to_key_val_list(session_setting)) - merged_setting.update(to_key_val_list(request_setting)) - - # Remove keys that are set to None. Extract keys first to avoid altering - # the dictionary during iteration. - none_keys = [k for (k, v) in merged_setting.items() if v is None] - for key in none_keys: - del merged_setting[key] - - return merged_setting - - -def merge_hooks(request_hooks, session_hooks, dict_class=OrderedDict): - """Properly merges both requests and session hooks. - - This is necessary because when request_hooks == {'response': []}, the - merge breaks Session hooks entirely. - """ - if session_hooks is None or session_hooks.get('response') == []: - return request_hooks - - if request_hooks is None or request_hooks.get('response') == []: - return session_hooks - - return merge_setting(request_hooks, session_hooks, dict_class) - - -class SessionRedirectMixin(object): - - def get_redirect_target(self, resp): - """Receives a Response. Returns a redirect URI or ``None``""" - # Due to the nature of how requests processes redirects this method will - # be called at least once upon the original response and at least twice - # on each subsequent redirect response (if any). - # If a custom mixin is used to handle this logic, it may be advantageous - # to cache the redirect location onto the response object as a private - # attribute. - if resp.is_redirect: - location = resp.headers['location'] - # Currently the underlying http module on py3 decode headers - # in latin1, but empirical evidence suggests that latin1 is very - # rarely used with non-ASCII characters in HTTP headers. - # It is more likely to get UTF8 header rather than latin1. - # This causes incorrect handling of UTF8 encoded location headers. - # To solve this, we re-encode the location in latin1. - if is_py3: - location = location.encode('latin1') - return to_native_string(location, 'utf8') - return None - - def should_strip_auth(self, old_url, new_url): - """Decide whether Authorization header should be removed when redirecting""" - old_parsed = urlparse(old_url) - new_parsed = urlparse(new_url) - if old_parsed.hostname != new_parsed.hostname: - return True - # Special case: allow http -> https redirect when using the standard - # ports. This isn't specified by RFC 7235, but is kept to avoid - # breaking backwards compatibility with older versions of requests - # that allowed any redirects on the same host. - if (old_parsed.scheme == 'http' and old_parsed.port in (80, None) - and new_parsed.scheme == 'https' and new_parsed.port in (443, None)): - return False - - # Handle default port usage corresponding to scheme. - changed_port = old_parsed.port != new_parsed.port - changed_scheme = old_parsed.scheme != new_parsed.scheme - default_port = (DEFAULT_PORTS.get(old_parsed.scheme, None), None) - if (not changed_scheme and old_parsed.port in default_port - and new_parsed.port in default_port): - return False - - # Standard case: root URI must match - return changed_port or changed_scheme - - def resolve_redirects(self, resp, req, stream=False, timeout=None, - verify=True, cert=None, proxies=None, yield_requests=False, **adapter_kwargs): - """Receives a Response. Returns a generator of Responses or Requests.""" - - hist = [] # keep track of history - - url = self.get_redirect_target(resp) - previous_fragment = urlparse(req.url).fragment - while url: - prepared_request = req.copy() - - # Update history and keep track of redirects. - # resp.history must ignore the original request in this loop - hist.append(resp) - resp.history = hist[1:] - - try: - resp.content # Consume socket so it can be released - except (ChunkedEncodingError, ContentDecodingError, RuntimeError): - resp.raw.read(decode_content=False) - - if len(resp.history) >= self.max_redirects: - raise TooManyRedirects('Exceeded %s redirects.' % self.max_redirects, response=resp) - - # Release the connection back into the pool. - resp.close() - - # Handle redirection without scheme (see: RFC 1808 Section 4) - if url.startswith('//'): - parsed_rurl = urlparse(resp.url) - url = '%s:%s' % (to_native_string(parsed_rurl.scheme), url) - - # Normalize url case and attach previous fragment if needed (RFC 7231 7.1.2) - parsed = urlparse(url) - if parsed.fragment == '' and previous_fragment: - parsed = parsed._replace(fragment=previous_fragment) - elif parsed.fragment: - previous_fragment = parsed.fragment - url = parsed.geturl() - - # Facilitate relative 'location' headers, as allowed by RFC 7231. - # (e.g. '/path/to/resource' instead of 'http://domain.tld/path/to/resource') - # Compliant with RFC3986, we percent encode the url. - if not parsed.netloc: - url = urljoin(resp.url, requote_uri(url)) - else: - url = requote_uri(url) - - prepared_request.url = to_native_string(url) - - self.rebuild_method(prepared_request, resp) - - # https://github.com/requests/requests/issues/1084 - if resp.status_code not in (codes.temporary_redirect, codes.permanent_redirect): - # https://github.com/requests/requests/issues/3490 - purged_headers = ('Content-Length', 'Content-Type', 'Transfer-Encoding') - for header in purged_headers: - prepared_request.headers.pop(header, None) - prepared_request.body = None - - headers = prepared_request.headers - try: - del headers['Cookie'] - except KeyError: - pass - - # Extract any cookies sent on the response to the cookiejar - # in the new request. Because we've mutated our copied prepared - # request, use the old one that we haven't yet touched. - extract_cookies_to_jar(prepared_request._cookies, req, resp.raw) - merge_cookies(prepared_request._cookies, self.cookies) - prepared_request.prepare_cookies(prepared_request._cookies) - - # Rebuild auth and proxy information. - proxies = self.rebuild_proxies(prepared_request, proxies) - self.rebuild_auth(prepared_request, resp) - - # A failed tell() sets `_body_position` to `object()`. This non-None - # value ensures `rewindable` will be True, allowing us to raise an - # UnrewindableBodyError, instead of hanging the connection. - rewindable = ( - prepared_request._body_position is not None and - ('Content-Length' in headers or 'Transfer-Encoding' in headers) - ) - - # Attempt to rewind consumed file-like object. - if rewindable: - rewind_body(prepared_request) - - # Override the original request. - req = prepared_request - - if yield_requests: - yield req - else: - - resp = self.send( - req, - stream=stream, - timeout=timeout, - verify=verify, - cert=cert, - proxies=proxies, - allow_redirects=False, - **adapter_kwargs - ) - - extract_cookies_to_jar(self.cookies, prepared_request, resp.raw) - - # extract redirect url, if any, for the next loop - url = self.get_redirect_target(resp) - yield resp - - def rebuild_auth(self, prepared_request, response): - """When being redirected we may want to strip authentication from the - request to avoid leaking credentials. This method intelligently removes - and reapplies authentication where possible to avoid credential loss. - """ - headers = prepared_request.headers - url = prepared_request.url - - if 'Authorization' in headers and self.should_strip_auth(response.request.url, url): - # If we get redirected to a new host, we should strip out any - # authentication headers. - del headers['Authorization'] - - # .netrc might have more auth for us on our new host. - new_auth = get_netrc_auth(url) if self.trust_env else None - if new_auth is not None: - prepared_request.prepare_auth(new_auth) - - return - - def rebuild_proxies(self, prepared_request, proxies): - """This method re-evaluates the proxy configuration by considering the - environment variables. If we are redirected to a URL covered by - NO_PROXY, we strip the proxy configuration. Otherwise, we set missing - proxy keys for this URL (in case they were stripped by a previous - redirect). - - This method also replaces the Proxy-Authorization header where - necessary. - - :rtype: dict - """ - proxies = proxies if proxies is not None else {} - headers = prepared_request.headers - url = prepared_request.url - scheme = urlparse(url).scheme - new_proxies = proxies.copy() - no_proxy = proxies.get('no_proxy') - - bypass_proxy = should_bypass_proxies(url, no_proxy=no_proxy) - if self.trust_env and not bypass_proxy: - environ_proxies = get_environ_proxies(url, no_proxy=no_proxy) - - proxy = environ_proxies.get(scheme, environ_proxies.get('all')) - - if proxy: - new_proxies.setdefault(scheme, proxy) - - if 'Proxy-Authorization' in headers: - del headers['Proxy-Authorization'] - - try: - username, password = get_auth_from_url(new_proxies[scheme]) - except KeyError: - username, password = None, None - - if username and password: - headers['Proxy-Authorization'] = _basic_auth_str(username, password) - - return new_proxies - - def rebuild_method(self, prepared_request, response): - """When being redirected we may want to change the method of the request - based on certain specs or browser behavior. - """ - method = prepared_request.method - - # https://tools.ietf.org/html/rfc7231#section-6.4.4 - if response.status_code == codes.see_other and method != 'HEAD': - method = 'GET' - - # Do what the browsers do, despite standards... - # First, turn 302s into GETs. - if response.status_code == codes.found and method != 'HEAD': - method = 'GET' - - # Second, if a POST is responded to with a 301, turn it into a GET. - # This bizarre behaviour is explained in Issue 1704. - if response.status_code == codes.moved and method == 'POST': - method = 'GET' - - prepared_request.method = method - - -class Session(SessionRedirectMixin): - """A Requests session. - - Provides cookie persistence, connection-pooling, and configuration. - - Basic Usage:: - - >>> import requests - >>> s = requests.Session() - >>> s.get('https://httpbin.org/get') - <Response [200]> - - Or as a context manager:: - - >>> with requests.Session() as s: - >>> s.get('https://httpbin.org/get') - <Response [200]> - """ - - __attrs__ = [ - 'headers', 'cookies', 'auth', 'proxies', 'hooks', 'params', 'verify', - 'cert', 'prefetch', 'adapters', 'stream', 'trust_env', - 'max_redirects', - ] - - def __init__(self): - - #: A case-insensitive dictionary of headers to be sent on each - #: :class:`Request <Request>` sent from this - #: :class:`Session <Session>`. - self.headers = default_headers() - - #: Default Authentication tuple or object to attach to - #: :class:`Request <Request>`. - self.auth = None - - #: Dictionary mapping protocol or protocol and host to the URL of the proxy - #: (e.g. {'http': 'foo.bar:3128', 'http://host.name': 'foo.bar:4012'}) to - #: be used on each :class:`Request <Request>`. - self.proxies = {} - - #: Event-handling hooks. - self.hooks = default_hooks() - - #: Dictionary of querystring data to attach to each - #: :class:`Request <Request>`. The dictionary values may be lists for - #: representing multivalued query parameters. - self.params = {} - - #: Stream response content default. - self.stream = False - - #: SSL Verification default. - self.verify = True - - #: SSL client certificate default, if String, path to ssl client - #: cert file (.pem). If Tuple, ('cert', 'key') pair. - self.cert = None - - #: Maximum number of redirects allowed. If the request exceeds this - #: limit, a :class:`TooManyRedirects` exception is raised. - #: This defaults to requests.models.DEFAULT_REDIRECT_LIMIT, which is - #: 30. - self.max_redirects = DEFAULT_REDIRECT_LIMIT - - #: Trust environment settings for proxy configuration, default - #: authentication and similar. - self.trust_env = True - - #: A CookieJar containing all currently outstanding cookies set on this - #: session. By default it is a - #: :class:`RequestsCookieJar <requests.cookies.RequestsCookieJar>`, but - #: may be any other ``cookielib.CookieJar`` compatible object. - self.cookies = cookiejar_from_dict({}) - - # Default connection adapters. - self.adapters = OrderedDict() - self.mount('https://', HTTPAdapter()) - self.mount('http://', HTTPAdapter()) - - def __enter__(self): - return self - - def __exit__(self, *args): - self.close() - - def prepare_request(self, request): - """Constructs a :class:`PreparedRequest <PreparedRequest>` for - transmission and returns it. The :class:`PreparedRequest` has settings - merged from the :class:`Request <Request>` instance and those of the - :class:`Session`. - - :param request: :class:`Request` instance to prepare with this - session's settings. - :rtype: requests.PreparedRequest - """ - cookies = request.cookies or {} - - # Bootstrap CookieJar. - if not isinstance(cookies, cookielib.CookieJar): - cookies = cookiejar_from_dict(cookies) - - # Merge with session cookies - merged_cookies = merge_cookies( - merge_cookies(RequestsCookieJar(), self.cookies), cookies) - - # Set environment's basic authentication if not explicitly set. - auth = request.auth - if self.trust_env and not auth and not self.auth: - auth = get_netrc_auth(request.url) - - p = PreparedRequest() - p.prepare( - method=request.method.upper(), - url=request.url, - files=request.files, - data=request.data, - json=request.json, - headers=merge_setting(request.headers, self.headers, dict_class=CaseInsensitiveDict), - params=merge_setting(request.params, self.params), - auth=merge_setting(auth, self.auth), - cookies=merged_cookies, - hooks=merge_hooks(request.hooks, self.hooks), - ) - return p - - def request(self, method, url, - params=None, data=None, headers=None, cookies=None, files=None, - auth=None, timeout=None, allow_redirects=True, proxies=None, - hooks=None, stream=None, verify=None, cert=None, json=None): - """Constructs a :class:`Request <Request>`, prepares it and sends it. - Returns :class:`Response <Response>` object. - - :param method: method for the new :class:`Request` object. - :param url: URL for the new :class:`Request` object. - :param params: (optional) Dictionary or bytes to be sent in the query - string for the :class:`Request`. - :param data: (optional) Dictionary, list of tuples, bytes, or file-like - object to send in the body of the :class:`Request`. - :param json: (optional) json to send in the body of the - :class:`Request`. - :param headers: (optional) Dictionary of HTTP Headers to send with the - :class:`Request`. - :param cookies: (optional) Dict or CookieJar object to send with the - :class:`Request`. - :param files: (optional) Dictionary of ``'filename': file-like-objects`` - for multipart encoding upload. - :param auth: (optional) Auth tuple or callable to enable - Basic/Digest/Custom HTTP Auth. - :param timeout: (optional) How long to wait for the server to send - data before giving up, as a float, or a :ref:`(connect timeout, - read timeout) <timeouts>` tuple. - :type timeout: float or tuple - :param allow_redirects: (optional) Set to True by default. - :type allow_redirects: bool - :param proxies: (optional) Dictionary mapping protocol or protocol and - hostname to the URL of the proxy. - :param stream: (optional) whether to immediately download the response - content. Defaults to ``False``. - :param verify: (optional) Either a boolean, in which case it controls whether we verify - the server's TLS certificate, or a string, in which case it must be a path - to a CA bundle to use. Defaults to ``True``. - :param cert: (optional) if String, path to ssl client cert file (.pem). - If Tuple, ('cert', 'key') pair. - :rtype: requests.Response - """ - # Create the Request. - req = Request( - method=method.upper(), - url=url, - headers=headers, - files=files, - data=data or {}, - json=json, - params=params or {}, - auth=auth, - cookies=cookies, - hooks=hooks, - ) - prep = self.prepare_request(req) - - proxies = proxies or {} - - settings = self.merge_environment_settings( - prep.url, proxies, stream, verify, cert - ) - - # Send the request. - send_kwargs = { - 'timeout': timeout, - 'allow_redirects': allow_redirects, - } - send_kwargs.update(settings) - resp = self.send(prep, **send_kwargs) - - return resp - - def get(self, url, **kwargs): - r"""Sends a GET request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :rtype: requests.Response - """ - - kwargs.setdefault('allow_redirects', True) - return self.request('GET', url, **kwargs) - - def options(self, url, **kwargs): - r"""Sends a OPTIONS request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :rtype: requests.Response - """ - - kwargs.setdefault('allow_redirects', True) - return self.request('OPTIONS', url, **kwargs) - - def head(self, url, **kwargs): - r"""Sends a HEAD request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :rtype: requests.Response - """ - - kwargs.setdefault('allow_redirects', False) - return self.request('HEAD', url, **kwargs) - - def post(self, url, data=None, json=None, **kwargs): - r"""Sends a POST request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, list of tuples, bytes, or file-like - object to send in the body of the :class:`Request`. - :param json: (optional) json to send in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :rtype: requests.Response - """ - - return self.request('POST', url, data=data, json=json, **kwargs) - - def put(self, url, data=None, **kwargs): - r"""Sends a PUT request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, list of tuples, bytes, or file-like - object to send in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :rtype: requests.Response - """ - - return self.request('PUT', url, data=data, **kwargs) - - def patch(self, url, data=None, **kwargs): - r"""Sends a PATCH request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, list of tuples, bytes, or file-like - object to send in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :rtype: requests.Response - """ - - return self.request('PATCH', url, data=data, **kwargs) - - def delete(self, url, **kwargs): - r"""Sends a DELETE request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :rtype: requests.Response - """ - - return self.request('DELETE', url, **kwargs) - - def send(self, request, **kwargs): - """Send a given PreparedRequest. - - :rtype: requests.Response - """ - # Set defaults that the hooks can utilize to ensure they always have - # the correct parameters to reproduce the previous request. - kwargs.setdefault('stream', self.stream) - kwargs.setdefault('verify', self.verify) - kwargs.setdefault('cert', self.cert) - kwargs.setdefault('proxies', self.proxies) - - # It's possible that users might accidentally send a Request object. - # Guard against that specific failure case. - if isinstance(request, Request): - raise ValueError('You can only send PreparedRequests.') - - # Set up variables needed for resolve_redirects and dispatching of hooks - allow_redirects = kwargs.pop('allow_redirects', True) - stream = kwargs.get('stream') - hooks = request.hooks - - # Get the appropriate adapter to use - adapter = self.get_adapter(url=request.url) - - # Start time (approximately) of the request - start = preferred_clock() - - # Send the request - r = adapter.send(request, **kwargs) - - # Total elapsed time of the request (approximately) - elapsed = preferred_clock() - start - r.elapsed = timedelta(seconds=elapsed) - - # Response manipulation hooks - r = dispatch_hook('response', hooks, r, **kwargs) - - # Persist cookies - if r.history: - - # If the hooks create history then we want those cookies too - for resp in r.history: - extract_cookies_to_jar(self.cookies, resp.request, resp.raw) - - extract_cookies_to_jar(self.cookies, request, r.raw) - - # Redirect resolving generator. - gen = self.resolve_redirects(r, request, **kwargs) - - # Resolve redirects if allowed. - history = [resp for resp in gen] if allow_redirects else [] - - # Shuffle things around if there's history. - if history: - # Insert the first (original) request at the start - history.insert(0, r) - # Get the last request made - r = history.pop() - r.history = history - - # If redirects aren't being followed, store the response on the Request for Response.next(). - if not allow_redirects: - try: - r._next = next(self.resolve_redirects(r, request, yield_requests=True, **kwargs)) - except StopIteration: - pass - - if not stream: - r.content - - return r - - def merge_environment_settings(self, url, proxies, stream, verify, cert): - """ - Check the environment and merge it with some settings. - - :rtype: dict - """ - # Gather clues from the surrounding environment. - if self.trust_env: - # Set environment's proxies. - no_proxy = proxies.get('no_proxy') if proxies is not None else None - env_proxies = get_environ_proxies(url, no_proxy=no_proxy) - for (k, v) in env_proxies.items(): - proxies.setdefault(k, v) - - # Look for requests environment configuration and be compatible - # with cURL. - if verify is True or verify is None: - verify = (os.environ.get('REQUESTS_CA_BUNDLE') or - os.environ.get('CURL_CA_BUNDLE')) - - # Merge all the kwargs. - proxies = merge_setting(proxies, self.proxies) - stream = merge_setting(stream, self.stream) - verify = merge_setting(verify, self.verify) - cert = merge_setting(cert, self.cert) - - return {'verify': verify, 'proxies': proxies, 'stream': stream, - 'cert': cert} - - def get_adapter(self, url): - """ - Returns the appropriate connection adapter for the given URL. - - :rtype: requests.adapters.BaseAdapter - """ - for (prefix, adapter) in self.adapters.items(): - - if url.lower().startswith(prefix.lower()): - return adapter - - # Nothing matches :-/ - raise InvalidSchema("No connection adapters were found for '%s'" % url) - - def close(self): - """Closes all adapters and as such the session""" - for v in self.adapters.values(): - v.close() - - def mount(self, prefix, adapter): - """Registers a connection adapter to a prefix. - - Adapters are sorted in descending order by prefix length. - """ - self.adapters[prefix] = adapter - keys_to_move = [k for k in self.adapters if len(k) < len(prefix)] - - for key in keys_to_move: - self.adapters[key] = self.adapters.pop(key) - - def __getstate__(self): - state = {attr: getattr(self, attr, None) for attr in self.__attrs__} - return state - - def __setstate__(self, state): - for attr, value in state.items(): - setattr(self, attr, value) - - -def session(): - """ - Returns a :class:`Session` for context-management. - - .. deprecated:: 1.0.0 - - This method has been deprecated since version 1.0.0 and is only kept for - backwards compatibility. New code should use :class:`~requests.sessions.Session` - to create a session. This may be removed at a future date. - - :rtype: Session - """ - return Session() diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/sessions.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/requests/sessions.pyc deleted file mode 100644 index e00c13bc561101a4fcd999555298ea208570dd9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24341 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 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/status_codes.py b/venv/lib/python2.7/site-packages/pip/_vendor/requests/status_codes.py deleted file mode 100644 index 813e8c4..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/requests/status_codes.py +++ /dev/null @@ -1,120 +0,0 @@ -# -*- coding: utf-8 -*- - -r""" -The ``codes`` object defines a mapping from common names for HTTP statuses -to their numerical codes, accessible either as attributes or as dictionary -items. - ->>> requests.codes['temporary_redirect'] -307 ->>> requests.codes.teapot -418 ->>> requests.codes['\o/'] -200 - -Some codes have multiple names, and both upper- and lower-case versions of -the names are allowed. For example, ``codes.ok``, ``codes.OK``, and -``codes.okay`` all correspond to the HTTP status code 200. -""" - -from .structures import LookupDict - -_codes = { - - # Informational. - 100: ('continue',), - 101: ('switching_protocols',), - 102: ('processing',), - 103: ('checkpoint',), - 122: ('uri_too_long', 'request_uri_too_long'), - 200: ('ok', 'okay', 'all_ok', 'all_okay', 'all_good', '\\o/', '✓'), - 201: ('created',), - 202: ('accepted',), - 203: ('non_authoritative_info', 'non_authoritative_information'), - 204: ('no_content',), - 205: ('reset_content', 'reset'), - 206: ('partial_content', 'partial'), - 207: ('multi_status', 'multiple_status', 'multi_stati', 'multiple_stati'), - 208: ('already_reported',), - 226: ('im_used',), - - # Redirection. - 300: ('multiple_choices',), - 301: ('moved_permanently', 'moved', '\\o-'), - 302: ('found',), - 303: ('see_other', 'other'), - 304: ('not_modified',), - 305: ('use_proxy',), - 306: ('switch_proxy',), - 307: ('temporary_redirect', 'temporary_moved', 'temporary'), - 308: ('permanent_redirect', - 'resume_incomplete', 'resume',), # These 2 to be removed in 3.0 - - # Client Error. - 400: ('bad_request', 'bad'), - 401: ('unauthorized',), - 402: ('payment_required', 'payment'), - 403: ('forbidden',), - 404: ('not_found', '-o-'), - 405: ('method_not_allowed', 'not_allowed'), - 406: ('not_acceptable',), - 407: ('proxy_authentication_required', 'proxy_auth', 'proxy_authentication'), - 408: ('request_timeout', 'timeout'), - 409: ('conflict',), - 410: ('gone',), - 411: ('length_required',), - 412: ('precondition_failed', 'precondition'), - 413: ('request_entity_too_large',), - 414: ('request_uri_too_large',), - 415: ('unsupported_media_type', 'unsupported_media', 'media_type'), - 416: ('requested_range_not_satisfiable', 'requested_range', 'range_not_satisfiable'), - 417: ('expectation_failed',), - 418: ('im_a_teapot', 'teapot', 'i_am_a_teapot'), - 421: ('misdirected_request',), - 422: ('unprocessable_entity', 'unprocessable'), - 423: ('locked',), - 424: ('failed_dependency', 'dependency'), - 425: ('unordered_collection', 'unordered'), - 426: ('upgrade_required', 'upgrade'), - 428: ('precondition_required', 'precondition'), - 429: ('too_many_requests', 'too_many'), - 431: ('header_fields_too_large', 'fields_too_large'), - 444: ('no_response', 'none'), - 449: ('retry_with', 'retry'), - 450: ('blocked_by_windows_parental_controls', 'parental_controls'), - 451: ('unavailable_for_legal_reasons', 'legal_reasons'), - 499: ('client_closed_request',), - - # Server Error. - 500: ('internal_server_error', 'server_error', '/o\\', '✗'), - 501: ('not_implemented',), - 502: ('bad_gateway',), - 503: ('service_unavailable', 'unavailable'), - 504: ('gateway_timeout',), - 505: ('http_version_not_supported', 'http_version'), - 506: ('variant_also_negotiates',), - 507: ('insufficient_storage',), - 509: ('bandwidth_limit_exceeded', 'bandwidth'), - 510: ('not_extended',), - 511: ('network_authentication_required', 'network_auth', 'network_authentication'), -} - -codes = LookupDict(name='status_codes') - -def _init(): - for code, titles in _codes.items(): - for title in titles: - setattr(codes, title, code) - if not title.startswith(('\\', '/')): - setattr(codes, title.upper(), code) - - def doc(code): - names = ', '.join('``%s``' % n for n in _codes[code]) - return '* %d: %s' % (code, names) - - global __doc__ - __doc__ = (__doc__ + '\n' + - '\n'.join(doc(code) for code in sorted(_codes)) - if __doc__ is not None else None) - -_init() diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/status_codes.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/requests/status_codes.pyc deleted file mode 100644 index 9be491fb4e52144c9bf8c4b8c14e8c1119081cfa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7881 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 JZLF-{^nWmh(~1B9 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/structures.py b/venv/lib/python2.7/site-packages/pip/_vendor/requests/structures.py deleted file mode 100644 index da930e2..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/requests/structures.py +++ /dev/null @@ -1,103 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.structures -~~~~~~~~~~~~~~~~~~~ - -Data structures that power Requests. -""" - -from .compat import OrderedDict, Mapping, MutableMapping - - -class CaseInsensitiveDict(MutableMapping): - """A case-insensitive ``dict``-like object. - - Implements all methods and operations of - ``MutableMapping`` as well as dict's ``copy``. Also - provides ``lower_items``. - - All keys are expected to be strings. The structure remembers the - case of the last key to be set, and ``iter(instance)``, - ``keys()``, ``items()``, ``iterkeys()``, and ``iteritems()`` - will contain case-sensitive keys. However, querying and contains - testing is case insensitive:: - - cid = CaseInsensitiveDict() - cid['Accept'] = 'application/json' - cid['aCCEPT'] == 'application/json' # True - list(cid) == ['Accept'] # True - - For example, ``headers['content-encoding']`` will return the - value of a ``'Content-Encoding'`` response header, regardless - of how the header name was originally stored. - - If the constructor, ``.update``, or equality comparison - operations are given keys that have equal ``.lower()``s, the - behavior is undefined. - """ - - def __init__(self, data=None, **kwargs): - self._store = OrderedDict() - if data is None: - data = {} - self.update(data, **kwargs) - - def __setitem__(self, key, value): - # Use the lowercased key for lookups, but store the actual - # key alongside the value. - self._store[key.lower()] = (key, value) - - def __getitem__(self, key): - return self._store[key.lower()][1] - - def __delitem__(self, key): - del self._store[key.lower()] - - def __iter__(self): - return (casedkey for casedkey, mappedvalue in self._store.values()) - - def __len__(self): - return len(self._store) - - def lower_items(self): - """Like iteritems(), but with all lowercase keys.""" - return ( - (lowerkey, keyval[1]) - for (lowerkey, keyval) - in self._store.items() - ) - - def __eq__(self, other): - if isinstance(other, Mapping): - other = CaseInsensitiveDict(other) - else: - return NotImplemented - # Compare insensitively - return dict(self.lower_items()) == dict(other.lower_items()) - - # Copy is required - def copy(self): - return CaseInsensitiveDict(self._store.values()) - - def __repr__(self): - return str(dict(self.items())) - - -class LookupDict(dict): - """Dictionary lookup object.""" - - def __init__(self, name=None): - self.name = name - super(LookupDict, self).__init__() - - def __repr__(self): - return '<lookup \'%s\'>' % (self.name) - - def __getitem__(self, key): - # We allow fall-through here, so values default to None - - return self.__dict__.get(key, None) - - def get(self, key, default=None): - return self.__dict__.get(key, default) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/structures.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/requests/structures.pyc deleted file mode 100644 index 55b4c4b2cb0d568b3bad63b6338f748f5742a2b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6281 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 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/utils.py b/venv/lib/python2.7/site-packages/pip/_vendor/requests/utils.py deleted file mode 100644 index 8170a8d..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/requests/utils.py +++ /dev/null @@ -1,977 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.utils -~~~~~~~~~~~~~~ - -This module provides utility functions that are used within Requests -that are also useful for external consumption. -""" - -import codecs -import contextlib -import io -import os -import re -import socket -import struct -import sys -import tempfile -import warnings -import zipfile - -from .__version__ import __version__ -from . import certs -# to_native_string is unused here, but imported here for backwards compatibility -from ._internal_utils import to_native_string -from .compat import parse_http_list as _parse_list_header -from .compat import ( - quote, urlparse, bytes, str, OrderedDict, unquote, getproxies, - proxy_bypass, urlunparse, basestring, integer_types, is_py3, - proxy_bypass_environment, getproxies_environment, Mapping) -from .cookies import cookiejar_from_dict -from .structures import CaseInsensitiveDict -from .exceptions import ( - InvalidURL, InvalidHeader, FileModeWarning, UnrewindableBodyError) - -NETRC_FILES = ('.netrc', '_netrc') - -DEFAULT_CA_BUNDLE_PATH = certs.where() - -DEFAULT_PORTS = {'http': 80, 'https': 443} - - -if sys.platform == 'win32': - # provide a proxy_bypass version on Windows without DNS lookups - - def proxy_bypass_registry(host): - try: - if is_py3: - import winreg - else: - import _winreg as winreg - except ImportError: - return False - - try: - internetSettings = winreg.OpenKey(winreg.HKEY_CURRENT_USER, - r'Software\Microsoft\Windows\CurrentVersion\Internet Settings') - # ProxyEnable could be REG_SZ or REG_DWORD, normalizing it - proxyEnable = int(winreg.QueryValueEx(internetSettings, - 'ProxyEnable')[0]) - # ProxyOverride is almost always a string - proxyOverride = winreg.QueryValueEx(internetSettings, - 'ProxyOverride')[0] - except OSError: - return False - if not proxyEnable or not proxyOverride: - return False - - # make a check value list from the registry entry: replace the - # '<local>' string by the localhost entry and the corresponding - # canonical entry. - proxyOverride = proxyOverride.split(';') - # now check if we match one of the registry values. - for test in proxyOverride: - if test == '<local>': - if '.' not in host: - return True - test = test.replace(".", r"\.") # mask dots - test = test.replace("*", r".*") # change glob sequence - test = test.replace("?", r".") # change glob char - if re.match(test, host, re.I): - return True - return False - - def proxy_bypass(host): # noqa - """Return True, if the host should be bypassed. - - Checks proxy settings gathered from the environment, if specified, - or the registry. - """ - if getproxies_environment(): - return proxy_bypass_environment(host) - else: - return proxy_bypass_registry(host) - - -def dict_to_sequence(d): - """Returns an internal sequence dictionary update.""" - - if hasattr(d, 'items'): - d = d.items() - - return d - - -def super_len(o): - total_length = None - current_position = 0 - - if hasattr(o, '__len__'): - total_length = len(o) - - elif hasattr(o, 'len'): - total_length = o.len - - elif hasattr(o, 'fileno'): - try: - fileno = o.fileno() - except io.UnsupportedOperation: - pass - else: - total_length = os.fstat(fileno).st_size - - # Having used fstat to determine the file length, we need to - # confirm that this file was opened up in binary mode. - if 'b' not in o.mode: - warnings.warn(( - "Requests has determined the content-length for this " - "request using the binary size of the file: however, the " - "file has been opened in text mode (i.e. without the 'b' " - "flag in the mode). This may lead to an incorrect " - "content-length. In Requests 3.0, support will be removed " - "for files in text mode."), - FileModeWarning - ) - - if hasattr(o, 'tell'): - try: - current_position = o.tell() - except (OSError, IOError): - # This can happen in some weird situations, such as when the file - # is actually a special file descriptor like stdin. In this - # instance, we don't know what the length is, so set it to zero and - # let requests chunk it instead. - if total_length is not None: - current_position = total_length - else: - if hasattr(o, 'seek') and total_length is None: - # StringIO and BytesIO have seek but no useable fileno - try: - # seek to end of file - o.seek(0, 2) - total_length = o.tell() - - # seek back to current position to support - # partially read file-like objects - o.seek(current_position or 0) - except (OSError, IOError): - total_length = 0 - - if total_length is None: - total_length = 0 - - return max(0, total_length - current_position) - - -def get_netrc_auth(url, raise_errors=False): - """Returns the Requests tuple auth for a given url from netrc.""" - - try: - from netrc import netrc, NetrcParseError - - netrc_path = None - - for f in NETRC_FILES: - try: - loc = os.path.expanduser('~/{}'.format(f)) - except KeyError: - # os.path.expanduser can fail when $HOME is undefined and - # getpwuid fails. See https://bugs.python.org/issue20164 & - # https://github.com/requests/requests/issues/1846 - return - - if os.path.exists(loc): - netrc_path = loc - break - - # Abort early if there isn't one. - if netrc_path is None: - return - - ri = urlparse(url) - - # Strip port numbers from netloc. This weird `if...encode`` dance is - # used for Python 3.2, which doesn't support unicode literals. - splitstr = b':' - if isinstance(url, str): - splitstr = splitstr.decode('ascii') - host = ri.netloc.split(splitstr)[0] - - try: - _netrc = netrc(netrc_path).authenticators(host) - if _netrc: - # Return with login / password - login_i = (0 if _netrc[0] else 1) - return (_netrc[login_i], _netrc[2]) - except (NetrcParseError, IOError): - # If there was a parsing error or a permissions issue reading the file, - # we'll just skip netrc auth unless explicitly asked to raise errors. - if raise_errors: - raise - - # AppEngine hackiness. - except (ImportError, AttributeError): - pass - - -def guess_filename(obj): - """Tries to guess the filename of the given object.""" - name = getattr(obj, 'name', None) - if (name and isinstance(name, basestring) and name[0] != '<' and - name[-1] != '>'): - return os.path.basename(name) - - -def extract_zipped_paths(path): - """Replace nonexistent paths that look like they refer to a member of a zip - archive with the location of an extracted copy of the target, or else - just return the provided path unchanged. - """ - if os.path.exists(path): - # this is already a valid path, no need to do anything further - return path - - # find the first valid part of the provided path and treat that as a zip archive - # assume the rest of the path is the name of a member in the archive - archive, member = os.path.split(path) - while archive and not os.path.exists(archive): - archive, prefix = os.path.split(archive) - member = '/'.join([prefix, member]) - - if not zipfile.is_zipfile(archive): - return path - - zip_file = zipfile.ZipFile(archive) - if member not in zip_file.namelist(): - return path - - # we have a valid zip archive and a valid member of that archive - tmp = tempfile.gettempdir() - extracted_path = os.path.join(tmp, *member.split('/')) - if not os.path.exists(extracted_path): - extracted_path = zip_file.extract(member, path=tmp) - - return extracted_path - - -def from_key_val_list(value): - """Take an object and test to see if it can be represented as a - dictionary. Unless it can not be represented as such, return an - OrderedDict, e.g., - - :: - - >>> from_key_val_list([('key', 'val')]) - OrderedDict([('key', 'val')]) - >>> from_key_val_list('string') - ValueError: cannot encode objects that are not 2-tuples - >>> from_key_val_list({'key': 'val'}) - OrderedDict([('key', 'val')]) - - :rtype: OrderedDict - """ - if value is None: - return None - - if isinstance(value, (str, bytes, bool, int)): - raise ValueError('cannot encode objects that are not 2-tuples') - - return OrderedDict(value) - - -def to_key_val_list(value): - """Take an object and test to see if it can be represented as a - dictionary. If it can be, return a list of tuples, e.g., - - :: - - >>> to_key_val_list([('key', 'val')]) - [('key', 'val')] - >>> to_key_val_list({'key': 'val'}) - [('key', 'val')] - >>> to_key_val_list('string') - ValueError: cannot encode objects that are not 2-tuples. - - :rtype: list - """ - if value is None: - return None - - if isinstance(value, (str, bytes, bool, int)): - raise ValueError('cannot encode objects that are not 2-tuples') - - if isinstance(value, Mapping): - value = value.items() - - return list(value) - - -# From mitsuhiko/werkzeug (used with permission). -def parse_list_header(value): - """Parse lists as described by RFC 2068 Section 2. - - In particular, parse comma-separated lists where the elements of - the list may include quoted-strings. A quoted-string could - contain a comma. A non-quoted string could have quotes in the - middle. Quotes are removed automatically after parsing. - - It basically works like :func:`parse_set_header` just that items - may appear multiple times and case sensitivity is preserved. - - The return value is a standard :class:`list`: - - >>> parse_list_header('token, "quoted value"') - ['token', 'quoted value'] - - To create a header from the :class:`list` again, use the - :func:`dump_header` function. - - :param value: a string with a list header. - :return: :class:`list` - :rtype: list - """ - result = [] - for item in _parse_list_header(value): - if item[:1] == item[-1:] == '"': - item = unquote_header_value(item[1:-1]) - result.append(item) - return result - - -# From mitsuhiko/werkzeug (used with permission). -def parse_dict_header(value): - """Parse lists of key, value pairs as described by RFC 2068 Section 2 and - convert them into a python dict: - - >>> d = parse_dict_header('foo="is a fish", bar="as well"') - >>> type(d) is dict - True - >>> sorted(d.items()) - [('bar', 'as well'), ('foo', 'is a fish')] - - If there is no value for a key it will be `None`: - - >>> parse_dict_header('key_without_value') - {'key_without_value': None} - - To create a header from the :class:`dict` again, use the - :func:`dump_header` function. - - :param value: a string with a dict header. - :return: :class:`dict` - :rtype: dict - """ - result = {} - for item in _parse_list_header(value): - if '=' not in item: - result[item] = None - continue - name, value = item.split('=', 1) - if value[:1] == value[-1:] == '"': - value = unquote_header_value(value[1:-1]) - result[name] = value - return result - - -# From mitsuhiko/werkzeug (used with permission). -def unquote_header_value(value, is_filename=False): - r"""Unquotes a header value. (Reversal of :func:`quote_header_value`). - This does not use the real unquoting but what browsers are actually - using for quoting. - - :param value: the header value to unquote. - :rtype: str - """ - if value and value[0] == value[-1] == '"': - # this is not the real unquoting, but fixing this so that the - # RFC is met will result in bugs with internet explorer and - # probably some other browsers as well. IE for example is - # uploading files with "C:\foo\bar.txt" as filename - value = value[1:-1] - - # if this is a filename and the starting characters look like - # a UNC path, then just return the value without quotes. Using the - # replace sequence below on a UNC path has the effect of turning - # the leading double slash into a single slash and then - # _fix_ie_filename() doesn't work correctly. See #458. - if not is_filename or value[:2] != '\\\\': - return value.replace('\\\\', '\\').replace('\\"', '"') - return value - - -def dict_from_cookiejar(cj): - """Returns a key/value dictionary from a CookieJar. - - :param cj: CookieJar object to extract cookies from. - :rtype: dict - """ - - cookie_dict = {} - - for cookie in cj: - cookie_dict[cookie.name] = cookie.value - - return cookie_dict - - -def add_dict_to_cookiejar(cj, cookie_dict): - """Returns a CookieJar from a key/value dictionary. - - :param cj: CookieJar to insert cookies into. - :param cookie_dict: Dict of key/values to insert into CookieJar. - :rtype: CookieJar - """ - - return cookiejar_from_dict(cookie_dict, cj) - - -def get_encodings_from_content(content): - """Returns encodings from given content string. - - :param content: bytestring to extract encodings from. - """ - warnings.warn(( - 'In requests 3.0, get_encodings_from_content will be removed. For ' - 'more information, please see the discussion on issue #2266. (This' - ' warning should only appear once.)'), - DeprecationWarning) - - charset_re = re.compile(r'<meta.*?charset=["\']*(.+?)["\'>]', flags=re.I) - pragma_re = re.compile(r'<meta.*?content=["\']*;?charset=(.+?)["\'>]', flags=re.I) - xml_re = re.compile(r'^<\?xml.*?encoding=["\']*(.+?)["\'>]') - - return (charset_re.findall(content) + - pragma_re.findall(content) + - xml_re.findall(content)) - - -def _parse_content_type_header(header): - """Returns content type and parameters from given header - - :param header: string - :return: tuple containing content type and dictionary of - parameters - """ - - tokens = header.split(';') - content_type, params = tokens[0].strip(), tokens[1:] - params_dict = {} - items_to_strip = "\"' " - - for param in params: - param = param.strip() - if param: - key, value = param, True - index_of_equals = param.find("=") - if index_of_equals != -1: - key = param[:index_of_equals].strip(items_to_strip) - value = param[index_of_equals + 1:].strip(items_to_strip) - params_dict[key.lower()] = value - return content_type, params_dict - - -def get_encoding_from_headers(headers): - """Returns encodings from given HTTP Header Dict. - - :param headers: dictionary to extract encoding from. - :rtype: str - """ - - content_type = headers.get('content-type') - - if not content_type: - return None - - content_type, params = _parse_content_type_header(content_type) - - if 'charset' in params: - return params['charset'].strip("'\"") - - if 'text' in content_type: - return 'ISO-8859-1' - - -def stream_decode_response_unicode(iterator, r): - """Stream decodes a iterator.""" - - if r.encoding is None: - for item in iterator: - yield item - return - - decoder = codecs.getincrementaldecoder(r.encoding)(errors='replace') - for chunk in iterator: - rv = decoder.decode(chunk) - if rv: - yield rv - rv = decoder.decode(b'', final=True) - if rv: - yield rv - - -def iter_slices(string, slice_length): - """Iterate over slices of a string.""" - pos = 0 - if slice_length is None or slice_length <= 0: - slice_length = len(string) - while pos < len(string): - yield string[pos:pos + slice_length] - pos += slice_length - - -def get_unicode_from_response(r): - """Returns the requested content back in unicode. - - :param r: Response object to get unicode content from. - - Tried: - - 1. charset from content-type - 2. fall back and replace all unicode characters - - :rtype: str - """ - warnings.warn(( - 'In requests 3.0, get_unicode_from_response will be removed. For ' - 'more information, please see the discussion on issue #2266. (This' - ' warning should only appear once.)'), - DeprecationWarning) - - tried_encodings = [] - - # Try charset from content-type - encoding = get_encoding_from_headers(r.headers) - - if encoding: - try: - return str(r.content, encoding) - except UnicodeError: - tried_encodings.append(encoding) - - # Fall back: - try: - return str(r.content, encoding, errors='replace') - except TypeError: - return r.content - - -# The unreserved URI characters (RFC 3986) -UNRESERVED_SET = frozenset( - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + "0123456789-._~") - - -def unquote_unreserved(uri): - """Un-escape any percent-escape sequences in a URI that are unreserved - characters. This leaves all reserved, illegal and non-ASCII bytes encoded. - - :rtype: str - """ - parts = uri.split('%') - for i in range(1, len(parts)): - h = parts[i][0:2] - if len(h) == 2 and h.isalnum(): - try: - c = chr(int(h, 16)) - except ValueError: - raise InvalidURL("Invalid percent-escape sequence: '%s'" % h) - - if c in UNRESERVED_SET: - parts[i] = c + parts[i][2:] - else: - parts[i] = '%' + parts[i] - else: - parts[i] = '%' + parts[i] - return ''.join(parts) - - -def requote_uri(uri): - """Re-quote the given URI. - - This function passes the given URI through an unquote/quote cycle to - ensure that it is fully and consistently quoted. - - :rtype: str - """ - safe_with_percent = "!#$%&'()*+,/:;=?@[]~" - safe_without_percent = "!#$&'()*+,/:;=?@[]~" - try: - # Unquote only the unreserved characters - # Then quote only illegal characters (do not quote reserved, - # unreserved, or '%') - return quote(unquote_unreserved(uri), safe=safe_with_percent) - except InvalidURL: - # We couldn't unquote the given URI, so let's try quoting it, but - # there may be unquoted '%'s in the URI. We need to make sure they're - # properly quoted so they do not cause issues elsewhere. - return quote(uri, safe=safe_without_percent) - - -def address_in_network(ip, net): - """This function allows you to check if an IP belongs to a network subnet - - Example: returns True if ip = 192.168.1.1 and net = 192.168.1.0/24 - returns False if ip = 192.168.1.1 and net = 192.168.100.0/24 - - :rtype: bool - """ - ipaddr = struct.unpack('=L', socket.inet_aton(ip))[0] - netaddr, bits = net.split('/') - netmask = struct.unpack('=L', socket.inet_aton(dotted_netmask(int(bits))))[0] - network = struct.unpack('=L', socket.inet_aton(netaddr))[0] & netmask - return (ipaddr & netmask) == (network & netmask) - - -def dotted_netmask(mask): - """Converts mask from /xx format to xxx.xxx.xxx.xxx - - Example: if mask is 24 function returns 255.255.255.0 - - :rtype: str - """ - bits = 0xffffffff ^ (1 << 32 - mask) - 1 - return socket.inet_ntoa(struct.pack('>I', bits)) - - -def is_ipv4_address(string_ip): - """ - :rtype: bool - """ - try: - socket.inet_aton(string_ip) - except socket.error: - return False - return True - - -def is_valid_cidr(string_network): - """ - Very simple check of the cidr format in no_proxy variable. - - :rtype: bool - """ - if string_network.count('/') == 1: - try: - mask = int(string_network.split('/')[1]) - except ValueError: - return False - - if mask < 1 or mask > 32: - return False - - try: - socket.inet_aton(string_network.split('/')[0]) - except socket.error: - return False - else: - return False - return True - - -@contextlib.contextmanager -def set_environ(env_name, value): - """Set the environment variable 'env_name' to 'value' - - Save previous value, yield, and then restore the previous value stored in - the environment variable 'env_name'. - - If 'value' is None, do nothing""" - value_changed = value is not None - if value_changed: - old_value = os.environ.get(env_name) - os.environ[env_name] = value - try: - yield - finally: - if value_changed: - if old_value is None: - del os.environ[env_name] - else: - os.environ[env_name] = old_value - - -def should_bypass_proxies(url, no_proxy): - """ - Returns whether we should bypass proxies or not. - - :rtype: bool - """ - # Prioritize lowercase environment variables over uppercase - # to keep a consistent behaviour with other http projects (curl, wget). - get_proxy = lambda k: os.environ.get(k) or os.environ.get(k.upper()) - - # First check whether no_proxy is defined. If it is, check that the URL - # we're getting isn't in the no_proxy list. - no_proxy_arg = no_proxy - if no_proxy is None: - no_proxy = get_proxy('no_proxy') - parsed = urlparse(url) - - if parsed.hostname is None: - # URLs don't always have hostnames, e.g. file:/// urls. - return True - - if no_proxy: - # We need to check whether we match here. We need to see if we match - # the end of the hostname, both with and without the port. - no_proxy = ( - host for host in no_proxy.replace(' ', '').split(',') if host - ) - - if is_ipv4_address(parsed.hostname): - for proxy_ip in no_proxy: - if is_valid_cidr(proxy_ip): - if address_in_network(parsed.hostname, proxy_ip): - return True - elif parsed.hostname == proxy_ip: - # If no_proxy ip was defined in plain IP notation instead of cidr notation & - # matches the IP of the index - return True - else: - host_with_port = parsed.hostname - if parsed.port: - host_with_port += ':{}'.format(parsed.port) - - for host in no_proxy: - if parsed.hostname.endswith(host) or host_with_port.endswith(host): - # The URL does match something in no_proxy, so we don't want - # to apply the proxies on this URL. - return True - - with set_environ('no_proxy', no_proxy_arg): - # parsed.hostname can be `None` in cases such as a file URI. - try: - bypass = proxy_bypass(parsed.hostname) - except (TypeError, socket.gaierror): - bypass = False - - if bypass: - return True - - return False - - -def get_environ_proxies(url, no_proxy=None): - """ - Return a dict of environment proxies. - - :rtype: dict - """ - if should_bypass_proxies(url, no_proxy=no_proxy): - return {} - else: - return getproxies() - - -def select_proxy(url, proxies): - """Select a proxy for the url, if applicable. - - :param url: The url being for the request - :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs - """ - proxies = proxies or {} - urlparts = urlparse(url) - if urlparts.hostname is None: - return proxies.get(urlparts.scheme, proxies.get('all')) - - proxy_keys = [ - urlparts.scheme + '://' + urlparts.hostname, - urlparts.scheme, - 'all://' + urlparts.hostname, - 'all', - ] - proxy = None - for proxy_key in proxy_keys: - if proxy_key in proxies: - proxy = proxies[proxy_key] - break - - return proxy - - -def default_user_agent(name="python-requests"): - """ - Return a string representing the default user agent. - - :rtype: str - """ - return '%s/%s' % (name, __version__) - - -def default_headers(): - """ - :rtype: requests.structures.CaseInsensitiveDict - """ - return CaseInsensitiveDict({ - 'User-Agent': default_user_agent(), - 'Accept-Encoding': ', '.join(('gzip', 'deflate')), - 'Accept': '*/*', - 'Connection': 'keep-alive', - }) - - -def parse_header_links(value): - """Return a list of parsed link headers proxies. - - i.e. Link: <http:/.../front.jpeg>; rel=front; type="image/jpeg",<http://.../back.jpeg>; rel=back;type="image/jpeg" - - :rtype: list - """ - - links = [] - - replace_chars = ' \'"' - - value = value.strip(replace_chars) - if not value: - return links - - for val in re.split(', *<', value): - try: - url, params = val.split(';', 1) - except ValueError: - url, params = val, '' - - link = {'url': url.strip('<> \'"')} - - for param in params.split(';'): - try: - key, value = param.split('=') - except ValueError: - break - - link[key.strip(replace_chars)] = value.strip(replace_chars) - - links.append(link) - - return links - - -# Null bytes; no need to recreate these on each call to guess_json_utf -_null = '\x00'.encode('ascii') # encoding to ASCII for Python 3 -_null2 = _null * 2 -_null3 = _null * 3 - - -def guess_json_utf(data): - """ - :rtype: str - """ - # JSON always starts with two ASCII characters, so detection is as - # easy as counting the nulls and from their location and count - # determine the encoding. Also detect a BOM, if present. - sample = data[:4] - if sample in (codecs.BOM_UTF32_LE, codecs.BOM_UTF32_BE): - return 'utf-32' # BOM included - if sample[:3] == codecs.BOM_UTF8: - return 'utf-8-sig' # BOM included, MS style (discouraged) - if sample[:2] in (codecs.BOM_UTF16_LE, codecs.BOM_UTF16_BE): - return 'utf-16' # BOM included - nullcount = sample.count(_null) - if nullcount == 0: - return 'utf-8' - if nullcount == 2: - if sample[::2] == _null2: # 1st and 3rd are null - return 'utf-16-be' - if sample[1::2] == _null2: # 2nd and 4th are null - return 'utf-16-le' - # Did not detect 2 valid UTF-16 ascii-range characters - if nullcount == 3: - if sample[:3] == _null3: - return 'utf-32-be' - if sample[1:] == _null3: - return 'utf-32-le' - # Did not detect a valid UTF-32 ascii-range character - return None - - -def prepend_scheme_if_needed(url, new_scheme): - """Given a URL that may or may not have a scheme, prepend the given scheme. - Does not replace a present scheme with the one provided as an argument. - - :rtype: str - """ - scheme, netloc, path, params, query, fragment = urlparse(url, new_scheme) - - # urlparse is a finicky beast, and sometimes decides that there isn't a - # netloc present. Assume that it's being over-cautious, and switch netloc - # and path if urlparse decided there was no netloc. - if not netloc: - netloc, path = path, netloc - - return urlunparse((scheme, netloc, path, params, query, fragment)) - - -def get_auth_from_url(url): - """Given a url with authentication components, extract them into a tuple of - username,password. - - :rtype: (str,str) - """ - parsed = urlparse(url) - - try: - auth = (unquote(parsed.username), unquote(parsed.password)) - except (AttributeError, TypeError): - auth = ('', '') - - return auth - - -# Moved outside of function to avoid recompile every call -_CLEAN_HEADER_REGEX_BYTE = re.compile(b'^\\S[^\\r\\n]*$|^$') -_CLEAN_HEADER_REGEX_STR = re.compile(r'^\S[^\r\n]*$|^$') - - -def check_header_validity(header): - """Verifies that header value is a string which doesn't contain - leading whitespace or return characters. This prevents unintended - header injection. - - :param header: tuple, in the format (name, value). - """ - name, value = header - - if isinstance(value, bytes): - pat = _CLEAN_HEADER_REGEX_BYTE - else: - pat = _CLEAN_HEADER_REGEX_STR - try: - if not pat.match(value): - raise InvalidHeader("Invalid return character or leading space in header: %s" % name) - except TypeError: - raise InvalidHeader("Value for header {%s: %s} must be of type str or " - "bytes, not %s" % (name, value, type(value))) - - -def urldefragauth(url): - """ - Given a url remove the fragment and the authentication part. - - :rtype: str - """ - scheme, netloc, path, params, query, fragment = urlparse(url) - - # see func:`prepend_scheme_if_needed` - if not netloc: - netloc, path = path, netloc - - netloc = netloc.rsplit('@', 1)[-1] - - return urlunparse((scheme, netloc, path, params, query, '')) - - -def rewind_body(prepared_request): - """Move file pointer back to its recorded starting position - so it can be read again on redirect. - """ - body_seek = getattr(prepared_request.body, 'seek', None) - if body_seek is not None and isinstance(prepared_request._body_position, integer_types): - try: - body_seek(prepared_request._body_position) - except (IOError, OSError): - raise UnrewindableBodyError("An error occurred when rewinding request " - "body for redirect.") - else: - raise UnrewindableBodyError("Unable to rewind request body for redirect.") diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/utils.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/requests/utils.pyc deleted file mode 100644 index 1564234f70f902d2114ffb70e2f8c5d8f83d1514..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29364 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 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/retrying.py b/venv/lib/python2.7/site-packages/pip/_vendor/retrying.py deleted file mode 100644 index 6d1e627..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/retrying.py +++ /dev/null @@ -1,267 +0,0 @@ -## Copyright 2013-2014 Ray Holder -## -## Licensed under the Apache License, Version 2.0 (the "License"); -## you may not use this file except in compliance with the License. -## You may obtain a copy of the License at -## -## http://www.apache.org/licenses/LICENSE-2.0 -## -## Unless required by applicable law or agreed to in writing, software -## distributed under the License is distributed on an "AS IS" BASIS, -## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -## See the License for the specific language governing permissions and -## limitations under the License. - -import random -from pip._vendor import six -import sys -import time -import traceback - - -# sys.maxint / 2, since Python 3.2 doesn't have a sys.maxint... -MAX_WAIT = 1073741823 - - -def retry(*dargs, **dkw): - """ - Decorator function that instantiates the Retrying object - @param *dargs: positional arguments passed to Retrying object - @param **dkw: keyword arguments passed to the Retrying object - """ - # support both @retry and @retry() as valid syntax - if len(dargs) == 1 and callable(dargs[0]): - def wrap_simple(f): - - @six.wraps(f) - def wrapped_f(*args, **kw): - return Retrying().call(f, *args, **kw) - - return wrapped_f - - return wrap_simple(dargs[0]) - - else: - def wrap(f): - - @six.wraps(f) - def wrapped_f(*args, **kw): - return Retrying(*dargs, **dkw).call(f, *args, **kw) - - return wrapped_f - - return wrap - - -class Retrying(object): - - def __init__(self, - stop=None, wait=None, - stop_max_attempt_number=None, - stop_max_delay=None, - wait_fixed=None, - wait_random_min=None, wait_random_max=None, - wait_incrementing_start=None, wait_incrementing_increment=None, - wait_exponential_multiplier=None, wait_exponential_max=None, - retry_on_exception=None, - retry_on_result=None, - wrap_exception=False, - stop_func=None, - wait_func=None, - wait_jitter_max=None): - - self._stop_max_attempt_number = 5 if stop_max_attempt_number is None else stop_max_attempt_number - self._stop_max_delay = 100 if stop_max_delay is None else stop_max_delay - self._wait_fixed = 1000 if wait_fixed is None else wait_fixed - self._wait_random_min = 0 if wait_random_min is None else wait_random_min - self._wait_random_max = 1000 if wait_random_max is None else wait_random_max - self._wait_incrementing_start = 0 if wait_incrementing_start is None else wait_incrementing_start - self._wait_incrementing_increment = 100 if wait_incrementing_increment is None else wait_incrementing_increment - self._wait_exponential_multiplier = 1 if wait_exponential_multiplier is None else wait_exponential_multiplier - self._wait_exponential_max = MAX_WAIT if wait_exponential_max is None else wait_exponential_max - self._wait_jitter_max = 0 if wait_jitter_max is None else wait_jitter_max - - # TODO add chaining of stop behaviors - # stop behavior - stop_funcs = [] - if stop_max_attempt_number is not None: - stop_funcs.append(self.stop_after_attempt) - - if stop_max_delay is not None: - stop_funcs.append(self.stop_after_delay) - - if stop_func is not None: - self.stop = stop_func - - elif stop is None: - self.stop = lambda attempts, delay: any(f(attempts, delay) for f in stop_funcs) - - else: - self.stop = getattr(self, stop) - - # TODO add chaining of wait behaviors - # wait behavior - wait_funcs = [lambda *args, **kwargs: 0] - if wait_fixed is not None: - wait_funcs.append(self.fixed_sleep) - - if wait_random_min is not None or wait_random_max is not None: - wait_funcs.append(self.random_sleep) - - if wait_incrementing_start is not None or wait_incrementing_increment is not None: - wait_funcs.append(self.incrementing_sleep) - - if wait_exponential_multiplier is not None or wait_exponential_max is not None: - wait_funcs.append(self.exponential_sleep) - - if wait_func is not None: - self.wait = wait_func - - elif wait is None: - self.wait = lambda attempts, delay: max(f(attempts, delay) for f in wait_funcs) - - else: - self.wait = getattr(self, wait) - - # retry on exception filter - if retry_on_exception is None: - self._retry_on_exception = self.always_reject - else: - self._retry_on_exception = retry_on_exception - - # TODO simplify retrying by Exception types - # retry on result filter - if retry_on_result is None: - self._retry_on_result = self.never_reject - else: - self._retry_on_result = retry_on_result - - self._wrap_exception = wrap_exception - - def stop_after_attempt(self, previous_attempt_number, delay_since_first_attempt_ms): - """Stop after the previous attempt >= stop_max_attempt_number.""" - return previous_attempt_number >= self._stop_max_attempt_number - - def stop_after_delay(self, previous_attempt_number, delay_since_first_attempt_ms): - """Stop after the time from the first attempt >= stop_max_delay.""" - return delay_since_first_attempt_ms >= self._stop_max_delay - - def no_sleep(self, previous_attempt_number, delay_since_first_attempt_ms): - """Don't sleep at all before retrying.""" - return 0 - - def fixed_sleep(self, previous_attempt_number, delay_since_first_attempt_ms): - """Sleep a fixed amount of time between each retry.""" - return self._wait_fixed - - def random_sleep(self, previous_attempt_number, delay_since_first_attempt_ms): - """Sleep a random amount of time between wait_random_min and wait_random_max""" - return random.randint(self._wait_random_min, self._wait_random_max) - - def incrementing_sleep(self, previous_attempt_number, delay_since_first_attempt_ms): - """ - Sleep an incremental amount of time after each attempt, starting at - wait_incrementing_start and incrementing by wait_incrementing_increment - """ - result = self._wait_incrementing_start + (self._wait_incrementing_increment * (previous_attempt_number - 1)) - if result < 0: - result = 0 - return result - - def exponential_sleep(self, previous_attempt_number, delay_since_first_attempt_ms): - exp = 2 ** previous_attempt_number - result = self._wait_exponential_multiplier * exp - if result > self._wait_exponential_max: - result = self._wait_exponential_max - if result < 0: - result = 0 - return result - - def never_reject(self, result): - return False - - def always_reject(self, result): - return True - - def should_reject(self, attempt): - reject = False - if attempt.has_exception: - reject |= self._retry_on_exception(attempt.value[1]) - else: - reject |= self._retry_on_result(attempt.value) - - return reject - - def call(self, fn, *args, **kwargs): - start_time = int(round(time.time() * 1000)) - attempt_number = 1 - while True: - try: - attempt = Attempt(fn(*args, **kwargs), attempt_number, False) - except: - tb = sys.exc_info() - attempt = Attempt(tb, attempt_number, True) - - if not self.should_reject(attempt): - return attempt.get(self._wrap_exception) - - delay_since_first_attempt_ms = int(round(time.time() * 1000)) - start_time - if self.stop(attempt_number, delay_since_first_attempt_ms): - if not self._wrap_exception and attempt.has_exception: - # get() on an attempt with an exception should cause it to be raised, but raise just in case - raise attempt.get() - else: - raise RetryError(attempt) - else: - sleep = self.wait(attempt_number, delay_since_first_attempt_ms) - if self._wait_jitter_max: - jitter = random.random() * self._wait_jitter_max - sleep = sleep + max(0, jitter) - time.sleep(sleep / 1000.0) - - attempt_number += 1 - - -class Attempt(object): - """ - An Attempt encapsulates a call to a target function that may end as a - normal return value from the function or an Exception depending on what - occurred during the execution. - """ - - def __init__(self, value, attempt_number, has_exception): - self.value = value - self.attempt_number = attempt_number - self.has_exception = has_exception - - def get(self, wrap_exception=False): - """ - Return the return value of this Attempt instance or raise an Exception. - If wrap_exception is true, this Attempt is wrapped inside of a - RetryError before being raised. - """ - if self.has_exception: - if wrap_exception: - raise RetryError(self) - else: - six.reraise(self.value[0], self.value[1], self.value[2]) - else: - return self.value - - def __repr__(self): - if self.has_exception: - return "Attempts: {0}, Error:\n{1}".format(self.attempt_number, "".join(traceback.format_tb(self.value[2]))) - else: - return "Attempts: {0}, Value: {1}".format(self.attempt_number, self.value) - - -class RetryError(Exception): - """ - A RetryError encapsulates the last Attempt instance right before giving up. - """ - - def __init__(self, last_attempt): - self.last_attempt = last_attempt - - def __str__(self): - return "RetryError[{0}]".format(self.last_attempt) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/retrying.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/retrying.pyc deleted file mode 100644 index ebe2655b9948b2a9d6f107b1ccdf42460eb500d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11662 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%0DuFyK=VYOp`_Gj z1ua2z$&<3se#nWhph3e4Z+MwUPma>Lpa%w$miTosn<nmrG{9eTw8%x#s=$X=@YYh^ zvjQ}S7oNtFrk`SUAvME&m^8ALjM&0qUR9T(v=k!qy^$X}V07X|X}E>mhIL%;a>Lo0 zhjXw<hVba*w)IjOhtFO3DN__+;YKcSIa;};Es_NbAq7UZ4tm>(FECdOQgGG;B4oUN zn-z*N{z)iPMLPO|&F29hkUf11TmKuygcr3sjK!q=xb4%Juuwom8t4ylY4`@2UEa3g zClQgs(=EdVLjdFx0)BVKKLluCc{$d=rMGmcDYJ9AmB8m=@1NN`>4<lGdi4FXn+PD_ zYf06+jl0TN4s*_KPSdxFu8EIAW~b$4qJZLqm)r2mbqvW8&kq+oe?^|mFc&V4YH5;% z4F3nijNCmXVJC6j{{oFtJx|)^eD9)Dd#EIoaNVHo!*h{8#&eOIdI?qU0Mgpk>>NGG z-%;f9S{tg_^`Y?zQ3M~o@<Yjb0VQ=%-PON9s&2ujROwSH9LZJ1UR*Sv2#Sbo^(r(U zO)t&vG#5#<xRez-ycpe}5_dbfsi$xiMMQlMI!aUDXV{6gygT70MNYU+jbSPK2*0Z| zC*H%ruedW3RTiF0&cyJCT5FWJ{|kb25};m8`3@BDnmH7XuCyGAOGzZzldIi4UM}rv z2E7>Vozj@ucZr+Fie}g-!wOnGRCiwmX!UI(O7n?O%&u4DBPa>e<^3PN!aSXSfhq1m zUnTN%xw^sXAyyNp#GIM0Y0Z~}R0J_zWtbznHNfMF-Fn6Z($7(v(kWEq)?UfNj8|)w M`q4wbIrPx~0U^4oCIA2c diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/six.py b/venv/lib/python2.7/site-packages/pip/_vendor/six.py deleted file mode 100644 index 89b2188..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/six.py +++ /dev/null @@ -1,952 +0,0 @@ -# Copyright (c) 2010-2018 Benjamin Peterson -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -"""Utilities for writing code that runs on Python 2 and 3""" - -from __future__ import absolute_import - -import functools -import itertools -import operator -import sys -import types - -__author__ = "Benjamin Peterson <benjamin@python.org>" -__version__ = "1.12.0" - - -# Useful for very coarse version differentiation. -PY2 = sys.version_info[0] == 2 -PY3 = sys.version_info[0] == 3 -PY34 = sys.version_info[0:2] >= (3, 4) - -if PY3: - string_types = str, - integer_types = int, - class_types = type, - text_type = str - binary_type = bytes - - MAXSIZE = sys.maxsize -else: - string_types = basestring, - integer_types = (int, long) - class_types = (type, types.ClassType) - text_type = unicode - binary_type = str - - if sys.platform.startswith("java"): - # Jython always uses 32 bits. - MAXSIZE = int((1 << 31) - 1) - else: - # It's possible to have sizeof(long) != sizeof(Py_ssize_t). - class X(object): - - def __len__(self): - return 1 << 31 - try: - len(X()) - except OverflowError: - # 32-bit - MAXSIZE = int((1 << 31) - 1) - else: - # 64-bit - MAXSIZE = int((1 << 63) - 1) - del X - - -def _add_doc(func, doc): - """Add documentation to a function.""" - func.__doc__ = doc - - -def _import_module(name): - """Import module, returning the module after the last dot.""" - __import__(name) - return sys.modules[name] - - -class _LazyDescr(object): - - def __init__(self, name): - self.name = name - - def __get__(self, obj, tp): - result = self._resolve() - setattr(obj, self.name, result) # Invokes __set__. - try: - # This is a bit ugly, but it avoids running this again by - # removing this descriptor. - delattr(obj.__class__, self.name) - except AttributeError: - pass - return result - - -class MovedModule(_LazyDescr): - - def __init__(self, name, old, new=None): - super(MovedModule, self).__init__(name) - if PY3: - if new is None: - new = name - self.mod = new - else: - self.mod = old - - def _resolve(self): - return _import_module(self.mod) - - def __getattr__(self, attr): - _module = self._resolve() - value = getattr(_module, attr) - setattr(self, attr, value) - return value - - -class _LazyModule(types.ModuleType): - - def __init__(self, name): - super(_LazyModule, self).__init__(name) - self.__doc__ = self.__class__.__doc__ - - def __dir__(self): - attrs = ["__doc__", "__name__"] - attrs += [attr.name for attr in self._moved_attributes] - return attrs - - # Subclasses should override this - _moved_attributes = [] - - -class MovedAttribute(_LazyDescr): - - def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): - super(MovedAttribute, self).__init__(name) - if PY3: - if new_mod is None: - new_mod = name - self.mod = new_mod - if new_attr is None: - if old_attr is None: - new_attr = name - else: - new_attr = old_attr - self.attr = new_attr - else: - self.mod = old_mod - if old_attr is None: - old_attr = name - self.attr = old_attr - - def _resolve(self): - module = _import_module(self.mod) - return getattr(module, self.attr) - - -class _SixMetaPathImporter(object): - - """ - A meta path importer to import six.moves and its submodules. - - This class implements a PEP302 finder and loader. It should be compatible - with Python 2.5 and all existing versions of Python3 - """ - - def __init__(self, six_module_name): - self.name = six_module_name - self.known_modules = {} - - def _add_module(self, mod, *fullnames): - for fullname in fullnames: - self.known_modules[self.name + "." + fullname] = mod - - def _get_module(self, fullname): - return self.known_modules[self.name + "." + fullname] - - def find_module(self, fullname, path=None): - if fullname in self.known_modules: - return self - return None - - def __get_module(self, fullname): - try: - return self.known_modules[fullname] - except KeyError: - raise ImportError("This loader does not know module " + fullname) - - def load_module(self, fullname): - try: - # in case of a reload - return sys.modules[fullname] - except KeyError: - pass - mod = self.__get_module(fullname) - if isinstance(mod, MovedModule): - mod = mod._resolve() - else: - mod.__loader__ = self - sys.modules[fullname] = mod - return mod - - def is_package(self, fullname): - """ - Return true, if the named module is a package. - - We need this method to get correct spec objects with - Python 3.4 (see PEP451) - """ - return hasattr(self.__get_module(fullname), "__path__") - - def get_code(self, fullname): - """Return None - - Required, if is_package is implemented""" - self.__get_module(fullname) # eventually raises ImportError - return None - get_source = get_code # same as get_code - -_importer = _SixMetaPathImporter(__name__) - - -class _MovedItems(_LazyModule): - - """Lazy loading of moved objects""" - __path__ = [] # mark as package - - -_moved_attributes = [ - MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), - MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), - MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"), - MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), - MovedAttribute("intern", "__builtin__", "sys"), - MovedAttribute("map", "itertools", "builtins", "imap", "map"), - MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"), - MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"), - MovedAttribute("getoutput", "commands", "subprocess"), - MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), - MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"), - MovedAttribute("reduce", "__builtin__", "functools"), - MovedAttribute("shlex_quote", "pipes", "shlex", "quote"), - MovedAttribute("StringIO", "StringIO", "io"), - MovedAttribute("UserDict", "UserDict", "collections"), - MovedAttribute("UserList", "UserList", "collections"), - MovedAttribute("UserString", "UserString", "collections"), - MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), - MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), - MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"), - MovedModule("builtins", "__builtin__"), - MovedModule("configparser", "ConfigParser"), - MovedModule("copyreg", "copy_reg"), - MovedModule("dbm_gnu", "gdbm", "dbm.gnu"), - MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"), - MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), - MovedModule("http_cookies", "Cookie", "http.cookies"), - MovedModule("html_entities", "htmlentitydefs", "html.entities"), - MovedModule("html_parser", "HTMLParser", "html.parser"), - MovedModule("http_client", "httplib", "http.client"), - MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), - MovedModule("email_mime_image", "email.MIMEImage", "email.mime.image"), - MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), - MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"), - MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), - MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), - MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), - MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), - MovedModule("cPickle", "cPickle", "pickle"), - MovedModule("queue", "Queue"), - MovedModule("reprlib", "repr"), - MovedModule("socketserver", "SocketServer"), - MovedModule("_thread", "thread", "_thread"), - MovedModule("tkinter", "Tkinter"), - MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), - MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), - MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), - MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), - MovedModule("tkinter_tix", "Tix", "tkinter.tix"), - MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"), - MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), - MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), - MovedModule("tkinter_colorchooser", "tkColorChooser", - "tkinter.colorchooser"), - MovedModule("tkinter_commondialog", "tkCommonDialog", - "tkinter.commondialog"), - MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), - MovedModule("tkinter_font", "tkFont", "tkinter.font"), - MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), - MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", - "tkinter.simpledialog"), - MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"), - MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"), - MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"), - MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), - MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"), - MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"), -] -# Add windows specific modules. -if sys.platform == "win32": - _moved_attributes += [ - MovedModule("winreg", "_winreg"), - ] - -for attr in _moved_attributes: - setattr(_MovedItems, attr.name, attr) - if isinstance(attr, MovedModule): - _importer._add_module(attr, "moves." + attr.name) -del attr - -_MovedItems._moved_attributes = _moved_attributes - -moves = _MovedItems(__name__ + ".moves") -_importer._add_module(moves, "moves") - - -class Module_six_moves_urllib_parse(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_parse""" - - -_urllib_parse_moved_attributes = [ - MovedAttribute("ParseResult", "urlparse", "urllib.parse"), - MovedAttribute("SplitResult", "urlparse", "urllib.parse"), - MovedAttribute("parse_qs", "urlparse", "urllib.parse"), - MovedAttribute("parse_qsl", "urlparse", "urllib.parse"), - MovedAttribute("urldefrag", "urlparse", "urllib.parse"), - MovedAttribute("urljoin", "urlparse", "urllib.parse"), - MovedAttribute("urlparse", "urlparse", "urllib.parse"), - MovedAttribute("urlsplit", "urlparse", "urllib.parse"), - MovedAttribute("urlunparse", "urlparse", "urllib.parse"), - MovedAttribute("urlunsplit", "urlparse", "urllib.parse"), - MovedAttribute("quote", "urllib", "urllib.parse"), - MovedAttribute("quote_plus", "urllib", "urllib.parse"), - MovedAttribute("unquote", "urllib", "urllib.parse"), - MovedAttribute("unquote_plus", "urllib", "urllib.parse"), - MovedAttribute("unquote_to_bytes", "urllib", "urllib.parse", "unquote", "unquote_to_bytes"), - MovedAttribute("urlencode", "urllib", "urllib.parse"), - MovedAttribute("splitquery", "urllib", "urllib.parse"), - MovedAttribute("splittag", "urllib", "urllib.parse"), - MovedAttribute("splituser", "urllib", "urllib.parse"), - MovedAttribute("splitvalue", "urllib", "urllib.parse"), - MovedAttribute("uses_fragment", "urlparse", "urllib.parse"), - MovedAttribute("uses_netloc", "urlparse", "urllib.parse"), - MovedAttribute("uses_params", "urlparse", "urllib.parse"), - MovedAttribute("uses_query", "urlparse", "urllib.parse"), - MovedAttribute("uses_relative", "urlparse", "urllib.parse"), -] -for attr in _urllib_parse_moved_attributes: - setattr(Module_six_moves_urllib_parse, attr.name, attr) -del attr - -Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes - -_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"), - "moves.urllib_parse", "moves.urllib.parse") - - -class Module_six_moves_urllib_error(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_error""" - - -_urllib_error_moved_attributes = [ - MovedAttribute("URLError", "urllib2", "urllib.error"), - MovedAttribute("HTTPError", "urllib2", "urllib.error"), - MovedAttribute("ContentTooShortError", "urllib", "urllib.error"), -] -for attr in _urllib_error_moved_attributes: - setattr(Module_six_moves_urllib_error, attr.name, attr) -del attr - -Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes - -_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"), - "moves.urllib_error", "moves.urllib.error") - - -class Module_six_moves_urllib_request(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_request""" - - -_urllib_request_moved_attributes = [ - MovedAttribute("urlopen", "urllib2", "urllib.request"), - MovedAttribute("install_opener", "urllib2", "urllib.request"), - MovedAttribute("build_opener", "urllib2", "urllib.request"), - MovedAttribute("pathname2url", "urllib", "urllib.request"), - MovedAttribute("url2pathname", "urllib", "urllib.request"), - MovedAttribute("getproxies", "urllib", "urllib.request"), - MovedAttribute("Request", "urllib2", "urllib.request"), - MovedAttribute("OpenerDirector", "urllib2", "urllib.request"), - MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"), - MovedAttribute("ProxyHandler", "urllib2", "urllib.request"), - MovedAttribute("BaseHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"), - MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"), - MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"), - MovedAttribute("FileHandler", "urllib2", "urllib.request"), - MovedAttribute("FTPHandler", "urllib2", "urllib.request"), - MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"), - MovedAttribute("UnknownHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"), - MovedAttribute("urlretrieve", "urllib", "urllib.request"), - MovedAttribute("urlcleanup", "urllib", "urllib.request"), - MovedAttribute("URLopener", "urllib", "urllib.request"), - MovedAttribute("FancyURLopener", "urllib", "urllib.request"), - MovedAttribute("proxy_bypass", "urllib", "urllib.request"), - MovedAttribute("parse_http_list", "urllib2", "urllib.request"), - MovedAttribute("parse_keqv_list", "urllib2", "urllib.request"), -] -for attr in _urllib_request_moved_attributes: - setattr(Module_six_moves_urllib_request, attr.name, attr) -del attr - -Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes - -_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"), - "moves.urllib_request", "moves.urllib.request") - - -class Module_six_moves_urllib_response(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_response""" - - -_urllib_response_moved_attributes = [ - MovedAttribute("addbase", "urllib", "urllib.response"), - MovedAttribute("addclosehook", "urllib", "urllib.response"), - MovedAttribute("addinfo", "urllib", "urllib.response"), - MovedAttribute("addinfourl", "urllib", "urllib.response"), -] -for attr in _urllib_response_moved_attributes: - setattr(Module_six_moves_urllib_response, attr.name, attr) -del attr - -Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes - -_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"), - "moves.urllib_response", "moves.urllib.response") - - -class Module_six_moves_urllib_robotparser(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_robotparser""" - - -_urllib_robotparser_moved_attributes = [ - MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"), -] -for attr in _urllib_robotparser_moved_attributes: - setattr(Module_six_moves_urllib_robotparser, attr.name, attr) -del attr - -Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes - -_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"), - "moves.urllib_robotparser", "moves.urllib.robotparser") - - -class Module_six_moves_urllib(types.ModuleType): - - """Create a six.moves.urllib namespace that resembles the Python 3 namespace""" - __path__ = [] # mark as package - parse = _importer._get_module("moves.urllib_parse") - error = _importer._get_module("moves.urllib_error") - request = _importer._get_module("moves.urllib_request") - response = _importer._get_module("moves.urllib_response") - robotparser = _importer._get_module("moves.urllib_robotparser") - - def __dir__(self): - return ['parse', 'error', 'request', 'response', 'robotparser'] - -_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"), - "moves.urllib") - - -def add_move(move): - """Add an item to six.moves.""" - setattr(_MovedItems, move.name, move) - - -def remove_move(name): - """Remove item from six.moves.""" - try: - delattr(_MovedItems, name) - except AttributeError: - try: - del moves.__dict__[name] - except KeyError: - raise AttributeError("no such move, %r" % (name,)) - - -if PY3: - _meth_func = "__func__" - _meth_self = "__self__" - - _func_closure = "__closure__" - _func_code = "__code__" - _func_defaults = "__defaults__" - _func_globals = "__globals__" -else: - _meth_func = "im_func" - _meth_self = "im_self" - - _func_closure = "func_closure" - _func_code = "func_code" - _func_defaults = "func_defaults" - _func_globals = "func_globals" - - -try: - advance_iterator = next -except NameError: - def advance_iterator(it): - return it.next() -next = advance_iterator - - -try: - callable = callable -except NameError: - def callable(obj): - return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) - - -if PY3: - def get_unbound_function(unbound): - return unbound - - create_bound_method = types.MethodType - - def create_unbound_method(func, cls): - return func - - Iterator = object -else: - def get_unbound_function(unbound): - return unbound.im_func - - def create_bound_method(func, obj): - return types.MethodType(func, obj, obj.__class__) - - def create_unbound_method(func, cls): - return types.MethodType(func, None, cls) - - class Iterator(object): - - def next(self): - return type(self).__next__(self) - - callable = callable -_add_doc(get_unbound_function, - """Get the function out of a possibly unbound function""") - - -get_method_function = operator.attrgetter(_meth_func) -get_method_self = operator.attrgetter(_meth_self) -get_function_closure = operator.attrgetter(_func_closure) -get_function_code = operator.attrgetter(_func_code) -get_function_defaults = operator.attrgetter(_func_defaults) -get_function_globals = operator.attrgetter(_func_globals) - - -if PY3: - def iterkeys(d, **kw): - return iter(d.keys(**kw)) - - def itervalues(d, **kw): - return iter(d.values(**kw)) - - def iteritems(d, **kw): - return iter(d.items(**kw)) - - def iterlists(d, **kw): - return iter(d.lists(**kw)) - - viewkeys = operator.methodcaller("keys") - - viewvalues = operator.methodcaller("values") - - viewitems = operator.methodcaller("items") -else: - def iterkeys(d, **kw): - return d.iterkeys(**kw) - - def itervalues(d, **kw): - return d.itervalues(**kw) - - def iteritems(d, **kw): - return d.iteritems(**kw) - - def iterlists(d, **kw): - return d.iterlists(**kw) - - viewkeys = operator.methodcaller("viewkeys") - - viewvalues = operator.methodcaller("viewvalues") - - viewitems = operator.methodcaller("viewitems") - -_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.") -_add_doc(itervalues, "Return an iterator over the values of a dictionary.") -_add_doc(iteritems, - "Return an iterator over the (key, value) pairs of a dictionary.") -_add_doc(iterlists, - "Return an iterator over the (key, [values]) pairs of a dictionary.") - - -if PY3: - def b(s): - return s.encode("latin-1") - - def u(s): - return s - unichr = chr - import struct - int2byte = struct.Struct(">B").pack - del struct - byte2int = operator.itemgetter(0) - indexbytes = operator.getitem - iterbytes = iter - import io - StringIO = io.StringIO - BytesIO = io.BytesIO - _assertCountEqual = "assertCountEqual" - if sys.version_info[1] <= 1: - _assertRaisesRegex = "assertRaisesRegexp" - _assertRegex = "assertRegexpMatches" - else: - _assertRaisesRegex = "assertRaisesRegex" - _assertRegex = "assertRegex" -else: - def b(s): - return s - # Workaround for standalone backslash - - def u(s): - return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape") - unichr = unichr - int2byte = chr - - def byte2int(bs): - return ord(bs[0]) - - def indexbytes(buf, i): - return ord(buf[i]) - iterbytes = functools.partial(itertools.imap, ord) - import StringIO - StringIO = BytesIO = StringIO.StringIO - _assertCountEqual = "assertItemsEqual" - _assertRaisesRegex = "assertRaisesRegexp" - _assertRegex = "assertRegexpMatches" -_add_doc(b, """Byte literal""") -_add_doc(u, """Text literal""") - - -def assertCountEqual(self, *args, **kwargs): - return getattr(self, _assertCountEqual)(*args, **kwargs) - - -def assertRaisesRegex(self, *args, **kwargs): - return getattr(self, _assertRaisesRegex)(*args, **kwargs) - - -def assertRegex(self, *args, **kwargs): - return getattr(self, _assertRegex)(*args, **kwargs) - - -if PY3: - exec_ = getattr(moves.builtins, "exec") - - def reraise(tp, value, tb=None): - try: - if value is None: - value = tp() - if value.__traceback__ is not tb: - raise value.with_traceback(tb) - raise value - finally: - value = None - tb = None - -else: - def exec_(_code_, _globs_=None, _locs_=None): - """Execute code in a namespace.""" - if _globs_ is None: - frame = sys._getframe(1) - _globs_ = frame.f_globals - if _locs_ is None: - _locs_ = frame.f_locals - del frame - elif _locs_ is None: - _locs_ = _globs_ - exec("""exec _code_ in _globs_, _locs_""") - - exec_("""def reraise(tp, value, tb=None): - try: - raise tp, value, tb - finally: - tb = None -""") - - -if sys.version_info[:2] == (3, 2): - exec_("""def raise_from(value, from_value): - try: - if from_value is None: - raise value - raise value from from_value - finally: - value = None -""") -elif sys.version_info[:2] > (3, 2): - exec_("""def raise_from(value, from_value): - try: - raise value from from_value - finally: - value = None -""") -else: - def raise_from(value, from_value): - raise value - - -print_ = getattr(moves.builtins, "print", None) -if print_ is None: - def print_(*args, **kwargs): - """The new-style print function for Python 2.4 and 2.5.""" - fp = kwargs.pop("file", sys.stdout) - if fp is None: - return - - def write(data): - if not isinstance(data, basestring): - data = str(data) - # If the file has an encoding, encode unicode with it. - if (isinstance(fp, file) and - isinstance(data, unicode) and - fp.encoding is not None): - errors = getattr(fp, "errors", None) - if errors is None: - errors = "strict" - data = data.encode(fp.encoding, errors) - fp.write(data) - want_unicode = False - sep = kwargs.pop("sep", None) - if sep is not None: - if isinstance(sep, unicode): - want_unicode = True - elif not isinstance(sep, str): - raise TypeError("sep must be None or a string") - end = kwargs.pop("end", None) - if end is not None: - if isinstance(end, unicode): - want_unicode = True - elif not isinstance(end, str): - raise TypeError("end must be None or a string") - if kwargs: - raise TypeError("invalid keyword arguments to print()") - if not want_unicode: - for arg in args: - if isinstance(arg, unicode): - want_unicode = True - break - if want_unicode: - newline = unicode("\n") - space = unicode(" ") - else: - newline = "\n" - space = " " - if sep is None: - sep = space - if end is None: - end = newline - for i, arg in enumerate(args): - if i: - write(sep) - write(arg) - write(end) -if sys.version_info[:2] < (3, 3): - _print = print_ - - def print_(*args, **kwargs): - fp = kwargs.get("file", sys.stdout) - flush = kwargs.pop("flush", False) - _print(*args, **kwargs) - if flush and fp is not None: - fp.flush() - -_add_doc(reraise, """Reraise an exception.""") - -if sys.version_info[0:2] < (3, 4): - def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS, - updated=functools.WRAPPER_UPDATES): - def wrapper(f): - f = functools.wraps(wrapped, assigned, updated)(f) - f.__wrapped__ = wrapped - return f - return wrapper -else: - wraps = functools.wraps - - -def with_metaclass(meta, *bases): - """Create a base class with a metaclass.""" - # This requires a bit of explanation: the basic idea is to make a dummy - # metaclass for one level of class instantiation that replaces itself with - # the actual metaclass. - class metaclass(type): - - def __new__(cls, name, this_bases, d): - return meta(name, bases, d) - - @classmethod - def __prepare__(cls, name, this_bases): - return meta.__prepare__(name, bases) - return type.__new__(metaclass, 'temporary_class', (), {}) - - -def add_metaclass(metaclass): - """Class decorator for creating a class with a metaclass.""" - def wrapper(cls): - orig_vars = cls.__dict__.copy() - slots = orig_vars.get('__slots__') - if slots is not None: - if isinstance(slots, str): - slots = [slots] - for slots_var in slots: - orig_vars.pop(slots_var) - orig_vars.pop('__dict__', None) - orig_vars.pop('__weakref__', None) - if hasattr(cls, '__qualname__'): - orig_vars['__qualname__'] = cls.__qualname__ - return metaclass(cls.__name__, cls.__bases__, orig_vars) - return wrapper - - -def ensure_binary(s, encoding='utf-8', errors='strict'): - """Coerce **s** to six.binary_type. - - For Python 2: - - `unicode` -> encoded to `str` - - `str` -> `str` - - For Python 3: - - `str` -> encoded to `bytes` - - `bytes` -> `bytes` - """ - if isinstance(s, text_type): - return s.encode(encoding, errors) - elif isinstance(s, binary_type): - return s - else: - raise TypeError("not expecting type '%s'" % type(s)) - - -def ensure_str(s, encoding='utf-8', errors='strict'): - """Coerce *s* to `str`. - - For Python 2: - - `unicode` -> encoded to `str` - - `str` -> `str` - - For Python 3: - - `str` -> `str` - - `bytes` -> decoded to `str` - """ - if not isinstance(s, (text_type, binary_type)): - raise TypeError("not expecting type '%s'" % type(s)) - if PY2 and isinstance(s, text_type): - s = s.encode(encoding, errors) - elif PY3 and isinstance(s, binary_type): - s = s.decode(encoding, errors) - return s - - -def ensure_text(s, encoding='utf-8', errors='strict'): - """Coerce *s* to six.text_type. - - For Python 2: - - `unicode` -> `unicode` - - `str` -> `unicode` - - For Python 3: - - `str` -> `str` - - `bytes` -> decoded to `str` - """ - if isinstance(s, binary_type): - return s.decode(encoding, errors) - elif isinstance(s, text_type): - return s - else: - raise TypeError("not expecting type '%s'" % type(s)) - - - -def python_2_unicode_compatible(klass): - """ - A decorator that defines __unicode__ and __str__ methods under Python 2. - Under Python 3 it does nothing. - - To support Python 2 and 3 with a single code base, define a __str__ method - returning text and apply this decorator to the class. - """ - if PY2: - if '__str__' not in klass.__dict__: - raise ValueError("@python_2_unicode_compatible cannot be applied " - "to %s because it doesn't define __str__()." % - klass.__name__) - klass.__unicode__ = klass.__str__ - klass.__str__ = lambda self: self.__unicode__().encode('utf-8') - return klass - - -# Complete the moves implementation. -# This code is at the end of this module to speed up module loading. -# Turn this module into a package. -__path__ = [] # required for PEP 302 and PEP 451 -__package__ = __name__ # see PEP 366 @ReservedAssignment -if globals().get("__spec__") is not None: - __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable -# Remove other six meta path importers, since they cause problems. This can -# happen if six is removed from sys.modules and then reloaded. (Setuptools does -# this for some reason.) -if sys.meta_path: - for i, importer in enumerate(sys.meta_path): - # Here's some real nastiness: Another "instance" of the six module might - # be floating around. Therefore, we can't use isinstance() to check for - # the six meta path importer, since the other six instance will have - # inserted an importer with different class. - if (type(importer).__name__ == "_SixMetaPathImporter" and - importer.name == __name__): - del sys.meta_path[i] - break - del i, importer -# Finally, add the importer to the meta path import hook. -sys.meta_path.append(_importer) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/six.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/six.pyc deleted file mode 100644 index fafb1753343b7b2784e7a0bba9e7168d3b38cec4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37306 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 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/__init__.py deleted file mode 100644 index 148a9c3..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/__init__.py +++ /dev/null @@ -1,92 +0,0 @@ -""" -urllib3 - Thread-safe connection pooling and re-using. -""" - -from __future__ import absolute_import -import warnings - -from .connectionpool import ( - HTTPConnectionPool, - HTTPSConnectionPool, - connection_from_url -) - -from . import exceptions -from .filepost import encode_multipart_formdata -from .poolmanager import PoolManager, ProxyManager, proxy_from_url -from .response import HTTPResponse -from .util.request import make_headers -from .util.url import get_host -from .util.timeout import Timeout -from .util.retry import Retry - - -# Set default logging handler to avoid "No handler found" warnings. -import logging -from logging import NullHandler - -__author__ = 'Andrey Petrov (andrey.petrov@shazow.net)' -__license__ = 'MIT' -__version__ = '1.24.1' - -__all__ = ( - 'HTTPConnectionPool', - 'HTTPSConnectionPool', - 'PoolManager', - 'ProxyManager', - 'HTTPResponse', - 'Retry', - 'Timeout', - 'add_stderr_logger', - 'connection_from_url', - 'disable_warnings', - 'encode_multipart_formdata', - 'get_host', - 'make_headers', - 'proxy_from_url', -) - -logging.getLogger(__name__).addHandler(NullHandler()) - - -def add_stderr_logger(level=logging.DEBUG): - """ - Helper for quickly adding a StreamHandler to the logger. Useful for - debugging. - - Returns the handler after adding it. - """ - # This method needs to be in this __init__.py to get the __name__ correct - # even if urllib3 is vendored within another package. - logger = logging.getLogger(__name__) - handler = logging.StreamHandler() - handler.setFormatter(logging.Formatter('%(asctime)s %(levelname)s %(message)s')) - logger.addHandler(handler) - logger.setLevel(level) - logger.debug('Added a stderr logging handler to logger: %s', __name__) - return handler - - -# ... Clean up. -del NullHandler - - -# All warning filters *must* be appended unless you're really certain that they -# shouldn't be: otherwise, it's very hard for users to use most Python -# mechanisms to silence them. -# SecurityWarning's always go off by default. -warnings.simplefilter('always', exceptions.SecurityWarning, append=True) -# SubjectAltNameWarning's should go off once per host -warnings.simplefilter('default', exceptions.SubjectAltNameWarning, append=True) -# InsecurePlatformWarning's don't vary between requests, so we keep it default. -warnings.simplefilter('default', exceptions.InsecurePlatformWarning, - append=True) -# SNIMissingWarnings should go off only once. -warnings.simplefilter('default', exceptions.SNIMissingWarning, append=True) - - -def disable_warnings(category=exceptions.HTTPWarning): - """ - Helper for quickly disabling all urllib3 warnings. - """ - warnings.simplefilter('ignore', category) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/__init__.pyc deleted file mode 100644 index 4066c9c5191af16a9fa33471f9ee182b93b69c0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3012 zcmc&$dv6m*5T83IcH+DY;gy88$0O7!#3ltHTA?bGK0qQ-bTMjmRkgZ!*Y=sc2e*4k zjNp$dRX<0+W4}OWcF)8`N&m&xt#2N?J3I56-@5Y8LjCR^i@$fF{4C<{_BMd}+X3JJ z0geuE7o-ER3xNv`$rX?l2r9s*fKP**f_NH&X^5*3R3WZGP(weoRYA@`JPX0Bm1`jD z5YIs{XXP1?^AImUumJHQ1d9+aL9k?PvmhG~Ux46(mFplcLc9#YvX$pRUV`{C1edKm z5Aq7cS0T7+<pq$}AYOrB1!WuaDg>+MJc}S#Azp)E4Q;sPb>IyMJ_C;1eGYsbf-gX< z!q5Y815O+m-UP7*CqVBG8Eygh;7<pF+wj{OhzbnXf!_cz3&T6W(fdm{aUG{L+%ksd zd4`Si3|~zeaOu0iZ<}53Q3>{&cd%OOF%I=2mohqd;B9)HK`uhRsluM{x@nS#u8z{g z%hFUvN#6?-?&V^$P$;zO5zd7smKyXD4&i}HWuXO&;w;VeZbX)5h0GUmc;4ykJ^Qfa z9<HdDOZEO4`qSN6FHd8JG1{%_I7u9LMMjY+t6L#m(oMNwaUpe-g}G+EG>>_xLmR>z zy3nROVG{O5uIEY4)8o-tLEz0u@zH+dNU{4uWw@cRJCZgIUkf(Ce2Kh_V+OT-q1hl+ z+WOT{(}`k{7Nueu6~55<$l58a-9pOem|98ep!_u9xfpqS=#?INO|+oc%8a<J2I1TE zsFeu4p((dJFFLA<zgw-ZAGWr9%DL~-KuVvs_h)HXpn;;+7jOtUXG&w>Ig@E0^WmF1 zHPFN(6&^^zj>0^_GArLiOmX^@dY{hNrEO>iJ<qlgM+{#yz|aBh63*Y_3yKwj{d*VQ zxiFkEnrUhwbf8{%hrLlH+gPZ<JKH5>nIYz&)sQyOXW!IO{e>IVJ^VZuG84InRrcN# zQTMeRd3Y*=Qg2@)jN>w=o=!bI5S~3~%X_6nuaGp+ti#1Y(eE2T8ySmJ<cTs<2DU0* z*weUGxqPHs#!;<fDC^BoVUNUOLwV~>DGr59!cvNbQi!z;rS75UQ_cnVLeHk%L_@)j zx4<B6fZuxSs!1i&R6Nq5n<fP!>!m4{rW!Ct8!@J-vi~`-!L}0mCv1RFW8`M`sYGSO zvy|yEi=p>Rid|E&O-5|jkZ2C22~IXZ6IU5F!4=G)QhaM?d2|?R(LN0Gb}yCG8SS^n z?a_n$AUS%y_2^A<|55(%QTMSr{)WHJ@8hSRwL9%B$~L1!=}^i|y|vS4d!#ZCI}`~| z^L9y6ZN{P`(u}pTkxzJih>xP?h1n%%-nrr|;J4wJfJ1o{j+A}PGF->R&P6Xomgo|Q z$3Qk9zJv-3V#FvRkuIzc$a{j;^N?qo#(+;sZ_KCT7P5FTVMP5T&Bbn$TGV8I>|=|D z)G0+Tl2|m$52o8Nqx}>a1Lu6gWD{@vijSh$VX8?vS7$T3I)~ZSM=Y#}kS1B!C??rf z8TKK*R1;LH&g3w&>lyckI*ZoS|K1sj@;+vA6VxQx8@PRRS8U=0gD%E++Qqh{E@P}$ zAe&&9`Y3^albk4Tr%}??I>FjRs0cyyouW4i1K}Vtyig1gYsw(aiS0c$LG$EmCgkN! zWr*M4s?d>a<>E~ta2X2B_!%u?)u%O2{fN!*y0VuAIhV7s2KE-An)`H$@{D1j2WgH+ zrga#TQCHwS`9VHJ62Pk(WvU=!*yETFLWoZd=U>CY@XilEe*fxc)6@Pf($SxaebFuQ zNRNK8w~?l-bn-&z%VaDLhWHQVsnokjg=3eiXnBDF;6$+}Lybfqk8OmT{oNNkk)ppa zV=cu^petpcyiS|VynPCKGevq5r@WBjI|7E<#i8mpoO$<pwSgpe9iQ?$HSaXss)OGO ZlG-`nYGtLev|OpJxGU~Or{=Cy{smcl;7$Ml diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/_collections.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/_collections.py deleted file mode 100644 index 34f2381..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/_collections.py +++ /dev/null @@ -1,329 +0,0 @@ -from __future__ import absolute_import -try: - from collections.abc import Mapping, MutableMapping -except ImportError: - from collections import Mapping, MutableMapping -try: - from threading import RLock -except ImportError: # Platform-specific: No threads available - class RLock: - def __enter__(self): - pass - - def __exit__(self, exc_type, exc_value, traceback): - pass - - -from collections import OrderedDict -from .exceptions import InvalidHeader -from .packages.six import iterkeys, itervalues, PY3 - - -__all__ = ['RecentlyUsedContainer', 'HTTPHeaderDict'] - - -_Null = object() - - -class RecentlyUsedContainer(MutableMapping): - """ - Provides a thread-safe dict-like container which maintains up to - ``maxsize`` keys while throwing away the least-recently-used keys beyond - ``maxsize``. - - :param maxsize: - Maximum number of recent elements to retain. - - :param dispose_func: - Every time an item is evicted from the container, - ``dispose_func(value)`` is called. Callback which will get called - """ - - ContainerCls = OrderedDict - - def __init__(self, maxsize=10, dispose_func=None): - self._maxsize = maxsize - self.dispose_func = dispose_func - - self._container = self.ContainerCls() - self.lock = RLock() - - def __getitem__(self, key): - # Re-insert the item, moving it to the end of the eviction line. - with self.lock: - item = self._container.pop(key) - self._container[key] = item - return item - - def __setitem__(self, key, value): - evicted_value = _Null - with self.lock: - # Possibly evict the existing value of 'key' - evicted_value = self._container.get(key, _Null) - self._container[key] = value - - # If we didn't evict an existing value, we might have to evict the - # least recently used item from the beginning of the container. - if len(self._container) > self._maxsize: - _key, evicted_value = self._container.popitem(last=False) - - if self.dispose_func and evicted_value is not _Null: - self.dispose_func(evicted_value) - - def __delitem__(self, key): - with self.lock: - value = self._container.pop(key) - - if self.dispose_func: - self.dispose_func(value) - - def __len__(self): - with self.lock: - return len(self._container) - - def __iter__(self): - raise NotImplementedError('Iteration over this class is unlikely to be threadsafe.') - - def clear(self): - with self.lock: - # Copy pointers to all values, then wipe the mapping - values = list(itervalues(self._container)) - self._container.clear() - - if self.dispose_func: - for value in values: - self.dispose_func(value) - - def keys(self): - with self.lock: - return list(iterkeys(self._container)) - - -class HTTPHeaderDict(MutableMapping): - """ - :param headers: - An iterable of field-value pairs. Must not contain multiple field names - when compared case-insensitively. - - :param kwargs: - Additional field-value pairs to pass in to ``dict.update``. - - A ``dict`` like container for storing HTTP Headers. - - Field names are stored and compared case-insensitively in compliance with - RFC 7230. Iteration provides the first case-sensitive key seen for each - case-insensitive pair. - - Using ``__setitem__`` syntax overwrites fields that compare equal - case-insensitively in order to maintain ``dict``'s api. For fields that - compare equal, instead create a new ``HTTPHeaderDict`` and use ``.add`` - in a loop. - - If multiple fields that are equal case-insensitively are passed to the - constructor or ``.update``, the behavior is undefined and some will be - lost. - - >>> headers = HTTPHeaderDict() - >>> headers.add('Set-Cookie', 'foo=bar') - >>> headers.add('set-cookie', 'baz=quxx') - >>> headers['content-length'] = '7' - >>> headers['SET-cookie'] - 'foo=bar, baz=quxx' - >>> headers['Content-Length'] - '7' - """ - - def __init__(self, headers=None, **kwargs): - super(HTTPHeaderDict, self).__init__() - self._container = OrderedDict() - if headers is not None: - if isinstance(headers, HTTPHeaderDict): - self._copy_from(headers) - else: - self.extend(headers) - if kwargs: - self.extend(kwargs) - - def __setitem__(self, key, val): - self._container[key.lower()] = [key, val] - return self._container[key.lower()] - - def __getitem__(self, key): - val = self._container[key.lower()] - return ', '.join(val[1:]) - - def __delitem__(self, key): - del self._container[key.lower()] - - def __contains__(self, key): - return key.lower() in self._container - - def __eq__(self, other): - if not isinstance(other, Mapping) and not hasattr(other, 'keys'): - return False - if not isinstance(other, type(self)): - other = type(self)(other) - return (dict((k.lower(), v) for k, v in self.itermerged()) == - dict((k.lower(), v) for k, v in other.itermerged())) - - def __ne__(self, other): - return not self.__eq__(other) - - if not PY3: # Python 2 - iterkeys = MutableMapping.iterkeys - itervalues = MutableMapping.itervalues - - __marker = object() - - def __len__(self): - return len(self._container) - - def __iter__(self): - # Only provide the originally cased names - for vals in self._container.values(): - yield vals[0] - - def pop(self, key, default=__marker): - '''D.pop(k[,d]) -> v, remove specified key and return the corresponding value. - If key is not found, d is returned if given, otherwise KeyError is raised. - ''' - # Using the MutableMapping function directly fails due to the private marker. - # Using ordinary dict.pop would expose the internal structures. - # So let's reinvent the wheel. - try: - value = self[key] - except KeyError: - if default is self.__marker: - raise - return default - else: - del self[key] - return value - - def discard(self, key): - try: - del self[key] - except KeyError: - pass - - def add(self, key, val): - """Adds a (name, value) pair, doesn't overwrite the value if it already - exists. - - >>> headers = HTTPHeaderDict(foo='bar') - >>> headers.add('Foo', 'baz') - >>> headers['foo'] - 'bar, baz' - """ - key_lower = key.lower() - new_vals = [key, val] - # Keep the common case aka no item present as fast as possible - vals = self._container.setdefault(key_lower, new_vals) - if new_vals is not vals: - vals.append(val) - - def extend(self, *args, **kwargs): - """Generic import function for any type of header-like object. - Adapted version of MutableMapping.update in order to insert items - with self.add instead of self.__setitem__ - """ - if len(args) > 1: - raise TypeError("extend() takes at most 1 positional " - "arguments ({0} given)".format(len(args))) - other = args[0] if len(args) >= 1 else () - - if isinstance(other, HTTPHeaderDict): - for key, val in other.iteritems(): - self.add(key, val) - elif isinstance(other, Mapping): - for key in other: - self.add(key, other[key]) - elif hasattr(other, "keys"): - for key in other.keys(): - self.add(key, other[key]) - else: - for key, value in other: - self.add(key, value) - - for key, value in kwargs.items(): - self.add(key, value) - - def getlist(self, key, default=__marker): - """Returns a list of all the values for the named field. Returns an - empty list if the key doesn't exist.""" - try: - vals = self._container[key.lower()] - except KeyError: - if default is self.__marker: - return [] - return default - else: - return vals[1:] - - # Backwards compatibility for httplib - getheaders = getlist - getallmatchingheaders = getlist - iget = getlist - - # Backwards compatibility for http.cookiejar - get_all = getlist - - def __repr__(self): - return "%s(%s)" % (type(self).__name__, dict(self.itermerged())) - - def _copy_from(self, other): - for key in other: - val = other.getlist(key) - if isinstance(val, list): - # Don't need to convert tuples - val = list(val) - self._container[key.lower()] = [key] + val - - def copy(self): - clone = type(self)() - clone._copy_from(self) - return clone - - def iteritems(self): - """Iterate over all header lines, including duplicate ones.""" - for key in self: - vals = self._container[key.lower()] - for val in vals[1:]: - yield vals[0], val - - def itermerged(self): - """Iterate over all headers, merging duplicate ones together.""" - for key in self: - val = self._container[key.lower()] - yield val[0], ', '.join(val[1:]) - - def items(self): - return list(self.iteritems()) - - @classmethod - def from_httplib(cls, message): # Python 2 - """Read headers from a Python 2 httplib message object.""" - # python2.7 does not expose a proper API for exporting multiheaders - # efficiently. This function re-reads raw lines from the message - # object and extracts the multiheaders properly. - obs_fold_continued_leaders = (' ', '\t') - headers = [] - - for line in message.headers: - if line.startswith(obs_fold_continued_leaders): - if not headers: - # We received a header line that starts with OWS as described - # in RFC-7230 S3.2.4. This indicates a multiline header, but - # there exists no previous header to which we can attach it. - raise InvalidHeader( - 'Header continuation with no previous header: %s' % line - ) - else: - key, value = headers[-1] - headers[-1] = (key, value + ' ' + line.strip()) - continue - - key, value = line.split(':', 1) - headers.append((key, value.strip())) - - return cls(headers) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/_collections.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/_collections.pyc deleted file mode 100644 index 732d14693e41f965a4cca1428829e77612679989..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15104 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 Khp}I$KmA`U+W3C} diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/connection.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/connection.py deleted file mode 100644 index 02b3665..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/connection.py +++ /dev/null @@ -1,391 +0,0 @@ -from __future__ import absolute_import -import datetime -import logging -import os -import socket -from socket import error as SocketError, timeout as SocketTimeout -import warnings -from .packages import six -from .packages.six.moves.http_client import HTTPConnection as _HTTPConnection -from .packages.six.moves.http_client import HTTPException # noqa: F401 - -try: # Compiled with SSL? - import ssl - BaseSSLError = ssl.SSLError -except (ImportError, AttributeError): # Platform-specific: No SSL. - ssl = None - - class BaseSSLError(BaseException): - pass - - -try: # Python 3: - # Not a no-op, we're adding this to the namespace so it can be imported. - ConnectionError = ConnectionError -except NameError: # Python 2: - class ConnectionError(Exception): - pass - - -from .exceptions import ( - NewConnectionError, - ConnectTimeoutError, - SubjectAltNameWarning, - SystemTimeWarning, -) -from .packages.ssl_match_hostname import match_hostname, CertificateError - -from .util.ssl_ import ( - resolve_cert_reqs, - resolve_ssl_version, - assert_fingerprint, - create_urllib3_context, - ssl_wrap_socket -) - - -from .util import connection - -from ._collections import HTTPHeaderDict - -log = logging.getLogger(__name__) - -port_by_scheme = { - 'http': 80, - 'https': 443, -} - -# When updating RECENT_DATE, move it to within two years of the current date, -# and not less than 6 months ago. -# Example: if Today is 2018-01-01, then RECENT_DATE should be any date on or -# after 2016-01-01 (today - 2 years) AND before 2017-07-01 (today - 6 months) -RECENT_DATE = datetime.date(2017, 6, 30) - - -class DummyConnection(object): - """Used to detect a failed ConnectionCls import.""" - pass - - -class HTTPConnection(_HTTPConnection, object): - """ - Based on httplib.HTTPConnection but provides an extra constructor - backwards-compatibility layer between older and newer Pythons. - - Additional keyword parameters are used to configure attributes of the connection. - Accepted parameters include: - - - ``strict``: See the documentation on :class:`urllib3.connectionpool.HTTPConnectionPool` - - ``source_address``: Set the source address for the current connection. - - ``socket_options``: Set specific options on the underlying socket. If not specified, then - defaults are loaded from ``HTTPConnection.default_socket_options`` which includes disabling - Nagle's algorithm (sets TCP_NODELAY to 1) unless the connection is behind a proxy. - - For example, if you wish to enable TCP Keep Alive in addition to the defaults, - you might pass:: - - HTTPConnection.default_socket_options + [ - (socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1), - ] - - Or you may want to disable the defaults by passing an empty list (e.g., ``[]``). - """ - - default_port = port_by_scheme['http'] - - #: Disable Nagle's algorithm by default. - #: ``[(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)]`` - default_socket_options = [(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)] - - #: Whether this connection verifies the host's certificate. - is_verified = False - - def __init__(self, *args, **kw): - if six.PY3: # Python 3 - kw.pop('strict', None) - - # Pre-set source_address. - self.source_address = kw.get('source_address') - - #: The socket options provided by the user. If no options are - #: provided, we use the default options. - self.socket_options = kw.pop('socket_options', self.default_socket_options) - - _HTTPConnection.__init__(self, *args, **kw) - - @property - def host(self): - """ - Getter method to remove any trailing dots that indicate the hostname is an FQDN. - - In general, SSL certificates don't include the trailing dot indicating a - fully-qualified domain name, and thus, they don't validate properly when - checked against a domain name that includes the dot. In addition, some - servers may not expect to receive the trailing dot when provided. - - However, the hostname with trailing dot is critical to DNS resolution; doing a - lookup with the trailing dot will properly only resolve the appropriate FQDN, - whereas a lookup without a trailing dot will search the system's search domain - list. Thus, it's important to keep the original host around for use only in - those cases where it's appropriate (i.e., when doing DNS lookup to establish the - actual TCP connection across which we're going to send HTTP requests). - """ - return self._dns_host.rstrip('.') - - @host.setter - def host(self, value): - """ - Setter for the `host` property. - - We assume that only urllib3 uses the _dns_host attribute; httplib itself - only uses `host`, and it seems reasonable that other libraries follow suit. - """ - self._dns_host = value - - def _new_conn(self): - """ Establish a socket connection and set nodelay settings on it. - - :return: New socket connection. - """ - extra_kw = {} - if self.source_address: - extra_kw['source_address'] = self.source_address - - if self.socket_options: - extra_kw['socket_options'] = self.socket_options - - try: - conn = connection.create_connection( - (self._dns_host, self.port), self.timeout, **extra_kw) - - except SocketTimeout as e: - raise ConnectTimeoutError( - self, "Connection to %s timed out. (connect timeout=%s)" % - (self.host, self.timeout)) - - except SocketError as e: - raise NewConnectionError( - self, "Failed to establish a new connection: %s" % e) - - return conn - - def _prepare_conn(self, conn): - self.sock = conn - if self._tunnel_host: - # TODO: Fix tunnel so it doesn't depend on self.sock state. - self._tunnel() - # Mark this connection as not reusable - self.auto_open = 0 - - def connect(self): - conn = self._new_conn() - self._prepare_conn(conn) - - def request_chunked(self, method, url, body=None, headers=None): - """ - Alternative to the common request method, which sends the - body with chunked encoding and not as one block - """ - headers = HTTPHeaderDict(headers if headers is not None else {}) - skip_accept_encoding = 'accept-encoding' in headers - skip_host = 'host' in headers - self.putrequest( - method, - url, - skip_accept_encoding=skip_accept_encoding, - skip_host=skip_host - ) - for header, value in headers.items(): - self.putheader(header, value) - if 'transfer-encoding' not in headers: - self.putheader('Transfer-Encoding', 'chunked') - self.endheaders() - - if body is not None: - stringish_types = six.string_types + (bytes,) - if isinstance(body, stringish_types): - body = (body,) - for chunk in body: - if not chunk: - continue - if not isinstance(chunk, bytes): - chunk = chunk.encode('utf8') - len_str = hex(len(chunk))[2:] - self.send(len_str.encode('utf-8')) - self.send(b'\r\n') - self.send(chunk) - self.send(b'\r\n') - - # After the if clause, to always have a closed body - self.send(b'0\r\n\r\n') - - -class HTTPSConnection(HTTPConnection): - default_port = port_by_scheme['https'] - - ssl_version = None - - def __init__(self, host, port=None, key_file=None, cert_file=None, - strict=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, - ssl_context=None, server_hostname=None, **kw): - - HTTPConnection.__init__(self, host, port, strict=strict, - timeout=timeout, **kw) - - self.key_file = key_file - self.cert_file = cert_file - self.ssl_context = ssl_context - self.server_hostname = server_hostname - - # Required property for Google AppEngine 1.9.0 which otherwise causes - # HTTPS requests to go out as HTTP. (See Issue #356) - self._protocol = 'https' - - def connect(self): - conn = self._new_conn() - self._prepare_conn(conn) - - if self.ssl_context is None: - self.ssl_context = create_urllib3_context( - ssl_version=resolve_ssl_version(None), - cert_reqs=resolve_cert_reqs(None), - ) - - self.sock = ssl_wrap_socket( - sock=conn, - keyfile=self.key_file, - certfile=self.cert_file, - ssl_context=self.ssl_context, - server_hostname=self.server_hostname - ) - - -class VerifiedHTTPSConnection(HTTPSConnection): - """ - Based on httplib.HTTPSConnection but wraps the socket with - SSL certification. - """ - cert_reqs = None - ca_certs = None - ca_cert_dir = None - ssl_version = None - assert_fingerprint = None - - def set_cert(self, key_file=None, cert_file=None, - cert_reqs=None, ca_certs=None, - assert_hostname=None, assert_fingerprint=None, - ca_cert_dir=None): - """ - This method should only be called once, before the connection is used. - """ - # If cert_reqs is not provided, we can try to guess. If the user gave - # us a cert database, we assume they want to use it: otherwise, if - # they gave us an SSL Context object we should use whatever is set for - # it. - if cert_reqs is None: - if ca_certs or ca_cert_dir: - cert_reqs = 'CERT_REQUIRED' - elif self.ssl_context is not None: - cert_reqs = self.ssl_context.verify_mode - - self.key_file = key_file - self.cert_file = cert_file - self.cert_reqs = cert_reqs - self.assert_hostname = assert_hostname - self.assert_fingerprint = assert_fingerprint - self.ca_certs = ca_certs and os.path.expanduser(ca_certs) - self.ca_cert_dir = ca_cert_dir and os.path.expanduser(ca_cert_dir) - - def connect(self): - # Add certificate verification - conn = self._new_conn() - hostname = self.host - - if self._tunnel_host: - self.sock = conn - # Calls self._set_hostport(), so self.host is - # self._tunnel_host below. - self._tunnel() - # Mark this connection as not reusable - self.auto_open = 0 - - # Override the host with the one we're requesting data from. - hostname = self._tunnel_host - - server_hostname = hostname - if self.server_hostname is not None: - server_hostname = self.server_hostname - - is_time_off = datetime.date.today() < RECENT_DATE - if is_time_off: - warnings.warn(( - 'System time is way off (before {0}). This will probably ' - 'lead to SSL verification errors').format(RECENT_DATE), - SystemTimeWarning - ) - - # Wrap socket using verification with the root certs in - # trusted_root_certs - if self.ssl_context is None: - self.ssl_context = create_urllib3_context( - ssl_version=resolve_ssl_version(self.ssl_version), - cert_reqs=resolve_cert_reqs(self.cert_reqs), - ) - - context = self.ssl_context - context.verify_mode = resolve_cert_reqs(self.cert_reqs) - self.sock = ssl_wrap_socket( - sock=conn, - keyfile=self.key_file, - certfile=self.cert_file, - ca_certs=self.ca_certs, - ca_cert_dir=self.ca_cert_dir, - server_hostname=server_hostname, - ssl_context=context) - - if self.assert_fingerprint: - assert_fingerprint(self.sock.getpeercert(binary_form=True), - self.assert_fingerprint) - elif context.verify_mode != ssl.CERT_NONE \ - and not getattr(context, 'check_hostname', False) \ - and self.assert_hostname is not False: - # While urllib3 attempts to always turn off hostname matching from - # the TLS library, this cannot always be done. So we check whether - # the TLS Library still thinks it's matching hostnames. - cert = self.sock.getpeercert() - if not cert.get('subjectAltName', ()): - warnings.warn(( - 'Certificate for {0} has no `subjectAltName`, falling back to check for a ' - '`commonName` for now. This feature is being removed by major browsers and ' - 'deprecated by RFC 2818. (See https://github.com/shazow/urllib3/issues/497 ' - 'for details.)'.format(hostname)), - SubjectAltNameWarning - ) - _match_hostname(cert, self.assert_hostname or server_hostname) - - self.is_verified = ( - context.verify_mode == ssl.CERT_REQUIRED or - self.assert_fingerprint is not None - ) - - -def _match_hostname(cert, asserted_hostname): - try: - match_hostname(cert, asserted_hostname) - except CertificateError as e: - log.error( - 'Certificate did not match expected hostname: %s. ' - 'Certificate: %s', asserted_hostname, cert - ) - # Add cert to exception and reraise so client code can inspect - # the cert when catching the exception, if they want to - e._peer_cert = cert - raise - - -if ssl: - # Make a copy for testing. - UnverifiedHTTPSConnection = HTTPSConnection - HTTPSConnection = VerifiedHTTPSConnection -else: - HTTPSConnection = DummyConnection diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/connection.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/connection.pyc deleted file mode 100644 index c8d05ff3b9125dc8988f77d278c0d8c67ffc262c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13186 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 G;eP-=0gKN7 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/connectionpool.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/connectionpool.py deleted file mode 100644 index f7a8f19..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/connectionpool.py +++ /dev/null @@ -1,896 +0,0 @@ -from __future__ import absolute_import -import errno -import logging -import sys -import warnings - -from socket import error as SocketError, timeout as SocketTimeout -import socket - - -from .exceptions import ( - ClosedPoolError, - ProtocolError, - EmptyPoolError, - HeaderParsingError, - HostChangedError, - LocationValueError, - MaxRetryError, - ProxyError, - ReadTimeoutError, - SSLError, - TimeoutError, - InsecureRequestWarning, - NewConnectionError, -) -from .packages.ssl_match_hostname import CertificateError -from .packages import six -from .packages.six.moves import queue -from .connection import ( - port_by_scheme, - DummyConnection, - HTTPConnection, HTTPSConnection, VerifiedHTTPSConnection, - HTTPException, BaseSSLError, -) -from .request import RequestMethods -from .response import HTTPResponse - -from .util.connection import is_connection_dropped -from .util.request import set_file_position -from .util.response import assert_header_parsing -from .util.retry import Retry -from .util.timeout import Timeout -from .util.url import get_host, Url, NORMALIZABLE_SCHEMES -from .util.queue import LifoQueue - - -xrange = six.moves.xrange - -log = logging.getLogger(__name__) - -_Default = object() - - -# Pool objects -class ConnectionPool(object): - """ - Base class for all connection pools, such as - :class:`.HTTPConnectionPool` and :class:`.HTTPSConnectionPool`. - """ - - scheme = None - QueueCls = LifoQueue - - def __init__(self, host, port=None): - if not host: - raise LocationValueError("No host specified.") - - self.host = _ipv6_host(host, self.scheme) - self._proxy_host = host.lower() - self.port = port - - def __str__(self): - return '%s(host=%r, port=%r)' % (type(self).__name__, - self.host, self.port) - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - self.close() - # Return False to re-raise any potential exceptions - return False - - def close(self): - """ - Close all pooled connections and disable the pool. - """ - pass - - -# This is taken from http://hg.python.org/cpython/file/7aaba721ebc0/Lib/socket.py#l252 -_blocking_errnos = {errno.EAGAIN, errno.EWOULDBLOCK} - - -class HTTPConnectionPool(ConnectionPool, RequestMethods): - """ - Thread-safe connection pool for one host. - - :param host: - Host used for this HTTP Connection (e.g. "localhost"), passed into - :class:`httplib.HTTPConnection`. - - :param port: - Port used for this HTTP Connection (None is equivalent to 80), passed - into :class:`httplib.HTTPConnection`. - - :param strict: - Causes BadStatusLine to be raised if the status line can't be parsed - as a valid HTTP/1.0 or 1.1 status line, passed into - :class:`httplib.HTTPConnection`. - - .. note:: - Only works in Python 2. This parameter is ignored in Python 3. - - :param timeout: - Socket timeout in seconds for each individual connection. This can - be a float or integer, which sets the timeout for the HTTP request, - or an instance of :class:`urllib3.util.Timeout` which gives you more - fine-grained control over request timeouts. After the constructor has - been parsed, this is always a `urllib3.util.Timeout` object. - - :param maxsize: - Number of connections to save that can be reused. More than 1 is useful - in multithreaded situations. If ``block`` is set to False, more - connections will be created but they will not be saved once they've - been used. - - :param block: - If set to True, no more than ``maxsize`` connections will be used at - a time. When no free connections are available, the call will block - until a connection has been released. This is a useful side effect for - particular multithreaded situations where one does not want to use more - than maxsize connections per host to prevent flooding. - - :param headers: - Headers to include with all requests, unless other headers are given - explicitly. - - :param retries: - Retry configuration to use by default with requests in this pool. - - :param _proxy: - Parsed proxy URL, should not be used directly, instead, see - :class:`urllib3.connectionpool.ProxyManager`" - - :param _proxy_headers: - A dictionary with proxy headers, should not be used directly, - instead, see :class:`urllib3.connectionpool.ProxyManager`" - - :param \\**conn_kw: - Additional parameters are used to create fresh :class:`urllib3.connection.HTTPConnection`, - :class:`urllib3.connection.HTTPSConnection` instances. - """ - - scheme = 'http' - ConnectionCls = HTTPConnection - ResponseCls = HTTPResponse - - def __init__(self, host, port=None, strict=False, - timeout=Timeout.DEFAULT_TIMEOUT, maxsize=1, block=False, - headers=None, retries=None, - _proxy=None, _proxy_headers=None, - **conn_kw): - ConnectionPool.__init__(self, host, port) - RequestMethods.__init__(self, headers) - - self.strict = strict - - if not isinstance(timeout, Timeout): - timeout = Timeout.from_float(timeout) - - if retries is None: - retries = Retry.DEFAULT - - self.timeout = timeout - self.retries = retries - - self.pool = self.QueueCls(maxsize) - self.block = block - - self.proxy = _proxy - self.proxy_headers = _proxy_headers or {} - - # Fill the queue up so that doing get() on it will block properly - for _ in xrange(maxsize): - self.pool.put(None) - - # These are mostly for testing and debugging purposes. - self.num_connections = 0 - self.num_requests = 0 - self.conn_kw = conn_kw - - if self.proxy: - # Enable Nagle's algorithm for proxies, to avoid packet fragmentation. - # We cannot know if the user has added default socket options, so we cannot replace the - # list. - self.conn_kw.setdefault('socket_options', []) - - def _new_conn(self): - """ - Return a fresh :class:`HTTPConnection`. - """ - self.num_connections += 1 - log.debug("Starting new HTTP connection (%d): %s:%s", - self.num_connections, self.host, self.port or "80") - - conn = self.ConnectionCls(host=self.host, port=self.port, - timeout=self.timeout.connect_timeout, - strict=self.strict, **self.conn_kw) - return conn - - def _get_conn(self, timeout=None): - """ - Get a connection. Will return a pooled connection if one is available. - - If no connections are available and :prop:`.block` is ``False``, then a - fresh connection is returned. - - :param timeout: - Seconds to wait before giving up and raising - :class:`urllib3.exceptions.EmptyPoolError` if the pool is empty and - :prop:`.block` is ``True``. - """ - conn = None - try: - conn = self.pool.get(block=self.block, timeout=timeout) - - except AttributeError: # self.pool is None - raise ClosedPoolError(self, "Pool is closed.") - - except queue.Empty: - if self.block: - raise EmptyPoolError(self, - "Pool reached maximum size and no more " - "connections are allowed.") - pass # Oh well, we'll create a new connection then - - # If this is a persistent connection, check if it got disconnected - if conn and is_connection_dropped(conn): - log.debug("Resetting dropped connection: %s", self.host) - conn.close() - if getattr(conn, 'auto_open', 1) == 0: - # This is a proxied connection that has been mutated by - # httplib._tunnel() and cannot be reused (since it would - # attempt to bypass the proxy) - conn = None - - return conn or self._new_conn() - - def _put_conn(self, conn): - """ - Put a connection back into the pool. - - :param conn: - Connection object for the current host and port as returned by - :meth:`._new_conn` or :meth:`._get_conn`. - - If the pool is already full, the connection is closed and discarded - because we exceeded maxsize. If connections are discarded frequently, - then maxsize should be increased. - - If the pool is closed, then the connection will be closed and discarded. - """ - try: - self.pool.put(conn, block=False) - return # Everything is dandy, done. - except AttributeError: - # self.pool is None. - pass - except queue.Full: - # This should never happen if self.block == True - log.warning( - "Connection pool is full, discarding connection: %s", - self.host) - - # Connection never got put back into the pool, close it. - if conn: - conn.close() - - def _validate_conn(self, conn): - """ - Called right before a request is made, after the socket is created. - """ - pass - - def _prepare_proxy(self, conn): - # Nothing to do for HTTP connections. - pass - - def _get_timeout(self, timeout): - """ Helper that always returns a :class:`urllib3.util.Timeout` """ - if timeout is _Default: - return self.timeout.clone() - - if isinstance(timeout, Timeout): - return timeout.clone() - else: - # User passed us an int/float. This is for backwards compatibility, - # can be removed later - return Timeout.from_float(timeout) - - def _raise_timeout(self, err, url, timeout_value): - """Is the error actually a timeout? Will raise a ReadTimeout or pass""" - - if isinstance(err, SocketTimeout): - raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value) - - # See the above comment about EAGAIN in Python 3. In Python 2 we have - # to specifically catch it and throw the timeout error - if hasattr(err, 'errno') and err.errno in _blocking_errnos: - raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value) - - # Catch possible read timeouts thrown as SSL errors. If not the - # case, rethrow the original. We need to do this because of: - # http://bugs.python.org/issue10272 - if 'timed out' in str(err) or 'did not complete (read)' in str(err): # Python < 2.7.4 - raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value) - - def _make_request(self, conn, method, url, timeout=_Default, chunked=False, - **httplib_request_kw): - """ - Perform a request on a given urllib connection object taken from our - pool. - - :param conn: - a connection from one of our connection pools - - :param timeout: - Socket timeout in seconds for the request. This can be a - float or integer, which will set the same timeout value for - the socket connect and the socket read, or an instance of - :class:`urllib3.util.Timeout`, which gives you more fine-grained - control over your timeouts. - """ - self.num_requests += 1 - - timeout_obj = self._get_timeout(timeout) - timeout_obj.start_connect() - conn.timeout = timeout_obj.connect_timeout - - # Trigger any extra validation we need to do. - try: - self._validate_conn(conn) - except (SocketTimeout, BaseSSLError) as e: - # Py2 raises this as a BaseSSLError, Py3 raises it as socket timeout. - self._raise_timeout(err=e, url=url, timeout_value=conn.timeout) - raise - - # conn.request() calls httplib.*.request, not the method in - # urllib3.request. It also calls makefile (recv) on the socket. - if chunked: - conn.request_chunked(method, url, **httplib_request_kw) - else: - conn.request(method, url, **httplib_request_kw) - - # Reset the timeout for the recv() on the socket - read_timeout = timeout_obj.read_timeout - - # App Engine doesn't have a sock attr - if getattr(conn, 'sock', None): - # In Python 3 socket.py will catch EAGAIN and return None when you - # try and read into the file pointer created by http.client, which - # instead raises a BadStatusLine exception. Instead of catching - # the exception and assuming all BadStatusLine exceptions are read - # timeouts, check for a zero timeout before making the request. - if read_timeout == 0: - raise ReadTimeoutError( - self, url, "Read timed out. (read timeout=%s)" % read_timeout) - if read_timeout is Timeout.DEFAULT_TIMEOUT: - conn.sock.settimeout(socket.getdefaulttimeout()) - else: # None or a value - conn.sock.settimeout(read_timeout) - - # Receive the response from the server - try: - try: # Python 2.7, use buffering of HTTP responses - httplib_response = conn.getresponse(buffering=True) - except TypeError: # Python 3 - try: - httplib_response = conn.getresponse() - except Exception as e: - # Remove the TypeError from the exception chain in Python 3; - # otherwise it looks like a programming error was the cause. - six.raise_from(e, None) - except (SocketTimeout, BaseSSLError, SocketError) as e: - self._raise_timeout(err=e, url=url, timeout_value=read_timeout) - raise - - # AppEngine doesn't have a version attr. - http_version = getattr(conn, '_http_vsn_str', 'HTTP/?') - log.debug("%s://%s:%s \"%s %s %s\" %s %s", self.scheme, self.host, self.port, - method, url, http_version, httplib_response.status, - httplib_response.length) - - try: - assert_header_parsing(httplib_response.msg) - except (HeaderParsingError, TypeError) as hpe: # Platform-specific: Python 3 - log.warning( - 'Failed to parse headers (url=%s): %s', - self._absolute_url(url), hpe, exc_info=True) - - return httplib_response - - def _absolute_url(self, path): - return Url(scheme=self.scheme, host=self.host, port=self.port, path=path).url - - def close(self): - """ - Close all pooled connections and disable the pool. - """ - if self.pool is None: - return - # Disable access to the pool - old_pool, self.pool = self.pool, None - - try: - while True: - conn = old_pool.get(block=False) - if conn: - conn.close() - - except queue.Empty: - pass # Done. - - def is_same_host(self, url): - """ - Check if the given ``url`` is a member of the same host as this - connection pool. - """ - if url.startswith('/'): - return True - - # TODO: Add optional support for socket.gethostbyname checking. - scheme, host, port = get_host(url) - - host = _ipv6_host(host, self.scheme) - - # Use explicit default port for comparison when none is given - if self.port and not port: - port = port_by_scheme.get(scheme) - elif not self.port and port == port_by_scheme.get(scheme): - port = None - - return (scheme, host, port) == (self.scheme, self.host, self.port) - - def urlopen(self, method, url, body=None, headers=None, retries=None, - redirect=True, assert_same_host=True, timeout=_Default, - pool_timeout=None, release_conn=None, chunked=False, - body_pos=None, **response_kw): - """ - Get a connection from the pool and perform an HTTP request. This is the - lowest level call for making a request, so you'll need to specify all - the raw details. - - .. note:: - - More commonly, it's appropriate to use a convenience method provided - by :class:`.RequestMethods`, such as :meth:`request`. - - .. note:: - - `release_conn` will only behave as expected if - `preload_content=False` because we want to make - `preload_content=False` the default behaviour someday soon without - breaking backwards compatibility. - - :param method: - HTTP request method (such as GET, POST, PUT, etc.) - - :param body: - Data to send in the request body (useful for creating - POST requests, see HTTPConnectionPool.post_url for - more convenience). - - :param headers: - Dictionary of custom headers to send, such as User-Agent, - If-None-Match, etc. If None, pool headers are used. If provided, - these headers completely replace any pool-specific headers. - - :param retries: - Configure the number of retries to allow before raising a - :class:`~urllib3.exceptions.MaxRetryError` exception. - - Pass ``None`` to retry until you receive a response. Pass a - :class:`~urllib3.util.retry.Retry` object for fine-grained control - over different types of retries. - Pass an integer number to retry connection errors that many times, - but no other types of errors. Pass zero to never retry. - - If ``False``, then retries are disabled and any exception is raised - immediately. Also, instead of raising a MaxRetryError on redirects, - the redirect response will be returned. - - :type retries: :class:`~urllib3.util.retry.Retry`, False, or an int. - - :param redirect: - If True, automatically handle redirects (status codes 301, 302, - 303, 307, 308). Each redirect counts as a retry. Disabling retries - will disable redirect, too. - - :param assert_same_host: - If ``True``, will make sure that the host of the pool requests is - consistent else will raise HostChangedError. When False, you can - use the pool on an HTTP proxy and request foreign hosts. - - :param timeout: - If specified, overrides the default timeout for this one - request. It may be a float (in seconds) or an instance of - :class:`urllib3.util.Timeout`. - - :param pool_timeout: - If set and the pool is set to block=True, then this method will - block for ``pool_timeout`` seconds and raise EmptyPoolError if no - connection is available within the time period. - - :param release_conn: - If False, then the urlopen call will not release the connection - back into the pool once a response is received (but will release if - you read the entire contents of the response such as when - `preload_content=True`). This is useful if you're not preloading - the response's content immediately. You will need to call - ``r.release_conn()`` on the response ``r`` to return the connection - back into the pool. If None, it takes the value of - ``response_kw.get('preload_content', True)``. - - :param chunked: - If True, urllib3 will send the body using chunked transfer - encoding. Otherwise, urllib3 will send the body using the standard - content-length form. Defaults to False. - - :param int body_pos: - Position to seek to in file-like body in the event of a retry or - redirect. Typically this won't need to be set because urllib3 will - auto-populate the value when needed. - - :param \\**response_kw: - Additional parameters are passed to - :meth:`urllib3.response.HTTPResponse.from_httplib` - """ - if headers is None: - headers = self.headers - - if not isinstance(retries, Retry): - retries = Retry.from_int(retries, redirect=redirect, default=self.retries) - - if release_conn is None: - release_conn = response_kw.get('preload_content', True) - - # Check host - if assert_same_host and not self.is_same_host(url): - raise HostChangedError(self, url, retries) - - conn = None - - # Track whether `conn` needs to be released before - # returning/raising/recursing. Update this variable if necessary, and - # leave `release_conn` constant throughout the function. That way, if - # the function recurses, the original value of `release_conn` will be - # passed down into the recursive call, and its value will be respected. - # - # See issue #651 [1] for details. - # - # [1] <https://github.com/shazow/urllib3/issues/651> - release_this_conn = release_conn - - # Merge the proxy headers. Only do this in HTTP. We have to copy the - # headers dict so we can safely change it without those changes being - # reflected in anyone else's copy. - if self.scheme == 'http': - headers = headers.copy() - headers.update(self.proxy_headers) - - # Must keep the exception bound to a separate variable or else Python 3 - # complains about UnboundLocalError. - err = None - - # Keep track of whether we cleanly exited the except block. This - # ensures we do proper cleanup in finally. - clean_exit = False - - # Rewind body position, if needed. Record current position - # for future rewinds in the event of a redirect/retry. - body_pos = set_file_position(body, body_pos) - - try: - # Request a connection from the queue. - timeout_obj = self._get_timeout(timeout) - conn = self._get_conn(timeout=pool_timeout) - - conn.timeout = timeout_obj.connect_timeout - - is_new_proxy_conn = self.proxy is not None and not getattr(conn, 'sock', None) - if is_new_proxy_conn: - self._prepare_proxy(conn) - - # Make the request on the httplib connection object. - httplib_response = self._make_request(conn, method, url, - timeout=timeout_obj, - body=body, headers=headers, - chunked=chunked) - - # If we're going to release the connection in ``finally:``, then - # the response doesn't need to know about the connection. Otherwise - # it will also try to release it and we'll have a double-release - # mess. - response_conn = conn if not release_conn else None - - # Pass method to Response for length checking - response_kw['request_method'] = method - - # Import httplib's response into our own wrapper object - response = self.ResponseCls.from_httplib(httplib_response, - pool=self, - connection=response_conn, - retries=retries, - **response_kw) - - # Everything went great! - clean_exit = True - - except queue.Empty: - # Timed out by queue. - raise EmptyPoolError(self, "No pool connections are available.") - - except (TimeoutError, HTTPException, SocketError, ProtocolError, - BaseSSLError, SSLError, CertificateError) as e: - # Discard the connection for these exceptions. It will be - # replaced during the next _get_conn() call. - clean_exit = False - if isinstance(e, (BaseSSLError, CertificateError)): - e = SSLError(e) - elif isinstance(e, (SocketError, NewConnectionError)) and self.proxy: - e = ProxyError('Cannot connect to proxy.', e) - elif isinstance(e, (SocketError, HTTPException)): - e = ProtocolError('Connection aborted.', e) - - retries = retries.increment(method, url, error=e, _pool=self, - _stacktrace=sys.exc_info()[2]) - retries.sleep() - - # Keep track of the error for the retry warning. - err = e - - finally: - if not clean_exit: - # We hit some kind of exception, handled or otherwise. We need - # to throw the connection away unless explicitly told not to. - # Close the connection, set the variable to None, and make sure - # we put the None back in the pool to avoid leaking it. - conn = conn and conn.close() - release_this_conn = True - - if release_this_conn: - # Put the connection back to be reused. If the connection is - # expired then it will be None, which will get replaced with a - # fresh connection during _get_conn. - self._put_conn(conn) - - if not conn: - # Try again - log.warning("Retrying (%r) after connection " - "broken by '%r': %s", retries, err, url) - return self.urlopen(method, url, body, headers, retries, - redirect, assert_same_host, - timeout=timeout, pool_timeout=pool_timeout, - release_conn=release_conn, body_pos=body_pos, - **response_kw) - - def drain_and_release_conn(response): - try: - # discard any remaining response body, the connection will be - # released back to the pool once the entire response is read - response.read() - except (TimeoutError, HTTPException, SocketError, ProtocolError, - BaseSSLError, SSLError) as e: - pass - - # Handle redirect? - redirect_location = redirect and response.get_redirect_location() - if redirect_location: - if response.status == 303: - method = 'GET' - - try: - retries = retries.increment(method, url, response=response, _pool=self) - except MaxRetryError: - if retries.raise_on_redirect: - # Drain and release the connection for this response, since - # we're not returning it to be released manually. - drain_and_release_conn(response) - raise - return response - - # drain and return the connection to the pool before recursing - drain_and_release_conn(response) - - retries.sleep_for_retry(response) - log.debug("Redirecting %s -> %s", url, redirect_location) - return self.urlopen( - method, redirect_location, body, headers, - retries=retries, redirect=redirect, - assert_same_host=assert_same_host, - timeout=timeout, pool_timeout=pool_timeout, - release_conn=release_conn, body_pos=body_pos, - **response_kw) - - # Check if we should retry the HTTP response. - has_retry_after = bool(response.getheader('Retry-After')) - if retries.is_retry(method, response.status, has_retry_after): - try: - retries = retries.increment(method, url, response=response, _pool=self) - except MaxRetryError: - if retries.raise_on_status: - # Drain and release the connection for this response, since - # we're not returning it to be released manually. - drain_and_release_conn(response) - raise - return response - - # drain and return the connection to the pool before recursing - drain_and_release_conn(response) - - retries.sleep(response) - log.debug("Retry: %s", url) - return self.urlopen( - method, url, body, headers, - retries=retries, redirect=redirect, - assert_same_host=assert_same_host, - timeout=timeout, pool_timeout=pool_timeout, - release_conn=release_conn, - body_pos=body_pos, **response_kw) - - return response - - -class HTTPSConnectionPool(HTTPConnectionPool): - """ - Same as :class:`.HTTPConnectionPool`, but HTTPS. - - When Python is compiled with the :mod:`ssl` module, then - :class:`.VerifiedHTTPSConnection` is used, which *can* verify certificates, - instead of :class:`.HTTPSConnection`. - - :class:`.VerifiedHTTPSConnection` uses one of ``assert_fingerprint``, - ``assert_hostname`` and ``host`` in this order to verify connections. - If ``assert_hostname`` is False, no verification is done. - - The ``key_file``, ``cert_file``, ``cert_reqs``, ``ca_certs``, - ``ca_cert_dir``, and ``ssl_version`` are only used if :mod:`ssl` is - available and are fed into :meth:`urllib3.util.ssl_wrap_socket` to upgrade - the connection socket into an SSL socket. - """ - - scheme = 'https' - ConnectionCls = HTTPSConnection - - def __init__(self, host, port=None, - strict=False, timeout=Timeout.DEFAULT_TIMEOUT, maxsize=1, - block=False, headers=None, retries=None, - _proxy=None, _proxy_headers=None, - key_file=None, cert_file=None, cert_reqs=None, - ca_certs=None, ssl_version=None, - assert_hostname=None, assert_fingerprint=None, - ca_cert_dir=None, **conn_kw): - - HTTPConnectionPool.__init__(self, host, port, strict, timeout, maxsize, - block, headers, retries, _proxy, _proxy_headers, - **conn_kw) - - if ca_certs and cert_reqs is None: - cert_reqs = 'CERT_REQUIRED' - - self.key_file = key_file - self.cert_file = cert_file - self.cert_reqs = cert_reqs - self.ca_certs = ca_certs - self.ca_cert_dir = ca_cert_dir - self.ssl_version = ssl_version - self.assert_hostname = assert_hostname - self.assert_fingerprint = assert_fingerprint - - def _prepare_conn(self, conn): - """ - Prepare the ``connection`` for :meth:`urllib3.util.ssl_wrap_socket` - and establish the tunnel if proxy is used. - """ - - if isinstance(conn, VerifiedHTTPSConnection): - conn.set_cert(key_file=self.key_file, - cert_file=self.cert_file, - cert_reqs=self.cert_reqs, - ca_certs=self.ca_certs, - ca_cert_dir=self.ca_cert_dir, - assert_hostname=self.assert_hostname, - assert_fingerprint=self.assert_fingerprint) - conn.ssl_version = self.ssl_version - return conn - - def _prepare_proxy(self, conn): - """ - Establish tunnel connection early, because otherwise httplib - would improperly set Host: header to proxy's IP:port. - """ - conn.set_tunnel(self._proxy_host, self.port, self.proxy_headers) - conn.connect() - - def _new_conn(self): - """ - Return a fresh :class:`httplib.HTTPSConnection`. - """ - self.num_connections += 1 - log.debug("Starting new HTTPS connection (%d): %s:%s", - self.num_connections, self.host, self.port or "443") - - if not self.ConnectionCls or self.ConnectionCls is DummyConnection: - raise SSLError("Can't connect to HTTPS URL because the SSL " - "module is not available.") - - actual_host = self.host - actual_port = self.port - if self.proxy is not None: - actual_host = self.proxy.host - actual_port = self.proxy.port - - conn = self.ConnectionCls(host=actual_host, port=actual_port, - timeout=self.timeout.connect_timeout, - strict=self.strict, **self.conn_kw) - - return self._prepare_conn(conn) - - def _validate_conn(self, conn): - """ - Called right before a request is made, after the socket is created. - """ - super(HTTPSConnectionPool, self)._validate_conn(conn) - - # Force connect early to allow us to validate the connection. - if not getattr(conn, 'sock', None): # AppEngine might not have `.sock` - conn.connect() - - if not conn.is_verified: - warnings.warn(( - 'Unverified HTTPS request is being made. ' - 'Adding certificate verification is strongly advised. See: ' - 'https://urllib3.readthedocs.io/en/latest/advanced-usage.html' - '#ssl-warnings'), - InsecureRequestWarning) - - -def connection_from_url(url, **kw): - """ - Given a url, return an :class:`.ConnectionPool` instance of its host. - - This is a shortcut for not having to parse out the scheme, host, and port - of the url before creating an :class:`.ConnectionPool` instance. - - :param url: - Absolute URL string that must include the scheme. Port is optional. - - :param \\**kw: - Passes additional parameters to the constructor of the appropriate - :class:`.ConnectionPool`. Useful for specifying things like - timeout, maxsize, headers, etc. - - Example:: - - >>> conn = connection_from_url('http://google.com/') - >>> r = conn.request('GET', '/') - """ - scheme, host, port = get_host(url) - port = port or port_by_scheme.get(scheme, 80) - if scheme == 'https': - return HTTPSConnectionPool(host, port=port, **kw) - else: - return HTTPConnectionPool(host, port=port, **kw) - - -def _ipv6_host(host, scheme): - """ - Process IPv6 address literals - """ - - # httplib doesn't like it when we include brackets in IPv6 addresses - # Specifically, if we include brackets but also pass the port then - # httplib crazily doubles up the square brackets on the Host header. - # Instead, we need to make sure we never pass ``None`` as the port. - # However, for backward compatibility reasons we can't actually - # *assert* that. See http://bugs.python.org/issue28539 - # - # Also if an IPv6 address literal has a zone identifier, the - # percent sign might be URIencoded, convert it back into ASCII - if host.startswith('[') and host.endswith(']'): - host = host.replace('%25', '%').strip('[]') - if scheme in NORMALIZABLE_SCHEMES: - host = host.lower() - return host diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/connectionpool.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/connectionpool.pyc deleted file mode 100644 index 970e3c1d5cc3142ae2f4330122417d9b67edbdcf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28575 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 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/__init__.pyc deleted file mode 100644 index f49aee15dd7e4590b330a54ebf2af453f9b4aabe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 206 zcmZ9GO$x#=5QQVU5JAsTkUEu0Q4sM0ilAEwZ4*l{CUKJf?mV*>Fcnum_}+tWGc$Zo zC-c|rnv-7!e)k?b^2G=_2faB4zQ|wM+B+~Ps?>3)QiPk9jH89Ffi}iW)%RucR8fMf zBwyQR!#a$73Ii7~!h}Lumr5DB<)NUbUVWhzS4<<6D5c0^$hC4PGN4o_;V500){Xt` O?L)It@?HO-^^gx2mo(S_ diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py deleted file mode 100644 index f3e0094..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py +++ /dev/null @@ -1,30 +0,0 @@ -""" -This module provides means to detect the App Engine environment. -""" - -import os - - -def is_appengine(): - return (is_local_appengine() or - is_prod_appengine() or - is_prod_appengine_mvms()) - - -def is_appengine_sandbox(): - return is_appengine() and not is_prod_appengine_mvms() - - -def is_local_appengine(): - return ('APPENGINE_RUNTIME' in os.environ and - 'Development/' in os.environ['SERVER_SOFTWARE']) - - -def is_prod_appengine(): - return ('APPENGINE_RUNTIME' in os.environ and - 'Google App Engine/' in os.environ['SERVER_SOFTWARE'] and - not is_prod_appengine_mvms()) - - -def is_prod_appengine_mvms(): - return os.environ.get('GAE_VM', False) == 'true' diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.pyc deleted file mode 100644 index 368ba447f95cce7e6615eb584f6b3de3185ce655..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1838 zcmd5-ZBNud5T4#k@d$!%QTbr($D)BkFhmn$Jh2cyP|4nj35nVCy6aKsb!&I2z&C>b z*dL%X+v83nKj8MV)7k0ncAjUS*=zo~JOA=(@oNI(*1+d`?0OrG060SHfM`JGz!5r4 z_=&*=h?aGlAllYxfpD$U1~F$Hmsa)sJG9vcH1qxARC^;O&NAs0rK(aPaV+Cpdq#Oe z8krc+980fT6keDQ(_DHouhLTGBbl4E`SdroXp*Xfn^Kl~8I1wB1}L6_ac-OjIX$1I zMShd!JV29bo~b0xcw7|He#G3b!<du!EBg4hC?8cL?c*Dm8hwSspeWNSHZrK<GWe!4 zAxj-xo(C73<skoYy0P^=U*9TUZ6&Yu`5SRru45Y(K|d(cVl~aRiL-3gZ0ryD0flVm zmCS`IgR?Tr(!pkssN9t4Aebh}$Na1n7iOW(cLK{2?^3Ex2Y(59)F!kM?3y-pZ%o_5 z4P7JyMw~J7rdX{vBY+=aW_X$tz+A_<7^w3_jB838rl1MRHpM+OC}_le;=rj3>N&}@ z9-_FHG1T*0I4QES=pGz|(e7Rpa`rju@9l@0X#OZGnW=(Q8JHyu^g?zRGT!^N)Bn<C zp-*2oWRx~@_!uA4O!CMuKcLFc1RI>CTUdL6FaBX|<v-Tc3L(A*Kn+>`Sey2wjdztA zV$Dy>I$)$rTa%3FVWidBRT`s`d4gTn<+S8HyoICjErhZ<!Rrwv)`V+x8gNS2APF!s zw0^f6^22>Y9GUV=TC%1r;3|NjG=|vQi8C!{Q#2&*XV}Mu=F>4+sdFw=!g-B|z%W8; hMP_-N-D5VS!ngGw)H}-D*1FqRXm;FAtJChde*lO&$=?6~ diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.pyc deleted file mode 100644 index f30e5e4704731f75d7b062e38da90edddea2b0d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 223 zcmZ9GK?=e!6htGs5JAsTkoqf?q9Ec06hXHV+9sA@OyW;k+wR<XUoT)Pt{iwX@K)1* zk4Mwz<eZaVdVaSaJMhH_IR>5C2foN(*_U@<P*kboP^AbLEg44(Z4FI~nR;C3$z4SW zE|Pp{>lJG;@+l0Qzz7oxWnC&|=;phE9y;}fR$MWSP@<F~iy_y_p~!$*o|niSrpg+P a4k#5$I7(-xaYKJ*ebcOzeA8XF9`XS|n>*_O diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py deleted file mode 100644 index bcf41c0..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py +++ /dev/null @@ -1,593 +0,0 @@ -""" -This module uses ctypes to bind a whole bunch of functions and constants from -SecureTransport. The goal here is to provide the low-level API to -SecureTransport. These are essentially the C-level functions and constants, and -they're pretty gross to work with. - -This code is a bastardised version of the code found in Will Bond's oscrypto -library. An enormous debt is owed to him for blazing this trail for us. For -that reason, this code should be considered to be covered both by urllib3's -license and by oscrypto's: - - Copyright (c) 2015-2016 Will Bond <will@wbond.net> - - Permission is hereby granted, free of charge, to any person obtaining a - copy of this software and associated documentation files (the "Software"), - to deal in the Software without restriction, including without limitation - the rights to use, copy, modify, merge, publish, distribute, sublicense, - and/or sell copies of the Software, and to permit persons to whom the - Software is furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. -""" -from __future__ import absolute_import - -import platform -from ctypes.util import find_library -from ctypes import ( - c_void_p, c_int32, c_char_p, c_size_t, c_byte, c_uint32, c_ulong, c_long, - c_bool -) -from ctypes import CDLL, POINTER, CFUNCTYPE - - -security_path = find_library('Security') -if not security_path: - raise ImportError('The library Security could not be found') - - -core_foundation_path = find_library('CoreFoundation') -if not core_foundation_path: - raise ImportError('The library CoreFoundation could not be found') - - -version = platform.mac_ver()[0] -version_info = tuple(map(int, version.split('.'))) -if version_info < (10, 8): - raise OSError( - 'Only OS X 10.8 and newer are supported, not %s.%s' % ( - version_info[0], version_info[1] - ) - ) - -Security = CDLL(security_path, use_errno=True) -CoreFoundation = CDLL(core_foundation_path, use_errno=True) - -Boolean = c_bool -CFIndex = c_long -CFStringEncoding = c_uint32 -CFData = c_void_p -CFString = c_void_p -CFArray = c_void_p -CFMutableArray = c_void_p -CFDictionary = c_void_p -CFError = c_void_p -CFType = c_void_p -CFTypeID = c_ulong - -CFTypeRef = POINTER(CFType) -CFAllocatorRef = c_void_p - -OSStatus = c_int32 - -CFDataRef = POINTER(CFData) -CFStringRef = POINTER(CFString) -CFArrayRef = POINTER(CFArray) -CFMutableArrayRef = POINTER(CFMutableArray) -CFDictionaryRef = POINTER(CFDictionary) -CFArrayCallBacks = c_void_p -CFDictionaryKeyCallBacks = c_void_p -CFDictionaryValueCallBacks = c_void_p - -SecCertificateRef = POINTER(c_void_p) -SecExternalFormat = c_uint32 -SecExternalItemType = c_uint32 -SecIdentityRef = POINTER(c_void_p) -SecItemImportExportFlags = c_uint32 -SecItemImportExportKeyParameters = c_void_p -SecKeychainRef = POINTER(c_void_p) -SSLProtocol = c_uint32 -SSLCipherSuite = c_uint32 -SSLContextRef = POINTER(c_void_p) -SecTrustRef = POINTER(c_void_p) -SSLConnectionRef = c_uint32 -SecTrustResultType = c_uint32 -SecTrustOptionFlags = c_uint32 -SSLProtocolSide = c_uint32 -SSLConnectionType = c_uint32 -SSLSessionOption = c_uint32 - - -try: - Security.SecItemImport.argtypes = [ - CFDataRef, - CFStringRef, - POINTER(SecExternalFormat), - POINTER(SecExternalItemType), - SecItemImportExportFlags, - POINTER(SecItemImportExportKeyParameters), - SecKeychainRef, - POINTER(CFArrayRef), - ] - Security.SecItemImport.restype = OSStatus - - Security.SecCertificateGetTypeID.argtypes = [] - Security.SecCertificateGetTypeID.restype = CFTypeID - - Security.SecIdentityGetTypeID.argtypes = [] - Security.SecIdentityGetTypeID.restype = CFTypeID - - Security.SecKeyGetTypeID.argtypes = [] - Security.SecKeyGetTypeID.restype = CFTypeID - - Security.SecCertificateCreateWithData.argtypes = [ - CFAllocatorRef, - CFDataRef - ] - Security.SecCertificateCreateWithData.restype = SecCertificateRef - - Security.SecCertificateCopyData.argtypes = [ - SecCertificateRef - ] - Security.SecCertificateCopyData.restype = CFDataRef - - Security.SecCopyErrorMessageString.argtypes = [ - OSStatus, - c_void_p - ] - Security.SecCopyErrorMessageString.restype = CFStringRef - - Security.SecIdentityCreateWithCertificate.argtypes = [ - CFTypeRef, - SecCertificateRef, - POINTER(SecIdentityRef) - ] - Security.SecIdentityCreateWithCertificate.restype = OSStatus - - Security.SecKeychainCreate.argtypes = [ - c_char_p, - c_uint32, - c_void_p, - Boolean, - c_void_p, - POINTER(SecKeychainRef) - ] - Security.SecKeychainCreate.restype = OSStatus - - Security.SecKeychainDelete.argtypes = [ - SecKeychainRef - ] - Security.SecKeychainDelete.restype = OSStatus - - Security.SecPKCS12Import.argtypes = [ - CFDataRef, - CFDictionaryRef, - POINTER(CFArrayRef) - ] - Security.SecPKCS12Import.restype = OSStatus - - SSLReadFunc = CFUNCTYPE(OSStatus, SSLConnectionRef, c_void_p, POINTER(c_size_t)) - SSLWriteFunc = CFUNCTYPE(OSStatus, SSLConnectionRef, POINTER(c_byte), POINTER(c_size_t)) - - Security.SSLSetIOFuncs.argtypes = [ - SSLContextRef, - SSLReadFunc, - SSLWriteFunc - ] - Security.SSLSetIOFuncs.restype = OSStatus - - Security.SSLSetPeerID.argtypes = [ - SSLContextRef, - c_char_p, - c_size_t - ] - Security.SSLSetPeerID.restype = OSStatus - - Security.SSLSetCertificate.argtypes = [ - SSLContextRef, - CFArrayRef - ] - Security.SSLSetCertificate.restype = OSStatus - - Security.SSLSetCertificateAuthorities.argtypes = [ - SSLContextRef, - CFTypeRef, - Boolean - ] - Security.SSLSetCertificateAuthorities.restype = OSStatus - - Security.SSLSetConnection.argtypes = [ - SSLContextRef, - SSLConnectionRef - ] - Security.SSLSetConnection.restype = OSStatus - - Security.SSLSetPeerDomainName.argtypes = [ - SSLContextRef, - c_char_p, - c_size_t - ] - Security.SSLSetPeerDomainName.restype = OSStatus - - Security.SSLHandshake.argtypes = [ - SSLContextRef - ] - Security.SSLHandshake.restype = OSStatus - - Security.SSLRead.argtypes = [ - SSLContextRef, - c_char_p, - c_size_t, - POINTER(c_size_t) - ] - Security.SSLRead.restype = OSStatus - - Security.SSLWrite.argtypes = [ - SSLContextRef, - c_char_p, - c_size_t, - POINTER(c_size_t) - ] - Security.SSLWrite.restype = OSStatus - - Security.SSLClose.argtypes = [ - SSLContextRef - ] - Security.SSLClose.restype = OSStatus - - Security.SSLGetNumberSupportedCiphers.argtypes = [ - SSLContextRef, - POINTER(c_size_t) - ] - Security.SSLGetNumberSupportedCiphers.restype = OSStatus - - Security.SSLGetSupportedCiphers.argtypes = [ - SSLContextRef, - POINTER(SSLCipherSuite), - POINTER(c_size_t) - ] - Security.SSLGetSupportedCiphers.restype = OSStatus - - Security.SSLSetEnabledCiphers.argtypes = [ - SSLContextRef, - POINTER(SSLCipherSuite), - c_size_t - ] - Security.SSLSetEnabledCiphers.restype = OSStatus - - Security.SSLGetNumberEnabledCiphers.argtype = [ - SSLContextRef, - POINTER(c_size_t) - ] - Security.SSLGetNumberEnabledCiphers.restype = OSStatus - - Security.SSLGetEnabledCiphers.argtypes = [ - SSLContextRef, - POINTER(SSLCipherSuite), - POINTER(c_size_t) - ] - Security.SSLGetEnabledCiphers.restype = OSStatus - - Security.SSLGetNegotiatedCipher.argtypes = [ - SSLContextRef, - POINTER(SSLCipherSuite) - ] - Security.SSLGetNegotiatedCipher.restype = OSStatus - - Security.SSLGetNegotiatedProtocolVersion.argtypes = [ - SSLContextRef, - POINTER(SSLProtocol) - ] - Security.SSLGetNegotiatedProtocolVersion.restype = OSStatus - - Security.SSLCopyPeerTrust.argtypes = [ - SSLContextRef, - POINTER(SecTrustRef) - ] - Security.SSLCopyPeerTrust.restype = OSStatus - - Security.SecTrustSetAnchorCertificates.argtypes = [ - SecTrustRef, - CFArrayRef - ] - Security.SecTrustSetAnchorCertificates.restype = OSStatus - - Security.SecTrustSetAnchorCertificatesOnly.argstypes = [ - SecTrustRef, - Boolean - ] - Security.SecTrustSetAnchorCertificatesOnly.restype = OSStatus - - Security.SecTrustEvaluate.argtypes = [ - SecTrustRef, - POINTER(SecTrustResultType) - ] - Security.SecTrustEvaluate.restype = OSStatus - - Security.SecTrustGetCertificateCount.argtypes = [ - SecTrustRef - ] - Security.SecTrustGetCertificateCount.restype = CFIndex - - Security.SecTrustGetCertificateAtIndex.argtypes = [ - SecTrustRef, - CFIndex - ] - Security.SecTrustGetCertificateAtIndex.restype = SecCertificateRef - - Security.SSLCreateContext.argtypes = [ - CFAllocatorRef, - SSLProtocolSide, - SSLConnectionType - ] - Security.SSLCreateContext.restype = SSLContextRef - - Security.SSLSetSessionOption.argtypes = [ - SSLContextRef, - SSLSessionOption, - Boolean - ] - Security.SSLSetSessionOption.restype = OSStatus - - Security.SSLSetProtocolVersionMin.argtypes = [ - SSLContextRef, - SSLProtocol - ] - Security.SSLSetProtocolVersionMin.restype = OSStatus - - Security.SSLSetProtocolVersionMax.argtypes = [ - SSLContextRef, - SSLProtocol - ] - Security.SSLSetProtocolVersionMax.restype = OSStatus - - Security.SecCopyErrorMessageString.argtypes = [ - OSStatus, - c_void_p - ] - Security.SecCopyErrorMessageString.restype = CFStringRef - - Security.SSLReadFunc = SSLReadFunc - Security.SSLWriteFunc = SSLWriteFunc - Security.SSLContextRef = SSLContextRef - Security.SSLProtocol = SSLProtocol - Security.SSLCipherSuite = SSLCipherSuite - Security.SecIdentityRef = SecIdentityRef - Security.SecKeychainRef = SecKeychainRef - Security.SecTrustRef = SecTrustRef - Security.SecTrustResultType = SecTrustResultType - Security.SecExternalFormat = SecExternalFormat - Security.OSStatus = OSStatus - - Security.kSecImportExportPassphrase = CFStringRef.in_dll( - Security, 'kSecImportExportPassphrase' - ) - Security.kSecImportItemIdentity = CFStringRef.in_dll( - Security, 'kSecImportItemIdentity' - ) - - # CoreFoundation time! - CoreFoundation.CFRetain.argtypes = [ - CFTypeRef - ] - CoreFoundation.CFRetain.restype = CFTypeRef - - CoreFoundation.CFRelease.argtypes = [ - CFTypeRef - ] - CoreFoundation.CFRelease.restype = None - - CoreFoundation.CFGetTypeID.argtypes = [ - CFTypeRef - ] - CoreFoundation.CFGetTypeID.restype = CFTypeID - - CoreFoundation.CFStringCreateWithCString.argtypes = [ - CFAllocatorRef, - c_char_p, - CFStringEncoding - ] - CoreFoundation.CFStringCreateWithCString.restype = CFStringRef - - CoreFoundation.CFStringGetCStringPtr.argtypes = [ - CFStringRef, - CFStringEncoding - ] - CoreFoundation.CFStringGetCStringPtr.restype = c_char_p - - CoreFoundation.CFStringGetCString.argtypes = [ - CFStringRef, - c_char_p, - CFIndex, - CFStringEncoding - ] - CoreFoundation.CFStringGetCString.restype = c_bool - - CoreFoundation.CFDataCreate.argtypes = [ - CFAllocatorRef, - c_char_p, - CFIndex - ] - CoreFoundation.CFDataCreate.restype = CFDataRef - - CoreFoundation.CFDataGetLength.argtypes = [ - CFDataRef - ] - CoreFoundation.CFDataGetLength.restype = CFIndex - - CoreFoundation.CFDataGetBytePtr.argtypes = [ - CFDataRef - ] - CoreFoundation.CFDataGetBytePtr.restype = c_void_p - - CoreFoundation.CFDictionaryCreate.argtypes = [ - CFAllocatorRef, - POINTER(CFTypeRef), - POINTER(CFTypeRef), - CFIndex, - CFDictionaryKeyCallBacks, - CFDictionaryValueCallBacks - ] - CoreFoundation.CFDictionaryCreate.restype = CFDictionaryRef - - CoreFoundation.CFDictionaryGetValue.argtypes = [ - CFDictionaryRef, - CFTypeRef - ] - CoreFoundation.CFDictionaryGetValue.restype = CFTypeRef - - CoreFoundation.CFArrayCreate.argtypes = [ - CFAllocatorRef, - POINTER(CFTypeRef), - CFIndex, - CFArrayCallBacks, - ] - CoreFoundation.CFArrayCreate.restype = CFArrayRef - - CoreFoundation.CFArrayCreateMutable.argtypes = [ - CFAllocatorRef, - CFIndex, - CFArrayCallBacks - ] - CoreFoundation.CFArrayCreateMutable.restype = CFMutableArrayRef - - CoreFoundation.CFArrayAppendValue.argtypes = [ - CFMutableArrayRef, - c_void_p - ] - CoreFoundation.CFArrayAppendValue.restype = None - - CoreFoundation.CFArrayGetCount.argtypes = [ - CFArrayRef - ] - CoreFoundation.CFArrayGetCount.restype = CFIndex - - CoreFoundation.CFArrayGetValueAtIndex.argtypes = [ - CFArrayRef, - CFIndex - ] - CoreFoundation.CFArrayGetValueAtIndex.restype = c_void_p - - CoreFoundation.kCFAllocatorDefault = CFAllocatorRef.in_dll( - CoreFoundation, 'kCFAllocatorDefault' - ) - CoreFoundation.kCFTypeArrayCallBacks = c_void_p.in_dll(CoreFoundation, 'kCFTypeArrayCallBacks') - CoreFoundation.kCFTypeDictionaryKeyCallBacks = c_void_p.in_dll( - CoreFoundation, 'kCFTypeDictionaryKeyCallBacks' - ) - CoreFoundation.kCFTypeDictionaryValueCallBacks = c_void_p.in_dll( - CoreFoundation, 'kCFTypeDictionaryValueCallBacks' - ) - - CoreFoundation.CFTypeRef = CFTypeRef - CoreFoundation.CFArrayRef = CFArrayRef - CoreFoundation.CFStringRef = CFStringRef - CoreFoundation.CFDictionaryRef = CFDictionaryRef - -except (AttributeError): - raise ImportError('Error initializing ctypes') - - -class CFConst(object): - """ - A class object that acts as essentially a namespace for CoreFoundation - constants. - """ - kCFStringEncodingUTF8 = CFStringEncoding(0x08000100) - - -class SecurityConst(object): - """ - A class object that acts as essentially a namespace for Security constants. - """ - kSSLSessionOptionBreakOnServerAuth = 0 - - kSSLProtocol2 = 1 - kSSLProtocol3 = 2 - kTLSProtocol1 = 4 - kTLSProtocol11 = 7 - kTLSProtocol12 = 8 - - kSSLClientSide = 1 - kSSLStreamType = 0 - - kSecFormatPEMSequence = 10 - - kSecTrustResultInvalid = 0 - kSecTrustResultProceed = 1 - # This gap is present on purpose: this was kSecTrustResultConfirm, which - # is deprecated. - kSecTrustResultDeny = 3 - kSecTrustResultUnspecified = 4 - kSecTrustResultRecoverableTrustFailure = 5 - kSecTrustResultFatalTrustFailure = 6 - kSecTrustResultOtherError = 7 - - errSSLProtocol = -9800 - errSSLWouldBlock = -9803 - errSSLClosedGraceful = -9805 - errSSLClosedNoNotify = -9816 - errSSLClosedAbort = -9806 - - errSSLXCertChainInvalid = -9807 - errSSLCrypto = -9809 - errSSLInternal = -9810 - errSSLCertExpired = -9814 - errSSLCertNotYetValid = -9815 - errSSLUnknownRootCert = -9812 - errSSLNoRootCert = -9813 - errSSLHostNameMismatch = -9843 - errSSLPeerHandshakeFail = -9824 - errSSLPeerUserCancelled = -9839 - errSSLWeakPeerEphemeralDHKey = -9850 - errSSLServerAuthCompleted = -9841 - errSSLRecordOverflow = -9847 - - errSecVerifyFailed = -67808 - errSecNoTrustSettings = -25263 - errSecItemNotFound = -25300 - errSecInvalidTrustSettings = -25262 - - # Cipher suites. We only pick the ones our default cipher string allows. - TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 = 0xC02C - TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 = 0xC030 - TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 = 0xC02B - TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 = 0xC02F - TLS_DHE_DSS_WITH_AES_256_GCM_SHA384 = 0x00A3 - TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 = 0x009F - TLS_DHE_DSS_WITH_AES_128_GCM_SHA256 = 0x00A2 - TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 = 0x009E - TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 = 0xC024 - TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 = 0xC028 - TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA = 0xC00A - TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA = 0xC014 - TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 = 0x006B - TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 = 0x006A - TLS_DHE_RSA_WITH_AES_256_CBC_SHA = 0x0039 - TLS_DHE_DSS_WITH_AES_256_CBC_SHA = 0x0038 - TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 = 0xC023 - TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 = 0xC027 - TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA = 0xC009 - TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA = 0xC013 - TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 = 0x0067 - TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 = 0x0040 - TLS_DHE_RSA_WITH_AES_128_CBC_SHA = 0x0033 - TLS_DHE_DSS_WITH_AES_128_CBC_SHA = 0x0032 - TLS_RSA_WITH_AES_256_GCM_SHA384 = 0x009D - TLS_RSA_WITH_AES_128_GCM_SHA256 = 0x009C - TLS_RSA_WITH_AES_256_CBC_SHA256 = 0x003D - TLS_RSA_WITH_AES_128_CBC_SHA256 = 0x003C - TLS_RSA_WITH_AES_256_CBC_SHA = 0x0035 - TLS_RSA_WITH_AES_128_CBC_SHA = 0x002F - TLS_AES_128_GCM_SHA256 = 0x1301 - TLS_AES_256_GCM_SHA384 = 0x1302 - TLS_CHACHA20_POLY1305_SHA256 = 0x1303 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.pyc deleted file mode 100644 index 6370c4ef96e1777a4a6054fa13dd3588fd96e515..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12359 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 F{{cUiZQ%d_ diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py deleted file mode 100644 index b13cd9e..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py +++ /dev/null @@ -1,346 +0,0 @@ -""" -Low-level helpers for the SecureTransport bindings. - -These are Python functions that are not directly related to the high-level APIs -but are necessary to get them to work. They include a whole bunch of low-level -CoreFoundation messing about and memory management. The concerns in this module -are almost entirely about trying to avoid memory leaks and providing -appropriate and useful assistance to the higher-level code. -""" -import base64 -import ctypes -import itertools -import re -import os -import ssl -import tempfile - -from .bindings import Security, CoreFoundation, CFConst - - -# This regular expression is used to grab PEM data out of a PEM bundle. -_PEM_CERTS_RE = re.compile( - b"-----BEGIN CERTIFICATE-----\n(.*?)\n-----END CERTIFICATE-----", re.DOTALL -) - - -def _cf_data_from_bytes(bytestring): - """ - Given a bytestring, create a CFData object from it. This CFData object must - be CFReleased by the caller. - """ - return CoreFoundation.CFDataCreate( - CoreFoundation.kCFAllocatorDefault, bytestring, len(bytestring) - ) - - -def _cf_dictionary_from_tuples(tuples): - """ - Given a list of Python tuples, create an associated CFDictionary. - """ - dictionary_size = len(tuples) - - # We need to get the dictionary keys and values out in the same order. - keys = (t[0] for t in tuples) - values = (t[1] for t in tuples) - cf_keys = (CoreFoundation.CFTypeRef * dictionary_size)(*keys) - cf_values = (CoreFoundation.CFTypeRef * dictionary_size)(*values) - - return CoreFoundation.CFDictionaryCreate( - CoreFoundation.kCFAllocatorDefault, - cf_keys, - cf_values, - dictionary_size, - CoreFoundation.kCFTypeDictionaryKeyCallBacks, - CoreFoundation.kCFTypeDictionaryValueCallBacks, - ) - - -def _cf_string_to_unicode(value): - """ - Creates a Unicode string from a CFString object. Used entirely for error - reporting. - - Yes, it annoys me quite a lot that this function is this complex. - """ - value_as_void_p = ctypes.cast(value, ctypes.POINTER(ctypes.c_void_p)) - - string = CoreFoundation.CFStringGetCStringPtr( - value_as_void_p, - CFConst.kCFStringEncodingUTF8 - ) - if string is None: - buffer = ctypes.create_string_buffer(1024) - result = CoreFoundation.CFStringGetCString( - value_as_void_p, - buffer, - 1024, - CFConst.kCFStringEncodingUTF8 - ) - if not result: - raise OSError('Error copying C string from CFStringRef') - string = buffer.value - if string is not None: - string = string.decode('utf-8') - return string - - -def _assert_no_error(error, exception_class=None): - """ - Checks the return code and throws an exception if there is an error to - report - """ - if error == 0: - return - - cf_error_string = Security.SecCopyErrorMessageString(error, None) - output = _cf_string_to_unicode(cf_error_string) - CoreFoundation.CFRelease(cf_error_string) - - if output is None or output == u'': - output = u'OSStatus %s' % error - - if exception_class is None: - exception_class = ssl.SSLError - - raise exception_class(output) - - -def _cert_array_from_pem(pem_bundle): - """ - Given a bundle of certs in PEM format, turns them into a CFArray of certs - that can be used to validate a cert chain. - """ - # Normalize the PEM bundle's line endings. - pem_bundle = pem_bundle.replace(b"\r\n", b"\n") - - der_certs = [ - base64.b64decode(match.group(1)) - for match in _PEM_CERTS_RE.finditer(pem_bundle) - ] - if not der_certs: - raise ssl.SSLError("No root certificates specified") - - cert_array = CoreFoundation.CFArrayCreateMutable( - CoreFoundation.kCFAllocatorDefault, - 0, - ctypes.byref(CoreFoundation.kCFTypeArrayCallBacks) - ) - if not cert_array: - raise ssl.SSLError("Unable to allocate memory!") - - try: - for der_bytes in der_certs: - certdata = _cf_data_from_bytes(der_bytes) - if not certdata: - raise ssl.SSLError("Unable to allocate memory!") - cert = Security.SecCertificateCreateWithData( - CoreFoundation.kCFAllocatorDefault, certdata - ) - CoreFoundation.CFRelease(certdata) - if not cert: - raise ssl.SSLError("Unable to build cert object!") - - CoreFoundation.CFArrayAppendValue(cert_array, cert) - CoreFoundation.CFRelease(cert) - except Exception: - # We need to free the array before the exception bubbles further. - # We only want to do that if an error occurs: otherwise, the caller - # should free. - CoreFoundation.CFRelease(cert_array) - - return cert_array - - -def _is_cert(item): - """ - Returns True if a given CFTypeRef is a certificate. - """ - expected = Security.SecCertificateGetTypeID() - return CoreFoundation.CFGetTypeID(item) == expected - - -def _is_identity(item): - """ - Returns True if a given CFTypeRef is an identity. - """ - expected = Security.SecIdentityGetTypeID() - return CoreFoundation.CFGetTypeID(item) == expected - - -def _temporary_keychain(): - """ - This function creates a temporary Mac keychain that we can use to work with - credentials. This keychain uses a one-time password and a temporary file to - store the data. We expect to have one keychain per socket. The returned - SecKeychainRef must be freed by the caller, including calling - SecKeychainDelete. - - Returns a tuple of the SecKeychainRef and the path to the temporary - directory that contains it. - """ - # Unfortunately, SecKeychainCreate requires a path to a keychain. This - # means we cannot use mkstemp to use a generic temporary file. Instead, - # we're going to create a temporary directory and a filename to use there. - # This filename will be 8 random bytes expanded into base64. We also need - # some random bytes to password-protect the keychain we're creating, so we - # ask for 40 random bytes. - random_bytes = os.urandom(40) - filename = base64.b16encode(random_bytes[:8]).decode('utf-8') - password = base64.b16encode(random_bytes[8:]) # Must be valid UTF-8 - tempdirectory = tempfile.mkdtemp() - - keychain_path = os.path.join(tempdirectory, filename).encode('utf-8') - - # We now want to create the keychain itself. - keychain = Security.SecKeychainRef() - status = Security.SecKeychainCreate( - keychain_path, - len(password), - password, - False, - None, - ctypes.byref(keychain) - ) - _assert_no_error(status) - - # Having created the keychain, we want to pass it off to the caller. - return keychain, tempdirectory - - -def _load_items_from_file(keychain, path): - """ - Given a single file, loads all the trust objects from it into arrays and - the keychain. - Returns a tuple of lists: the first list is a list of identities, the - second a list of certs. - """ - certificates = [] - identities = [] - result_array = None - - with open(path, 'rb') as f: - raw_filedata = f.read() - - try: - filedata = CoreFoundation.CFDataCreate( - CoreFoundation.kCFAllocatorDefault, - raw_filedata, - len(raw_filedata) - ) - result_array = CoreFoundation.CFArrayRef() - result = Security.SecItemImport( - filedata, # cert data - None, # Filename, leaving it out for now - None, # What the type of the file is, we don't care - None, # what's in the file, we don't care - 0, # import flags - None, # key params, can include passphrase in the future - keychain, # The keychain to insert into - ctypes.byref(result_array) # Results - ) - _assert_no_error(result) - - # A CFArray is not very useful to us as an intermediary - # representation, so we are going to extract the objects we want - # and then free the array. We don't need to keep hold of keys: the - # keychain already has them! - result_count = CoreFoundation.CFArrayGetCount(result_array) - for index in range(result_count): - item = CoreFoundation.CFArrayGetValueAtIndex( - result_array, index - ) - item = ctypes.cast(item, CoreFoundation.CFTypeRef) - - if _is_cert(item): - CoreFoundation.CFRetain(item) - certificates.append(item) - elif _is_identity(item): - CoreFoundation.CFRetain(item) - identities.append(item) - finally: - if result_array: - CoreFoundation.CFRelease(result_array) - - CoreFoundation.CFRelease(filedata) - - return (identities, certificates) - - -def _load_client_cert_chain(keychain, *paths): - """ - Load certificates and maybe keys from a number of files. Has the end goal - of returning a CFArray containing one SecIdentityRef, and then zero or more - SecCertificateRef objects, suitable for use as a client certificate trust - chain. - """ - # Ok, the strategy. - # - # This relies on knowing that macOS will not give you a SecIdentityRef - # unless you have imported a key into a keychain. This is a somewhat - # artificial limitation of macOS (for example, it doesn't necessarily - # affect iOS), but there is nothing inside Security.framework that lets you - # get a SecIdentityRef without having a key in a keychain. - # - # So the policy here is we take all the files and iterate them in order. - # Each one will use SecItemImport to have one or more objects loaded from - # it. We will also point at a keychain that macOS can use to work with the - # private key. - # - # Once we have all the objects, we'll check what we actually have. If we - # already have a SecIdentityRef in hand, fab: we'll use that. Otherwise, - # we'll take the first certificate (which we assume to be our leaf) and - # ask the keychain to give us a SecIdentityRef with that cert's associated - # key. - # - # We'll then return a CFArray containing the trust chain: one - # SecIdentityRef and then zero-or-more SecCertificateRef objects. The - # responsibility for freeing this CFArray will be with the caller. This - # CFArray must remain alive for the entire connection, so in practice it - # will be stored with a single SSLSocket, along with the reference to the - # keychain. - certificates = [] - identities = [] - - # Filter out bad paths. - paths = (path for path in paths if path) - - try: - for file_path in paths: - new_identities, new_certs = _load_items_from_file( - keychain, file_path - ) - identities.extend(new_identities) - certificates.extend(new_certs) - - # Ok, we have everything. The question is: do we have an identity? If - # not, we want to grab one from the first cert we have. - if not identities: - new_identity = Security.SecIdentityRef() - status = Security.SecIdentityCreateWithCertificate( - keychain, - certificates[0], - ctypes.byref(new_identity) - ) - _assert_no_error(status) - identities.append(new_identity) - - # We now want to release the original certificate, as we no longer - # need it. - CoreFoundation.CFRelease(certificates.pop(0)) - - # We now need to build a new CFArray that holds the trust chain. - trust_chain = CoreFoundation.CFArrayCreateMutable( - CoreFoundation.kCFAllocatorDefault, - 0, - ctypes.byref(CoreFoundation.kCFTypeArrayCallBacks), - ) - for item in itertools.chain(identities, certificates): - # ArrayAppendValue does a CFRetain on the item. That's fine, - # because the finally block will release our other refs to them. - CoreFoundation.CFArrayAppendValue(trust_chain, item) - - return trust_chain - finally: - for obj in itertools.chain(identities, certificates): - CoreFoundation.CFRelease(obj) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.pyc deleted file mode 100644 index 242d594d275e56788d6d53fcbcdec2656d9eec74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10132 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 I()#xQ0^;loLjV8( diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/appengine.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/appengine.py deleted file mode 100644 index 9b42952..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/appengine.py +++ /dev/null @@ -1,289 +0,0 @@ -""" -This module provides a pool manager that uses Google App Engine's -`URLFetch Service <https://cloud.google.com/appengine/docs/python/urlfetch>`_. - -Example usage:: - - from pip._vendor.urllib3 import PoolManager - from pip._vendor.urllib3.contrib.appengine import AppEngineManager, is_appengine_sandbox - - if is_appengine_sandbox(): - # AppEngineManager uses AppEngine's URLFetch API behind the scenes - http = AppEngineManager() - else: - # PoolManager uses a socket-level API behind the scenes - http = PoolManager() - - r = http.request('GET', 'https://google.com/') - -There are `limitations <https://cloud.google.com/appengine/docs/python/\ -urlfetch/#Python_Quotas_and_limits>`_ to the URLFetch service and it may not be -the best choice for your application. There are three options for using -urllib3 on Google App Engine: - -1. You can use :class:`AppEngineManager` with URLFetch. URLFetch is - cost-effective in many circumstances as long as your usage is within the - limitations. -2. You can use a normal :class:`~urllib3.PoolManager` by enabling sockets. - Sockets also have `limitations and restrictions - <https://cloud.google.com/appengine/docs/python/sockets/\ - #limitations-and-restrictions>`_ and have a lower free quota than URLFetch. - To use sockets, be sure to specify the following in your ``app.yaml``:: - - env_variables: - GAE_USE_SOCKETS_HTTPLIB : 'true' - -3. If you are using `App Engine Flexible -<https://cloud.google.com/appengine/docs/flexible/>`_, you can use the standard -:class:`PoolManager` without any configuration or special environment variables. -""" - -from __future__ import absolute_import -import io -import logging -import warnings -from ..packages.six.moves.urllib.parse import urljoin - -from ..exceptions import ( - HTTPError, - HTTPWarning, - MaxRetryError, - ProtocolError, - TimeoutError, - SSLError -) - -from ..request import RequestMethods -from ..response import HTTPResponse -from ..util.timeout import Timeout -from ..util.retry import Retry -from . import _appengine_environ - -try: - from google.appengine.api import urlfetch -except ImportError: - urlfetch = None - - -log = logging.getLogger(__name__) - - -class AppEnginePlatformWarning(HTTPWarning): - pass - - -class AppEnginePlatformError(HTTPError): - pass - - -class AppEngineManager(RequestMethods): - """ - Connection manager for Google App Engine sandbox applications. - - This manager uses the URLFetch service directly instead of using the - emulated httplib, and is subject to URLFetch limitations as described in - the App Engine documentation `here - <https://cloud.google.com/appengine/docs/python/urlfetch>`_. - - Notably it will raise an :class:`AppEnginePlatformError` if: - * URLFetch is not available. - * If you attempt to use this on App Engine Flexible, as full socket - support is available. - * If a request size is more than 10 megabytes. - * If a response size is more than 32 megabtyes. - * If you use an unsupported request method such as OPTIONS. - - Beyond those cases, it will raise normal urllib3 errors. - """ - - def __init__(self, headers=None, retries=None, validate_certificate=True, - urlfetch_retries=True): - if not urlfetch: - raise AppEnginePlatformError( - "URLFetch is not available in this environment.") - - if is_prod_appengine_mvms(): - raise AppEnginePlatformError( - "Use normal urllib3.PoolManager instead of AppEngineManager" - "on Managed VMs, as using URLFetch is not necessary in " - "this environment.") - - warnings.warn( - "urllib3 is using URLFetch on Google App Engine sandbox instead " - "of sockets. To use sockets directly instead of URLFetch see " - "https://urllib3.readthedocs.io/en/latest/reference/urllib3.contrib.html.", - AppEnginePlatformWarning) - - RequestMethods.__init__(self, headers) - self.validate_certificate = validate_certificate - self.urlfetch_retries = urlfetch_retries - - self.retries = retries or Retry.DEFAULT - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - # Return False to re-raise any potential exceptions - return False - - def urlopen(self, method, url, body=None, headers=None, - retries=None, redirect=True, timeout=Timeout.DEFAULT_TIMEOUT, - **response_kw): - - retries = self._get_retries(retries, redirect) - - try: - follow_redirects = ( - redirect and - retries.redirect != 0 and - retries.total) - response = urlfetch.fetch( - url, - payload=body, - method=method, - headers=headers or {}, - allow_truncated=False, - follow_redirects=self.urlfetch_retries and follow_redirects, - deadline=self._get_absolute_timeout(timeout), - validate_certificate=self.validate_certificate, - ) - except urlfetch.DeadlineExceededError as e: - raise TimeoutError(self, e) - - except urlfetch.InvalidURLError as e: - if 'too large' in str(e): - raise AppEnginePlatformError( - "URLFetch request too large, URLFetch only " - "supports requests up to 10mb in size.", e) - raise ProtocolError(e) - - except urlfetch.DownloadError as e: - if 'Too many redirects' in str(e): - raise MaxRetryError(self, url, reason=e) - raise ProtocolError(e) - - except urlfetch.ResponseTooLargeError as e: - raise AppEnginePlatformError( - "URLFetch response too large, URLFetch only supports" - "responses up to 32mb in size.", e) - - except urlfetch.SSLCertificateError as e: - raise SSLError(e) - - except urlfetch.InvalidMethodError as e: - raise AppEnginePlatformError( - "URLFetch does not support method: %s" % method, e) - - http_response = self._urlfetch_response_to_http_response( - response, retries=retries, **response_kw) - - # Handle redirect? - redirect_location = redirect and http_response.get_redirect_location() - if redirect_location: - # Check for redirect response - if (self.urlfetch_retries and retries.raise_on_redirect): - raise MaxRetryError(self, url, "too many redirects") - else: - if http_response.status == 303: - method = 'GET' - - try: - retries = retries.increment(method, url, response=http_response, _pool=self) - except MaxRetryError: - if retries.raise_on_redirect: - raise MaxRetryError(self, url, "too many redirects") - return http_response - - retries.sleep_for_retry(http_response) - log.debug("Redirecting %s -> %s", url, redirect_location) - redirect_url = urljoin(url, redirect_location) - return self.urlopen( - method, redirect_url, body, headers, - retries=retries, redirect=redirect, - timeout=timeout, **response_kw) - - # Check if we should retry the HTTP response. - has_retry_after = bool(http_response.getheader('Retry-After')) - if retries.is_retry(method, http_response.status, has_retry_after): - retries = retries.increment( - method, url, response=http_response, _pool=self) - log.debug("Retry: %s", url) - retries.sleep(http_response) - return self.urlopen( - method, url, - body=body, headers=headers, - retries=retries, redirect=redirect, - timeout=timeout, **response_kw) - - return http_response - - def _urlfetch_response_to_http_response(self, urlfetch_resp, **response_kw): - - if is_prod_appengine(): - # Production GAE handles deflate encoding automatically, but does - # not remove the encoding header. - content_encoding = urlfetch_resp.headers.get('content-encoding') - - if content_encoding == 'deflate': - del urlfetch_resp.headers['content-encoding'] - - transfer_encoding = urlfetch_resp.headers.get('transfer-encoding') - # We have a full response's content, - # so let's make sure we don't report ourselves as chunked data. - if transfer_encoding == 'chunked': - encodings = transfer_encoding.split(",") - encodings.remove('chunked') - urlfetch_resp.headers['transfer-encoding'] = ','.join(encodings) - - original_response = HTTPResponse( - # In order for decoding to work, we must present the content as - # a file-like object. - body=io.BytesIO(urlfetch_resp.content), - msg=urlfetch_resp.header_msg, - headers=urlfetch_resp.headers, - status=urlfetch_resp.status_code, - **response_kw - ) - - return HTTPResponse( - body=io.BytesIO(urlfetch_resp.content), - headers=urlfetch_resp.headers, - status=urlfetch_resp.status_code, - original_response=original_response, - **response_kw - ) - - def _get_absolute_timeout(self, timeout): - if timeout is Timeout.DEFAULT_TIMEOUT: - return None # Defer to URLFetch's default. - if isinstance(timeout, Timeout): - if timeout._read is not None or timeout._connect is not None: - warnings.warn( - "URLFetch does not support granular timeout settings, " - "reverting to total or default URLFetch timeout.", - AppEnginePlatformWarning) - return timeout.total - return timeout - - def _get_retries(self, retries, redirect): - if not isinstance(retries, Retry): - retries = Retry.from_int( - retries, redirect=redirect, default=self.retries) - - if retries.connect or retries.read or retries.redirect: - warnings.warn( - "URLFetch only supports total retries and does not " - "recognize connect, read, or redirect retry parameters.", - AppEnginePlatformWarning) - - return retries - - -# Alias methods from _appengine_environ to maintain public API interface. - -is_appengine = _appengine_environ.is_appengine -is_appengine_sandbox = _appengine_environ.is_appengine_sandbox -is_local_appengine = _appengine_environ.is_local_appengine -is_prod_appengine = _appengine_environ.is_prod_appengine -is_prod_appengine_mvms = _appengine_environ.is_prod_appengine_mvms diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/appengine.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/appengine.pyc deleted file mode 100644 index 78fb82df42c9523009fb2b1d2dcb5ef78f1f3790..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10129 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 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py deleted file mode 100644 index 8ea127c..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py +++ /dev/null @@ -1,111 +0,0 @@ -""" -NTLM authenticating pool, contributed by erikcederstran - -Issue #10, see: http://code.google.com/p/urllib3/issues/detail?id=10 -""" -from __future__ import absolute_import - -from logging import getLogger -from ntlm import ntlm - -from .. import HTTPSConnectionPool -from ..packages.six.moves.http_client import HTTPSConnection - - -log = getLogger(__name__) - - -class NTLMConnectionPool(HTTPSConnectionPool): - """ - Implements an NTLM authentication version of an urllib3 connection pool - """ - - scheme = 'https' - - def __init__(self, user, pw, authurl, *args, **kwargs): - """ - authurl is a random URL on the server that is protected by NTLM. - user is the Windows user, probably in the DOMAIN\\username format. - pw is the password for the user. - """ - super(NTLMConnectionPool, self).__init__(*args, **kwargs) - self.authurl = authurl - self.rawuser = user - user_parts = user.split('\\', 1) - self.domain = user_parts[0].upper() - self.user = user_parts[1] - self.pw = pw - - def _new_conn(self): - # Performs the NTLM handshake that secures the connection. The socket - # must be kept open while requests are performed. - self.num_connections += 1 - log.debug('Starting NTLM HTTPS connection no. %d: https://%s%s', - self.num_connections, self.host, self.authurl) - - headers = {'Connection': 'Keep-Alive'} - req_header = 'Authorization' - resp_header = 'www-authenticate' - - conn = HTTPSConnection(host=self.host, port=self.port) - - # Send negotiation message - headers[req_header] = ( - 'NTLM %s' % ntlm.create_NTLM_NEGOTIATE_MESSAGE(self.rawuser)) - log.debug('Request headers: %s', headers) - conn.request('GET', self.authurl, None, headers) - res = conn.getresponse() - reshdr = dict(res.getheaders()) - log.debug('Response status: %s %s', res.status, res.reason) - log.debug('Response headers: %s', reshdr) - log.debug('Response data: %s [...]', res.read(100)) - - # Remove the reference to the socket, so that it can not be closed by - # the response object (we want to keep the socket open) - res.fp = None - - # Server should respond with a challenge message - auth_header_values = reshdr[resp_header].split(', ') - auth_header_value = None - for s in auth_header_values: - if s[:5] == 'NTLM ': - auth_header_value = s[5:] - if auth_header_value is None: - raise Exception('Unexpected %s response header: %s' % - (resp_header, reshdr[resp_header])) - - # Send authentication message - ServerChallenge, NegotiateFlags = \ - ntlm.parse_NTLM_CHALLENGE_MESSAGE(auth_header_value) - auth_msg = ntlm.create_NTLM_AUTHENTICATE_MESSAGE(ServerChallenge, - self.user, - self.domain, - self.pw, - NegotiateFlags) - headers[req_header] = 'NTLM %s' % auth_msg - log.debug('Request headers: %s', headers) - conn.request('GET', self.authurl, None, headers) - res = conn.getresponse() - log.debug('Response status: %s %s', res.status, res.reason) - log.debug('Response headers: %s', dict(res.getheaders())) - log.debug('Response data: %s [...]', res.read()[:100]) - if res.status != 200: - if res.status == 401: - raise Exception('Server rejected request: wrong ' - 'username or password') - raise Exception('Wrong server response: %s %s' % - (res.status, res.reason)) - - res.fp = None - log.debug('Connection established') - return conn - - def urlopen(self, method, url, body=None, headers=None, retries=3, - redirect=True, assert_same_host=True): - if headers is None: - headers = {} - headers['Connection'] = 'Keep-Alive' - return super(NTLMConnectionPool, self).urlopen(method, url, body, - headers, retries, - redirect, - assert_same_host) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.pyc deleted file mode 100644 index 100ab15ed99c4e18e35c1a267ef7661d839fae47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4173 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 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py deleted file mode 100644 index 363667c..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py +++ /dev/null @@ -1,466 +0,0 @@ -""" -SSL with SNI_-support for Python 2. Follow these instructions if you would -like to verify SSL certificates in Python 2. Note, the default libraries do -*not* do certificate checking; you need to do additional work to validate -certificates yourself. - -This needs the following packages installed: - -* pyOpenSSL (tested with 16.0.0) -* cryptography (minimum 1.3.4, from pyopenssl) -* idna (minimum 2.0, from cryptography) - -However, pyopenssl depends on cryptography, which depends on idna, so while we -use all three directly here we end up having relatively few packages required. - -You can install them with the following command: - - pip install pyopenssl cryptography idna - -To activate certificate checking, call -:func:`~urllib3.contrib.pyopenssl.inject_into_urllib3` from your Python code -before you begin making HTTP requests. This can be done in a ``sitecustomize`` -module, or at any other time before your application begins using ``urllib3``, -like this:: - - try: - import urllib3.contrib.pyopenssl - urllib3.contrib.pyopenssl.inject_into_urllib3() - except ImportError: - pass - -Now you can use :mod:`urllib3` as you normally would, and it will support SNI -when the required modules are installed. - -Activating this module also has the positive side effect of disabling SSL/TLS -compression in Python 2 (see `CRIME attack`_). - -If you want to configure the default list of supported cipher suites, you can -set the ``urllib3.contrib.pyopenssl.DEFAULT_SSL_CIPHER_LIST`` variable. - -.. _sni: https://en.wikipedia.org/wiki/Server_Name_Indication -.. _crime attack: https://en.wikipedia.org/wiki/CRIME_(security_exploit) -""" -from __future__ import absolute_import - -import OpenSSL.SSL -from cryptography import x509 -from cryptography.hazmat.backends.openssl import backend as openssl_backend -from cryptography.hazmat.backends.openssl.x509 import _Certificate -try: - from cryptography.x509 import UnsupportedExtension -except ImportError: - # UnsupportedExtension is gone in cryptography >= 2.1.0 - class UnsupportedExtension(Exception): - pass - -from socket import timeout, error as SocketError -from io import BytesIO - -try: # Platform-specific: Python 2 - from socket import _fileobject -except ImportError: # Platform-specific: Python 3 - _fileobject = None - from ..packages.backports.makefile import backport_makefile - -import logging -import ssl -from ..packages import six -import sys - -from .. import util - -__all__ = ['inject_into_urllib3', 'extract_from_urllib3'] - -# SNI always works. -HAS_SNI = True - -# Map from urllib3 to PyOpenSSL compatible parameter-values. -_openssl_versions = { - ssl.PROTOCOL_SSLv23: OpenSSL.SSL.SSLv23_METHOD, - ssl.PROTOCOL_TLSv1: OpenSSL.SSL.TLSv1_METHOD, -} - -if hasattr(ssl, 'PROTOCOL_TLSv1_1') and hasattr(OpenSSL.SSL, 'TLSv1_1_METHOD'): - _openssl_versions[ssl.PROTOCOL_TLSv1_1] = OpenSSL.SSL.TLSv1_1_METHOD - -if hasattr(ssl, 'PROTOCOL_TLSv1_2') and hasattr(OpenSSL.SSL, 'TLSv1_2_METHOD'): - _openssl_versions[ssl.PROTOCOL_TLSv1_2] = OpenSSL.SSL.TLSv1_2_METHOD - -try: - _openssl_versions.update({ssl.PROTOCOL_SSLv3: OpenSSL.SSL.SSLv3_METHOD}) -except AttributeError: - pass - -_stdlib_to_openssl_verify = { - ssl.CERT_NONE: OpenSSL.SSL.VERIFY_NONE, - ssl.CERT_OPTIONAL: OpenSSL.SSL.VERIFY_PEER, - ssl.CERT_REQUIRED: - OpenSSL.SSL.VERIFY_PEER + OpenSSL.SSL.VERIFY_FAIL_IF_NO_PEER_CERT, -} -_openssl_to_stdlib_verify = dict( - (v, k) for k, v in _stdlib_to_openssl_verify.items() -) - -# OpenSSL will only write 16K at a time -SSL_WRITE_BLOCKSIZE = 16384 - -orig_util_HAS_SNI = util.HAS_SNI -orig_util_SSLContext = util.ssl_.SSLContext - - -log = logging.getLogger(__name__) - - -def inject_into_urllib3(): - 'Monkey-patch urllib3 with PyOpenSSL-backed SSL-support.' - - _validate_dependencies_met() - - util.ssl_.SSLContext = PyOpenSSLContext - util.HAS_SNI = HAS_SNI - util.ssl_.HAS_SNI = HAS_SNI - util.IS_PYOPENSSL = True - util.ssl_.IS_PYOPENSSL = True - - -def extract_from_urllib3(): - 'Undo monkey-patching by :func:`inject_into_urllib3`.' - - util.ssl_.SSLContext = orig_util_SSLContext - util.HAS_SNI = orig_util_HAS_SNI - util.ssl_.HAS_SNI = orig_util_HAS_SNI - util.IS_PYOPENSSL = False - util.ssl_.IS_PYOPENSSL = False - - -def _validate_dependencies_met(): - """ - Verifies that PyOpenSSL's package-level dependencies have been met. - Throws `ImportError` if they are not met. - """ - # Method added in `cryptography==1.1`; not available in older versions - from cryptography.x509.extensions import Extensions - if getattr(Extensions, "get_extension_for_class", None) is None: - raise ImportError("'cryptography' module missing required functionality. " - "Try upgrading to v1.3.4 or newer.") - - # pyOpenSSL 0.14 and above use cryptography for OpenSSL bindings. The _x509 - # attribute is only present on those versions. - from OpenSSL.crypto import X509 - x509 = X509() - if getattr(x509, "_x509", None) is None: - raise ImportError("'pyOpenSSL' module missing required functionality. " - "Try upgrading to v0.14 or newer.") - - -def _dnsname_to_stdlib(name): - """ - Converts a dNSName SubjectAlternativeName field to the form used by the - standard library on the given Python version. - - Cryptography produces a dNSName as a unicode string that was idna-decoded - from ASCII bytes. We need to idna-encode that string to get it back, and - then on Python 3 we also need to convert to unicode via UTF-8 (the stdlib - uses PyUnicode_FromStringAndSize on it, which decodes via UTF-8). - - If the name cannot be idna-encoded then we return None signalling that - the name given should be skipped. - """ - def idna_encode(name): - """ - Borrowed wholesale from the Python Cryptography Project. It turns out - that we can't just safely call `idna.encode`: it can explode for - wildcard names. This avoids that problem. - """ - from pip._vendor import idna - - try: - for prefix in [u'*.', u'.']: - if name.startswith(prefix): - name = name[len(prefix):] - return prefix.encode('ascii') + idna.encode(name) - return idna.encode(name) - except idna.core.IDNAError: - return None - - name = idna_encode(name) - if name is None: - return None - elif sys.version_info >= (3, 0): - name = name.decode('utf-8') - return name - - -def get_subj_alt_name(peer_cert): - """ - Given an PyOpenSSL certificate, provides all the subject alternative names. - """ - # Pass the cert to cryptography, which has much better APIs for this. - if hasattr(peer_cert, "to_cryptography"): - cert = peer_cert.to_cryptography() - else: - # This is technically using private APIs, but should work across all - # relevant versions before PyOpenSSL got a proper API for this. - cert = _Certificate(openssl_backend, peer_cert._x509) - - # We want to find the SAN extension. Ask Cryptography to locate it (it's - # faster than looping in Python) - try: - ext = cert.extensions.get_extension_for_class( - x509.SubjectAlternativeName - ).value - except x509.ExtensionNotFound: - # No such extension, return the empty list. - return [] - except (x509.DuplicateExtension, UnsupportedExtension, - x509.UnsupportedGeneralNameType, UnicodeError) as e: - # A problem has been found with the quality of the certificate. Assume - # no SAN field is present. - log.warning( - "A problem was encountered with the certificate that prevented " - "urllib3 from finding the SubjectAlternativeName field. This can " - "affect certificate validation. The error was %s", - e, - ) - return [] - - # We want to return dNSName and iPAddress fields. We need to cast the IPs - # back to strings because the match_hostname function wants them as - # strings. - # Sadly the DNS names need to be idna encoded and then, on Python 3, UTF-8 - # decoded. This is pretty frustrating, but that's what the standard library - # does with certificates, and so we need to attempt to do the same. - # We also want to skip over names which cannot be idna encoded. - names = [ - ('DNS', name) for name in map(_dnsname_to_stdlib, ext.get_values_for_type(x509.DNSName)) - if name is not None - ] - names.extend( - ('IP Address', str(name)) - for name in ext.get_values_for_type(x509.IPAddress) - ) - - return names - - -class WrappedSocket(object): - '''API-compatibility wrapper for Python OpenSSL's Connection-class. - - Note: _makefile_refs, _drop() and _reuse() are needed for the garbage - collector of pypy. - ''' - - def __init__(self, connection, socket, suppress_ragged_eofs=True): - self.connection = connection - self.socket = socket - self.suppress_ragged_eofs = suppress_ragged_eofs - self._makefile_refs = 0 - self._closed = False - - def fileno(self): - return self.socket.fileno() - - # Copy-pasted from Python 3.5 source code - def _decref_socketios(self): - if self._makefile_refs > 0: - self._makefile_refs -= 1 - if self._closed: - self.close() - - def recv(self, *args, **kwargs): - try: - data = self.connection.recv(*args, **kwargs) - except OpenSSL.SSL.SysCallError as e: - if self.suppress_ragged_eofs and e.args == (-1, 'Unexpected EOF'): - return b'' - else: - raise SocketError(str(e)) - except OpenSSL.SSL.ZeroReturnError as e: - if self.connection.get_shutdown() == OpenSSL.SSL.RECEIVED_SHUTDOWN: - return b'' - else: - raise - except OpenSSL.SSL.WantReadError: - if not util.wait_for_read(self.socket, self.socket.gettimeout()): - raise timeout('The read operation timed out') - else: - return self.recv(*args, **kwargs) - else: - return data - - def recv_into(self, *args, **kwargs): - try: - return self.connection.recv_into(*args, **kwargs) - except OpenSSL.SSL.SysCallError as e: - if self.suppress_ragged_eofs and e.args == (-1, 'Unexpected EOF'): - return 0 - else: - raise SocketError(str(e)) - except OpenSSL.SSL.ZeroReturnError as e: - if self.connection.get_shutdown() == OpenSSL.SSL.RECEIVED_SHUTDOWN: - return 0 - else: - raise - except OpenSSL.SSL.WantReadError: - if not util.wait_for_read(self.socket, self.socket.gettimeout()): - raise timeout('The read operation timed out') - else: - return self.recv_into(*args, **kwargs) - - def settimeout(self, timeout): - return self.socket.settimeout(timeout) - - def _send_until_done(self, data): - while True: - try: - return self.connection.send(data) - except OpenSSL.SSL.WantWriteError: - if not util.wait_for_write(self.socket, self.socket.gettimeout()): - raise timeout() - continue - except OpenSSL.SSL.SysCallError as e: - raise SocketError(str(e)) - - def sendall(self, data): - total_sent = 0 - while total_sent < len(data): - sent = self._send_until_done(data[total_sent:total_sent + SSL_WRITE_BLOCKSIZE]) - total_sent += sent - - def shutdown(self): - # FIXME rethrow compatible exceptions should we ever use this - self.connection.shutdown() - - def close(self): - if self._makefile_refs < 1: - try: - self._closed = True - return self.connection.close() - except OpenSSL.SSL.Error: - return - else: - self._makefile_refs -= 1 - - def getpeercert(self, binary_form=False): - x509 = self.connection.get_peer_certificate() - - if not x509: - return x509 - - if binary_form: - return OpenSSL.crypto.dump_certificate( - OpenSSL.crypto.FILETYPE_ASN1, - x509) - - return { - 'subject': ( - (('commonName', x509.get_subject().CN),), - ), - 'subjectAltName': get_subj_alt_name(x509) - } - - def _reuse(self): - self._makefile_refs += 1 - - def _drop(self): - if self._makefile_refs < 1: - self.close() - else: - self._makefile_refs -= 1 - - -if _fileobject: # Platform-specific: Python 2 - def makefile(self, mode, bufsize=-1): - self._makefile_refs += 1 - return _fileobject(self, mode, bufsize, close=True) -else: # Platform-specific: Python 3 - makefile = backport_makefile - -WrappedSocket.makefile = makefile - - -class PyOpenSSLContext(object): - """ - I am a wrapper class for the PyOpenSSL ``Context`` object. I am responsible - for translating the interface of the standard library ``SSLContext`` object - to calls into PyOpenSSL. - """ - def __init__(self, protocol): - self.protocol = _openssl_versions[protocol] - self._ctx = OpenSSL.SSL.Context(self.protocol) - self._options = 0 - self.check_hostname = False - - @property - def options(self): - return self._options - - @options.setter - def options(self, value): - self._options = value - self._ctx.set_options(value) - - @property - def verify_mode(self): - return _openssl_to_stdlib_verify[self._ctx.get_verify_mode()] - - @verify_mode.setter - def verify_mode(self, value): - self._ctx.set_verify( - _stdlib_to_openssl_verify[value], - _verify_callback - ) - - def set_default_verify_paths(self): - self._ctx.set_default_verify_paths() - - def set_ciphers(self, ciphers): - if isinstance(ciphers, six.text_type): - ciphers = ciphers.encode('utf-8') - self._ctx.set_cipher_list(ciphers) - - def load_verify_locations(self, cafile=None, capath=None, cadata=None): - if cafile is not None: - cafile = cafile.encode('utf-8') - if capath is not None: - capath = capath.encode('utf-8') - self._ctx.load_verify_locations(cafile, capath) - if cadata is not None: - self._ctx.load_verify_locations(BytesIO(cadata)) - - def load_cert_chain(self, certfile, keyfile=None, password=None): - self._ctx.use_certificate_chain_file(certfile) - if password is not None: - self._ctx.set_passwd_cb(lambda max_length, prompt_twice, userdata: password) - self._ctx.use_privatekey_file(keyfile or certfile) - - def wrap_socket(self, sock, server_side=False, - do_handshake_on_connect=True, suppress_ragged_eofs=True, - server_hostname=None): - cnx = OpenSSL.SSL.Connection(self._ctx, sock) - - if isinstance(server_hostname, six.text_type): # Platform-specific: Python 3 - server_hostname = server_hostname.encode('utf-8') - - if server_hostname is not None: - cnx.set_tlsext_host_name(server_hostname) - - cnx.set_connect_state() - - while True: - try: - cnx.do_handshake() - except OpenSSL.SSL.WantReadError: - if not util.wait_for_read(sock, sock.gettimeout()): - raise timeout('select timed out') - continue - except OpenSSL.SSL.Error as e: - raise ssl.SSLError('bad handshake: %r' % e) - break - - return WrappedSocket(cnx, sock) - - -def _verify_callback(cnx, x509, err_no, err_depth, return_code): - return err_no == 0 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.pyc deleted file mode 100644 index 5f89f3c61540d0abb34c3ba487b7b11c43569957..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19914 zcmd5^+ix7#c|WteB*hhJ>VCI8vaN`6q@^S~vP>%uDT=aa%S&dKGNo;t;c#b`9CCMN zH8V?cT{}T6r%jqBZrU_WixfqR0s&eS2v8(_=~Md`wCGb&^tCU&r$CE7wEg|QGdsJK z<s=UUM3Or^_se(xzH?^tKN&54`YTVpQ&Z{B0RB%+DHT7LSISkYil?F6oN5@VnN!uA zGMLY+MqX75Qddxo0o5E-)j?f1pc+G}xkpupb$(DaimJI+Rre~Rb4a=jsm6$Ej;iXY zGM0jKs^C4PHi|0xNEwFV?or;Ds$-U6^`TM^mAa31fuZhk=AvrsQ_cOVx?eR9sOmvI z$6nPqq?(6S^>8-Fh%`K+sz-Lt@e`Q?t3RULQRP0R8pl-gxT+pkMt2VE?u4qIkfkDh zQdLh%+cDKRrJ7Hx>eCq%POIu^soSR-�!UswV38EBAm}1-Q;A?^#uSPWd_I71a9k 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 KbCl<gSpNqUigO(R diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/securetransport.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/securetransport.py deleted file mode 100644 index 77cb59e..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/securetransport.py +++ /dev/null @@ -1,804 +0,0 @@ -""" -SecureTranport support for urllib3 via ctypes. - -This makes platform-native TLS available to urllib3 users on macOS without the -use of a compiler. This is an important feature because the Python Package -Index is moving to become a TLSv1.2-or-higher server, and the default OpenSSL -that ships with macOS is not capable of doing TLSv1.2. The only way to resolve -this is to give macOS users an alternative solution to the problem, and that -solution is to use SecureTransport. - -We use ctypes here because this solution must not require a compiler. That's -because pip is not allowed to require a compiler either. - -This is not intended to be a seriously long-term solution to this problem. -The hope is that PEP 543 will eventually solve this issue for us, at which -point we can retire this contrib module. But in the short term, we need to -solve the impending tire fire that is Python on Mac without this kind of -contrib module. So...here we are. - -To use this module, simply import and inject it:: - - import urllib3.contrib.securetransport - urllib3.contrib.securetransport.inject_into_urllib3() - -Happy TLSing! -""" -from __future__ import absolute_import - -import contextlib -import ctypes -import errno -import os.path -import shutil -import socket -import ssl -import threading -import weakref - -from .. import util -from ._securetransport.bindings import ( - Security, SecurityConst, CoreFoundation -) -from ._securetransport.low_level import ( - _assert_no_error, _cert_array_from_pem, _temporary_keychain, - _load_client_cert_chain -) - -try: # Platform-specific: Python 2 - from socket import _fileobject -except ImportError: # Platform-specific: Python 3 - _fileobject = None - from ..packages.backports.makefile import backport_makefile - -__all__ = ['inject_into_urllib3', 'extract_from_urllib3'] - -# SNI always works -HAS_SNI = True - -orig_util_HAS_SNI = util.HAS_SNI -orig_util_SSLContext = util.ssl_.SSLContext - -# This dictionary is used by the read callback to obtain a handle to the -# calling wrapped socket. This is a pretty silly approach, but for now it'll -# do. I feel like I should be able to smuggle a handle to the wrapped socket -# directly in the SSLConnectionRef, but for now this approach will work I -# guess. -# -# We need to lock around this structure for inserts, but we don't do it for -# reads/writes in the callbacks. The reasoning here goes as follows: -# -# 1. It is not possible to call into the callbacks before the dictionary is -# populated, so once in the callback the id must be in the dictionary. -# 2. The callbacks don't mutate the dictionary, they only read from it, and -# so cannot conflict with any of the insertions. -# -# This is good: if we had to lock in the callbacks we'd drastically slow down -# the performance of this code. -_connection_refs = weakref.WeakValueDictionary() -_connection_ref_lock = threading.Lock() - -# Limit writes to 16kB. This is OpenSSL's limit, but we'll cargo-cult it over -# for no better reason than we need *a* limit, and this one is right there. -SSL_WRITE_BLOCKSIZE = 16384 - -# This is our equivalent of util.ssl_.DEFAULT_CIPHERS, but expanded out to -# individual cipher suites. We need to do this because this is how -# SecureTransport wants them. -CIPHER_SUITES = [ - SecurityConst.TLS_AES_256_GCM_SHA384, - SecurityConst.TLS_CHACHA20_POLY1305_SHA256, - SecurityConst.TLS_AES_128_GCM_SHA256, - SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, - SecurityConst.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, - SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, - SecurityConst.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, - SecurityConst.TLS_DHE_DSS_WITH_AES_256_GCM_SHA384, - SecurityConst.TLS_DHE_RSA_WITH_AES_256_GCM_SHA384, - SecurityConst.TLS_DHE_DSS_WITH_AES_128_GCM_SHA256, - SecurityConst.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, - SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, - SecurityConst.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, - SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, - SecurityConst.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, - SecurityConst.TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, - SecurityConst.TLS_DHE_DSS_WITH_AES_256_CBC_SHA256, - SecurityConst.TLS_DHE_RSA_WITH_AES_256_CBC_SHA, - SecurityConst.TLS_DHE_DSS_WITH_AES_256_CBC_SHA, - SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, - SecurityConst.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, - SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, - SecurityConst.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, - SecurityConst.TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, - SecurityConst.TLS_DHE_DSS_WITH_AES_128_CBC_SHA256, - SecurityConst.TLS_DHE_RSA_WITH_AES_128_CBC_SHA, - SecurityConst.TLS_DHE_DSS_WITH_AES_128_CBC_SHA, - SecurityConst.TLS_RSA_WITH_AES_256_GCM_SHA384, - SecurityConst.TLS_RSA_WITH_AES_128_GCM_SHA256, - SecurityConst.TLS_RSA_WITH_AES_256_CBC_SHA256, - SecurityConst.TLS_RSA_WITH_AES_128_CBC_SHA256, - SecurityConst.TLS_RSA_WITH_AES_256_CBC_SHA, - SecurityConst.TLS_RSA_WITH_AES_128_CBC_SHA, -] - -# Basically this is simple: for PROTOCOL_SSLv23 we turn it into a low of -# TLSv1 and a high of TLSv1.2. For everything else, we pin to that version. -_protocol_to_min_max = { - ssl.PROTOCOL_SSLv23: (SecurityConst.kTLSProtocol1, SecurityConst.kTLSProtocol12), -} - -if hasattr(ssl, "PROTOCOL_SSLv2"): - _protocol_to_min_max[ssl.PROTOCOL_SSLv2] = ( - SecurityConst.kSSLProtocol2, SecurityConst.kSSLProtocol2 - ) -if hasattr(ssl, "PROTOCOL_SSLv3"): - _protocol_to_min_max[ssl.PROTOCOL_SSLv3] = ( - SecurityConst.kSSLProtocol3, SecurityConst.kSSLProtocol3 - ) -if hasattr(ssl, "PROTOCOL_TLSv1"): - _protocol_to_min_max[ssl.PROTOCOL_TLSv1] = ( - SecurityConst.kTLSProtocol1, SecurityConst.kTLSProtocol1 - ) -if hasattr(ssl, "PROTOCOL_TLSv1_1"): - _protocol_to_min_max[ssl.PROTOCOL_TLSv1_1] = ( - SecurityConst.kTLSProtocol11, SecurityConst.kTLSProtocol11 - ) -if hasattr(ssl, "PROTOCOL_TLSv1_2"): - _protocol_to_min_max[ssl.PROTOCOL_TLSv1_2] = ( - SecurityConst.kTLSProtocol12, SecurityConst.kTLSProtocol12 - ) -if hasattr(ssl, "PROTOCOL_TLS"): - _protocol_to_min_max[ssl.PROTOCOL_TLS] = _protocol_to_min_max[ssl.PROTOCOL_SSLv23] - - -def inject_into_urllib3(): - """ - Monkey-patch urllib3 with SecureTransport-backed SSL-support. - """ - util.ssl_.SSLContext = SecureTransportContext - util.HAS_SNI = HAS_SNI - util.ssl_.HAS_SNI = HAS_SNI - util.IS_SECURETRANSPORT = True - util.ssl_.IS_SECURETRANSPORT = True - - -def extract_from_urllib3(): - """ - Undo monkey-patching by :func:`inject_into_urllib3`. - """ - util.ssl_.SSLContext = orig_util_SSLContext - util.HAS_SNI = orig_util_HAS_SNI - util.ssl_.HAS_SNI = orig_util_HAS_SNI - util.IS_SECURETRANSPORT = False - util.ssl_.IS_SECURETRANSPORT = False - - -def _read_callback(connection_id, data_buffer, data_length_pointer): - """ - SecureTransport read callback. This is called by ST to request that data - be returned from the socket. - """ - wrapped_socket = None - try: - wrapped_socket = _connection_refs.get(connection_id) - if wrapped_socket is None: - return SecurityConst.errSSLInternal - base_socket = wrapped_socket.socket - - requested_length = data_length_pointer[0] - - timeout = wrapped_socket.gettimeout() - error = None - read_count = 0 - - try: - while read_count < requested_length: - if timeout is None or timeout >= 0: - if not util.wait_for_read(base_socket, timeout): - raise socket.error(errno.EAGAIN, 'timed out') - - remaining = requested_length - read_count - buffer = (ctypes.c_char * remaining).from_address( - data_buffer + read_count - ) - chunk_size = base_socket.recv_into(buffer, remaining) - read_count += chunk_size - if not chunk_size: - if not read_count: - return SecurityConst.errSSLClosedGraceful - break - except (socket.error) as e: - error = e.errno - - if error is not None and error != errno.EAGAIN: - data_length_pointer[0] = read_count - if error == errno.ECONNRESET or error == errno.EPIPE: - return SecurityConst.errSSLClosedAbort - raise - - data_length_pointer[0] = read_count - - if read_count != requested_length: - return SecurityConst.errSSLWouldBlock - - return 0 - except Exception as e: - if wrapped_socket is not None: - wrapped_socket._exception = e - return SecurityConst.errSSLInternal - - -def _write_callback(connection_id, data_buffer, data_length_pointer): - """ - SecureTransport write callback. This is called by ST to request that data - actually be sent on the network. - """ - wrapped_socket = None - try: - wrapped_socket = _connection_refs.get(connection_id) - if wrapped_socket is None: - return SecurityConst.errSSLInternal - base_socket = wrapped_socket.socket - - bytes_to_write = data_length_pointer[0] - data = ctypes.string_at(data_buffer, bytes_to_write) - - timeout = wrapped_socket.gettimeout() - error = None - sent = 0 - - try: - while sent < bytes_to_write: - if timeout is None or timeout >= 0: - if not util.wait_for_write(base_socket, timeout): - raise socket.error(errno.EAGAIN, 'timed out') - chunk_sent = base_socket.send(data) - sent += chunk_sent - - # This has some needless copying here, but I'm not sure there's - # much value in optimising this data path. - data = data[chunk_sent:] - except (socket.error) as e: - error = e.errno - - if error is not None and error != errno.EAGAIN: - data_length_pointer[0] = sent - if error == errno.ECONNRESET or error == errno.EPIPE: - return SecurityConst.errSSLClosedAbort - raise - - data_length_pointer[0] = sent - - if sent != bytes_to_write: - return SecurityConst.errSSLWouldBlock - - return 0 - except Exception as e: - if wrapped_socket is not None: - wrapped_socket._exception = e - return SecurityConst.errSSLInternal - - -# We need to keep these two objects references alive: if they get GC'd while -# in use then SecureTransport could attempt to call a function that is in freed -# memory. That would be...uh...bad. Yeah, that's the word. Bad. -_read_callback_pointer = Security.SSLReadFunc(_read_callback) -_write_callback_pointer = Security.SSLWriteFunc(_write_callback) - - -class WrappedSocket(object): - """ - API-compatibility wrapper for Python's OpenSSL wrapped socket object. - - Note: _makefile_refs, _drop(), and _reuse() are needed for the garbage - collector of PyPy. - """ - def __init__(self, socket): - self.socket = socket - self.context = None - self._makefile_refs = 0 - self._closed = False - self._exception = None - self._keychain = None - self._keychain_dir = None - self._client_cert_chain = None - - # We save off the previously-configured timeout and then set it to - # zero. This is done because we use select and friends to handle the - # timeouts, but if we leave the timeout set on the lower socket then - # Python will "kindly" call select on that socket again for us. Avoid - # that by forcing the timeout to zero. - self._timeout = self.socket.gettimeout() - self.socket.settimeout(0) - - @contextlib.contextmanager - def _raise_on_error(self): - """ - A context manager that can be used to wrap calls that do I/O from - SecureTransport. If any of the I/O callbacks hit an exception, this - context manager will correctly propagate the exception after the fact. - This avoids silently swallowing those exceptions. - - It also correctly forces the socket closed. - """ - self._exception = None - - # We explicitly don't catch around this yield because in the unlikely - # event that an exception was hit in the block we don't want to swallow - # it. - yield - if self._exception is not None: - exception, self._exception = self._exception, None - self.close() - raise exception - - def _set_ciphers(self): - """ - Sets up the allowed ciphers. By default this matches the set in - util.ssl_.DEFAULT_CIPHERS, at least as supported by macOS. This is done - custom and doesn't allow changing at this time, mostly because parsing - OpenSSL cipher strings is going to be a freaking nightmare. - """ - ciphers = (Security.SSLCipherSuite * len(CIPHER_SUITES))(*CIPHER_SUITES) - result = Security.SSLSetEnabledCiphers( - self.context, ciphers, len(CIPHER_SUITES) - ) - _assert_no_error(result) - - def _custom_validate(self, verify, trust_bundle): - """ - Called when we have set custom validation. We do this in two cases: - first, when cert validation is entirely disabled; and second, when - using a custom trust DB. - """ - # If we disabled cert validation, just say: cool. - if not verify: - return - - # We want data in memory, so load it up. - if os.path.isfile(trust_bundle): - with open(trust_bundle, 'rb') as f: - trust_bundle = f.read() - - cert_array = None - trust = Security.SecTrustRef() - - try: - # Get a CFArray that contains the certs we want. - cert_array = _cert_array_from_pem(trust_bundle) - - # Ok, now the hard part. We want to get the SecTrustRef that ST has - # created for this connection, shove our CAs into it, tell ST to - # ignore everything else it knows, and then ask if it can build a - # chain. This is a buuuunch of code. - result = Security.SSLCopyPeerTrust( - self.context, ctypes.byref(trust) - ) - _assert_no_error(result) - if not trust: - raise ssl.SSLError("Failed to copy trust reference") - - result = Security.SecTrustSetAnchorCertificates(trust, cert_array) - _assert_no_error(result) - - result = Security.SecTrustSetAnchorCertificatesOnly(trust, True) - _assert_no_error(result) - - trust_result = Security.SecTrustResultType() - result = Security.SecTrustEvaluate( - trust, ctypes.byref(trust_result) - ) - _assert_no_error(result) - finally: - if trust: - CoreFoundation.CFRelease(trust) - - if cert_array is not None: - CoreFoundation.CFRelease(cert_array) - - # Ok, now we can look at what the result was. - successes = ( - SecurityConst.kSecTrustResultUnspecified, - SecurityConst.kSecTrustResultProceed - ) - if trust_result.value not in successes: - raise ssl.SSLError( - "certificate verify failed, error code: %d" % - trust_result.value - ) - - def handshake(self, - server_hostname, - verify, - trust_bundle, - min_version, - max_version, - client_cert, - client_key, - client_key_passphrase): - """ - Actually performs the TLS handshake. This is run automatically by - wrapped socket, and shouldn't be needed in user code. - """ - # First, we do the initial bits of connection setup. We need to create - # a context, set its I/O funcs, and set the connection reference. - self.context = Security.SSLCreateContext( - None, SecurityConst.kSSLClientSide, SecurityConst.kSSLStreamType - ) - result = Security.SSLSetIOFuncs( - self.context, _read_callback_pointer, _write_callback_pointer - ) - _assert_no_error(result) - - # Here we need to compute the handle to use. We do this by taking the - # id of self modulo 2**31 - 1. If this is already in the dictionary, we - # just keep incrementing by one until we find a free space. - with _connection_ref_lock: - handle = id(self) % 2147483647 - while handle in _connection_refs: - handle = (handle + 1) % 2147483647 - _connection_refs[handle] = self - - result = Security.SSLSetConnection(self.context, handle) - _assert_no_error(result) - - # If we have a server hostname, we should set that too. - if server_hostname: - if not isinstance(server_hostname, bytes): - server_hostname = server_hostname.encode('utf-8') - - result = Security.SSLSetPeerDomainName( - self.context, server_hostname, len(server_hostname) - ) - _assert_no_error(result) - - # Setup the ciphers. - self._set_ciphers() - - # Set the minimum and maximum TLS versions. - result = Security.SSLSetProtocolVersionMin(self.context, min_version) - _assert_no_error(result) - result = Security.SSLSetProtocolVersionMax(self.context, max_version) - _assert_no_error(result) - - # If there's a trust DB, we need to use it. We do that by telling - # SecureTransport to break on server auth. We also do that if we don't - # want to validate the certs at all: we just won't actually do any - # authing in that case. - if not verify or trust_bundle is not None: - result = Security.SSLSetSessionOption( - self.context, - SecurityConst.kSSLSessionOptionBreakOnServerAuth, - True - ) - _assert_no_error(result) - - # If there's a client cert, we need to use it. - if client_cert: - self._keychain, self._keychain_dir = _temporary_keychain() - self._client_cert_chain = _load_client_cert_chain( - self._keychain, client_cert, client_key - ) - result = Security.SSLSetCertificate( - self.context, self._client_cert_chain - ) - _assert_no_error(result) - - while True: - with self._raise_on_error(): - result = Security.SSLHandshake(self.context) - - if result == SecurityConst.errSSLWouldBlock: - raise socket.timeout("handshake timed out") - elif result == SecurityConst.errSSLServerAuthCompleted: - self._custom_validate(verify, trust_bundle) - continue - else: - _assert_no_error(result) - break - - def fileno(self): - return self.socket.fileno() - - # Copy-pasted from Python 3.5 source code - def _decref_socketios(self): - if self._makefile_refs > 0: - self._makefile_refs -= 1 - if self._closed: - self.close() - - def recv(self, bufsiz): - buffer = ctypes.create_string_buffer(bufsiz) - bytes_read = self.recv_into(buffer, bufsiz) - data = buffer[:bytes_read] - return data - - def recv_into(self, buffer, nbytes=None): - # Read short on EOF. - if self._closed: - return 0 - - if nbytes is None: - nbytes = len(buffer) - - buffer = (ctypes.c_char * nbytes).from_buffer(buffer) - processed_bytes = ctypes.c_size_t(0) - - with self._raise_on_error(): - result = Security.SSLRead( - self.context, buffer, nbytes, ctypes.byref(processed_bytes) - ) - - # There are some result codes that we want to treat as "not always - # errors". Specifically, those are errSSLWouldBlock, - # errSSLClosedGraceful, and errSSLClosedNoNotify. - if (result == SecurityConst.errSSLWouldBlock): - # If we didn't process any bytes, then this was just a time out. - # However, we can get errSSLWouldBlock in situations when we *did* - # read some data, and in those cases we should just read "short" - # and return. - if processed_bytes.value == 0: - # Timed out, no data read. - raise socket.timeout("recv timed out") - elif result in (SecurityConst.errSSLClosedGraceful, SecurityConst.errSSLClosedNoNotify): - # The remote peer has closed this connection. We should do so as - # well. Note that we don't actually return here because in - # principle this could actually be fired along with return data. - # It's unlikely though. - self.close() - else: - _assert_no_error(result) - - # Ok, we read and probably succeeded. We should return whatever data - # was actually read. - return processed_bytes.value - - def settimeout(self, timeout): - self._timeout = timeout - - def gettimeout(self): - return self._timeout - - def send(self, data): - processed_bytes = ctypes.c_size_t(0) - - with self._raise_on_error(): - result = Security.SSLWrite( - self.context, data, len(data), ctypes.byref(processed_bytes) - ) - - if result == SecurityConst.errSSLWouldBlock and processed_bytes.value == 0: - # Timed out - raise socket.timeout("send timed out") - else: - _assert_no_error(result) - - # We sent, and probably succeeded. Tell them how much we sent. - return processed_bytes.value - - def sendall(self, data): - total_sent = 0 - while total_sent < len(data): - sent = self.send(data[total_sent:total_sent + SSL_WRITE_BLOCKSIZE]) - total_sent += sent - - def shutdown(self): - with self._raise_on_error(): - Security.SSLClose(self.context) - - def close(self): - # TODO: should I do clean shutdown here? Do I have to? - if self._makefile_refs < 1: - self._closed = True - if self.context: - CoreFoundation.CFRelease(self.context) - self.context = None - if self._client_cert_chain: - CoreFoundation.CFRelease(self._client_cert_chain) - self._client_cert_chain = None - if self._keychain: - Security.SecKeychainDelete(self._keychain) - CoreFoundation.CFRelease(self._keychain) - shutil.rmtree(self._keychain_dir) - self._keychain = self._keychain_dir = None - return self.socket.close() - else: - self._makefile_refs -= 1 - - def getpeercert(self, binary_form=False): - # Urgh, annoying. - # - # Here's how we do this: - # - # 1. Call SSLCopyPeerTrust to get hold of the trust object for this - # connection. - # 2. Call SecTrustGetCertificateAtIndex for index 0 to get the leaf. - # 3. To get the CN, call SecCertificateCopyCommonName and process that - # string so that it's of the appropriate type. - # 4. To get the SAN, we need to do something a bit more complex: - # a. Call SecCertificateCopyValues to get the data, requesting - # kSecOIDSubjectAltName. - # b. Mess about with this dictionary to try to get the SANs out. - # - # This is gross. Really gross. It's going to be a few hundred LoC extra - # just to repeat something that SecureTransport can *already do*. So my - # operating assumption at this time is that what we want to do is - # instead to just flag to urllib3 that it shouldn't do its own hostname - # validation when using SecureTransport. - if not binary_form: - raise ValueError( - "SecureTransport only supports dumping binary certs" - ) - trust = Security.SecTrustRef() - certdata = None - der_bytes = None - - try: - # Grab the trust store. - result = Security.SSLCopyPeerTrust( - self.context, ctypes.byref(trust) - ) - _assert_no_error(result) - if not trust: - # Probably we haven't done the handshake yet. No biggie. - return None - - cert_count = Security.SecTrustGetCertificateCount(trust) - if not cert_count: - # Also a case that might happen if we haven't handshaked. - # Handshook? Handshaken? - return None - - leaf = Security.SecTrustGetCertificateAtIndex(trust, 0) - assert leaf - - # Ok, now we want the DER bytes. - certdata = Security.SecCertificateCopyData(leaf) - assert certdata - - data_length = CoreFoundation.CFDataGetLength(certdata) - data_buffer = CoreFoundation.CFDataGetBytePtr(certdata) - der_bytes = ctypes.string_at(data_buffer, data_length) - finally: - if certdata: - CoreFoundation.CFRelease(certdata) - if trust: - CoreFoundation.CFRelease(trust) - - return der_bytes - - def _reuse(self): - self._makefile_refs += 1 - - def _drop(self): - if self._makefile_refs < 1: - self.close() - else: - self._makefile_refs -= 1 - - -if _fileobject: # Platform-specific: Python 2 - def makefile(self, mode, bufsize=-1): - self._makefile_refs += 1 - return _fileobject(self, mode, bufsize, close=True) -else: # Platform-specific: Python 3 - def makefile(self, mode="r", buffering=None, *args, **kwargs): - # We disable buffering with SecureTransport because it conflicts with - # the buffering that ST does internally (see issue #1153 for more). - buffering = 0 - return backport_makefile(self, mode, buffering, *args, **kwargs) - -WrappedSocket.makefile = makefile - - -class SecureTransportContext(object): - """ - I am a wrapper class for the SecureTransport library, to translate the - interface of the standard library ``SSLContext`` object to calls into - SecureTransport. - """ - def __init__(self, protocol): - self._min_version, self._max_version = _protocol_to_min_max[protocol] - self._options = 0 - self._verify = False - self._trust_bundle = None - self._client_cert = None - self._client_key = None - self._client_key_passphrase = None - - @property - def check_hostname(self): - """ - SecureTransport cannot have its hostname checking disabled. For more, - see the comment on getpeercert() in this file. - """ - return True - - @check_hostname.setter - def check_hostname(self, value): - """ - SecureTransport cannot have its hostname checking disabled. For more, - see the comment on getpeercert() in this file. - """ - pass - - @property - def options(self): - # TODO: Well, crap. - # - # So this is the bit of the code that is the most likely to cause us - # trouble. Essentially we need to enumerate all of the SSL options that - # users might want to use and try to see if we can sensibly translate - # them, or whether we should just ignore them. - return self._options - - @options.setter - def options(self, value): - # TODO: Update in line with above. - self._options = value - - @property - def verify_mode(self): - return ssl.CERT_REQUIRED if self._verify else ssl.CERT_NONE - - @verify_mode.setter - def verify_mode(self, value): - self._verify = True if value == ssl.CERT_REQUIRED else False - - def set_default_verify_paths(self): - # So, this has to do something a bit weird. Specifically, what it does - # is nothing. - # - # This means that, if we had previously had load_verify_locations - # called, this does not undo that. We need to do that because it turns - # out that the rest of the urllib3 code will attempt to load the - # default verify paths if it hasn't been told about any paths, even if - # the context itself was sometime earlier. We resolve that by just - # ignoring it. - pass - - def load_default_certs(self): - return self.set_default_verify_paths() - - def set_ciphers(self, ciphers): - # For now, we just require the default cipher string. - if ciphers != util.ssl_.DEFAULT_CIPHERS: - raise ValueError( - "SecureTransport doesn't support custom cipher strings" - ) - - def load_verify_locations(self, cafile=None, capath=None, cadata=None): - # OK, we only really support cadata and cafile. - if capath is not None: - raise ValueError( - "SecureTransport does not support cert directories" - ) - - self._trust_bundle = cafile or cadata - - def load_cert_chain(self, certfile, keyfile=None, password=None): - self._client_cert = certfile - self._client_key = keyfile - self._client_cert_passphrase = password - - def wrap_socket(self, sock, server_side=False, - do_handshake_on_connect=True, suppress_ragged_eofs=True, - server_hostname=None): - # So, what do we do here? Firstly, we assert some properties. This is a - # stripped down shim, so there is some functionality we don't support. - # See PEP 543 for the real deal. - assert not server_side - assert do_handshake_on_connect - assert suppress_ragged_eofs - - # Ok, we're good to go. Now we want to create the wrapped socket object - # and store it in the appropriate place. - wrapped_socket = WrappedSocket(sock) - - # Now we can handshake - wrapped_socket.handshake( - server_hostname, self._verify, self._trust_bundle, - self._min_version, self._max_version, self._client_cert, - self._client_key, self._client_key_passphrase - ) - return wrapped_socket diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/securetransport.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/securetransport.pyc deleted file mode 100644 index ace66d5b35712391d3f0b7d172964c0615d5b2af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24494 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 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/socks.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/socks.py deleted file mode 100644 index 811e312..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/socks.py +++ /dev/null @@ -1,192 +0,0 @@ -# -*- coding: utf-8 -*- -""" -This module contains provisional support for SOCKS proxies from within -urllib3. This module supports SOCKS4 (specifically the SOCKS4A variant) and -SOCKS5. To enable its functionality, either install PySocks or install this -module with the ``socks`` extra. - -The SOCKS implementation supports the full range of urllib3 features. It also -supports the following SOCKS features: - -- SOCKS4 -- SOCKS4a -- SOCKS5 -- Usernames and passwords for the SOCKS proxy - -Known Limitations: - -- Currently PySocks does not support contacting remote websites via literal - IPv6 addresses. Any such connection attempt will fail. You must use a domain - name. -- Currently PySocks does not support IPv6 connections to the SOCKS proxy. Any - such connection attempt will fail. -""" -from __future__ import absolute_import - -try: - import socks -except ImportError: - import warnings - from ..exceptions import DependencyWarning - - warnings.warn(( - 'SOCKS support in urllib3 requires the installation of optional ' - 'dependencies: specifically, PySocks. For more information, see ' - 'https://urllib3.readthedocs.io/en/latest/contrib.html#socks-proxies' - ), - DependencyWarning - ) - raise - -from socket import error as SocketError, timeout as SocketTimeout - -from ..connection import ( - HTTPConnection, HTTPSConnection -) -from ..connectionpool import ( - HTTPConnectionPool, HTTPSConnectionPool -) -from ..exceptions import ConnectTimeoutError, NewConnectionError -from ..poolmanager import PoolManager -from ..util.url import parse_url - -try: - import ssl -except ImportError: - ssl = None - - -class SOCKSConnection(HTTPConnection): - """ - A plain-text HTTP connection that connects via a SOCKS proxy. - """ - def __init__(self, *args, **kwargs): - self._socks_options = kwargs.pop('_socks_options') - super(SOCKSConnection, self).__init__(*args, **kwargs) - - def _new_conn(self): - """ - Establish a new connection via the SOCKS proxy. - """ - extra_kw = {} - if self.source_address: - extra_kw['source_address'] = self.source_address - - if self.socket_options: - extra_kw['socket_options'] = self.socket_options - - try: - conn = socks.create_connection( - (self.host, self.port), - proxy_type=self._socks_options['socks_version'], - proxy_addr=self._socks_options['proxy_host'], - proxy_port=self._socks_options['proxy_port'], - proxy_username=self._socks_options['username'], - proxy_password=self._socks_options['password'], - proxy_rdns=self._socks_options['rdns'], - timeout=self.timeout, - **extra_kw - ) - - except SocketTimeout as e: - raise ConnectTimeoutError( - self, "Connection to %s timed out. (connect timeout=%s)" % - (self.host, self.timeout)) - - except socks.ProxyError as e: - # This is fragile as hell, but it seems to be the only way to raise - # useful errors here. - if e.socket_err: - error = e.socket_err - if isinstance(error, SocketTimeout): - raise ConnectTimeoutError( - self, - "Connection to %s timed out. (connect timeout=%s)" % - (self.host, self.timeout) - ) - else: - raise NewConnectionError( - self, - "Failed to establish a new connection: %s" % error - ) - else: - raise NewConnectionError( - self, - "Failed to establish a new connection: %s" % e - ) - - except SocketError as e: # Defensive: PySocks should catch all these. - raise NewConnectionError( - self, "Failed to establish a new connection: %s" % e) - - return conn - - -# We don't need to duplicate the Verified/Unverified distinction from -# urllib3/connection.py here because the HTTPSConnection will already have been -# correctly set to either the Verified or Unverified form by that module. This -# means the SOCKSHTTPSConnection will automatically be the correct type. -class SOCKSHTTPSConnection(SOCKSConnection, HTTPSConnection): - pass - - -class SOCKSHTTPConnectionPool(HTTPConnectionPool): - ConnectionCls = SOCKSConnection - - -class SOCKSHTTPSConnectionPool(HTTPSConnectionPool): - ConnectionCls = SOCKSHTTPSConnection - - -class SOCKSProxyManager(PoolManager): - """ - A version of the urllib3 ProxyManager that routes connections via the - defined SOCKS proxy. - """ - pool_classes_by_scheme = { - 'http': SOCKSHTTPConnectionPool, - 'https': SOCKSHTTPSConnectionPool, - } - - def __init__(self, proxy_url, username=None, password=None, - num_pools=10, headers=None, **connection_pool_kw): - parsed = parse_url(proxy_url) - - if username is None and password is None and parsed.auth is not None: - split = parsed.auth.split(':') - if len(split) == 2: - username, password = split - if parsed.scheme == 'socks5': - socks_version = socks.PROXY_TYPE_SOCKS5 - rdns = False - elif parsed.scheme == 'socks5h': - socks_version = socks.PROXY_TYPE_SOCKS5 - rdns = True - elif parsed.scheme == 'socks4': - socks_version = socks.PROXY_TYPE_SOCKS4 - rdns = False - elif parsed.scheme == 'socks4a': - socks_version = socks.PROXY_TYPE_SOCKS4 - rdns = True - else: - raise ValueError( - "Unable to determine SOCKS version from %s" % proxy_url - ) - - self.proxy_url = proxy_url - - socks_options = { - 'socks_version': socks_version, - 'proxy_host': parsed.host, - 'proxy_port': parsed.port, - 'username': username, - 'password': password, - 'rdns': rdns - } - connection_pool_kw['_socks_options'] = socks_options - - super(SOCKSProxyManager, self).__init__( - num_pools, headers, **connection_pool_kw - ) - - self.pool_classes_by_scheme = SOCKSProxyManager.pool_classes_by_scheme diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/socks.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/socks.pyc deleted file mode 100644 index 6c4b0b6c719ec7b5ae594ebdfaff9c5aff52b53b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6298 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 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/exceptions.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/exceptions.py deleted file mode 100644 index 7bbaa98..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/exceptions.py +++ /dev/null @@ -1,246 +0,0 @@ -from __future__ import absolute_import -from .packages.six.moves.http_client import ( - IncompleteRead as httplib_IncompleteRead -) -# Base Exceptions - - -class HTTPError(Exception): - "Base exception used by this module." - pass - - -class HTTPWarning(Warning): - "Base warning used by this module." - pass - - -class PoolError(HTTPError): - "Base exception for errors caused within a pool." - def __init__(self, pool, message): - self.pool = pool - HTTPError.__init__(self, "%s: %s" % (pool, message)) - - def __reduce__(self): - # For pickling purposes. - return self.__class__, (None, None) - - -class RequestError(PoolError): - "Base exception for PoolErrors that have associated URLs." - def __init__(self, pool, url, message): - self.url = url - PoolError.__init__(self, pool, message) - - def __reduce__(self): - # For pickling purposes. - return self.__class__, (None, self.url, None) - - -class SSLError(HTTPError): - "Raised when SSL certificate fails in an HTTPS connection." - pass - - -class ProxyError(HTTPError): - "Raised when the connection to a proxy fails." - pass - - -class DecodeError(HTTPError): - "Raised when automatic decoding based on Content-Type fails." - pass - - -class ProtocolError(HTTPError): - "Raised when something unexpected happens mid-request/response." - pass - - -#: Renamed to ProtocolError but aliased for backwards compatibility. -ConnectionError = ProtocolError - - -# Leaf Exceptions - -class MaxRetryError(RequestError): - """Raised when the maximum number of retries is exceeded. - - :param pool: The connection pool - :type pool: :class:`~urllib3.connectionpool.HTTPConnectionPool` - :param string url: The requested Url - :param exceptions.Exception reason: The underlying error - - """ - - def __init__(self, pool, url, reason=None): - self.reason = reason - - message = "Max retries exceeded with url: %s (Caused by %r)" % ( - url, reason) - - RequestError.__init__(self, pool, url, message) - - -class HostChangedError(RequestError): - "Raised when an existing pool gets a request for a foreign host." - - def __init__(self, pool, url, retries=3): - message = "Tried to open a foreign host with url: %s" % url - RequestError.__init__(self, pool, url, message) - self.retries = retries - - -class TimeoutStateError(HTTPError): - """ Raised when passing an invalid state to a timeout """ - pass - - -class TimeoutError(HTTPError): - """ Raised when a socket timeout error occurs. - - Catching this error will catch both :exc:`ReadTimeoutErrors - <ReadTimeoutError>` and :exc:`ConnectTimeoutErrors <ConnectTimeoutError>`. - """ - pass - - -class ReadTimeoutError(TimeoutError, RequestError): - "Raised when a socket timeout occurs while receiving data from a server" - pass - - -# This timeout error does not have a URL attached and needs to inherit from the -# base HTTPError -class ConnectTimeoutError(TimeoutError): - "Raised when a socket timeout occurs while connecting to a server" - pass - - -class NewConnectionError(ConnectTimeoutError, PoolError): - "Raised when we fail to establish a new connection. Usually ECONNREFUSED." - pass - - -class EmptyPoolError(PoolError): - "Raised when a pool runs out of connections and no more are allowed." - pass - - -class ClosedPoolError(PoolError): - "Raised when a request enters a pool after the pool has been closed." - pass - - -class LocationValueError(ValueError, HTTPError): - "Raised when there is something wrong with a given URL input." - pass - - -class LocationParseError(LocationValueError): - "Raised when get_host or similar fails to parse the URL input." - - def __init__(self, location): - message = "Failed to parse: %s" % location - HTTPError.__init__(self, message) - - self.location = location - - -class ResponseError(HTTPError): - "Used as a container for an error reason supplied in a MaxRetryError." - GENERIC_ERROR = 'too many error responses' - SPECIFIC_ERROR = 'too many {status_code} error responses' - - -class SecurityWarning(HTTPWarning): - "Warned when performing security reducing actions" - pass - - -class SubjectAltNameWarning(SecurityWarning): - "Warned when connecting to a host with a certificate missing a SAN." - pass - - -class InsecureRequestWarning(SecurityWarning): - "Warned when making an unverified HTTPS request." - pass - - -class SystemTimeWarning(SecurityWarning): - "Warned when system time is suspected to be wrong" - pass - - -class InsecurePlatformWarning(SecurityWarning): - "Warned when certain SSL configuration is not available on a platform." - pass - - -class SNIMissingWarning(HTTPWarning): - "Warned when making a HTTPS request without SNI available." - pass - - -class DependencyWarning(HTTPWarning): - """ - Warned when an attempt is made to import a module with missing optional - dependencies. - """ - pass - - -class ResponseNotChunked(ProtocolError, ValueError): - "Response needs to be chunked in order to read it as chunks." - pass - - -class BodyNotHttplibCompatible(HTTPError): - """ - Body should be httplib.HTTPResponse like (have an fp attribute which - returns raw chunks) for read_chunked(). - """ - pass - - -class IncompleteRead(HTTPError, httplib_IncompleteRead): - """ - Response length doesn't match expected Content-Length - - Subclass of http_client.IncompleteRead to allow int value - for `partial` to avoid creating large objects on streamed - reads. - """ - def __init__(self, partial, expected): - super(IncompleteRead, self).__init__(partial, expected) - - def __repr__(self): - return ('IncompleteRead(%i bytes read, ' - '%i more expected)' % (self.partial, self.expected)) - - -class InvalidHeader(HTTPError): - "The header provided was somehow invalid." - pass - - -class ProxySchemeUnknown(AssertionError, ValueError): - "ProxyManager does not support the supplied scheme" - # TODO(t-8ch): Stop inheriting from AssertionError in v2.0. - - def __init__(self, scheme): - message = "Not supported proxy scheme %s" % scheme - super(ProxySchemeUnknown, self).__init__(message) - - -class HeaderParsingError(HTTPError): - "Raised by assert_header_parsing, but we convert it to a log.warning statement." - def __init__(self, defects, unparsed_data): - message = '%s, unparsed data: %r' % (defects or 'Unknown', unparsed_data) - super(HeaderParsingError, self).__init__(message) - - -class UnrewindableBodyError(HTTPError): - "urllib3 encountered an error when trying to rewind a body" - pass diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/exceptions.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/exceptions.pyc deleted file mode 100644 index 6f9d47e568eeecc6c4db4cb5e4e1301749ea6812..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15502 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 GANyYyp&S_i diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/fields.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/fields.py deleted file mode 100644 index 37fe64a..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/fields.py +++ /dev/null @@ -1,178 +0,0 @@ -from __future__ import absolute_import -import email.utils -import mimetypes - -from .packages import six - - -def guess_content_type(filename, default='application/octet-stream'): - """ - Guess the "Content-Type" of a file. - - :param filename: - The filename to guess the "Content-Type" of using :mod:`mimetypes`. - :param default: - If no "Content-Type" can be guessed, default to `default`. - """ - if filename: - return mimetypes.guess_type(filename)[0] or default - return default - - -def format_header_param(name, value): - """ - Helper function to format and quote a single header parameter. - - Particularly useful for header parameters which might contain - non-ASCII values, like file names. This follows RFC 2231, as - suggested by RFC 2388 Section 4.4. - - :param name: - The name of the parameter, a string expected to be ASCII only. - :param value: - The value of the parameter, provided as a unicode string. - """ - if not any(ch in value for ch in '"\\\r\n'): - result = '%s="%s"' % (name, value) - try: - result.encode('ascii') - except (UnicodeEncodeError, UnicodeDecodeError): - pass - else: - return result - if not six.PY3 and isinstance(value, six.text_type): # Python 2: - value = value.encode('utf-8') - value = email.utils.encode_rfc2231(value, 'utf-8') - value = '%s*=%s' % (name, value) - return value - - -class RequestField(object): - """ - A data container for request body parameters. - - :param name: - The name of this request field. - :param data: - The data/value body. - :param filename: - An optional filename of the request field. - :param headers: - An optional dict-like object of headers to initially use for the field. - """ - def __init__(self, name, data, filename=None, headers=None): - self._name = name - self._filename = filename - self.data = data - self.headers = {} - if headers: - self.headers = dict(headers) - - @classmethod - def from_tuples(cls, fieldname, value): - """ - A :class:`~urllib3.fields.RequestField` factory from old-style tuple parameters. - - Supports constructing :class:`~urllib3.fields.RequestField` from - parameter of key/value strings AND key/filetuple. A filetuple is a - (filename, data, MIME type) tuple where the MIME type is optional. - For example:: - - 'foo': 'bar', - 'fakefile': ('foofile.txt', 'contents of foofile'), - 'realfile': ('barfile.txt', open('realfile').read()), - 'typedfile': ('bazfile.bin', open('bazfile').read(), 'image/jpeg'), - 'nonamefile': 'contents of nonamefile field', - - Field names and filenames must be unicode. - """ - if isinstance(value, tuple): - if len(value) == 3: - filename, data, content_type = value - else: - filename, data = value - content_type = guess_content_type(filename) - else: - filename = None - content_type = None - data = value - - request_param = cls(fieldname, data, filename=filename) - request_param.make_multipart(content_type=content_type) - - return request_param - - def _render_part(self, name, value): - """ - Overridable helper function to format a single header parameter. - - :param name: - The name of the parameter, a string expected to be ASCII only. - :param value: - The value of the parameter, provided as a unicode string. - """ - return format_header_param(name, value) - - def _render_parts(self, header_parts): - """ - Helper function to format and quote a single header. - - Useful for single headers that are composed of multiple items. E.g., - 'Content-Disposition' fields. - - :param header_parts: - A sequence of (k, v) tuples or a :class:`dict` of (k, v) to format - as `k1="v1"; k2="v2"; ...`. - """ - parts = [] - iterable = header_parts - if isinstance(header_parts, dict): - iterable = header_parts.items() - - for name, value in iterable: - if value is not None: - parts.append(self._render_part(name, value)) - - return '; '.join(parts) - - def render_headers(self): - """ - Renders the headers for this request field. - """ - lines = [] - - sort_keys = ['Content-Disposition', 'Content-Type', 'Content-Location'] - for sort_key in sort_keys: - if self.headers.get(sort_key, False): - lines.append('%s: %s' % (sort_key, self.headers[sort_key])) - - for header_name, header_value in self.headers.items(): - if header_name not in sort_keys: - if header_value: - lines.append('%s: %s' % (header_name, header_value)) - - lines.append('\r\n') - return '\r\n'.join(lines) - - def make_multipart(self, content_disposition=None, content_type=None, - content_location=None): - """ - Makes this request field into a multipart request field. - - This method overrides "Content-Disposition", "Content-Type" and - "Content-Location" headers to the request parameter. - - :param content_type: - The 'Content-Type' of the request body. - :param content_location: - The 'Content-Location' of the request body. - - """ - self.headers['Content-Disposition'] = content_disposition or 'form-data' - self.headers['Content-Disposition'] += '; '.join([ - '', self._render_parts( - (('name', self._name), ('filename', self._filename)) - ) - ]) - self.headers['Content-Type'] = content_type - self.headers['Content-Location'] = content_location diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/fields.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/fields.pyc deleted file mode 100644 index 1a6657f6a06bc47eb1482f121f2d231090448954..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7346 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 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/filepost.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/filepost.py deleted file mode 100644 index 78f1e19..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/filepost.py +++ /dev/null @@ -1,98 +0,0 @@ -from __future__ import absolute_import -import binascii -import codecs -import os - -from io import BytesIO - -from .packages import six -from .packages.six import b -from .fields import RequestField - -writer = codecs.lookup('utf-8')[3] - - -def choose_boundary(): - """ - Our embarrassingly-simple replacement for mimetools.choose_boundary. - """ - boundary = binascii.hexlify(os.urandom(16)) - if six.PY3: - boundary = boundary.decode('ascii') - return boundary - - -def iter_field_objects(fields): - """ - Iterate over fields. - - Supports list of (k, v) tuples and dicts, and lists of - :class:`~urllib3.fields.RequestField`. - - """ - if isinstance(fields, dict): - i = six.iteritems(fields) - else: - i = iter(fields) - - for field in i: - if isinstance(field, RequestField): - yield field - else: - yield RequestField.from_tuples(*field) - - -def iter_fields(fields): - """ - .. deprecated:: 1.6 - - Iterate over fields. - - The addition of :class:`~urllib3.fields.RequestField` makes this function - obsolete. Instead, use :func:`iter_field_objects`, which returns - :class:`~urllib3.fields.RequestField` objects. - - Supports list of (k, v) tuples and dicts. - """ - if isinstance(fields, dict): - return ((k, v) for k, v in six.iteritems(fields)) - - return ((k, v) for k, v in fields) - - -def encode_multipart_formdata(fields, boundary=None): - """ - Encode a dictionary of ``fields`` using the multipart/form-data MIME format. - - :param fields: - Dictionary of fields or list of (key, :class:`~urllib3.fields.RequestField`). - - :param boundary: - If not specified, then a random boundary will be generated using - :func:`urllib3.filepost.choose_boundary`. - """ - body = BytesIO() - if boundary is None: - boundary = choose_boundary() - - for field in iter_field_objects(fields): - body.write(b('--%s\r\n' % (boundary))) - - writer(body).write(field.render_headers()) - data = field.data - - if isinstance(data, int): - data = str(data) # Backwards compatibility - - if isinstance(data, six.text_type): - writer(body).write(data) - else: - body.write(data) - - body.write(b'\r\n') - - body.write(b('--%s--\r\n' % (boundary))) - - content_type = str('multipart/form-data; boundary=%s' % boundary) - - return body.getvalue(), content_type diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/filepost.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/filepost.pyc deleted file mode 100644 index 1e2cbde92f523ba6a3cd2b582d706b536ed37146..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3780 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 Q;^5CcH&bua->9$t3B)Cnv;Y7A diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/__init__.py deleted file mode 100644 index 170e974..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -from __future__ import absolute_import - -from . import ssl_match_hostname - -__all__ = ('ssl_match_hostname', ) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/__init__.pyc deleted file mode 100644 index abd835290be52e3b908b509e52142c36e5dde629..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 387 zcmZvX+e!m55Qb-WTa|)Ze2PV>X{i(ik-mT;)vJOG=_YMMv%4{wt=r!D%)Wq=DtP0N z`7(!pa>%|;dsm-lZw35X%KLN*5H2}Tyb`bgWdidA5|x6=z@|`UFwZzYf_Vp27hdvX zmK%1+69%0#<Ra9zA&sVVwI>rBKivzCLa<m$D%QBJ168urvnY5vD8m1WyvqveF%Xvx zHC`jmI0K3}%u{>_qO=w<kJUefmQ&%p*-Fx4E4^6OR%su^z7@N%UsNBP(d4}vPW;WJ zxDD-{+WR5f%86Iuj2oCL5T87t(c=oAW9i_y)s?EfXuP#%F&0i18@bX!Aezb$;<ek+ V315C+)~d1kA$~M;82z-Legh3mTl4?` diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/backports/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/backports/__init__.pyc deleted file mode 100644 index 664c9b5229ad3a148609ddd0e3c683abbfc0895e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 217 zcmZ9GK?=e!5Je-p5JAr&h)#=A6hyp$BIs5^+Qbr!X`IAryVEOs0jJ{15C6^ZR=@r3 z_eRgbF=M~9=&q^0Ly(N^hmF||3G5I4MGhS5QUnF1KsXgfD)dl4pqgT8@8>wV+9<(U zlFj{NA#02%xq|~Z?Z(>rAdDG@c$4#8qrT;(va&$9p)oq0f)m+U<jO-zk1H^E;9OfB VIG?yGbZN%&QplT8t7fdHvJbD3IVk`D diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py deleted file mode 100644 index 740db37..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py +++ /dev/null @@ -1,53 +0,0 @@ -# -*- coding: utf-8 -*- -""" -backports.makefile -~~~~~~~~~~~~~~~~~~ - -Backports the Python 3 ``socket.makefile`` method for use with anything that -wants to create a "fake" socket object. -""" -import io - -from socket import SocketIO - - -def backport_makefile(self, mode="r", buffering=None, encoding=None, - errors=None, newline=None): - """ - Backport of ``socket.makefile`` from Python 3.5. - """ - if not set(mode) <= {"r", "w", "b"}: - raise ValueError( - "invalid mode %r (only r, w, b allowed)" % (mode,) - ) - writing = "w" in mode - reading = "r" in mode or not writing - assert reading or writing - binary = "b" in mode - rawmode = "" - if reading: - rawmode += "r" - if writing: - rawmode += "w" - raw = SocketIO(self, rawmode) - self._makefile_refs += 1 - if buffering is None: - buffering = -1 - if buffering < 0: - buffering = io.DEFAULT_BUFFER_SIZE - if buffering == 0: - if not binary: - raise ValueError("unbuffered streams must be binary") - return raw - if reading and writing: - buffer = io.BufferedRWPair(raw, raw, buffering) - elif reading: - buffer = io.BufferedReader(raw, buffering) - else: - assert writing - buffer = io.BufferedWriter(raw, buffering) - if binary: - return buffer - text = io.TextIOWrapper(buffer, encoding, errors, newline) - text.mode = mode - return text diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/backports/makefile.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/backports/makefile.pyc deleted file mode 100644 index e8e7df100ec94c9dbb8d69e8048af46463438c21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1713 zcmd5+{camY5T8AN#J)IfX#_$-prsNh6|JvPAf*UZG>}M<Xd2lGks_hX*|(Qme7<vc z*KtzWNHj>i0e>LzNIV8lzyrW<_F`889)P{u*_q$&?0oF(R{mV^Kl$<2_kFr)b&Ox3 zo2MW#(J`o?*rQC)F&O+6$~+oY=(s{6uJYWQzeYdR=(xs6ca8Tlzk&F@s6QAL+M4z- z8mJ`Al>fuOn(uGTmq~l3<o=aCD{{FZPfkqHA1J#}J~@#?g~?bZg_dKZ<RrCcGRmQm z=BLn(tUrlzYosk?U#rL}8OeJIjNg;xX0qs=tG;df>0fAjYXW}S21wW0+I?Xe(R~hL z1-*v;HM;o)xFwnjx-Rp9_$zc)p@AT?PEbQqFq;T^2P<9+%8^5lp+TKyb<SbQkDk-C zPOaGzO_#{@SOB#i>tM?pg$Bhnnl*Wi{+Xst)_)8cyFx+#>L70pS?FP+N!K3DeCDg? zIHNi}_CmM?Uws-hNdHdp63slf3%~{q5bPgh>vaAP+#~IaX@g8%aBSFl9@NyQE_>A$ z>_}U%a)W^K@6mOIX3La6ah~tGSwvAz!8uHQ;6gqWWyq|)&~*!7RlgL|W$N<WGJ%^S zKEzR@>nhD!oTF)rLNF~9+%lif7a+bwn^%)8lK(8BL>I$Fk+nZ-JEe}R111w!06p_D z_%y$WvNV>%B3AMvE!T=XyOR2WoIH>{8D&{9QSp6L1(vd|tErSl^C8GM?~Rj0X%$Oj zQH?_*hht-9Psv`INBU}SjY|w?2L)xVkMX-G8>?-tacgctd}fT&HZ5`ob%2n=!})~@ zwMvYw0^cigg^a?B!meWYW_#z^;kO6j*5S_1b|>ua9&bC<ts9>@NBdD)T3J9UieZio z&!HooT0rdQfx5K2FOGCH8UbOGoR=~LmW;}h&K)qe2~viRYw2#6%KJsk0^cje;TgLG zHdm7@h2P9iV2YP8k8CZLm$@q8Xu>vK#&k4syOoBVKNcRYL7N;gufYW)onGJ_2reQW zBt?e!Oz`S5xZ2RYd@@+ye3?Jm)SqtlKR1_8;#c|++UY1b2uA7XVVWC@Q+{aIpPz>N z47na&s5~xoFxFX?_BMhM-mmCXnPBnW1@q%+kFM-naAQ8RI5*C**#e>3d!iy%y_Q%N zcSTFo@vXRiTik}+MCY##sfzJkaBpMvU5r&oP2nC~m!2?;i+&h(xR6|K$~VuIO@|Mq g^FGL%4E?Xt)PQSW;&jKEddj?EQWq`nPNgaS1}ILUK>z>% diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/six.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/six.py deleted file mode 100644 index 190c023..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/six.py +++ /dev/null @@ -1,868 +0,0 @@ -"""Utilities for writing code that runs on Python 2 and 3""" - -# Copyright (c) 2010-2015 Benjamin Peterson -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -from __future__ import absolute_import - -import functools -import itertools -import operator -import sys -import types - -__author__ = "Benjamin Peterson <benjamin@python.org>" -__version__ = "1.10.0" - - -# Useful for very coarse version differentiation. -PY2 = sys.version_info[0] == 2 -PY3 = sys.version_info[0] == 3 -PY34 = sys.version_info[0:2] >= (3, 4) - -if PY3: - string_types = str, - integer_types = int, - class_types = type, - text_type = str - binary_type = bytes - - MAXSIZE = sys.maxsize -else: - string_types = basestring, - integer_types = (int, long) - class_types = (type, types.ClassType) - text_type = unicode - binary_type = str - - if sys.platform.startswith("java"): - # Jython always uses 32 bits. - MAXSIZE = int((1 << 31) - 1) - else: - # It's possible to have sizeof(long) != sizeof(Py_ssize_t). - class X(object): - - def __len__(self): - return 1 << 31 - try: - len(X()) - except OverflowError: - # 32-bit - MAXSIZE = int((1 << 31) - 1) - else: - # 64-bit - MAXSIZE = int((1 << 63) - 1) - del X - - -def _add_doc(func, doc): - """Add documentation to a function.""" - func.__doc__ = doc - - -def _import_module(name): - """Import module, returning the module after the last dot.""" - __import__(name) - return sys.modules[name] - - -class _LazyDescr(object): - - def __init__(self, name): - self.name = name - - def __get__(self, obj, tp): - result = self._resolve() - setattr(obj, self.name, result) # Invokes __set__. - try: - # This is a bit ugly, but it avoids running this again by - # removing this descriptor. - delattr(obj.__class__, self.name) - except AttributeError: - pass - return result - - -class MovedModule(_LazyDescr): - - def __init__(self, name, old, new=None): - super(MovedModule, self).__init__(name) - if PY3: - if new is None: - new = name - self.mod = new - else: - self.mod = old - - def _resolve(self): - return _import_module(self.mod) - - def __getattr__(self, attr): - _module = self._resolve() - value = getattr(_module, attr) - setattr(self, attr, value) - return value - - -class _LazyModule(types.ModuleType): - - def __init__(self, name): - super(_LazyModule, self).__init__(name) - self.__doc__ = self.__class__.__doc__ - - def __dir__(self): - attrs = ["__doc__", "__name__"] - attrs += [attr.name for attr in self._moved_attributes] - return attrs - - # Subclasses should override this - _moved_attributes = [] - - -class MovedAttribute(_LazyDescr): - - def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): - super(MovedAttribute, self).__init__(name) - if PY3: - if new_mod is None: - new_mod = name - self.mod = new_mod - if new_attr is None: - if old_attr is None: - new_attr = name - else: - new_attr = old_attr - self.attr = new_attr - else: - self.mod = old_mod - if old_attr is None: - old_attr = name - self.attr = old_attr - - def _resolve(self): - module = _import_module(self.mod) - return getattr(module, self.attr) - - -class _SixMetaPathImporter(object): - - """ - A meta path importer to import six.moves and its submodules. - - This class implements a PEP302 finder and loader. It should be compatible - with Python 2.5 and all existing versions of Python3 - """ - - def __init__(self, six_module_name): - self.name = six_module_name - self.known_modules = {} - - def _add_module(self, mod, *fullnames): - for fullname in fullnames: - self.known_modules[self.name + "." + fullname] = mod - - def _get_module(self, fullname): - return self.known_modules[self.name + "." + fullname] - - def find_module(self, fullname, path=None): - if fullname in self.known_modules: - return self - return None - - def __get_module(self, fullname): - try: - return self.known_modules[fullname] - except KeyError: - raise ImportError("This loader does not know module " + fullname) - - def load_module(self, fullname): - try: - # in case of a reload - return sys.modules[fullname] - except KeyError: - pass - mod = self.__get_module(fullname) - if isinstance(mod, MovedModule): - mod = mod._resolve() - else: - mod.__loader__ = self - sys.modules[fullname] = mod - return mod - - def is_package(self, fullname): - """ - Return true, if the named module is a package. - - We need this method to get correct spec objects with - Python 3.4 (see PEP451) - """ - return hasattr(self.__get_module(fullname), "__path__") - - def get_code(self, fullname): - """Return None - - Required, if is_package is implemented""" - self.__get_module(fullname) # eventually raises ImportError - return None - get_source = get_code # same as get_code - -_importer = _SixMetaPathImporter(__name__) - - -class _MovedItems(_LazyModule): - - """Lazy loading of moved objects""" - __path__ = [] # mark as package - - -_moved_attributes = [ - MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), - MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), - MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"), - MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), - MovedAttribute("intern", "__builtin__", "sys"), - MovedAttribute("map", "itertools", "builtins", "imap", "map"), - MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"), - MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"), - MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), - MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"), - MovedAttribute("reduce", "__builtin__", "functools"), - MovedAttribute("shlex_quote", "pipes", "shlex", "quote"), - MovedAttribute("StringIO", "StringIO", "io"), - MovedAttribute("UserDict", "UserDict", "collections"), - MovedAttribute("UserList", "UserList", "collections"), - MovedAttribute("UserString", "UserString", "collections"), - MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), - MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), - MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"), - MovedModule("builtins", "__builtin__"), - MovedModule("configparser", "ConfigParser"), - MovedModule("copyreg", "copy_reg"), - MovedModule("dbm_gnu", "gdbm", "dbm.gnu"), - MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"), - MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), - MovedModule("http_cookies", "Cookie", "http.cookies"), - MovedModule("html_entities", "htmlentitydefs", "html.entities"), - MovedModule("html_parser", "HTMLParser", "html.parser"), - MovedModule("http_client", "httplib", "http.client"), - MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), - MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"), - MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), - MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), - MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), - MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), - MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), - MovedModule("cPickle", "cPickle", "pickle"), - MovedModule("queue", "Queue"), - MovedModule("reprlib", "repr"), - MovedModule("socketserver", "SocketServer"), - MovedModule("_thread", "thread", "_thread"), - MovedModule("tkinter", "Tkinter"), - MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), - MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), - MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), - MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), - MovedModule("tkinter_tix", "Tix", "tkinter.tix"), - MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"), - MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), - MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), - MovedModule("tkinter_colorchooser", "tkColorChooser", - "tkinter.colorchooser"), - MovedModule("tkinter_commondialog", "tkCommonDialog", - "tkinter.commondialog"), - MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), - MovedModule("tkinter_font", "tkFont", "tkinter.font"), - MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), - MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", - "tkinter.simpledialog"), - MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"), - MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"), - MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"), - MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), - MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"), - MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"), -] -# Add windows specific modules. -if sys.platform == "win32": - _moved_attributes += [ - MovedModule("winreg", "_winreg"), - ] - -for attr in _moved_attributes: - setattr(_MovedItems, attr.name, attr) - if isinstance(attr, MovedModule): - _importer._add_module(attr, "moves." + attr.name) -del attr - -_MovedItems._moved_attributes = _moved_attributes - -moves = _MovedItems(__name__ + ".moves") -_importer._add_module(moves, "moves") - - -class Module_six_moves_urllib_parse(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_parse""" - - -_urllib_parse_moved_attributes = [ - MovedAttribute("ParseResult", "urlparse", "urllib.parse"), - MovedAttribute("SplitResult", "urlparse", "urllib.parse"), - MovedAttribute("parse_qs", "urlparse", "urllib.parse"), - MovedAttribute("parse_qsl", "urlparse", "urllib.parse"), - MovedAttribute("urldefrag", "urlparse", "urllib.parse"), - MovedAttribute("urljoin", "urlparse", "urllib.parse"), - MovedAttribute("urlparse", "urlparse", "urllib.parse"), - MovedAttribute("urlsplit", "urlparse", "urllib.parse"), - MovedAttribute("urlunparse", "urlparse", "urllib.parse"), - MovedAttribute("urlunsplit", "urlparse", "urllib.parse"), - MovedAttribute("quote", "urllib", "urllib.parse"), - MovedAttribute("quote_plus", "urllib", "urllib.parse"), - MovedAttribute("unquote", "urllib", "urllib.parse"), - MovedAttribute("unquote_plus", "urllib", "urllib.parse"), - MovedAttribute("urlencode", "urllib", "urllib.parse"), - MovedAttribute("splitquery", "urllib", "urllib.parse"), - MovedAttribute("splittag", "urllib", "urllib.parse"), - MovedAttribute("splituser", "urllib", "urllib.parse"), - MovedAttribute("uses_fragment", "urlparse", "urllib.parse"), - MovedAttribute("uses_netloc", "urlparse", "urllib.parse"), - MovedAttribute("uses_params", "urlparse", "urllib.parse"), - MovedAttribute("uses_query", "urlparse", "urllib.parse"), - MovedAttribute("uses_relative", "urlparse", "urllib.parse"), -] -for attr in _urllib_parse_moved_attributes: - setattr(Module_six_moves_urllib_parse, attr.name, attr) -del attr - -Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes - -_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"), - "moves.urllib_parse", "moves.urllib.parse") - - -class Module_six_moves_urllib_error(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_error""" - - -_urllib_error_moved_attributes = [ - MovedAttribute("URLError", "urllib2", "urllib.error"), - MovedAttribute("HTTPError", "urllib2", "urllib.error"), - MovedAttribute("ContentTooShortError", "urllib", "urllib.error"), -] -for attr in _urllib_error_moved_attributes: - setattr(Module_six_moves_urllib_error, attr.name, attr) -del attr - -Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes - -_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"), - "moves.urllib_error", "moves.urllib.error") - - -class Module_six_moves_urllib_request(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_request""" - - -_urllib_request_moved_attributes = [ - MovedAttribute("urlopen", "urllib2", "urllib.request"), - MovedAttribute("install_opener", "urllib2", "urllib.request"), - MovedAttribute("build_opener", "urllib2", "urllib.request"), - MovedAttribute("pathname2url", "urllib", "urllib.request"), - MovedAttribute("url2pathname", "urllib", "urllib.request"), - MovedAttribute("getproxies", "urllib", "urllib.request"), - MovedAttribute("Request", "urllib2", "urllib.request"), - MovedAttribute("OpenerDirector", "urllib2", "urllib.request"), - MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"), - MovedAttribute("ProxyHandler", "urllib2", "urllib.request"), - MovedAttribute("BaseHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"), - MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"), - MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"), - MovedAttribute("FileHandler", "urllib2", "urllib.request"), - MovedAttribute("FTPHandler", "urllib2", "urllib.request"), - MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"), - MovedAttribute("UnknownHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"), - MovedAttribute("urlretrieve", "urllib", "urllib.request"), - MovedAttribute("urlcleanup", "urllib", "urllib.request"), - MovedAttribute("URLopener", "urllib", "urllib.request"), - MovedAttribute("FancyURLopener", "urllib", "urllib.request"), - MovedAttribute("proxy_bypass", "urllib", "urllib.request"), -] -for attr in _urllib_request_moved_attributes: - setattr(Module_six_moves_urllib_request, attr.name, attr) -del attr - -Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes - -_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"), - "moves.urllib_request", "moves.urllib.request") - - -class Module_six_moves_urllib_response(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_response""" - - -_urllib_response_moved_attributes = [ - MovedAttribute("addbase", "urllib", "urllib.response"), - MovedAttribute("addclosehook", "urllib", "urllib.response"), - MovedAttribute("addinfo", "urllib", "urllib.response"), - MovedAttribute("addinfourl", "urllib", "urllib.response"), -] -for attr in _urllib_response_moved_attributes: - setattr(Module_six_moves_urllib_response, attr.name, attr) -del attr - -Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes - -_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"), - "moves.urllib_response", "moves.urllib.response") - - -class Module_six_moves_urllib_robotparser(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_robotparser""" - - -_urllib_robotparser_moved_attributes = [ - MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"), -] -for attr in _urllib_robotparser_moved_attributes: - setattr(Module_six_moves_urllib_robotparser, attr.name, attr) -del attr - -Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes - -_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"), - "moves.urllib_robotparser", "moves.urllib.robotparser") - - -class Module_six_moves_urllib(types.ModuleType): - - """Create a six.moves.urllib namespace that resembles the Python 3 namespace""" - __path__ = [] # mark as package - parse = _importer._get_module("moves.urllib_parse") - error = _importer._get_module("moves.urllib_error") - request = _importer._get_module("moves.urllib_request") - response = _importer._get_module("moves.urllib_response") - robotparser = _importer._get_module("moves.urllib_robotparser") - - def __dir__(self): - return ['parse', 'error', 'request', 'response', 'robotparser'] - -_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"), - "moves.urllib") - - -def add_move(move): - """Add an item to six.moves.""" - setattr(_MovedItems, move.name, move) - - -def remove_move(name): - """Remove item from six.moves.""" - try: - delattr(_MovedItems, name) - except AttributeError: - try: - del moves.__dict__[name] - except KeyError: - raise AttributeError("no such move, %r" % (name,)) - - -if PY3: - _meth_func = "__func__" - _meth_self = "__self__" - - _func_closure = "__closure__" - _func_code = "__code__" - _func_defaults = "__defaults__" - _func_globals = "__globals__" -else: - _meth_func = "im_func" - _meth_self = "im_self" - - _func_closure = "func_closure" - _func_code = "func_code" - _func_defaults = "func_defaults" - _func_globals = "func_globals" - - -try: - advance_iterator = next -except NameError: - def advance_iterator(it): - return it.next() -next = advance_iterator - - -try: - callable = callable -except NameError: - def callable(obj): - return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) - - -if PY3: - def get_unbound_function(unbound): - return unbound - - create_bound_method = types.MethodType - - def create_unbound_method(func, cls): - return func - - Iterator = object -else: - def get_unbound_function(unbound): - return unbound.im_func - - def create_bound_method(func, obj): - return types.MethodType(func, obj, obj.__class__) - - def create_unbound_method(func, cls): - return types.MethodType(func, None, cls) - - class Iterator(object): - - def next(self): - return type(self).__next__(self) - - callable = callable -_add_doc(get_unbound_function, - """Get the function out of a possibly unbound function""") - - -get_method_function = operator.attrgetter(_meth_func) -get_method_self = operator.attrgetter(_meth_self) -get_function_closure = operator.attrgetter(_func_closure) -get_function_code = operator.attrgetter(_func_code) -get_function_defaults = operator.attrgetter(_func_defaults) -get_function_globals = operator.attrgetter(_func_globals) - - -if PY3: - def iterkeys(d, **kw): - return iter(d.keys(**kw)) - - def itervalues(d, **kw): - return iter(d.values(**kw)) - - def iteritems(d, **kw): - return iter(d.items(**kw)) - - def iterlists(d, **kw): - return iter(d.lists(**kw)) - - viewkeys = operator.methodcaller("keys") - - viewvalues = operator.methodcaller("values") - - viewitems = operator.methodcaller("items") -else: - def iterkeys(d, **kw): - return d.iterkeys(**kw) - - def itervalues(d, **kw): - return d.itervalues(**kw) - - def iteritems(d, **kw): - return d.iteritems(**kw) - - def iterlists(d, **kw): - return d.iterlists(**kw) - - viewkeys = operator.methodcaller("viewkeys") - - viewvalues = operator.methodcaller("viewvalues") - - viewitems = operator.methodcaller("viewitems") - -_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.") -_add_doc(itervalues, "Return an iterator over the values of a dictionary.") -_add_doc(iteritems, - "Return an iterator over the (key, value) pairs of a dictionary.") -_add_doc(iterlists, - "Return an iterator over the (key, [values]) pairs of a dictionary.") - - -if PY3: - def b(s): - return s.encode("latin-1") - - def u(s): - return s - unichr = chr - import struct - int2byte = struct.Struct(">B").pack - del struct - byte2int = operator.itemgetter(0) - indexbytes = operator.getitem - iterbytes = iter - import io - StringIO = io.StringIO - BytesIO = io.BytesIO - _assertCountEqual = "assertCountEqual" - if sys.version_info[1] <= 1: - _assertRaisesRegex = "assertRaisesRegexp" - _assertRegex = "assertRegexpMatches" - else: - _assertRaisesRegex = "assertRaisesRegex" - _assertRegex = "assertRegex" -else: - def b(s): - return s - # Workaround for standalone backslash - - def u(s): - return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape") - unichr = unichr - int2byte = chr - - def byte2int(bs): - return ord(bs[0]) - - def indexbytes(buf, i): - return ord(buf[i]) - iterbytes = functools.partial(itertools.imap, ord) - import StringIO - StringIO = BytesIO = StringIO.StringIO - _assertCountEqual = "assertItemsEqual" - _assertRaisesRegex = "assertRaisesRegexp" - _assertRegex = "assertRegexpMatches" -_add_doc(b, """Byte literal""") -_add_doc(u, """Text literal""") - - -def assertCountEqual(self, *args, **kwargs): - return getattr(self, _assertCountEqual)(*args, **kwargs) - - -def assertRaisesRegex(self, *args, **kwargs): - return getattr(self, _assertRaisesRegex)(*args, **kwargs) - - -def assertRegex(self, *args, **kwargs): - return getattr(self, _assertRegex)(*args, **kwargs) - - -if PY3: - exec_ = getattr(moves.builtins, "exec") - - def reraise(tp, value, tb=None): - if value is None: - value = tp() - if value.__traceback__ is not tb: - raise value.with_traceback(tb) - raise value - -else: - def exec_(_code_, _globs_=None, _locs_=None): - """Execute code in a namespace.""" - if _globs_ is None: - frame = sys._getframe(1) - _globs_ = frame.f_globals - if _locs_ is None: - _locs_ = frame.f_locals - del frame - elif _locs_ is None: - _locs_ = _globs_ - exec("""exec _code_ in _globs_, _locs_""") - - exec_("""def reraise(tp, value, tb=None): - raise tp, value, tb -""") - - -if sys.version_info[:2] == (3, 2): - exec_("""def raise_from(value, from_value): - if from_value is None: - raise value - raise value from from_value -""") -elif sys.version_info[:2] > (3, 2): - exec_("""def raise_from(value, from_value): - raise value from from_value -""") -else: - def raise_from(value, from_value): - raise value - - -print_ = getattr(moves.builtins, "print", None) -if print_ is None: - def print_(*args, **kwargs): - """The new-style print function for Python 2.4 and 2.5.""" - fp = kwargs.pop("file", sys.stdout) - if fp is None: - return - - def write(data): - if not isinstance(data, basestring): - data = str(data) - # If the file has an encoding, encode unicode with it. - if (isinstance(fp, file) and - isinstance(data, unicode) and - fp.encoding is not None): - errors = getattr(fp, "errors", None) - if errors is None: - errors = "strict" - data = data.encode(fp.encoding, errors) - fp.write(data) - want_unicode = False - sep = kwargs.pop("sep", None) - if sep is not None: - if isinstance(sep, unicode): - want_unicode = True - elif not isinstance(sep, str): - raise TypeError("sep must be None or a string") - end = kwargs.pop("end", None) - if end is not None: - if isinstance(end, unicode): - want_unicode = True - elif not isinstance(end, str): - raise TypeError("end must be None or a string") - if kwargs: - raise TypeError("invalid keyword arguments to print()") - if not want_unicode: - for arg in args: - if isinstance(arg, unicode): - want_unicode = True - break - if want_unicode: - newline = unicode("\n") - space = unicode(" ") - else: - newline = "\n" - space = " " - if sep is None: - sep = space - if end is None: - end = newline - for i, arg in enumerate(args): - if i: - write(sep) - write(arg) - write(end) -if sys.version_info[:2] < (3, 3): - _print = print_ - - def print_(*args, **kwargs): - fp = kwargs.get("file", sys.stdout) - flush = kwargs.pop("flush", False) - _print(*args, **kwargs) - if flush and fp is not None: - fp.flush() - -_add_doc(reraise, """Reraise an exception.""") - -if sys.version_info[0:2] < (3, 4): - def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS, - updated=functools.WRAPPER_UPDATES): - def wrapper(f): - f = functools.wraps(wrapped, assigned, updated)(f) - f.__wrapped__ = wrapped - return f - return wrapper -else: - wraps = functools.wraps - - -def with_metaclass(meta, *bases): - """Create a base class with a metaclass.""" - # This requires a bit of explanation: the basic idea is to make a dummy - # metaclass for one level of class instantiation that replaces itself with - # the actual metaclass. - class metaclass(meta): - - def __new__(cls, name, this_bases, d): - return meta(name, bases, d) - return type.__new__(metaclass, 'temporary_class', (), {}) - - -def add_metaclass(metaclass): - """Class decorator for creating a class with a metaclass.""" - def wrapper(cls): - orig_vars = cls.__dict__.copy() - slots = orig_vars.get('__slots__') - if slots is not None: - if isinstance(slots, str): - slots = [slots] - for slots_var in slots: - orig_vars.pop(slots_var) - orig_vars.pop('__dict__', None) - orig_vars.pop('__weakref__', None) - return metaclass(cls.__name__, cls.__bases__, orig_vars) - return wrapper - - -def python_2_unicode_compatible(klass): - """ - A decorator that defines __unicode__ and __str__ methods under Python 2. - Under Python 3 it does nothing. - - To support Python 2 and 3 with a single code base, define a __str__ method - returning text and apply this decorator to the class. - """ - if PY2: - if '__str__' not in klass.__dict__: - raise ValueError("@python_2_unicode_compatible cannot be applied " - "to %s because it doesn't define __str__()." % - klass.__name__) - klass.__unicode__ = klass.__str__ - klass.__str__ = lambda self: self.__unicode__().encode('utf-8') - return klass - - -# Complete the moves implementation. -# This code is at the end of this module to speed up module loading. -# Turn this module into a package. -__path__ = [] # required for PEP 302 and PEP 451 -__package__ = __name__ # see PEP 366 @ReservedAssignment -if globals().get("__spec__") is not None: - __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable -# Remove other six meta path importers, since they cause problems. This can -# happen if six is removed from sys.modules and then reloaded. (Setuptools does -# this for some reason.) -if sys.meta_path: - for i, importer in enumerate(sys.meta_path): - # Here's some real nastiness: Another "instance" of the six module might - # be floating around. Therefore, we can't use isinstance() to check for - # the six meta path importer, since the other six instance will have - # inserted an importer with different class. - if (type(importer).__name__ == "_SixMetaPathImporter" and - importer.name == __name__): - del sys.meta_path[i] - break - del i, importer -# Finally, add the importer to the meta path import hook. -sys.meta_path.append(_importer) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/six.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/six.pyc deleted file mode 100644 index be7b6d46af9c3617623edb9b7091f81076cebaaf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36102 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 E0K*li+W-In diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py deleted file mode 100644 index d6594eb..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py +++ /dev/null @@ -1,19 +0,0 @@ -import sys - -try: - # Our match_hostname function is the same as 3.5's, so we only want to - # import the match_hostname function if it's at least that good. - if sys.version_info < (3, 5): - raise ImportError("Fallback to vendored code") - - from ssl import CertificateError, match_hostname -except ImportError: - try: - # Backport of the function from a pypi module - from backports.ssl_match_hostname import CertificateError, match_hostname - except ImportError: - # Our vendored copy - from ._implementation import CertificateError, match_hostname - -# Not needed, but documenting what we provide. -__all__ = ('CertificateError', 'match_hostname') diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.pyc deleted file mode 100644 index e493130b97eb6b692b05161bc223072522c0b76a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 697 zcmZvY&2AGh5XZ;6Nk2l{^w0|xs&b5kQnxCKid0od2qX?vs0C3)Le^&Oq;9<S)}DrL zZ@`fU-~i{oU>~52H;AZ|(Rw@{|91SJNpDwMPrs~v%HfYSX@5a0+>n#>F)#oFfNCEU zz&QiC3=;s~1C@Ymz&8e88Q2-z1d~G1fI$O_CJdUuKH3k^Aac?I{}UKv)n;9m$c2B% zi(h}qACZ&`APHN%j}dih8Jx-%43?t2lkOvus_)2-bQ;6hLwHQ?b!N;k%O@RlovE_Y zc_ll!ld7B0Ev}P$sXXeD&NEc6ymubgC|P8fpNTUU&}N0wj8ez6;5bJ0zw?LcWB6aG z@UT>OnF?SO8LEIQv`>`}+F7CP$YE^cO;M7HnU)$1X8txlAtH7ZnXny#5%;xXn*gDU z(x^gN%#dp1V$2Deg%Di|VeZ0rI`Y!%DfQ2%ndc*CBuV1eSG?NuL;HEM+rO|oegCYV z?}w}B^4jl^jZ6NXm%8j}8;~mZaQE$4yo;%NiP^aMr8h<o_jpN~v#|>Np=2(od5uDB jmlZCNo`b^4OQR0su)_wql_X8utetGKRhCAdY^A>es2Hez diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py deleted file mode 100644 index 970cf65..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py +++ /dev/null @@ -1,156 +0,0 @@ -"""The match_hostname() function from Python 3.3.3, essential when using SSL.""" - -# Note: This file is under the PSF license as the code comes from the python -# stdlib. http://docs.python.org/3/license.html - -import re -import sys - -# ipaddress has been backported to 2.6+ in pypi. If it is installed on the -# system, use it to handle IPAddress ServerAltnames (this was added in -# python-3.5) otherwise only do DNS matching. This allows -# backports.ssl_match_hostname to continue to be used in Python 2.7. -try: - from pip._vendor import ipaddress -except ImportError: - ipaddress = None - -__version__ = '3.5.0.1' - - -class CertificateError(ValueError): - pass - - -def _dnsname_match(dn, hostname, max_wildcards=1): - """Matching according to RFC 6125, section 6.4.3 - - http://tools.ietf.org/html/rfc6125#section-6.4.3 - """ - pats = [] - if not dn: - return False - - # Ported from python3-syntax: - # leftmost, *remainder = dn.split(r'.') - parts = dn.split(r'.') - leftmost = parts[0] - remainder = parts[1:] - - wildcards = leftmost.count('*') - if wildcards > max_wildcards: - # Issue #17980: avoid denials of service by refusing more - # than one wildcard per fragment. A survey of established - # policy among SSL implementations showed it to be a - # reasonable choice. - raise CertificateError( - "too many wildcards in certificate DNS name: " + repr(dn)) - - # speed up common case w/o wildcards - if not wildcards: - return dn.lower() == hostname.lower() - - # RFC 6125, section 6.4.3, subitem 1. - # The client SHOULD NOT attempt to match a presented identifier in which - # the wildcard character comprises a label other than the left-most label. - if leftmost == '*': - # When '*' is a fragment by itself, it matches a non-empty dotless - # fragment. - pats.append('[^.]+') - elif leftmost.startswith('xn--') or hostname.startswith('xn--'): - # RFC 6125, section 6.4.3, subitem 3. - # The client SHOULD NOT attempt to match a presented identifier - # where the wildcard character is embedded within an A-label or - # U-label of an internationalized domain name. - pats.append(re.escape(leftmost)) - else: - # Otherwise, '*' matches any dotless string, e.g. www* - pats.append(re.escape(leftmost).replace(r'\*', '[^.]*')) - - # add the remaining fragments, ignore any wildcards - for frag in remainder: - pats.append(re.escape(frag)) - - pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE) - return pat.match(hostname) - - -def _to_unicode(obj): - if isinstance(obj, str) and sys.version_info < (3,): - obj = unicode(obj, encoding='ascii', errors='strict') - return obj - -def _ipaddress_match(ipname, host_ip): - """Exact matching of IP addresses. - - RFC 6125 explicitly doesn't define an algorithm for this - (section 1.7.2 - "Out of Scope"). - """ - # OpenSSL may add a trailing newline to a subjectAltName's IP address - # Divergence from upstream: ipaddress can't handle byte str - ip = ipaddress.ip_address(_to_unicode(ipname).rstrip()) - return ip == host_ip - - -def match_hostname(cert, hostname): - """Verify that *cert* (in decoded format as returned by - SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125 - rules are followed, but IP addresses are not accepted for *hostname*. - - CertificateError is raised on failure. On success, the function - returns nothing. - """ - if not cert: - raise ValueError("empty or no certificate, match_hostname needs a " - "SSL socket or SSL context with either " - "CERT_OPTIONAL or CERT_REQUIRED") - try: - # Divergence from upstream: ipaddress can't handle byte str - host_ip = ipaddress.ip_address(_to_unicode(hostname)) - except ValueError: - # Not an IP address (common case) - host_ip = None - except UnicodeError: - # Divergence from upstream: Have to deal with ipaddress not taking - # byte strings. addresses should be all ascii, so we consider it not - # an ipaddress in this case - host_ip = None - except AttributeError: - # Divergence from upstream: Make ipaddress library optional - if ipaddress is None: - host_ip = None - else: - raise - dnsnames = [] - san = cert.get('subjectAltName', ()) - for key, value in san: - if key == 'DNS': - if host_ip is None and _dnsname_match(value, hostname): - return - dnsnames.append(value) - elif key == 'IP Address': - if host_ip is not None and _ipaddress_match(value, host_ip): - return - dnsnames.append(value) - if not dnsnames: - # The subject is only checked when there is no dNSName entry - # in subjectAltName - for sub in cert.get('subject', ()): - for key, value in sub: - # XXX according to RFC 2818, the most specific Common Name - # must be used. - if key == 'commonName': - if _dnsname_match(value, hostname): - return - dnsnames.append(value) - if len(dnsnames) > 1: - raise CertificateError("hostname %r " - "doesn't match either of %s" - % (hostname, ', '.join(map(repr, dnsnames)))) - elif len(dnsnames) == 1: - raise CertificateError("hostname %r " - "doesn't match %r" - % (hostname, dnsnames[0])) - else: - raise CertificateError("no appropriate commonName or " - "subjectAltName fields were found") diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.pyc deleted file mode 100644 index b692fcb11d6dd1a2fe4218b9dbbc11f5312b4a32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4598 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 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/poolmanager.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/poolmanager.py deleted file mode 100644 index fe5491c..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/poolmanager.py +++ /dev/null @@ -1,450 +0,0 @@ -from __future__ import absolute_import -import collections -import functools -import logging - -from ._collections import RecentlyUsedContainer -from .connectionpool import HTTPConnectionPool, HTTPSConnectionPool -from .connectionpool import port_by_scheme -from .exceptions import LocationValueError, MaxRetryError, ProxySchemeUnknown -from .packages.six.moves.urllib.parse import urljoin -from .request import RequestMethods -from .util.url import parse_url -from .util.retry import Retry - - -__all__ = ['PoolManager', 'ProxyManager', 'proxy_from_url'] - - -log = logging.getLogger(__name__) - -SSL_KEYWORDS = ('key_file', 'cert_file', 'cert_reqs', 'ca_certs', - 'ssl_version', 'ca_cert_dir', 'ssl_context') - -# All known keyword arguments that could be provided to the pool manager, its -# pools, or the underlying connections. This is used to construct a pool key. -_key_fields = ( - 'key_scheme', # str - 'key_host', # str - 'key_port', # int - 'key_timeout', # int or float or Timeout - 'key_retries', # int or Retry - 'key_strict', # bool - 'key_block', # bool - 'key_source_address', # str - 'key_key_file', # str - 'key_cert_file', # str - 'key_cert_reqs', # str - 'key_ca_certs', # str - 'key_ssl_version', # str - 'key_ca_cert_dir', # str - 'key_ssl_context', # instance of ssl.SSLContext or urllib3.util.ssl_.SSLContext - 'key_maxsize', # int - 'key_headers', # dict - 'key__proxy', # parsed proxy url - 'key__proxy_headers', # dict - 'key_socket_options', # list of (level (int), optname (int), value (int or str)) tuples - 'key__socks_options', # dict - 'key_assert_hostname', # bool or string - 'key_assert_fingerprint', # str - 'key_server_hostname', #str -) - -#: The namedtuple class used to construct keys for the connection pool. -#: All custom key schemes should include the fields in this key at a minimum. -PoolKey = collections.namedtuple('PoolKey', _key_fields) - - -def _default_key_normalizer(key_class, request_context): - """ - Create a pool key out of a request context dictionary. - - According to RFC 3986, both the scheme and host are case-insensitive. - Therefore, this function normalizes both before constructing the pool - key for an HTTPS request. If you wish to change this behaviour, provide - alternate callables to ``key_fn_by_scheme``. - - :param key_class: - The class to use when constructing the key. This should be a namedtuple - with the ``scheme`` and ``host`` keys at a minimum. - :type key_class: namedtuple - :param request_context: - A dictionary-like object that contain the context for a request. - :type request_context: dict - - :return: A namedtuple that can be used as a connection pool key. - :rtype: PoolKey - """ - # Since we mutate the dictionary, make a copy first - context = request_context.copy() - context['scheme'] = context['scheme'].lower() - context['host'] = context['host'].lower() - - # These are both dictionaries and need to be transformed into frozensets - for key in ('headers', '_proxy_headers', '_socks_options'): - if key in context and context[key] is not None: - context[key] = frozenset(context[key].items()) - - # The socket_options key may be a list and needs to be transformed into a - # tuple. - socket_opts = context.get('socket_options') - if socket_opts is not None: - context['socket_options'] = tuple(socket_opts) - - # Map the kwargs to the names in the namedtuple - this is necessary since - # namedtuples can't have fields starting with '_'. - for key in list(context.keys()): - context['key_' + key] = context.pop(key) - - # Default to ``None`` for keys missing from the context - for field in key_class._fields: - if field not in context: - context[field] = None - - return key_class(**context) - - -#: A dictionary that maps a scheme to a callable that creates a pool key. -#: This can be used to alter the way pool keys are constructed, if desired. -#: Each PoolManager makes a copy of this dictionary so they can be configured -#: globally here, or individually on the instance. -key_fn_by_scheme = { - 'http': functools.partial(_default_key_normalizer, PoolKey), - 'https': functools.partial(_default_key_normalizer, PoolKey), -} - -pool_classes_by_scheme = { - 'http': HTTPConnectionPool, - 'https': HTTPSConnectionPool, -} - - -class PoolManager(RequestMethods): - """ - Allows for arbitrary requests while transparently keeping track of - necessary connection pools for you. - - :param num_pools: - Number of connection pools to cache before discarding the least - recently used pool. - - :param headers: - Headers to include with all requests, unless other headers are given - explicitly. - - :param \\**connection_pool_kw: - Additional parameters are used to create fresh - :class:`urllib3.connectionpool.ConnectionPool` instances. - - Example:: - - >>> manager = PoolManager(num_pools=2) - >>> r = manager.request('GET', 'http://google.com/') - >>> r = manager.request('GET', 'http://google.com/mail') - >>> r = manager.request('GET', 'http://yahoo.com/') - >>> len(manager.pools) - 2 - - """ - - proxy = None - - def __init__(self, num_pools=10, headers=None, **connection_pool_kw): - RequestMethods.__init__(self, headers) - self.connection_pool_kw = connection_pool_kw - self.pools = RecentlyUsedContainer(num_pools, - dispose_func=lambda p: p.close()) - - # Locally set the pool classes and keys so other PoolManagers can - # override them. - self.pool_classes_by_scheme = pool_classes_by_scheme - self.key_fn_by_scheme = key_fn_by_scheme.copy() - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - self.clear() - # Return False to re-raise any potential exceptions - return False - - def _new_pool(self, scheme, host, port, request_context=None): - """ - Create a new :class:`ConnectionPool` based on host, port, scheme, and - any additional pool keyword arguments. - - If ``request_context`` is provided, it is provided as keyword arguments - to the pool class used. This method is used to actually create the - connection pools handed out by :meth:`connection_from_url` and - companion methods. It is intended to be overridden for customization. - """ - pool_cls = self.pool_classes_by_scheme[scheme] - if request_context is None: - request_context = self.connection_pool_kw.copy() - - # Although the context has everything necessary to create the pool, - # this function has historically only used the scheme, host, and port - # in the positional args. When an API change is acceptable these can - # be removed. - for key in ('scheme', 'host', 'port'): - request_context.pop(key, None) - - if scheme == 'http': - for kw in SSL_KEYWORDS: - request_context.pop(kw, None) - - return pool_cls(host, port, **request_context) - - def clear(self): - """ - Empty our store of pools and direct them all to close. - - This will not affect in-flight connections, but they will not be - re-used after completion. - """ - self.pools.clear() - - def connection_from_host(self, host, port=None, scheme='http', pool_kwargs=None): - """ - Get a :class:`ConnectionPool` based on the host, port, and scheme. - - If ``port`` isn't given, it will be derived from the ``scheme`` using - ``urllib3.connectionpool.port_by_scheme``. If ``pool_kwargs`` is - provided, it is merged with the instance's ``connection_pool_kw`` - variable and used to create the new connection pool, if one is - needed. - """ - - if not host: - raise LocationValueError("No host specified.") - - request_context = self._merge_pool_kwargs(pool_kwargs) - request_context['scheme'] = scheme or 'http' - if not port: - port = port_by_scheme.get(request_context['scheme'].lower(), 80) - request_context['port'] = port - request_context['host'] = host - - return self.connection_from_context(request_context) - - def connection_from_context(self, request_context): - """ - Get a :class:`ConnectionPool` based on the request context. - - ``request_context`` must at least contain the ``scheme`` key and its - value must be a key in ``key_fn_by_scheme`` instance variable. - """ - scheme = request_context['scheme'].lower() - pool_key_constructor = self.key_fn_by_scheme[scheme] - pool_key = pool_key_constructor(request_context) - - return self.connection_from_pool_key(pool_key, request_context=request_context) - - def connection_from_pool_key(self, pool_key, request_context=None): - """ - Get a :class:`ConnectionPool` based on the provided pool key. - - ``pool_key`` should be a namedtuple that only contains immutable - objects. At a minimum it must have the ``scheme``, ``host``, and - ``port`` fields. - """ - with self.pools.lock: - # If the scheme, host, or port doesn't match existing open - # connections, open a new ConnectionPool. - pool = self.pools.get(pool_key) - if pool: - return pool - - # Make a fresh ConnectionPool of the desired type - scheme = request_context['scheme'] - host = request_context['host'] - port = request_context['port'] - pool = self._new_pool(scheme, host, port, request_context=request_context) - self.pools[pool_key] = pool - - return pool - - def connection_from_url(self, url, pool_kwargs=None): - """ - Similar to :func:`urllib3.connectionpool.connection_from_url`. - - If ``pool_kwargs`` is not provided and a new pool needs to be - constructed, ``self.connection_pool_kw`` is used to initialize - the :class:`urllib3.connectionpool.ConnectionPool`. If ``pool_kwargs`` - is provided, it is used instead. Note that if a new pool does not - need to be created for the request, the provided ``pool_kwargs`` are - not used. - """ - u = parse_url(url) - return self.connection_from_host(u.host, port=u.port, scheme=u.scheme, - pool_kwargs=pool_kwargs) - - def _merge_pool_kwargs(self, override): - """ - Merge a dictionary of override values for self.connection_pool_kw. - - This does not modify self.connection_pool_kw and returns a new dict. - Any keys in the override dictionary with a value of ``None`` are - removed from the merged dictionary. - """ - base_pool_kwargs = self.connection_pool_kw.copy() - if override: - for key, value in override.items(): - if value is None: - try: - del base_pool_kwargs[key] - except KeyError: - pass - else: - base_pool_kwargs[key] = value - return base_pool_kwargs - - def urlopen(self, method, url, redirect=True, **kw): - """ - Same as :meth:`urllib3.connectionpool.HTTPConnectionPool.urlopen` - with custom cross-host redirect logic and only sends the request-uri - portion of the ``url``. - - The given ``url`` parameter must be absolute, such that an appropriate - :class:`urllib3.connectionpool.ConnectionPool` can be chosen for it. - """ - u = parse_url(url) - conn = self.connection_from_host(u.host, port=u.port, scheme=u.scheme) - - kw['assert_same_host'] = False - kw['redirect'] = False - - if 'headers' not in kw: - kw['headers'] = self.headers.copy() - - if self.proxy is not None and u.scheme == "http": - response = conn.urlopen(method, url, **kw) - else: - response = conn.urlopen(method, u.request_uri, **kw) - - redirect_location = redirect and response.get_redirect_location() - if not redirect_location: - return response - - # Support relative URLs for redirecting. - redirect_location = urljoin(url, redirect_location) - - # RFC 7231, Section 6.4.4 - if response.status == 303: - method = 'GET' - - retries = kw.get('retries') - if not isinstance(retries, Retry): - retries = Retry.from_int(retries, redirect=redirect) - - # Strip headers marked as unsafe to forward to the redirected location. - # Check remove_headers_on_redirect to avoid a potential network call within - # conn.is_same_host() which may use socket.gethostbyname() in the future. - if (retries.remove_headers_on_redirect - and not conn.is_same_host(redirect_location)): - for header in retries.remove_headers_on_redirect: - kw['headers'].pop(header, None) - - try: - retries = retries.increment(method, url, response=response, _pool=conn) - except MaxRetryError: - if retries.raise_on_redirect: - raise - return response - - kw['retries'] = retries - kw['redirect'] = redirect - - log.info("Redirecting %s -> %s", url, redirect_location) - return self.urlopen(method, redirect_location, **kw) - - -class ProxyManager(PoolManager): - """ - Behaves just like :class:`PoolManager`, but sends all requests through - the defined proxy, using the CONNECT method for HTTPS URLs. - - :param proxy_url: - The URL of the proxy to be used. - - :param proxy_headers: - A dictionary containing headers that will be sent to the proxy. In case - of HTTP they are being sent with each request, while in the - HTTPS/CONNECT case they are sent only once. Could be used for proxy - authentication. - - Example: - >>> proxy = urllib3.ProxyManager('http://localhost:3128/') - >>> r1 = proxy.request('GET', 'http://google.com/') - >>> r2 = proxy.request('GET', 'http://httpbin.org/') - >>> len(proxy.pools) - 1 - >>> r3 = proxy.request('GET', 'https://httpbin.org/') - >>> r4 = proxy.request('GET', 'https://twitter.com/') - >>> len(proxy.pools) - 3 - - """ - - def __init__(self, proxy_url, num_pools=10, headers=None, - proxy_headers=None, **connection_pool_kw): - - if isinstance(proxy_url, HTTPConnectionPool): - proxy_url = '%s://%s:%i' % (proxy_url.scheme, proxy_url.host, - proxy_url.port) - proxy = parse_url(proxy_url) - if not proxy.port: - port = port_by_scheme.get(proxy.scheme, 80) - proxy = proxy._replace(port=port) - - if proxy.scheme not in ("http", "https"): - raise ProxySchemeUnknown(proxy.scheme) - - self.proxy = proxy - self.proxy_headers = proxy_headers or {} - - connection_pool_kw['_proxy'] = self.proxy - connection_pool_kw['_proxy_headers'] = self.proxy_headers - - super(ProxyManager, self).__init__( - num_pools, headers, **connection_pool_kw) - - def connection_from_host(self, host, port=None, scheme='http', pool_kwargs=None): - if scheme == "https": - return super(ProxyManager, self).connection_from_host( - host, port, scheme, pool_kwargs=pool_kwargs) - - return super(ProxyManager, self).connection_from_host( - self.proxy.host, self.proxy.port, self.proxy.scheme, pool_kwargs=pool_kwargs) - - def _set_proxy_headers(self, url, headers=None): - """ - Sets headers needed by proxies: specifically, the Accept and Host - headers. Only sets headers not provided by the user. - """ - headers_ = {'Accept': '*/*'} - - netloc = parse_url(url).netloc - if netloc: - headers_['Host'] = netloc - - if headers: - headers_.update(headers) - return headers_ - - def urlopen(self, method, url, redirect=True, **kw): - "Same as HTTP(S)ConnectionPool.urlopen, ``url`` must be absolute." - u = parse_url(url) - - if u.scheme == "http": - # For proxied HTTPS requests, httplib sets the necessary headers - # on the CONNECT to the proxy. For HTTP, we'll definitely - # need to set 'Host' at the very least. - headers = kw.get('headers', self.headers) - kw['headers'] = self._set_proxy_headers(url, headers) - - return super(ProxyManager, self).urlopen(method, url, redirect=redirect, **kw) - - -def proxy_from_url(url, **kw): - return ProxyManager(proxy_url=url, **kw) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/poolmanager.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/poolmanager.pyc deleted file mode 100644 index f4b9814c6dde85c07a556476d08249664233a1f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16523 zcmd5@OK=redOm%xBy@#@Fb@I7W4AqakUbz7@DPtIGhkqhV<R&yJlG1<y{+3vQcHci zFMawViGoGOq$)4Zq>`#s7G9((sce!}l1i4TRI0K~R#~UA$YNGW&0-eW<oo{9F9{fj z%0dxRbI$4WKL7vykMno)=M!V!`Hcg2yDI-Vj{h%RQp!AblnU_cs7R@vqm~@yFyBy7 zLoGGr9nwv;)GX3NYH3IX$PTG!SoKEK(g@lhKdhpCsyC{ZMpdt+mRh!SL`uih(wNQf zQ_+6a8&^x?syCsQCRFc$S~_6gjjCu;^$x0~gErq%(F>|~NG%<*`7sq8R=p!?>4?qm zSJ6?`n^H?t$d9XFLInrZDkghO=^?d#T<H_)ODyU|6?|7Mom9aEwe*tG4YmF)70f98 zlKK*>d|3sv>akKwuc)x0bW^RnO24A?%X}NWtuE{?I;$=$y()D_?faGrSoWI2B=jM* z;;7&pd;C(VFP6T|dFgLU>G`tsbrrlLgTBGdUY!0_oJh#inZ}8zY!VND*(A{*)9tX= zPtt55<Qx0?C{mv8>NtzGKQlVGlEj%G#yXvDu=OE4uHU+K6UDLaW?>TFOp+)&oEI<d zEVo@Az)KF(Ufyn-?waoD>1NT_CrQ_5FF*35fxeces5XIjH~cM6XX&;r;h;CuWNUj- zT7MRA#K~rCJKu+QgEU%C!n}Z^dHUW!o9u?p){?;3iY=7){nY3-s@tMrsfuB;{YY^k zH~iRN)oC`)JVz`FWDP86ucS$jU1X!Ev!PKCMml5fT{PU4OZ7b?6}x_$uZ@gkOw_)w zQ-gI&K7ZK`!nAzf#XG%~Wn=j$cH_!H*AkPJ8E&pL<aDyIr;|aIPqB|7Hlyqa*={Bi zX7%ML>2AoeGG~%O+SP482vTi~Yy*q=C(Gp7FjFmcM~N(#dna{@C6nS<P+xXYR$qEi z#(Kr_c`$6-^S4a+K$ojr(|&**ELYX;^Ki;_*lfF~MFNr;V68f9Cw-EfscIXPo3fb1 z%-X&&JW+0S?DupwwX=LBj6o{>G>kK$e;GihIM}KQsgrc|vEJ^Ie@5^}s=IOt2zd-# z_s~)6!p)Bw>LD<}Q76_Na<|RQ^S?&DtfA(&K2*V|x_bBf>QPfY#BW1wjHvWICXhW5 zwA4n6`ApuiXnlx%0<dhA`Frmv{N6@xeOLt}eDi2XJp}sNwtuOz5oT=*RG5#I+B&PU zee7X<H1F-|-EYYpP}Jhkd3983s$=u_{$AbQdP_Z2YJCjTeMLPQRuA!u>F!hM&o~yR zGpy$C{Y>HaHfo~aD+SOZwVGdG%f?*%TuHT`Y1eoA*h?21?SjJHWCbN4IkLK&6O0>x zxN*3Cx;--{Z7+AbNgCj++$?duA6#+IfA8H3r`_cwTXVBD?OMii{Wx%W(ypIsx9b~y zCX9`aO_+uE^^Ej%YfYzmB}w&ZGz^WqGKgg?H%`)?AAvlL?RHseaY`mj2dKlrF%)Mn zJ#hu-2!px=)5T&HGww$#?shV8H$#KjC2n`k2a(y~mi3x{KLmrGc0ug-!$3=4ew67n z=Js^`DDsyh%mOVt9n#}UT!C(<lkdnJV9@Vz8{6FoL_R0|aG$Y4SBlufz-V`KO~+5J z11)Dz7h7P~l0g)>%RC$MNRSQsk)0R&+YIwf?sV)ncRI4soesAe8T4daADiy>!Z_>= zdUmJhvhBWhYct&4dA@}F@C&r47IL{p2WO&iL%YfHI^-305~Gn;Ak*Yb3c8WwD9=H5 zB%j6ZL8NO-TXO){K^o7wmunNu$H3WQTd;|N>tl@^G?$nq73Yghx!O6`&4EJ32K#{l zMBHUVNDAH)O$tb(K-z_JQnVAwSj3VV=&?5*y~tow>(V^gr7hag<-#-}S?1JD`r8@N zEJ`*3l<asRiLESzlzag0(V0{TGu<;lBc)dJ5}^}m5`~at`J`-}KJc0Ig2>Sk#5cF1 zlvhHYqQvYv7ip58rVNEeT4`FY-^gU7*J<>r<Y7{zW&z{(!9%n6{d9IEi6~oUA8gHT zpHG+L&5g4c?!|9kNZ+~8eb;P#FL;o?ji1&2?5){;*e6hAV7)Wh*&D0vn=Fz)i1;{2 z(pl&VQMi15mfYX7`o#=3?ihw`2YSUHM41TK5=GKEyfQE2p^lC_N1P+g3Fjr})uBme z+&MgS!a3PIh|~)W*|oJS>&vp3FkLp{4>$CKOX%hgkkHUTp*Z3RX#$-XFpum3N|wja zQXv7FqA-q7^L~tK`{eDgdJGL0is*<GLKQ_5`)X7@hAuot2xtBM@@h=#Ls>?({gQ^( zJT4UuC_PDKl^q^b-r_W6y?GrJA=G|30to?735n@)n5BU4f)@=y2pX1)!q@=0L^B06 z=)S;e>UTFF38WkF7qk|(-NkISYXIv`1dIp0HczF7fD41(vQ8;lp6G&b?1Ll0))WGO z0n_z!$%4{I`%p)Sdi+Uq71{y-2iZAv&c+pDUAGDifj5l1(I5c$5<Nj!<xZS-2QlE? zxR70#WZs8JtW`*<xEx(?^`o#GLWSQs>YcaVs+J{7Z*Oc?bGRG?5O)xskt-rXL$Uz6 zuvURFZh#fUE6@(t%F*Vm6zSxIK2r@L>%LL~-%V^o2g?Jy#5k#ZZr8T_9)!l+oW)e` z-o=X--JDh2_XQVoJ$$-6viHxuSx$h}Q&cRtD@TUuQy*Ttb?UTximWj=JG+`BtC7a^ zdb6kgFO7SC7(IUn+x}XTJZ<nu$J52kg&M25owHjKQXA?LKFQYn`}h*r=LQlPlq+a; zqBy~(bf9=4({70F2PVfan4GGg!}1{otYBi83f}rY>T%41^Qm=lhy~I5LEQZWwi0!m zF0I4jZ;>N&K4@k&*F`a=7Aljf8=<AmvQ>ZYv6iOVeB}3*1OMXJNE`gAX_k64+{BP- zx1oV#?Y3A26$uwy;&CYgv~osb3@~L?C~Yb|D?5mql(2Q>%e#QWX&#-Rw$agwh_sTP zy|Z}deac$++f&ixEnotFj6XwDPB{mi7XD2RwVWN4aODzea7Cbmf(BS$PTpH&O0s<H zm5}A>w%ZUHFv{A0%8AelQ%;xj<{wX07DDBxBxxse$|bRZoO>4tpGxWnegpz%b6KX4 zkKXFGsmF;L!pwar=G0u|#q!>71*sidu|*pHbEM_ylrz@oQibDNE=cy`_mHrA0rT_( ztu|;3!)jwxrQeYku=il>DcX!N>_WJ?MquDgsYhZo!q|KWKpCc!%ei+Bb{$Y?NNqG! z`cQ4X%H5R8FcaZQLuKd`dF8gcjSj7mNGKapU(tm{ZP5H3&Z>m`(jtuYrdtT0-I8V* zW?bMVu^4u+n&2imo!fh-X@``(`SG?3pGPVDz}GZBHeonI{H+dpprArrQ9i*+>vVSM zpRi_N5apIxaM}&CdY(4G6FrvWL$Vh3VQzm>;N~_KJP+_<v9m%7``v5+y#Q*C6~|~> zc2yylm>I@}1sQM`U@$LlyL0Squ2a=2{aIp})w=2R{TRA{Ylk;5O=Uswc0jE~hnO?$ zn*{ETGz<cmiPYY@1Cu4a@PYXBta-!z@@8>>-rINx`tcyV>&PuwBc!r*geYn2NP_i5 z`}cmx_V4mRgcLCKzK@j1s>Q`m+8<y0;`XQB)kO>H1fOb5?+&vcusX>+M{VO>WeM4P zV{;nMJ;huR25k_t$eX{wYz&=NYHR|k{-Kcx=SXARnQ)FZo`m2RP|b3y^&B}6`itVN zHGjh%cmVvl*6U|<oTM(!2s#~fToGkrk;C<9&12mYm6N(2#dxlxvAr1ln<4bkIDy5! zvcd*od}bvISJ%X-&h1+R?+U05RJjcuHm|>2k!Y&VShIKqunaw$+8@=<ie46E`rb`U z-}@0B|Bpn9%;%plCo4(z2^|ZBl8UK734}gC0<dR}QbWUmeCenkI|NIf6cjdbtr1z9 zs(*$$8Za+tD*F4(7o<u6tS!oYcK}epDZGU2!&Zmm3`4LM{B!IV-2q2=`U03=)dBNE zO)twgA|+vn{8ykQ-D1`aQKJNbKQgCaUVJKZ#rzP=lLH4Zz=DQJ61a4i3%J!>Km!BQ zt)$D&vkV80P^ndLUs>E0{@vIFE*lxY>}WUk_H??68I(?_!tgj{fZjC(%scFK%AVi_ z2<b@^)+kW70$Z0tr|Ll12#a5VsL{abvYS|IAZ10?!qN+gY_Mzkx*Nh55zGh)30#Fj z@d8%_ON)IJ&!UvJWkH2P%JqAqgS>|d9&dTXr%=tyLOb%jNU(hgFtTfliG*eGk<|87 zfO7Bg@Cc^1dnqK$e@3~5#{DDCWMdNA>4@`+Ge$**SkB!l6`6TtsC>|?UV7Or1H!4E zd(VYA>HWqFFcwrDJXz>igUI|ldMVHJIru175J)LJff@rnO?l`+bkY?negtV#xF~C! z0~JDOGR!I}gQ7Xmt~3`vEbG9z`7{S`X?wc`g;&IB<t3%02xTEC&qFrjmG17Numq#G zr@7yv1q<CsCmGMKs6gMW^@4+&OYw_2?m3Bh%b4bW;LmVcYTrS~*YSp!*@REpxB}(d zNRT#!ZhpE78{1}bD#<Tl(l?3ai-2ZQ8_CJu+z{iD!W|5iW3&{l7C226S!#XRbaG0R zenEQkx1kUJ@N@PjY-|3T^Pvpp&vQ^<frx@o)IWF7U~xo1(Wm?IttUH)scBl5xpBi@ zZ;%li%lTN(IuyjqH9tPpUm;1{S@8ZsgC2`3fYV5ml{=lCT6m|E%M|PP-A$SmY>`M8 zto=p66rGaSn4TbE2Sp+PEm^K2Yn4C30@u7tGu(SZ)R@@M@n^_5YILG`2$(k11g7EN zN$0R7N=~1YDn$7X5}AM-<UPqps1p<e2m=8!fw&2fC=x(4RA>Ovnv1e)=3ncY!D848 zBR{1=KSy`Z+_U8IZVZ6GueeeoUFKQ=Tp~5$EV^PzhSVl-Q3UD9b3j4|a#>YV4okSu zu%SRRaFo;>iiPkK!C%@#blik;0ap?wDXvg<{&#-Kr)d{ucTchGL@l670mto(yO7`l zPA-?A2Go`qB)E=)zFhXiHRraIRVbh$!EoYyb9uqrMcftIE4~1GVEMFAc;Jq$I)ft4 zdDK|t4hX{%co!)P&xA5B;G^OpivF4lqlql`$zvlpKakmTwvbEpr_kJfOwUl+R{O`D zSDjMovq*U39uhf5LyW^qAxNF})YfNm-wsYt@IYKucc4%=i;HhZ{2O=F_I}Z?o9g}B z_g2&pz-41hrJpOuaghJ~-fL75z)j$+d1S<2K_5i}qso<jc{(?!f4Y9{Dv~x=ZZT_! zV90HIGw}>6uc5UVUj;F_y(9=%w%unm6Ai)MO!DH9?8aO1ibyWQ-2q_$Ft>N0<&>(+ z^ZfF`PLk8^ba=N1zN^z;s(WZ#Q}T0_yXvPJbivYMWxw;5OKf^k3qIC1*r!q`q_~)x zI92J-DG)%^->c|CJaV#^drq;QkNLbv^0Yuc2^c>C`@QMxhi<X2@q#0MM_!;(!w@I_ zf1x^oobW6G5*EmZ3m`|r0yz>i8XHg}uw<&KAiz8|q~@V9pp1bPD?<FGcOMmDDCU+Y zF7qZNIOJ=Zij)i^;+I1f4aUeGByDlKJ=&+@<F#_s2Wu3sK>o=;(sj2!E<84>9*!#W zFDzL^2p4-nln59MFHlKt4(S2>1!GqpSyLF^KimqoWaTY|BYueI3v6Z1I7qA?VhOdR zCh9nkT4MaR)cRqS-g7wPBQlDk#*yEeW^KH?diO>32y2m*pIASt9^#^M!g?cbI%L>w zFfpo5<?9Vl89qp?4v{d82FAG^zY5krCanLr;CzSGkE`^roF6Nh1XlSu$~Z;~#<wVS znCN_VLaievaJ<-nrd1d1&SEQahvoqszqyN}FTr9F(GzqM<_@}N$gC$r?`BXl>Fc;M zUd7(EjyO076JyR$*@AS*eLPXJ8g>OEM6*MX3x#kcf6ffju$&e(GI{}l0IVXmdKpMU zsecQlV*MBIs;k4wCdtDM;d~u*8Fj;mkJ$D55OTP9$Gv+w-t)<9T*yk4MHef~J&<7y z=W0goL2NieT^P@0u+tKuB>+=wi@krjj%wj7S+a=~t`EhXUxd(6`@+p<9~O-k*by)i zX7}>l<(>2!#yxWp&xPreXy83d`g*tdR<3<`IV2roL$<apC=wy^vlSD)a5v+0G6rcP zlA>Kqz76eHT&^CcXk$k*KN}d)h$ToagwMs^yLuA9!HN>f$ndonk+E1_gv_;*xa?h= ztf8qk&bnTCw}Pu`w1aotqx1#Kq8~p5O4plnD?xOkribxLA`v9^=7g=RgV}?9r98%B zcx^s5@Q@bN0K5Tn(tEzo)rtY0cE$EOd>Yw3_2hb6n7|B$z$H$lHSWCLpm$>2nQFZ3 z9B&+NSnYnYIq9_EznFB654YgOIOv>gG@aKVC|VF3!_wxkvoOt73#GQ(jIhE5B?+qC zh7K@@m?fdK+d<N8x2=nO69saI=Y7W1uk+F2gRWGo2h#NQXm)rJA3h$k*|*YxmIYMX zD5*WVzw>wjNmr^Ng^s*9(imw>?r$|)!{aAgtwYCJ6XVCnCtF9lcq>1&kv_PD`oD$* z)>nnSzzYP3$1kqK5xN50MjDb8PsF^S1a4HMZOqGv(nurhMdDu&u0n1xTOecsst*{6 z2i0wzE*pt1D`4v;%$ht@0md!8;1*u%Q5?X(G#RYg_z8k4f`AZU9Z==p+D42Ay`zG* zS3X@>xOU}Megz|Tf(;k^%=@Icj>;q9q%Fget7r})Gb$F)Ej4n>!`ck8mL2W$h?1(0 zdK_Kh1K{k6&=Z03!sUyl!t0-3WpOPqsSrH~rLBZ_h!L)UtAis8mk`UE-APN4TN)8I zl_6v!f2@{T_90s^TkH+Huey_tM64x<Fqv_$6yb?tt<lhuZ7BQl2bf8mg%&+?eY*%q zDQhvl#BSgFZXuX&a)CuuN)cf~7>+1y=gyx!_wEx>CT9_&BK^$dVE!BtD(AkbErVQ^ z!+0i1S9cH02opOlO-WP5mz>?P#Ps|x9m61m=9dhTzVnT(GaNCle4Z5q^VBJxuZO_U z*+^C-n~V1RZ%9}-2#i+fjp>YdKM+(6{S!~<Wq1y$m8P1qN+&gDI(Ox+8XDw~GQB(& zh6<%P?WnfmavE9a%jkk(G7j`^D$%yisA$?hQMk6VCFn4}-w`igTh!0~pYX#An4)c{ zmeA`_SY6hjNFZk(;*|<B{L{GgIUtH7#vJC&H$RwJoTi{%keHh{cm{a95!P-BuH&`$ z5jTR;)W(E*=a94}DfdcZ1G#yUkl;HH11gV3>n?Yg)mPZcDi7Rmr~>`S?`n^-#-n_Z zuQcSq3XMVZ7c=PV)Z;e+B7myfSh?S{^}#{jE!H^8$4~eWqfo@w9b~8Rx3?mE0TcL5 zif{?SgrMd%!#D)<QRgT`_MryCVHy+81k%<0ANRNPK~TWLDu64FM$Zh16cm~tve2e= zA<#t!v##kZ?ydoP5#Jr!Faff)3Al~RHa1{O4qrSs*6sOIjBU>V<YSL(x8sL%weHcK z9wFNcUheJwbKYNb|EcOI?EEC0pp#CQnk1*r|F2xady+jqUcxqGQ!c=nW5EF2h)Y)c zMMFBv9p+iUUM2_QJgzZMh!CsWVJUs>Bzp7vc$BcXs53-R<e{1NI*(BlBxHP3Ggn;V zG4dXgo5CEQ8|XgGo4~yeK~VOTcQWICN_RT!hg!ez;-N=I^dpphTe^X~N-N)q;ey|q zeM>mpjv(q9N3gdw+$edA_-jZZNe=n}OsmSFVpVK%o#>PKjN0BGqGZo`&faihUv>ty z{~4*^04Au0$!#Oxxe@T9_)!Q(WVnwnp^n%Ka=N)61?~zV4D#PcBms-<mWzn+_BzJ; z@@V(74ycGU0xZK0=G+QNAYKtl0{qf~$IYP73I<k%;ZC(=dhyLGJEC0+>zuA^;9jTm zgiV~^{t6b-`mvD7<FvReR~qv6k62dmHqDIMHOFJVUFTz`4J9bM=cg++#b1{k-5767 z4jpw)G!{g-dB4SZ|27}L!-oX=EHFhN@MPh?%ap7ciM=OR!B-HNjgcHV0n5Z0pE@); zKG{W~qFg0~2x-#y09*n{fucZ5Un$TJYb<yK8ynn0nQ5b5<Pd2C@BOKf@&18}<ZP8= z!%9Yxg!foJ2sABZ%8vo79Q0cw*Q&*LkA_Z%+6RD=uYLSizK6Ll;R?rDpKQRP?9HKc z$SgJNGD8oQwC0=q<Hs_edv2<Z<l{$~C#%cHj}lEFqaZe_`uI_TUs=pQe*9>7M9fs{ z-BBWIrok$8eEYqpnJku2ee+qC)z@FIm+wKjiu~ipGM^)Nxhe~p<vMmEXj#1TJD{={ z-+b0Sel&;k`R2|tZZ+KwW@=}7?c>L?2}D-?<HzY=L6h8Bu`<ASQgBvyD6$bJ-6V?a z2gF8nL;0AF)`|Et;4WH)VJMy_L=co!Z4@@il5Qc}o;HnDWGN*jBt}L>;4LIEoR`KE zb%&xt6xi$)r26=71fTkv853^J@D{@mtMQ@EjC>?)9ch#>xv5qKiVw0dVqH;`Wh5yf zscl=|n)S#)CxCZ`3<6i(Cs+_PV*$D!b0T-~5WikdU;NTZI;%dT^JZA_Lsn#um=|w3 zB__iLM3UI7qQ@Pn;6hS+<gyXfV%|EZE)oh2F`U{n{xuFdQ;^;-;ZOcG;RJ(~Gct@g e?C1D5GJL4n`fk%X>`XPA&OT>sXzD+wZvPKCx4MJ? diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/request.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/request.py deleted file mode 100644 index 8f2f44b..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/request.py +++ /dev/null @@ -1,150 +0,0 @@ -from __future__ import absolute_import - -from .filepost import encode_multipart_formdata -from .packages.six.moves.urllib.parse import urlencode - - -__all__ = ['RequestMethods'] - - -class RequestMethods(object): - """ - Convenience mixin for classes who implement a :meth:`urlopen` method, such - as :class:`~urllib3.connectionpool.HTTPConnectionPool` and - :class:`~urllib3.poolmanager.PoolManager`. - - Provides behavior for making common types of HTTP request methods and - decides which type of request field encoding to use. - - Specifically, - - :meth:`.request_encode_url` is for sending requests whose fields are - encoded in the URL (such as GET, HEAD, DELETE). - - :meth:`.request_encode_body` is for sending requests whose fields are - encoded in the *body* of the request using multipart or www-form-urlencoded - (such as for POST, PUT, PATCH). - - :meth:`.request` is for making any kind of request, it will look up the - appropriate encoding format and use one of the above two methods to make - the request. - - Initializer parameters: - - :param headers: - Headers to include with all requests, unless other headers are given - explicitly. - """ - - _encode_url_methods = {'DELETE', 'GET', 'HEAD', 'OPTIONS'} - - def __init__(self, headers=None): - self.headers = headers or {} - - def urlopen(self, method, url, body=None, headers=None, - encode_multipart=True, multipart_boundary=None, - **kw): # Abstract - raise NotImplementedError("Classes extending RequestMethods must implement " - "their own ``urlopen`` method.") - - def request(self, method, url, fields=None, headers=None, **urlopen_kw): - """ - Make a request using :meth:`urlopen` with the appropriate encoding of - ``fields`` based on the ``method`` used. - - This is a convenience method that requires the least amount of manual - effort. It can be used in most situations, while still having the - option to drop down to more specific methods when necessary, such as - :meth:`request_encode_url`, :meth:`request_encode_body`, - or even the lowest level :meth:`urlopen`. - """ - method = method.upper() - - urlopen_kw['request_url'] = url - - if method in self._encode_url_methods: - return self.request_encode_url(method, url, fields=fields, - headers=headers, - **urlopen_kw) - else: - return self.request_encode_body(method, url, fields=fields, - headers=headers, - **urlopen_kw) - - def request_encode_url(self, method, url, fields=None, headers=None, - **urlopen_kw): - """ - Make a request using :meth:`urlopen` with the ``fields`` encoded in - the url. This is useful for request methods like GET, HEAD, DELETE, etc. - """ - if headers is None: - headers = self.headers - - extra_kw = {'headers': headers} - extra_kw.update(urlopen_kw) - - if fields: - url += '?' + urlencode(fields) - - return self.urlopen(method, url, **extra_kw) - - def request_encode_body(self, method, url, fields=None, headers=None, - encode_multipart=True, multipart_boundary=None, - **urlopen_kw): - """ - Make a request using :meth:`urlopen` with the ``fields`` encoded in - the body. This is useful for request methods like POST, PUT, PATCH, etc. - - When ``encode_multipart=True`` (default), then - :meth:`urllib3.filepost.encode_multipart_formdata` is used to encode - the payload with the appropriate content type. Otherwise - :meth:`urllib.urlencode` is used with the - 'application/x-www-form-urlencoded' content type. - - Multipart encoding must be used when posting files, and it's reasonably - safe to use it in other times too. However, it may break request - signing, such as with OAuth. - - Supports an optional ``fields`` parameter of key/value strings AND - key/filetuple. A filetuple is a (filename, data, MIME type) tuple where - the MIME type is optional. For example:: - - fields = { - 'foo': 'bar', - 'fakefile': ('foofile.txt', 'contents of foofile'), - 'realfile': ('barfile.txt', open('realfile').read()), - 'typedfile': ('bazfile.bin', open('bazfile').read(), - 'image/jpeg'), - 'nonamefile': 'contents of nonamefile field', - } - - When uploading a file, providing a filename (the first parameter of the - tuple) is optional but recommended to best mimic behavior of browsers. - - Note that if ``headers`` are supplied, the 'Content-Type' header will - be overwritten because it depends on the dynamic random boundary string - which is used to compose the body of the request. The random boundary - string can be explicitly set with the ``multipart_boundary`` parameter. - """ - if headers is None: - headers = self.headers - - extra_kw = {'headers': {}} - - if fields: - if 'body' in urlopen_kw: - raise TypeError( - "request got values for both 'fields' and 'body', can only specify one.") - - if encode_multipart: - body, content_type = encode_multipart_formdata(fields, boundary=multipart_boundary) - else: - body, content_type = urlencode(fields), 'application/x-www-form-urlencoded' - - extra_kw['body'] = body - extra_kw['headers'] = {'Content-Type': content_type} - - extra_kw['headers'].update(headers) - extra_kw.update(urlopen_kw) - - return self.urlopen(method, url, **extra_kw) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/request.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/request.pyc deleted file mode 100644 index 507a9f46dfa1bd1210bd1238aa8613d72081a980..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6445 zcmd5=+j1L88SWX|@?o7#cC(Ny%b~eJ@*>N-EM>rzg@nW*f%TzeZ&3s&X{2dcZI7mB zr+X|b*i=DsyZ1Z+ufa9<ya3O@3-JBjJtNt13Mi-wDrwZy$N%{K|KD@}xUurxKfL|h zKJ%YB{NKONm_9%w#y4OIW21mQ3s?|`ES_UY$VPMQ*_?ZyXURMpEwE<`cwb;gm|0_J zh($ICSX^T-8GFIlubwTjc#$16mawnHk2L~3%uPI^o>oa=L`RM?l^aO|ZuEV$MA}!e z=!}ZQ$SlfDXQ1*?9GS>XS;mwiPuwi?Hs0Fei$Z9#Bg|06y5ejBLqEL_&I}rY5kuhb z8CXKYG8WIX;XE-GuMh_>!ODVduP_0g&<SoZVbOPjpO+yc#xR8Ml6_tFuYSq0U9!U3 z2aUIIu>Kn)yu$H$sM1rBN)RsiNS?`*gE8JuBCUny<DudZM<PZdH9X>5Be1j81*a+# zX_wQhikn;){h{41(tOJ<-s=7yvl7|+q}5kxD*8sMG*c>RJvltw$Em(+A6;D@rLkT9 z%34}6iqhyv<Sm-I<J#TUik-iot5X?+(4H7ZrxKJC^`q!SrboQ5MkAGSGs!SP4LBXl zbEg(hxvox*Mc-~T9?JgEuAwF6?12<X%&m55XQOzbg{R>l!_tB5M@ceiI<mZ&T7G%Q z8xI81<x*Q3wMb*y%1^PP)`HuEKvga*e{NySp%ya~{PXr_yg{<&kn_*B51ahS_Jc=F z{%HHN?ZfRgPta>l@2Pn5-yQ!UZSf(=g@`F-Q)uF&atsayjK|}3@{je(C7gOI+DS|M zdk0`(|8sggIDGizHRM+$d#y(4ghRdYjCz_}8a|du!V{%Vc##o(&K$EWS6MD2Bc|FT z$|6`Z_J9_-O7U|nMLl&YxEZU;JfLZu>o%KV+DrOrDvgX1`CQ~2pb)_wM6S2I5!fC+ z6j5wD$=m4j#C4Dn$+Vvou>kD`Dh2(eH8gpVCPKq(acExdL1w{^B>dGfN1KVWERlU_ zl1a<<nHs#?nS+6gGZ=}P$3NMLSwv%R|M2PF?m<69yZk-84@9_)j`M(J%Y=*PjCCyV z9$0wWbs$IUJv$9rYj@Tn8MFyb8~C}0PSM(c*iRw%jngRK7^sAVu<`tCWAaJfOUEZ4 zZ+?+}w3&Z@v;RYV_M`ZD{t-S$*~Z~UCbM;!Y6E$!n~!&nI{VaRe;u$Mt9-*F%Z3+M zE1MXipwp31NT;)gwk85u&?lN{j9!0nAN{w`0QLfIUj*!r7JUyaH@kWVLk~Uji8JFp zw0#N4Vd&b-U?TJ*bFRiI?^du_;$q8*jU>CP%+nG_MZBHoDz`DHO@YHI%|WSE8rZX< zC3mx;HAJ)rk;>7`yXdUmIz3gSag<LCae6X-v)Ul3g9{20O*EY{=K2);$UsRURvAZV z!03)`aJ~rGdC1NY>;iTVy)eS#fSuG>{>Zj5W@jKwo+CQWvGaMF{bd*)&{Vv?ZWtl; zph1W0zay$w&a(s0Mo_y9WLHC+^-Xg9=sGM>gKD>K*MWDp%X^U)04N9A-L6wD`T;kw zhYoVy!y$qJz7ayzOcb^;6%YoDBGP1z@I?e9B7*5fBPiMsVj(UTQBs{R1^_nG;!h3l zM=2trJ&r=hNMW6pridsA>n6gwOa#}4Ad})Ig*1<tM3>5F9syJg^yD#FHvypn{AeHT zDuf&lMamJ(fmX0SmkJ;}Rb+X2dLhq-!e*IHTp6>0s#$G-P$A&=P6TR<oC=aS6-l|; z+Zj><qMbg5Qk-&Aawf7lryT1}yA6UwLk3Y~naB-!=nQ2Yr!Z|jtlVcB!|n7d-9&SP zj<F8iUZvIzdb~#uvUjtBho`mk|KOjVgYSVXO;Ez#S`Amio55FtxnMD*r}bBIWfGV5 z*B%=1I{4nn63g#;7rmHgKzt<3G!(GSiyAwxv19AY0NDWEn(vWs!*c;}ct!7>A6$gA zj9eFfY+V<tz6{~2be{e*9+gV}GgqB)#c2jr?M1!>MYJmagIf-Y#HM9lD3x_55)ko9 zrq$%a^r!ab^h@=^Pj)TLSoGdSV&O)}E{Y7rf@l*sw@KO!lIv@YrA;M=jcJHOdGx03 zrF{qF{2V_`l?|({2CLzX;6_*r?u0hNlEYO-@>jf&B`jWVB+>@o&5I>6g#1rr6z7-< zn19R=ykJ|f4g_YhjRlq;d6NN#!#rLD!EZu#vCJ-3SbCc>5NAy<R~gzRb>13x(_+ z8KkY2HmL(Kg?6;9_m3BdLTj5#j9wPq3v3a#>uhn!*&_L_{tHxC+0Xyl77084ePg_u zHhWvFsQV@1akqOlTln-aFGRP?8?hKfC}P)|1gO(QavJt*%{D-Q$PhMKSNEyvUYnOw zK%>y$W>qwhhh@<uQBmx2Tk4pNpNMxzuZ*p;T6_<~`B-X~W)p&6qNW9Bbq7q(ETeLD zWF6Zh6Sfg<<81w!3Zza^c6zEy(&@0BvZkMw2sX(pBdCpVBn*m^Bp5_cDjuY%YeeWs zt2F8*lZq4_4Nyeb5|IiM1YnoN8#$s#u2hRZK^!|3xh-5q(S-M~%}JSvOgEB8DbB27 zs*~m3gTf4FvWNr3Fa&-oWqst15*R?0j8ugQ<qRicf`mLNDEjBvTk{9IkE#P{lo&Jx zO8ypqV7av~E=_6BV2U!Q$?58&$#<UaY+EI+aW@UJ@}(<DmegKNp)Fiy5dnK2Q&>NX zC@0?X1rx2HkFSA0<-e;4a|4{$2TIkqc)b_p^=XDM9YsP%Bw|W~rc%3Q&P=_@>t6Zx zCcqEX*RI(Enn<cWaL&vgl+HHl)r2+F_fgzfyKWb{bckoRd2YAq$rPlxZF-UItCzdH zN=nI=`>)FpZb3GVGjVh+-6^baRC0fb+v$iC?G?#gOg+J32Xqg=C0mcI{+k>%G;Ud@ zJ#-Lnka7nyM>=-N!q8o*&DzA;tm1jEpsbdzW>8)^@aR!WH<BaSpI+m@RC~D^YZQ$$ zrj9BKo<)hV9KghVEecel!dSx(5-D&SMU>SaI%i)$geK~~g0`0g6?O1$l>7NOmj<wa zv-=U<2f$@x0Zqp+6_<6!6L1Xba(KNO@v_qLE>!L3u8v^kB`ShTzy?t)uqd9C*9<<% zAk4=#%H>U~-JE}xsr<Cg=UUKZ2QCa~TND>1dQ}x5<WXtlN|Ms1_^lt~Q6@S^%5Vz^ z?pmq`sDhW#b(gMNl&cfvuv)4qRGLhD1psDJ_!dRSQXcx-c=?wwtSL91RnD$Ug}#n% zmo6=%MOw2}a+}gBmo|NaS~hp0bmR586J6%EsbaQSRQsFMBEAis>|vlo4%)!`8@sV+ z-^Jm-#!nN0>^nB6LPoWU#CsM0AB4BVmEgVb9pqWN_R`khagg_QI<}nXbVe#J5_+X{ zveSuGztd@d745c_C)FG_8KvlNW!L^14N^X537Cq&w%)+aO`EQ%h)!FC)IO+%?}n>$ zwczH$&AT_>sRg?YvIo!ZpfE)acH8K3`7z-t#b#?K=3D5_qW%exQn$1`YmMOHni2?P xH7$6Bb}6_Q7p|BfI!ez~?-*CqmX<d!607KYPPIQK``1f&+zM|6x8|1T{s~EH{u}@R diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/response.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/response.py deleted file mode 100644 index c112690..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/response.py +++ /dev/null @@ -1,705 +0,0 @@ -from __future__ import absolute_import -from contextlib import contextmanager -import zlib -import io -import logging -from socket import timeout as SocketTimeout -from socket import error as SocketError - -from ._collections import HTTPHeaderDict -from .exceptions import ( - BodyNotHttplibCompatible, ProtocolError, DecodeError, ReadTimeoutError, - ResponseNotChunked, IncompleteRead, InvalidHeader -) -from .packages.six import string_types as basestring, PY3 -from .packages.six.moves import http_client as httplib -from .connection import HTTPException, BaseSSLError -from .util.response import is_fp_closed, is_response_to_head - -log = logging.getLogger(__name__) - - -class DeflateDecoder(object): - - def __init__(self): - self._first_try = True - self._data = b'' - self._obj = zlib.decompressobj() - - def __getattr__(self, name): - return getattr(self._obj, name) - - def decompress(self, data): - if not data: - return data - - if not self._first_try: - return self._obj.decompress(data) - - self._data += data - try: - decompressed = self._obj.decompress(data) - if decompressed: - self._first_try = False - self._data = None - return decompressed - except zlib.error: - self._first_try = False - self._obj = zlib.decompressobj(-zlib.MAX_WBITS) - try: - return self.decompress(self._data) - finally: - self._data = None - - -class GzipDecoderState(object): - - FIRST_MEMBER = 0 - OTHER_MEMBERS = 1 - SWALLOW_DATA = 2 - - -class GzipDecoder(object): - - def __init__(self): - self._obj = zlib.decompressobj(16 + zlib.MAX_WBITS) - self._state = GzipDecoderState.FIRST_MEMBER - - def __getattr__(self, name): - return getattr(self._obj, name) - - def decompress(self, data): - ret = bytearray() - if self._state == GzipDecoderState.SWALLOW_DATA or not data: - return bytes(ret) - while True: - try: - ret += self._obj.decompress(data) - except zlib.error: - previous_state = self._state - # Ignore data after the first error - self._state = GzipDecoderState.SWALLOW_DATA - if previous_state == GzipDecoderState.OTHER_MEMBERS: - # Allow trailing garbage acceptable in other gzip clients - return bytes(ret) - raise - data = self._obj.unused_data - if not data: - return bytes(ret) - self._state = GzipDecoderState.OTHER_MEMBERS - self._obj = zlib.decompressobj(16 + zlib.MAX_WBITS) - - -class MultiDecoder(object): - """ - From RFC7231: - If one or more encodings have been applied to a representation, the - sender that applied the encodings MUST generate a Content-Encoding - header field that lists the content codings in the order in which - they were applied. - """ - - def __init__(self, modes): - self._decoders = [_get_decoder(m.strip()) for m in modes.split(',')] - - def flush(self): - return self._decoders[0].flush() - - def decompress(self, data): - for d in reversed(self._decoders): - data = d.decompress(data) - return data - - -def _get_decoder(mode): - if ',' in mode: - return MultiDecoder(mode) - - if mode == 'gzip': - return GzipDecoder() - - return DeflateDecoder() - - -class HTTPResponse(io.IOBase): - """ - HTTP Response container. - - Backwards-compatible to httplib's HTTPResponse but the response ``body`` is - loaded and decoded on-demand when the ``data`` property is accessed. This - class is also compatible with the Python standard library's :mod:`io` - module, and can hence be treated as a readable object in the context of that - framework. - - Extra parameters for behaviour not present in httplib.HTTPResponse: - - :param preload_content: - If True, the response's body will be preloaded during construction. - - :param decode_content: - If True, will attempt to decode the body based on the - 'content-encoding' header. - - :param original_response: - When this HTTPResponse wrapper is generated from an httplib.HTTPResponse - object, it's convenient to include the original for debug purposes. It's - otherwise unused. - - :param retries: - The retries contains the last :class:`~urllib3.util.retry.Retry` that - was used during the request. - - :param enforce_content_length: - Enforce content length checking. Body returned by server must match - value of Content-Length header, if present. Otherwise, raise error. - """ - - CONTENT_DECODERS = ['gzip', 'deflate'] - REDIRECT_STATUSES = [301, 302, 303, 307, 308] - - def __init__(self, body='', headers=None, status=0, version=0, reason=None, - strict=0, preload_content=True, decode_content=True, - original_response=None, pool=None, connection=None, msg=None, - retries=None, enforce_content_length=False, - request_method=None, request_url=None): - - if isinstance(headers, HTTPHeaderDict): - self.headers = headers - else: - self.headers = HTTPHeaderDict(headers) - self.status = status - self.version = version - self.reason = reason - self.strict = strict - self.decode_content = decode_content - self.retries = retries - self.enforce_content_length = enforce_content_length - - self._decoder = None - self._body = None - self._fp = None - self._original_response = original_response - self._fp_bytes_read = 0 - self.msg = msg - self._request_url = request_url - - if body and isinstance(body, (basestring, bytes)): - self._body = body - - self._pool = pool - self._connection = connection - - if hasattr(body, 'read'): - self._fp = body - - # Are we using the chunked-style of transfer encoding? - self.chunked = False - self.chunk_left = None - tr_enc = self.headers.get('transfer-encoding', '').lower() - # Don't incur the penalty of creating a list and then discarding it - encodings = (enc.strip() for enc in tr_enc.split(",")) - if "chunked" in encodings: - self.chunked = True - - # Determine length of response - self.length_remaining = self._init_length(request_method) - - # If requested, preload the body. - if preload_content and not self._body: - self._body = self.read(decode_content=decode_content) - - def get_redirect_location(self): - """ - Should we redirect and where to? - - :returns: Truthy redirect location string if we got a redirect status - code and valid location. ``None`` if redirect status and no - location. ``False`` if not a redirect status code. - """ - if self.status in self.REDIRECT_STATUSES: - return self.headers.get('location') - - return False - - def release_conn(self): - if not self._pool or not self._connection: - return - - self._pool._put_conn(self._connection) - self._connection = None - - @property - def data(self): - # For backwords-compat with earlier urllib3 0.4 and earlier. - if self._body: - return self._body - - if self._fp: - return self.read(cache_content=True) - - @property - def connection(self): - return self._connection - - def isclosed(self): - return is_fp_closed(self._fp) - - def tell(self): - """ - Obtain the number of bytes pulled over the wire so far. May differ from - the amount of content returned by :meth:``HTTPResponse.read`` if bytes - are encoded on the wire (e.g, compressed). - """ - return self._fp_bytes_read - - def _init_length(self, request_method): - """ - Set initial length value for Response content if available. - """ - length = self.headers.get('content-length') - - if length is not None: - if self.chunked: - # This Response will fail with an IncompleteRead if it can't be - # received as chunked. This method falls back to attempt reading - # the response before raising an exception. - log.warning("Received response with both Content-Length and " - "Transfer-Encoding set. This is expressly forbidden " - "by RFC 7230 sec 3.3.2. Ignoring Content-Length and " - "attempting to process response as Transfer-Encoding: " - "chunked.") - return None - - try: - # RFC 7230 section 3.3.2 specifies multiple content lengths can - # be sent in a single Content-Length header - # (e.g. Content-Length: 42, 42). This line ensures the values - # are all valid ints and that as long as the `set` length is 1, - # all values are the same. Otherwise, the header is invalid. - lengths = set([int(val) for val in length.split(',')]) - if len(lengths) > 1: - raise InvalidHeader("Content-Length contained multiple " - "unmatching values (%s)" % length) - length = lengths.pop() - except ValueError: - length = None - else: - if length < 0: - length = None - - # Convert status to int for comparison - # In some cases, httplib returns a status of "_UNKNOWN" - try: - status = int(self.status) - except ValueError: - status = 0 - - # Check for responses that shouldn't include a body - if status in (204, 304) or 100 <= status < 200 or request_method == 'HEAD': - length = 0 - - return length - - def _init_decoder(self): - """ - Set-up the _decoder attribute if necessary. - """ - # Note: content-encoding value should be case-insensitive, per RFC 7230 - # Section 3.2 - content_encoding = self.headers.get('content-encoding', '').lower() - if self._decoder is None: - if content_encoding in self.CONTENT_DECODERS: - self._decoder = _get_decoder(content_encoding) - elif ',' in content_encoding: - encodings = [e.strip() for e in content_encoding.split(',') if e.strip() in self.CONTENT_DECODERS] - if len(encodings): - self._decoder = _get_decoder(content_encoding) - - def _decode(self, data, decode_content, flush_decoder): - """ - Decode the data passed in and potentially flush the decoder. - """ - try: - if decode_content and self._decoder: - data = self._decoder.decompress(data) - except (IOError, zlib.error) as e: - content_encoding = self.headers.get('content-encoding', '').lower() - raise DecodeError( - "Received response with content-encoding: %s, but " - "failed to decode it." % content_encoding, e) - - if flush_decoder and decode_content: - data += self._flush_decoder() - - return data - - def _flush_decoder(self): - """ - Flushes the decoder. Should only be called if the decoder is actually - being used. - """ - if self._decoder: - buf = self._decoder.decompress(b'') - return buf + self._decoder.flush() - - return b'' - - @contextmanager - def _error_catcher(self): - """ - Catch low-level python exceptions, instead re-raising urllib3 - variants, so that low-level exceptions are not leaked in the - high-level api. - - On exit, release the connection back to the pool. - """ - clean_exit = False - - try: - try: - yield - - except SocketTimeout: - # FIXME: Ideally we'd like to include the url in the ReadTimeoutError but - # there is yet no clean way to get at it from this context. - raise ReadTimeoutError(self._pool, None, 'Read timed out.') - - except BaseSSLError as e: - # FIXME: Is there a better way to differentiate between SSLErrors? - if 'read operation timed out' not in str(e): # Defensive: - # This shouldn't happen but just in case we're missing an edge - # case, let's avoid swallowing SSL errors. - raise - - raise ReadTimeoutError(self._pool, None, 'Read timed out.') - - except (HTTPException, SocketError) as e: - # This includes IncompleteRead. - raise ProtocolError('Connection broken: %r' % e, e) - - # If no exception is thrown, we should avoid cleaning up - # unnecessarily. - clean_exit = True - finally: - # If we didn't terminate cleanly, we need to throw away our - # connection. - if not clean_exit: - # The response may not be closed but we're not going to use it - # anymore so close it now to ensure that the connection is - # released back to the pool. - if self._original_response: - self._original_response.close() - - # Closing the response may not actually be sufficient to close - # everything, so if we have a hold of the connection close that - # too. - if self._connection: - self._connection.close() - - # If we hold the original response but it's closed now, we should - # return the connection back to the pool. - if self._original_response and self._original_response.isclosed(): - self.release_conn() - - def read(self, amt=None, decode_content=None, cache_content=False): - """ - Similar to :meth:`httplib.HTTPResponse.read`, but with two additional - parameters: ``decode_content`` and ``cache_content``. - - :param amt: - How much of the content to read. If specified, caching is skipped - because it doesn't make sense to cache partial content as the full - response. - - :param decode_content: - If True, will attempt to decode the body based on the - 'content-encoding' header. - - :param cache_content: - If True, will save the returned data such that the same result is - returned despite of the state of the underlying file object. This - is useful if you want the ``.data`` property to continue working - after having ``.read()`` the file object. (Overridden if ``amt`` is - set.) - """ - self._init_decoder() - if decode_content is None: - decode_content = self.decode_content - - if self._fp is None: - return - - flush_decoder = False - data = None - - with self._error_catcher(): - if amt is None: - # cStringIO doesn't like amt=None - data = self._fp.read() - flush_decoder = True - else: - cache_content = False - data = self._fp.read(amt) - if amt != 0 and not data: # Platform-specific: Buggy versions of Python. - # Close the connection when no data is returned - # - # This is redundant to what httplib/http.client _should_ - # already do. However, versions of python released before - # December 15, 2012 (http://bugs.python.org/issue16298) do - # not properly close the connection in all cases. There is - # no harm in redundantly calling close. - self._fp.close() - flush_decoder = True - if self.enforce_content_length and self.length_remaining not in (0, None): - # This is an edge case that httplib failed to cover due - # to concerns of backward compatibility. We're - # addressing it here to make sure IncompleteRead is - # raised during streaming, so all calls with incorrect - # Content-Length are caught. - raise IncompleteRead(self._fp_bytes_read, self.length_remaining) - - if data: - self._fp_bytes_read += len(data) - if self.length_remaining is not None: - self.length_remaining -= len(data) - - data = self._decode(data, decode_content, flush_decoder) - - if cache_content: - self._body = data - - return data - - def stream(self, amt=2**16, decode_content=None): - """ - A generator wrapper for the read() method. A call will block until - ``amt`` bytes have been read from the connection or until the - connection is closed. - - :param amt: - How much of the content to read. The generator will return up to - much data per iteration, but may return less. This is particularly - likely when using compressed data. However, the empty string will - never be returned. - - :param decode_content: - If True, will attempt to decode the body based on the - 'content-encoding' header. - """ - if self.chunked and self.supports_chunked_reads(): - for line in self.read_chunked(amt, decode_content=decode_content): - yield line - else: - while not is_fp_closed(self._fp): - data = self.read(amt=amt, decode_content=decode_content) - - if data: - yield data - - @classmethod - def from_httplib(ResponseCls, r, **response_kw): - """ - Given an :class:`httplib.HTTPResponse` instance ``r``, return a - corresponding :class:`urllib3.response.HTTPResponse` object. - - Remaining parameters are passed to the HTTPResponse constructor, along - with ``original_response=r``. - """ - headers = r.msg - - if not isinstance(headers, HTTPHeaderDict): - if PY3: # Python 3 - headers = HTTPHeaderDict(headers.items()) - else: # Python 2 - headers = HTTPHeaderDict.from_httplib(headers) - - # HTTPResponse objects in Python 3 don't have a .strict attribute - strict = getattr(r, 'strict', 0) - resp = ResponseCls(body=r, - headers=headers, - status=r.status, - version=r.version, - reason=r.reason, - strict=strict, - original_response=r, - **response_kw) - return resp - - # Backwards-compatibility methods for httplib.HTTPResponse - def getheaders(self): - return self.headers - - def getheader(self, name, default=None): - return self.headers.get(name, default) - - # Backwards compatibility for http.cookiejar - def info(self): - return self.headers - - # Overrides from io.IOBase - def close(self): - if not self.closed: - self._fp.close() - - if self._connection: - self._connection.close() - - @property - def closed(self): - if self._fp is None: - return True - elif hasattr(self._fp, 'isclosed'): - return self._fp.isclosed() - elif hasattr(self._fp, 'closed'): - return self._fp.closed - else: - return True - - def fileno(self): - if self._fp is None: - raise IOError("HTTPResponse has no file to get a fileno from") - elif hasattr(self._fp, "fileno"): - return self._fp.fileno() - else: - raise IOError("The file-like object this HTTPResponse is wrapped " - "around has no file descriptor") - - def flush(self): - if self._fp is not None and hasattr(self._fp, 'flush'): - return self._fp.flush() - - def readable(self): - # This method is required for `io` module compatibility. - return True - - def readinto(self, b): - # This method is required for `io` module compatibility. - temp = self.read(len(b)) - if len(temp) == 0: - return 0 - else: - b[:len(temp)] = temp - return len(temp) - - def supports_chunked_reads(self): - """ - Checks if the underlying file-like object looks like a - httplib.HTTPResponse object. We do this by testing for the fp - attribute. If it is present we assume it returns raw chunks as - processed by read_chunked(). - """ - return hasattr(self._fp, 'fp') - - def _update_chunk_length(self): - # First, we'll figure out length of a chunk and then - # we'll try to read it from socket. - if self.chunk_left is not None: - return - line = self._fp.fp.readline() - line = line.split(b';', 1)[0] - try: - self.chunk_left = int(line, 16) - except ValueError: - # Invalid chunked protocol response, abort. - self.close() - raise httplib.IncompleteRead(line) - - def _handle_chunk(self, amt): - returned_chunk = None - if amt is None: - chunk = self._fp._safe_read(self.chunk_left) - returned_chunk = chunk - self._fp._safe_read(2) # Toss the CRLF at the end of the chunk. - self.chunk_left = None - elif amt < self.chunk_left: - value = self._fp._safe_read(amt) - self.chunk_left = self.chunk_left - amt - returned_chunk = value - elif amt == self.chunk_left: - value = self._fp._safe_read(amt) - self._fp._safe_read(2) # Toss the CRLF at the end of the chunk. - self.chunk_left = None - returned_chunk = value - else: # amt > self.chunk_left - returned_chunk = self._fp._safe_read(self.chunk_left) - self._fp._safe_read(2) # Toss the CRLF at the end of the chunk. - self.chunk_left = None - return returned_chunk - - def read_chunked(self, amt=None, decode_content=None): - """ - Similar to :meth:`HTTPResponse.read`, but with an additional - parameter: ``decode_content``. - - :param amt: - How much of the content to read. If specified, caching is skipped - because it doesn't make sense to cache partial content as the full - response. - - :param decode_content: - If True, will attempt to decode the body based on the - 'content-encoding' header. - """ - self._init_decoder() - # FIXME: Rewrite this method and make it a class with a better structured logic. - if not self.chunked: - raise ResponseNotChunked( - "Response is not chunked. " - "Header 'transfer-encoding: chunked' is missing.") - if not self.supports_chunked_reads(): - raise BodyNotHttplibCompatible( - "Body should be httplib.HTTPResponse like. " - "It should have have an fp attribute which returns raw chunks.") - - with self._error_catcher(): - # Don't bother reading the body of a HEAD request. - if self._original_response and is_response_to_head(self._original_response): - self._original_response.close() - return - - # If a response is already read and closed - # then return immediately. - if self._fp.fp is None: - return - - while True: - self._update_chunk_length() - if self.chunk_left == 0: - break - chunk = self._handle_chunk(amt) - decoded = self._decode(chunk, decode_content=decode_content, - flush_decoder=False) - if decoded: - yield decoded - - if decode_content: - # On CPython and PyPy, we should never need to flush the - # decoder. However, on Jython we *might* need to, so - # lets defensively do it anyway. - decoded = self._flush_decoder() - if decoded: # Platform-specific: Jython. - yield decoded - - # Chunk content ends with \r\n: discard it. - while True: - line = self._fp.fp.readline() - if not line: - # Some sites may not end with '\r\n'. - break - if line == b'\r\n': - break - - # We read everything; close the "file". - if self._original_response: - self._original_response.close() - - def geturl(self): - """ - Returns the URL that was the source of this response. - If the request that generated this response redirected, this method - will return the final redirect location. - """ - if self.retries is not None and len(self.retries.history): - return self.retries.history[-1].redirect_location - else: - return self._request_url diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/response.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/response.pyc deleted file mode 100644 index 1708746508d47548e1defc5f57aefc163b417728..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24614 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 E2au%l*Z=?k diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/__init__.py deleted file mode 100644 index 2f2770b..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/__init__.py +++ /dev/null @@ -1,54 +0,0 @@ -from __future__ import absolute_import -# For backwards compatibility, provide imports that used to be here. -from .connection import is_connection_dropped -from .request import make_headers -from .response import is_fp_closed -from .ssl_ import ( - SSLContext, - HAS_SNI, - IS_PYOPENSSL, - IS_SECURETRANSPORT, - assert_fingerprint, - resolve_cert_reqs, - resolve_ssl_version, - ssl_wrap_socket, -) -from .timeout import ( - current_time, - Timeout, -) - -from .retry import Retry -from .url import ( - get_host, - parse_url, - split_first, - Url, -) -from .wait import ( - wait_for_read, - wait_for_write -) - -__all__ = ( - 'HAS_SNI', - 'IS_PYOPENSSL', - 'IS_SECURETRANSPORT', - 'SSLContext', - 'Retry', - 'Timeout', - 'Url', - 'assert_fingerprint', - 'current_time', - 'is_connection_dropped', - 'is_fp_closed', - 'get_host', - 'parse_url', - 'make_headers', - 'resolve_cert_reqs', - 'resolve_ssl_version', - 'split_first', - 'ssl_wrap_socket', - 'wait_for_read', - 'wait_for_write' -) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/__init__.pyc deleted file mode 100644 index fd949fa56c0228d556f5d2b953f1c531a7265204..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1567 zcmah}S#Q)x5U$B&CduR)a>H`%K8=LHprD9dtq=%B0%-|RPk5ju)N;n1V5QqOUF96S z@mKdR>>t>wcEk(`2zy-PI=bulzIOY+#omLjOCLvYd9CsPix&X+FTZ5`Yk>psEzm7! zWmAx~!A*g0gKjtaG`MN-9nhUd?||!qp8-A7=v{EL;O9Wkf$xFtfu9FG4}Jmk0{BJH zi{O_)FM(eMy$rq&y5Fpv0e1uZ3g{K^tDsjK>nyl6@av%08+{Jk2KY_To8Y%VZ-KuF z`X=~Wpl>x1J#fE)zYY2}_&cEQu=PIZyO7<3;ox^}Gv@~eEf%!QB0a>?)nrZXt1?h7 zj>fyrZ#kM#Srm3ed0Ch&lvQQ3#=XF9pPpFr$)=eNIJWYlqsok2i5xr2Vbo(W9RBmF zEXbY{&9M6V<<JcG-jHnbW@z?5yxZU1;}}|L48z@5@73;sdbu~;f2R(jIYqRA%u!w( z+faqPAiBZP!Ey_y){Mj%>}RCa2`i#Ar(7R55E~Z#ETomea&%&8FvYR4icuYcEyz&r zZ7lJCU&@-A#yT9PEQO1~v@DRejxCu_B@)fCQl$Z{se_|=*06H96dKsuX8nC|O`=6s z&QkG}fon}OTAH++g`BL4xw>puGAShqm4qo-tz<w-@++C062O$?Py(mwi;$j_RHbC{ zN`|DQEG2_c!uq{|NSr_duOfjzMgqSF6Tb~6Zgx2{ylgt|aUHgpYjWQBQ?kX-Nk-x1 z=<&PJ$Jj|u;t%P8KcNR+K@Mf0SLlM*0L1G64({>7NP1(AYN~@ZMzN`}jSp1BE>ewI zTU(?ET;vvWx+)8_5m^!jNFfasuFxY=VGOo35%&}xGkqJDNZBL{gK#*qDH4+jJHeYs z6oEZv6rPS56ZbSGb<UUphrn1Mv6}FKJWa_ar)fxzN+;ih<jZ+-u^kSJvy&$~pNq#k z;pxuk8J_={eF=~GI<As~q{^#@d4a?`KcpvbkIlZA;=>2G$jXp#l`cQrPHM_sVoYA} r0Wy!Oi#V#keVNtHK9_@l&sg-Q`YpNt>TPuTtv|XOUEt68ukZf>r6gqJ diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/connection.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/connection.py deleted file mode 100644 index 5ad70b2..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/connection.py +++ /dev/null @@ -1,134 +0,0 @@ -from __future__ import absolute_import -import socket -from .wait import NoWayToWaitForSocketError, wait_for_read -from ..contrib import _appengine_environ - - -def is_connection_dropped(conn): # Platform-specific - """ - Returns True if the connection is dropped and should be closed. - - :param conn: - :class:`httplib.HTTPConnection` object. - - Note: For platforms like AppEngine, this will always return ``False`` to - let the platform handle connection recycling transparently for us. - """ - sock = getattr(conn, 'sock', False) - if sock is False: # Platform-specific: AppEngine - return False - if sock is None: # Connection already closed (such as by httplib). - return True - try: - # Returns True if readable, which here means it's been dropped - return wait_for_read(sock, timeout=0.0) - except NoWayToWaitForSocketError: # Platform-specific: AppEngine - return False - - -# This function is copied from socket.py in the Python 2.7 standard -# library test suite. Added to its signature is only `socket_options`. -# One additional modification is that we avoid binding to IPv6 servers -# discovered in DNS if the system doesn't have IPv6 functionality. -def create_connection(address, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, - source_address=None, socket_options=None): - """Connect to *address* and return the socket object. - - Convenience function. Connect to *address* (a 2-tuple ``(host, - port)``) and return the socket object. Passing the optional - *timeout* parameter will set the timeout on the socket instance - before attempting to connect. If no *timeout* is supplied, the - global default timeout setting returned by :func:`getdefaulttimeout` - is used. If *source_address* is set it must be a tuple of (host, port) - for the socket to bind as a source address before making the connection. - An host of '' or port 0 tells the OS to use the default. - """ - - host, port = address - if host.startswith('['): - host = host.strip('[]') - err = None - - # Using the value from allowed_gai_family() in the context of getaddrinfo lets - # us select whether to work with IPv4 DNS records, IPv6 records, or both. - # The original create_connection function always returns all records. - family = allowed_gai_family() - - for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM): - af, socktype, proto, canonname, sa = res - sock = None - try: - sock = socket.socket(af, socktype, proto) - - # If provided, set socket level options before connecting. - _set_socket_options(sock, socket_options) - - if timeout is not socket._GLOBAL_DEFAULT_TIMEOUT: - sock.settimeout(timeout) - if source_address: - sock.bind(source_address) - sock.connect(sa) - return sock - - except socket.error as e: - err = e - if sock is not None: - sock.close() - sock = None - - if err is not None: - raise err - - raise socket.error("getaddrinfo returns an empty list") - - -def _set_socket_options(sock, options): - if options is None: - return - - for opt in options: - sock.setsockopt(*opt) - - -def allowed_gai_family(): - """This function is designed to work in the context of - getaddrinfo, where family=socket.AF_UNSPEC is the default and - will perform a DNS search for both IPv6 and IPv4 records.""" - - family = socket.AF_INET - if HAS_IPV6: - family = socket.AF_UNSPEC - return family - - -def _has_ipv6(host): - """ Returns True if the system can bind an IPv6 address. """ - sock = None - has_ipv6 = False - - # App Engine doesn't support IPV6 sockets and actually has a quota on the - # number of sockets that can be used, so just early out here instead of - # creating a socket needlessly. - # See https://github.com/urllib3/urllib3/issues/1446 - if _appengine_environ.is_appengine_sandbox(): - return False - - if socket.has_ipv6: - # has_ipv6 returns true if cPython was compiled with IPv6 support. - # It does not tell us if the system has IPv6 support enabled. To - # determine that we must bind to an IPv6 address. - # https://github.com/shazow/urllib3/pull/611 - # https://bugs.python.org/issue658327 - try: - sock = socket.socket(socket.AF_INET6) - sock.bind((host, 0)) - has_ipv6 = True - except Exception: - pass - - if sock: - sock.close() - return has_ipv6 - - -HAS_IPV6 = _has_ipv6('::1') diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/connection.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/connection.pyc deleted file mode 100644 index 540edcade2068eb258e4b8fd4e0a0f0b4b855879..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4192 zcmd5<TW=f36+TN+6iHp<OM*6OJ9QqysFvtUAhbeSSe4~Os7(nZT^UM*<&rxTS6c3_ zcZQM}kOdm&t^GHB?l0(L|3u&W2l}0}E6E0ezB&YFcCKg6oXdC46#u(a`^{gMkNcGW zO87o`LS+7ihL68PA<@X8BZnOB7bq;yQGxs-`6UXAG%C?iiAHmDG=~*)<d-Qd(`cTK z=Fy+0ABc`BqziOf<=y<R&<{mAS|GnFvy0@{q_IT)f;5&%FO$DWZ*cAkZ)w+;z)yfe zbqAGQLFM&K9FDDagHaNvwi)nDy};8yL)DBAy-5dEV4uZlJMN!pyPKw1$+Rvo><;48 zO||C-yeT7m3oX}65*?ick#==-9;9*9XVScA4rS*F<l~}YiKZeV>(HAb%^aFKg!Wm5 z(tF%!qwklb|A=gn+LJqEOT3E3P{jS5_F;63N_LLUYLp(4<2bzU6?V1je3(%<x~A}J zX**6MqdMtWt6-q)P^*3%MY?Z;I8uR8ej0;uUwM(Q%rG8@zUpC37#r<x)P%@Z;-%h5 z_HD@kQ{L)_o-te9p|wdE^ftckbPjf|DR))eJH;V6g=TE^mV!i85_%RA92pe`XIgD1 z$*u_PK3D@c7eN>*FTC(3My0~L>UN)bq0!y0vay^VYAg4+BBh4lJ$&b0sqRnuVGx}t zn|hG}|2neaMB!vLHXA|)GKHj|VLQ)i2}U{|+Y>b9*Q}TEm8lbLJ!?~ln@CuZoy|DX z(qPfHSk0{)Q)1FA<`y^VC|PCB(P|`VaPC>%IQP=VAP#+<n#OmRjmhJ*7hRk^+<YB9 z*i66J?EltW{?7j{eSqId(&#jjAXyJ0W4$n3w+~;OxCcBW#XZ-NAE%9R8bTM38)F-U zjT=30BoliVM+e5e8FX{a^X&~=Fx753i%v;Ov2e#(a{A2vDhkU&EO;Mxg!z73pjnA# zb2Kf{saP|-E?t+d*eSYL5Mc_-%527Oh-UM2`5(6BQ`tC0Julrdy(!Vt<A2etLemO; zJ4drB&1y7TpxGkL;NqaNOp{Pn!xySFt<iKr9B7%fG+m}C&M1(>-h>k>bXKMGpF9B! z!5}ztz|XWm>Az(Z1Pa%qShYaYCFx^J`|$NEI2h<GijUoMoY@L!ukd9s&;AMWpE^t) zy9lTyEWZBK!OmAGhtu-avM(L9zjs(18A<VC9>J#EW8vGByASMKt$DtmYGc;KFLO^| z=VgP1{lDW~*a!UwI_hgR7)RpT8%q5sxw@wwt=n+|f9ZDX!`RsS;tdRjpLe^T|Nrxp zI)KxQUxAl6VG!{`A+VNv(3%po&{n6JH=EpD^LYi>dFvu#&|q9>^fVk)D|nk8fi}Bu zd<9py(B42r5Y6>LzzZ`@fIix1_{eCSgmKRcm9GchI0R5+eyzZT5X?jgyz5QW77J^u z3;)hn=Zm|-45*J81LfQ`6OYrrcCXdKXX9dlRim-744IzF#2OD&CRZgg6<UltZ(SO< z>IJ}C&tO+ZS>=>LNn|kc&aT9K<FXlWZAXgrrf|?_pDD&v=uSOQR)?XHWA@uDIB+k$ z{Bk+!F-U!57_YuLHowM);SI(XM1weoTyPaB*1!ZHZEUl?jAgcl3gDAka}n5~prNs8 zkhCg1%K!pkiZ8V9o_K*f@J2y6u?!rU$=U@p-#SbB?fsoUx$RDCcl(9Cjd>R`b+h$u zW?ja9#N%H*-~Z$GbNA`)v+bA9J8oz1#qR#gPR0{!R=^w1MZ|&?*v`c!jA{wt4B!&j z>Wpc!D3^MRrz~IdT|MVR>~h!q@F6UJIgLdRa3jJAa@qXeJOux>EN5?ESws?QCW#h? zk~Frltzx+EMF<q$NXuH|NytDr2g#pC;P`-<M8bod>BbV-aLglAw7lr7IJcbgT(xk| zx$BgjqI0*nR9JCV(OyLmsT44api*-_C@ebFLZ4;A^5L@cB&Wma4N20o%8mBr#|+v} zk8jhgz!B#Zc~XJ?4xoMg5gqahNxhnqx@9IP2C6N~8Maer@|iF>!d+PtkMb-&?>#2B z*yLZL7`6}Mz*|7jl{WWLL_WVl18E~fFhc_Y>|^O7c_fZ0kWMBH^A9ZSa2j<L1th`K zCOC<Jcz}e9I6YHA2Eb6J)t3w-0#R?d=6!WB)WG4)mVcl5<Hq(g_hqwvu)D)V8O*LA z7TK3jklZcNDe!BgJoU8M21I&ke<*2JFSbLqcW}Nb5eAJffHwU&_02||U8;5MlQ?Lv zx!Vz^`FgwU?j8JjQ(Wbm15tfTVb@PXkNmJWM#=OzR~38jv;NrJ7+XY--=l#zkCY$& z4YP(SPbD!*Kas?rlY==*&uG%f6CEBwa)j0LOgKfNBiYs<%UmELkU4yPhFqm8iOLB- z2GD=Sc7c@aFI=D2BtzjLeiboKW)szqz7EX9Ao?o6QXZqCTx(fEvZ3Tb)vPm|i{G`_ zy;@Av-a&;N^X4UFU>m*oGSe*^`Oq_NkeqLda&tv*wmxJE42GiS-OIj~%%a6FvdoWv z!7Ic}9`G2-d-q=9)xEmV5FD9Ln6E<FDVN!mtK}kq@iu^O$(hIKl4Dp(TU!sa_``VR zx`Q!ZXxepKyf+gR-;<x3@}Q8X#Z^E<yzPmoTOxjzccufDh`>pUZL#&3t94X2l9JZ@ oe1KHI&X=RuABXx6>>7r-Uj^uW=&Tm2KQB8gkE@mHLiLyb1F|3`VE_OC diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/queue.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/queue.py deleted file mode 100644 index d3d379a..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/queue.py +++ /dev/null @@ -1,21 +0,0 @@ -import collections -from ..packages import six -from ..packages.six.moves import queue - -if six.PY2: - # Queue is imported for side effects on MS Windows. See issue #229. - import Queue as _unused_module_Queue # noqa: F401 - - -class LifoQueue(queue.Queue): - def _init(self, _): - self.queue = collections.deque() - - def _qsize(self, len=len): - return len(self.queue) - - def _put(self, item): - self.queue.append(item) - - def _get(self): - return self.queue.pop() diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/queue.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/queue.pyc deleted file mode 100644 index 62193ac385a0b552407d01906ab972eee0aa4931..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1665 zcmd5+ZEw>s5I!euwvKL$mmd)ct=Sl=hJ+9TKEgCIzN`|mvc#?2IWLW!(pCF{*gxh6 zz}=-~lMtV~D88J}vHd*v*ysP+-Ffk2?^_D1$H(tGY&JoY;VZxZjL`8Q^T7znJs5c) zsNVtOL*9W=2ZZuq+J*Y#dQt$REhuna7gPtP0gMG?0o(%o1h^P&)5_=J7Ve^d<8!J# zbVGs05eBOlZKsQ!S)&@|dgy)9<MIpj{sN|H?`cAWMj=$(251`useIbyRuDkMOTjL& zASZzMJnZ0{lvY@`546%VG!9@Y2<i=hM5=&b3EXK&=-eYTX=#i~oh}RO2xX=aXG}kZ zw49^GtukXrAsM0pHg<+yRMmQ(I2Fy4IvSTIQ?-qji|G2ezAV099Svv2;jn%+Oi%3M zb+)Vz@tIW7*QnCffyNyZV-DQW=ZQR{5H~qjMOM~PQyZf%kE6zE6LIba)ipzuy3mZ> z5<(FFa^J=9jUd)jREi{OS(Clv7876A$*5xE%mM@>XI3xO9(w<!_8bRWUZ^Z`M0Vny zu9OjG=xDv9sxX->WJ{LR)K29aXG=h2)wn14U2`RM){T!a%g7qGr+6*n9Z5RIRavpT z%<y3ln<z&*t%z}baN8J=vPg0zrQ6|7US^HKZcGIvrXOM|4{@Iioq{_y>}}@G#guLW zYzbi?dVb&U`5`0aGD6`hNw1QLvN8JLp5BWLum}$Fa*kspF5kDai<f+pxd?KqWK%R& hWpb4g9^j21L<(5EH!Zfe#KKZO`eI+~dp+;5{|67SfF}R| diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/request.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/request.py deleted file mode 100644 index 3ddfcd5..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/request.py +++ /dev/null @@ -1,118 +0,0 @@ -from __future__ import absolute_import -from base64 import b64encode - -from ..packages.six import b, integer_types -from ..exceptions import UnrewindableBodyError - -ACCEPT_ENCODING = 'gzip,deflate' -_FAILEDTELL = object() - - -def make_headers(keep_alive=None, accept_encoding=None, user_agent=None, - basic_auth=None, proxy_basic_auth=None, disable_cache=None): - """ - Shortcuts for generating request headers. - - :param keep_alive: - If ``True``, adds 'connection: keep-alive' header. - - :param accept_encoding: - Can be a boolean, list, or string. - ``True`` translates to 'gzip,deflate'. - List will get joined by comma. - String will be used as provided. - - :param user_agent: - String representing the user-agent you want, such as - "python-urllib3/0.6" - - :param basic_auth: - Colon-separated username:password string for 'authorization: basic ...' - auth header. - - :param proxy_basic_auth: - Colon-separated username:password string for 'proxy-authorization: basic ...' - auth header. - - :param disable_cache: - If ``True``, adds 'cache-control: no-cache' header. - - Example:: - - >>> make_headers(keep_alive=True, user_agent="Batman/1.0") - {'connection': 'keep-alive', 'user-agent': 'Batman/1.0'} - >>> make_headers(accept_encoding=True) - {'accept-encoding': 'gzip,deflate'} - """ - headers = {} - if accept_encoding: - if isinstance(accept_encoding, str): - pass - elif isinstance(accept_encoding, list): - accept_encoding = ','.join(accept_encoding) - else: - accept_encoding = ACCEPT_ENCODING - headers['accept-encoding'] = accept_encoding - - if user_agent: - headers['user-agent'] = user_agent - - if keep_alive: - headers['connection'] = 'keep-alive' - - if basic_auth: - headers['authorization'] = 'Basic ' + \ - b64encode(b(basic_auth)).decode('utf-8') - - if proxy_basic_auth: - headers['proxy-authorization'] = 'Basic ' + \ - b64encode(b(proxy_basic_auth)).decode('utf-8') - - if disable_cache: - headers['cache-control'] = 'no-cache' - - return headers - - -def set_file_position(body, pos): - """ - If a position is provided, move file to that point. - Otherwise, we'll attempt to record a position for future use. - """ - if pos is not None: - rewind_body(body, pos) - elif getattr(body, 'tell', None) is not None: - try: - pos = body.tell() - except (IOError, OSError): - # This differentiates from None, allowing us to catch - # a failed `tell()` later when trying to rewind the body. - pos = _FAILEDTELL - - return pos - - -def rewind_body(body, body_pos): - """ - Attempt to rewind body to a certain position. - Primarily used for request redirects and retries. - - :param body: - File-like object that supports seek. - - :param int pos: - Position to seek to in file. - """ - body_seek = getattr(body, 'seek', None) - if body_seek is not None and isinstance(body_pos, integer_types): - try: - body_seek(body_pos) - except (IOError, OSError): - raise UnrewindableBodyError("An error occurred when rewinding request " - "body for redirect/retry.") - elif body_pos is _FAILEDTELL: - raise UnrewindableBodyError("Unable to record file position for rewinding " - "request body during a redirect/retry.") - else: - raise ValueError("body_pos must be of type integer, " - "instead it was %s." % type(body_pos)) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/request.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/request.pyc deleted file mode 100644 index c3bfd654d22750de3b394c613462c0ea0c0ba2fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3945 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 a<xT1n^g4z$Z>@3#Pu*)&8{Ya>WBnI85)X3# diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/response.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/response.py deleted file mode 100644 index 3d54864..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/response.py +++ /dev/null @@ -1,87 +0,0 @@ -from __future__ import absolute_import -from ..packages.six.moves import http_client as httplib - -from ..exceptions import HeaderParsingError - - -def is_fp_closed(obj): - """ - Checks whether a given file-like object is closed. - - :param obj: - The file-like object to check. - """ - - try: - # Check `isclosed()` first, in case Python3 doesn't set `closed`. - # GH Issue #928 - return obj.isclosed() - except AttributeError: - pass - - try: - # Check via the official file-like-object way. - return obj.closed - except AttributeError: - pass - - try: - # Check if the object is a container for another file-like object that - # gets released on exhaustion (e.g. HTTPResponse). - return obj.fp is None - except AttributeError: - pass - - raise ValueError("Unable to determine whether fp is closed.") - - -def assert_header_parsing(headers): - """ - Asserts whether all headers have been successfully parsed. - Extracts encountered errors from the result of parsing headers. - - Only works on Python 3. - - :param headers: Headers to verify. - :type headers: `httplib.HTTPMessage`. - - :raises urllib3.exceptions.HeaderParsingError: - If parsing errors are found. - """ - - # This will fail silently if we pass in the wrong kind of parameter. - # To make debugging easier add an explicit check. - if not isinstance(headers, httplib.HTTPMessage): - raise TypeError('expected httplib.Message, got {0}.'.format( - type(headers))) - - defects = getattr(headers, 'defects', None) - get_payload = getattr(headers, 'get_payload', None) - - unparsed_data = None - if get_payload: - # get_payload is actually email.message.Message.get_payload; - # we're only interested in the result if it's not a multipart message - if not headers.is_multipart(): - payload = get_payload() - - if isinstance(payload, (bytes, str)): - unparsed_data = payload - - if defects or unparsed_data: - raise HeaderParsingError(defects=defects, unparsed_data=unparsed_data) - - -def is_response_to_head(response): - """ - Checks whether the request of a response has been a HEAD-request. - Handles the quirks of AppEngine. - - :param conn: - :type conn: :class:`httplib.HTTPResponse` - """ - # FIXME: Can we do this somehow without accessing private httplib _method? - method = response._method - if isinstance(method, int): # Platform-specific: Appengine - return method == 3 - return method.upper() == 'HEAD' diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/response.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/response.pyc deleted file mode 100644 index f0f24a8b669c439659829a0d9306fef4e28d57d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2583 zcmd5;U2fY(5S}Gv*|HPIagmq4bQ7S3iq?|T6hSK#g^kpJiz1F8yFV~cFci6zXj3G; zyHu>yerVk@1jqsU-V5}hXX*v|%~G<R<^T;LE_Y{kcV=h5Z$|z<x0gTpb@k_nW{-#O z))tX@hE9y1pp0lN=tz)=J&JwGJR19S)TqY|$`)wcq@yOr3-mkD(IUl7*IA-?(RErB zFVR7}g*{We)D~#$9W>#<6j^0ekdDhj+m!9s+7<Lh)|Nq(r7E|za2>*36~;>MhuWn1 za7XJxN4y=s3wWPw!TSk1(^WbrIwra#I`}caOARaNWSR7R5<=vHewwbh8Qz=ftt<6i zr}hcwK7s!?_fYdmc7bDbDd;!B^A6fROdE@4S>kyzQqhT#FGk9al$N0!rW2LRB+b-D zmYyhC431S~Wol%U6-LFKWw)+ZhB_Rxw&%vY*WpOLz0ejiVjCSd&3p{Q-{;{VQxck3 zS*6EmuC5$N${VKk+D%NiOK4J4o42bNY+I|-0dB=b*Yc#9maiu%Z3CaZB3E`9ogc!i zs%O@B!~uZcZG6ZzE*jlZr<2gC?j+RRq{wiEru*`&JAI@F`HPc>k5BW>$NKZf(HG|I z%lM_<#4{|rhutzQH`3hLFv~XV!>7YwpGEEs5X!jF-AZR!I(XErY?^hoGG&n))hVa; z7F<Y8kT8fixQiH@_t~)}-(MBCMZ@#GmHO-7bzg@i#?cj){>A|J2`m9W#~xjJWH!kH z78o`N0DuYrsDFS#j+spsGG7+x(x(eCmta*bajFZS&OOqv9nO{*s0MwQAiBWLFp9QC z2y^1>>Q^kms?%3=`kD=$3o?Juxlj5pvMX#6lDNT=OY&-GVDZ4+wAlwq98R{4QQF?X zWtPd2<CT%4aH8Zu0i~vjB4tccW!Y2$kPe=V#GNy%!wBnD9u-v%kf~TIrlOIFF2)jI zm$-;3v$9CsQgC%{VFvMMId*+fXwaj`<^I%;@Oktm{%1b*WKDX*pq?n5Ces@4Jv%Mc zeBYjY&Itoh=<FUI?mva=;ZQxF@2JDnC?jWJ>8P_vl{N)bI&Wu`Ytnst?f&e5p#}|c zYEYG9VIBY<>Z}Bd5rnw|GvlAiVPWMjn-?9+*o#$yX$BWXG*mVy!)aE8vAvCPmDdpt z;?RbBZHBI+SBf+T^yiUsTg(i&EpD6=C?PsTFs><^6nY$5$5oD!TMeTS={`F%XU7<~ zl)|<Jl8FXWs|>)+Nlf=$I%aWgyGBT#-S4x5eRkZbW+!<UNPiDLg%00A4IhNr)ryax zsM)`^E?VNAw=UMbrfB-NM9aG;?s&I^V?Q671K=vjXXw;rgh?!zUbg1q14lKK6l8r! zkC}0<R9sboKe5(f<UduQX2)rTKr=l;ri#m1;GU_e7s}n8?Qb@;a<gir?S^@r0l~cd zv`QUu61iQLJNXbfevWgT7L_9^^1McI%@H@2y(mLydT;QgKQsQ^xtj9H9cb8rHfMTw z!NC|6tcd$u9~?Z=yar5FmP)rdX0DLTkK(FEz2;p2#e47%m0<2&U<(J1?;tiyXsFc^ zcf_*TYja6+#0!F?vXxdr(B}!3|9g~Sbb_2>Iwn2qjEjjfeWX<C^IsXa=sK%7?(})L oK3AOneKgmRaJ~PpF!GVV8W(Yusjv9}hW%U<Yu=jQ`k?jUzr;kBZvX%Q diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/retry.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/retry.py deleted file mode 100644 index e7d0abd..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/retry.py +++ /dev/null @@ -1,411 +0,0 @@ -from __future__ import absolute_import -import time -import logging -from collections import namedtuple -from itertools import takewhile -import email -import re - -from ..exceptions import ( - ConnectTimeoutError, - MaxRetryError, - ProtocolError, - ReadTimeoutError, - ResponseError, - InvalidHeader, -) -from ..packages import six - - -log = logging.getLogger(__name__) - - -# Data structure for representing the metadata of requests that result in a retry. -RequestHistory = namedtuple('RequestHistory', ["method", "url", "error", - "status", "redirect_location"]) - - -class Retry(object): - """ Retry configuration. - - Each retry attempt will create a new Retry object with updated values, so - they can be safely reused. - - Retries can be defined as a default for a pool:: - - retries = Retry(connect=5, read=2, redirect=5) - http = PoolManager(retries=retries) - response = http.request('GET', 'http://example.com/') - - Or per-request (which overrides the default for the pool):: - - response = http.request('GET', 'http://example.com/', retries=Retry(10)) - - Retries can be disabled by passing ``False``:: - - response = http.request('GET', 'http://example.com/', retries=False) - - Errors will be wrapped in :class:`~urllib3.exceptions.MaxRetryError` unless - retries are disabled, in which case the causing exception will be raised. - - :param int total: - Total number of retries to allow. Takes precedence over other counts. - - Set to ``None`` to remove this constraint and fall back on other - counts. It's a good idea to set this to some sensibly-high value to - account for unexpected edge cases and avoid infinite retry loops. - - Set to ``0`` to fail on the first retry. - - Set to ``False`` to disable and imply ``raise_on_redirect=False``. - - :param int connect: - How many connection-related errors to retry on. - - These are errors raised before the request is sent to the remote server, - which we assume has not triggered the server to process the request. - - Set to ``0`` to fail on the first retry of this type. - - :param int read: - How many times to retry on read errors. - - These errors are raised after the request was sent to the server, so the - request may have side-effects. - - Set to ``0`` to fail on the first retry of this type. - - :param int redirect: - How many redirects to perform. Limit this to avoid infinite redirect - loops. - - A redirect is a HTTP response with a status code 301, 302, 303, 307 or - 308. - - Set to ``0`` to fail on the first retry of this type. - - Set to ``False`` to disable and imply ``raise_on_redirect=False``. - - :param int status: - How many times to retry on bad status codes. - - These are retries made on responses, where status code matches - ``status_forcelist``. - - Set to ``0`` to fail on the first retry of this type. - - :param iterable method_whitelist: - Set of uppercased HTTP method verbs that we should retry on. - - By default, we only retry on methods which are considered to be - idempotent (multiple requests with the same parameters end with the - same state). See :attr:`Retry.DEFAULT_METHOD_WHITELIST`. - - Set to a ``False`` value to retry on any verb. - - :param iterable status_forcelist: - A set of integer HTTP status codes that we should force a retry on. - A retry is initiated if the request method is in ``method_whitelist`` - and the response status code is in ``status_forcelist``. - - By default, this is disabled with ``None``. - - :param float backoff_factor: - A backoff factor to apply between attempts after the second try - (most errors are resolved immediately by a second try without a - delay). urllib3 will sleep for:: - - {backoff factor} * (2 ** ({number of total retries} - 1)) - - seconds. If the backoff_factor is 0.1, then :func:`.sleep` will sleep - for [0.0s, 0.2s, 0.4s, ...] between retries. It will never be longer - than :attr:`Retry.BACKOFF_MAX`. - - By default, backoff is disabled (set to 0). - - :param bool raise_on_redirect: Whether, if the number of redirects is - exhausted, to raise a MaxRetryError, or to return a response with a - response code in the 3xx range. - - :param bool raise_on_status: Similar meaning to ``raise_on_redirect``: - whether we should raise an exception, or return a response, - if status falls in ``status_forcelist`` range and retries have - been exhausted. - - :param tuple history: The history of the request encountered during - each call to :meth:`~Retry.increment`. The list is in the order - the requests occurred. Each list item is of class :class:`RequestHistory`. - - :param bool respect_retry_after_header: - Whether to respect Retry-After header on status codes defined as - :attr:`Retry.RETRY_AFTER_STATUS_CODES` or not. - - :param iterable remove_headers_on_redirect: - Sequence of headers to remove from the request when a response - indicating a redirect is returned before firing off the redirected - request. - """ - - DEFAULT_METHOD_WHITELIST = frozenset([ - 'HEAD', 'GET', 'PUT', 'DELETE', 'OPTIONS', 'TRACE']) - - RETRY_AFTER_STATUS_CODES = frozenset([413, 429, 503]) - - DEFAULT_REDIRECT_HEADERS_BLACKLIST = frozenset(['Authorization']) - - #: Maximum backoff time. - BACKOFF_MAX = 120 - - def __init__(self, total=10, connect=None, read=None, redirect=None, status=None, - method_whitelist=DEFAULT_METHOD_WHITELIST, status_forcelist=None, - backoff_factor=0, raise_on_redirect=True, raise_on_status=True, - history=None, respect_retry_after_header=True, - remove_headers_on_redirect=DEFAULT_REDIRECT_HEADERS_BLACKLIST): - - self.total = total - self.connect = connect - self.read = read - self.status = status - - if redirect is False or total is False: - redirect = 0 - raise_on_redirect = False - - self.redirect = redirect - self.status_forcelist = status_forcelist or set() - self.method_whitelist = method_whitelist - self.backoff_factor = backoff_factor - self.raise_on_redirect = raise_on_redirect - self.raise_on_status = raise_on_status - self.history = history or tuple() - self.respect_retry_after_header = respect_retry_after_header - self.remove_headers_on_redirect = remove_headers_on_redirect - - def new(self, **kw): - params = dict( - total=self.total, - connect=self.connect, read=self.read, redirect=self.redirect, status=self.status, - method_whitelist=self.method_whitelist, - status_forcelist=self.status_forcelist, - backoff_factor=self.backoff_factor, - raise_on_redirect=self.raise_on_redirect, - raise_on_status=self.raise_on_status, - history=self.history, - remove_headers_on_redirect=self.remove_headers_on_redirect - ) - params.update(kw) - return type(self)(**params) - - @classmethod - def from_int(cls, retries, redirect=True, default=None): - """ Backwards-compatibility for the old retries format.""" - if retries is None: - retries = default if default is not None else cls.DEFAULT - - if isinstance(retries, Retry): - return retries - - redirect = bool(redirect) and None - new_retries = cls(retries, redirect=redirect) - log.debug("Converted retries value: %r -> %r", retries, new_retries) - return new_retries - - def get_backoff_time(self): - """ Formula for computing the current backoff - - :rtype: float - """ - # We want to consider only the last consecutive errors sequence (Ignore redirects). - consecutive_errors_len = len(list(takewhile(lambda x: x.redirect_location is None, - reversed(self.history)))) - if consecutive_errors_len <= 1: - return 0 - - backoff_value = self.backoff_factor * (2 ** (consecutive_errors_len - 1)) - return min(self.BACKOFF_MAX, backoff_value) - - def parse_retry_after(self, retry_after): - # Whitespace: https://tools.ietf.org/html/rfc7230#section-3.2.4 - if re.match(r"^\s*[0-9]+\s*$", retry_after): - seconds = int(retry_after) - else: - retry_date_tuple = email.utils.parsedate(retry_after) - if retry_date_tuple is None: - raise InvalidHeader("Invalid Retry-After header: %s" % retry_after) - retry_date = time.mktime(retry_date_tuple) - seconds = retry_date - time.time() - - if seconds < 0: - seconds = 0 - - return seconds - - def get_retry_after(self, response): - """ Get the value of Retry-After in seconds. """ - - retry_after = response.getheader("Retry-After") - - if retry_after is None: - return None - - return self.parse_retry_after(retry_after) - - def sleep_for_retry(self, response=None): - retry_after = self.get_retry_after(response) - if retry_after: - time.sleep(retry_after) - return True - - return False - - def _sleep_backoff(self): - backoff = self.get_backoff_time() - if backoff <= 0: - return - time.sleep(backoff) - - def sleep(self, response=None): - """ Sleep between retry attempts. - - This method will respect a server's ``Retry-After`` response header - and sleep the duration of the time requested. If that is not present, it - will use an exponential backoff. By default, the backoff factor is 0 and - this method will return immediately. - """ - - if response: - slept = self.sleep_for_retry(response) - if slept: - return - - self._sleep_backoff() - - def _is_connection_error(self, err): - """ Errors when we're fairly sure that the server did not receive the - request, so it should be safe to retry. - """ - return isinstance(err, ConnectTimeoutError) - - def _is_read_error(self, err): - """ Errors that occur after the request has been started, so we should - assume that the server began processing it. - """ - return isinstance(err, (ReadTimeoutError, ProtocolError)) - - def _is_method_retryable(self, method): - """ Checks if a given HTTP method should be retried upon, depending if - it is included on the method whitelist. - """ - if self.method_whitelist and method.upper() not in self.method_whitelist: - return False - - return True - - def is_retry(self, method, status_code, has_retry_after=False): - """ Is this method/status code retryable? (Based on whitelists and control - variables such as the number of total retries to allow, whether to - respect the Retry-After header, whether this header is present, and - whether the returned status code is on the list of status codes to - be retried upon on the presence of the aforementioned header) - """ - if not self._is_method_retryable(method): - return False - - if self.status_forcelist and status_code in self.status_forcelist: - return True - - return (self.total and self.respect_retry_after_header and - has_retry_after and (status_code in self.RETRY_AFTER_STATUS_CODES)) - - def is_exhausted(self): - """ Are we out of retries? """ - retry_counts = (self.total, self.connect, self.read, self.redirect, self.status) - retry_counts = list(filter(None, retry_counts)) - if not retry_counts: - return False - - return min(retry_counts) < 0 - - def increment(self, method=None, url=None, response=None, error=None, - _pool=None, _stacktrace=None): - """ Return a new Retry object with incremented retry counters. - - :param response: A response object, or None, if the server did not - return a response. - :type response: :class:`~urllib3.response.HTTPResponse` - :param Exception error: An error encountered during the request, or - None if the response was received successfully. - - :return: A new ``Retry`` object. - """ - if self.total is False and error: - # Disabled, indicate to re-raise the error. - raise six.reraise(type(error), error, _stacktrace) - - total = self.total - if total is not None: - total -= 1 - - connect = self.connect - read = self.read - redirect = self.redirect - status_count = self.status - cause = 'unknown' - status = None - redirect_location = None - - if error and self._is_connection_error(error): - # Connect retry? - if connect is False: - raise six.reraise(type(error), error, _stacktrace) - elif connect is not None: - connect -= 1 - - elif error and self._is_read_error(error): - # Read retry? - if read is False or not self._is_method_retryable(method): - raise six.reraise(type(error), error, _stacktrace) - elif read is not None: - read -= 1 - - elif response and response.get_redirect_location(): - # Redirect retry? - if redirect is not None: - redirect -= 1 - cause = 'too many redirects' - redirect_location = response.get_redirect_location() - status = response.status - - else: - # Incrementing because of a server error like a 500 in - # status_forcelist and a the given method is in the whitelist - cause = ResponseError.GENERIC_ERROR - if response and response.status: - if status_count is not None: - status_count -= 1 - cause = ResponseError.SPECIFIC_ERROR.format( - status_code=response.status) - status = response.status - - history = self.history + (RequestHistory(method, url, error, status, redirect_location),) - - new_retry = self.new( - total=total, - connect=connect, read=read, redirect=redirect, status=status_count, - history=history) - - if new_retry.is_exhausted(): - raise MaxRetryError(_pool, url, error or ResponseError(cause)) - - log.debug("Incremented Retry for (url='%s'): %r", url, new_retry) - - return new_retry - - def __repr__(self): - return ('{cls.__name__}(total={self.total}, connect={self.connect}, ' - 'read={self.read}, redirect={self.redirect}, status={self.status})').format( - cls=type(self), self=self) - - -# For backwards compatibility (equivalent to pre-v1.9): -Retry.DEFAULT = Retry(3) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/retry.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/retry.pyc deleted file mode 100644 index b0b06020d809cc7c002938497dd13feff8bc38e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15622 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 H{px=J==TUj diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/ssl_.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/ssl_.py deleted file mode 100644 index dfc553f..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/ssl_.py +++ /dev/null @@ -1,381 +0,0 @@ -from __future__ import absolute_import -import errno -import warnings -import hmac -import socket - -from binascii import hexlify, unhexlify -from hashlib import md5, sha1, sha256 - -from ..exceptions import SSLError, InsecurePlatformWarning, SNIMissingWarning -from ..packages import six - - -SSLContext = None -HAS_SNI = False -IS_PYOPENSSL = False -IS_SECURETRANSPORT = False - -# Maps the length of a digest to a possible hash function producing this digest -HASHFUNC_MAP = { - 32: md5, - 40: sha1, - 64: sha256, -} - - -def _const_compare_digest_backport(a, b): - """ - Compare two digests of equal length in constant time. - - The digests must be of type str/bytes. - Returns True if the digests match, and False otherwise. - """ - result = abs(len(a) - len(b)) - for l, r in zip(bytearray(a), bytearray(b)): - result |= l ^ r - return result == 0 - - -_const_compare_digest = getattr(hmac, 'compare_digest', - _const_compare_digest_backport) - - -try: # Test for SSL features - import ssl - from ssl import wrap_socket, CERT_NONE, PROTOCOL_SSLv23 - from ssl import HAS_SNI # Has SNI? -except ImportError: - pass - - -try: - from ssl import OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_COMPRESSION -except ImportError: - OP_NO_SSLv2, OP_NO_SSLv3 = 0x1000000, 0x2000000 - OP_NO_COMPRESSION = 0x20000 - - -# Python 2.7 doesn't have inet_pton on non-Linux so we fallback on inet_aton in -# those cases. This means that we can only detect IPv4 addresses in this case. -if hasattr(socket, 'inet_pton'): - inet_pton = socket.inet_pton -else: - # Maybe we can use ipaddress if the user has urllib3[secure]? - try: - from pip._vendor import ipaddress - - def inet_pton(_, host): - if isinstance(host, bytes): - host = host.decode('ascii') - return ipaddress.ip_address(host) - - except ImportError: # Platform-specific: Non-Linux - def inet_pton(_, host): - return socket.inet_aton(host) - - -# A secure default. -# Sources for more information on TLS ciphers: -# -# - https://wiki.mozilla.org/Security/Server_Side_TLS -# - https://www.ssllabs.com/projects/best-practices/index.html -# - https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/ -# -# The general intent is: -# - Prefer TLS 1.3 cipher suites -# - prefer cipher suites that offer perfect forward secrecy (DHE/ECDHE), -# - prefer ECDHE over DHE for better performance, -# - prefer any AES-GCM and ChaCha20 over any AES-CBC for better performance and -# security, -# - prefer AES-GCM over ChaCha20 because hardware-accelerated AES is common, -# - disable NULL authentication, MD5 MACs and DSS for security reasons. -DEFAULT_CIPHERS = ':'.join([ - 'TLS13-AES-256-GCM-SHA384', - 'TLS13-CHACHA20-POLY1305-SHA256', - 'TLS13-AES-128-GCM-SHA256', - 'ECDH+AESGCM', - 'ECDH+CHACHA20', - 'DH+AESGCM', - 'DH+CHACHA20', - 'ECDH+AES256', - 'DH+AES256', - 'ECDH+AES128', - 'DH+AES', - 'RSA+AESGCM', - 'RSA+AES', - '!aNULL', - '!eNULL', - '!MD5', -]) - -try: - from ssl import SSLContext # Modern SSL? -except ImportError: - import sys - - class SSLContext(object): # Platform-specific: Python 2 - def __init__(self, protocol_version): - self.protocol = protocol_version - # Use default values from a real SSLContext - self.check_hostname = False - self.verify_mode = ssl.CERT_NONE - self.ca_certs = None - self.options = 0 - self.certfile = None - self.keyfile = None - self.ciphers = None - - def load_cert_chain(self, certfile, keyfile): - self.certfile = certfile - self.keyfile = keyfile - - def load_verify_locations(self, cafile=None, capath=None): - self.ca_certs = cafile - - if capath is not None: - raise SSLError("CA directories not supported in older Pythons") - - def set_ciphers(self, cipher_suite): - self.ciphers = cipher_suite - - def wrap_socket(self, socket, server_hostname=None, server_side=False): - warnings.warn( - 'A true SSLContext object is not available. This prevents ' - 'urllib3 from configuring SSL appropriately and may cause ' - 'certain SSL connections to fail. You can upgrade to a newer ' - 'version of Python to solve this. For more information, see ' - 'https://urllib3.readthedocs.io/en/latest/advanced-usage.html' - '#ssl-warnings', - InsecurePlatformWarning - ) - kwargs = { - 'keyfile': self.keyfile, - 'certfile': self.certfile, - 'ca_certs': self.ca_certs, - 'cert_reqs': self.verify_mode, - 'ssl_version': self.protocol, - 'server_side': server_side, - } - return wrap_socket(socket, ciphers=self.ciphers, **kwargs) - - -def assert_fingerprint(cert, fingerprint): - """ - Checks if given fingerprint matches the supplied certificate. - - :param cert: - Certificate as bytes object. - :param fingerprint: - Fingerprint as string of hexdigits, can be interspersed by colons. - """ - - fingerprint = fingerprint.replace(':', '').lower() - digest_length = len(fingerprint) - hashfunc = HASHFUNC_MAP.get(digest_length) - if not hashfunc: - raise SSLError( - 'Fingerprint of invalid length: {0}'.format(fingerprint)) - - # We need encode() here for py32; works on py2 and p33. - fingerprint_bytes = unhexlify(fingerprint.encode()) - - cert_digest = hashfunc(cert).digest() - - if not _const_compare_digest(cert_digest, fingerprint_bytes): - raise SSLError('Fingerprints did not match. Expected "{0}", got "{1}".' - .format(fingerprint, hexlify(cert_digest))) - - -def resolve_cert_reqs(candidate): - """ - Resolves the argument to a numeric constant, which can be passed to - the wrap_socket function/method from the ssl module. - Defaults to :data:`ssl.CERT_NONE`. - If given a string it is assumed to be the name of the constant in the - :mod:`ssl` module or its abbreviation. - (So you can specify `REQUIRED` instead of `CERT_REQUIRED`. - If it's neither `None` nor a string we assume it is already the numeric - constant which can directly be passed to wrap_socket. - """ - if candidate is None: - return CERT_NONE - - if isinstance(candidate, str): - res = getattr(ssl, candidate, None) - if res is None: - res = getattr(ssl, 'CERT_' + candidate) - return res - - return candidate - - -def resolve_ssl_version(candidate): - """ - like resolve_cert_reqs - """ - if candidate is None: - return PROTOCOL_SSLv23 - - if isinstance(candidate, str): - res = getattr(ssl, candidate, None) - if res is None: - res = getattr(ssl, 'PROTOCOL_' + candidate) - return res - - return candidate - - -def create_urllib3_context(ssl_version=None, cert_reqs=None, - options=None, ciphers=None): - """All arguments have the same meaning as ``ssl_wrap_socket``. - - By default, this function does a lot of the same work that - ``ssl.create_default_context`` does on Python 3.4+. It: - - - Disables SSLv2, SSLv3, and compression - - Sets a restricted set of server ciphers - - If you wish to enable SSLv3, you can do:: - - from pip._vendor.urllib3.util import ssl_ - context = ssl_.create_urllib3_context() - context.options &= ~ssl_.OP_NO_SSLv3 - - You can do the same to enable compression (substituting ``COMPRESSION`` - for ``SSLv3`` in the last line above). - - :param ssl_version: - The desired protocol version to use. This will default to - PROTOCOL_SSLv23 which will negotiate the highest protocol that both - the server and your installation of OpenSSL support. - :param cert_reqs: - Whether to require the certificate verification. This defaults to - ``ssl.CERT_REQUIRED``. - :param options: - Specific OpenSSL options. These default to ``ssl.OP_NO_SSLv2``, - ``ssl.OP_NO_SSLv3``, ``ssl.OP_NO_COMPRESSION``. - :param ciphers: - Which cipher suites to allow the server to select. - :returns: - Constructed SSLContext object with specified options - :rtype: SSLContext - """ - context = SSLContext(ssl_version or ssl.PROTOCOL_SSLv23) - - context.set_ciphers(ciphers or DEFAULT_CIPHERS) - - # Setting the default here, as we may have no ssl module on import - cert_reqs = ssl.CERT_REQUIRED if cert_reqs is None else cert_reqs - - if options is None: - options = 0 - # SSLv2 is easily broken and is considered harmful and dangerous - options |= OP_NO_SSLv2 - # SSLv3 has several problems and is now dangerous - options |= OP_NO_SSLv3 - # Disable compression to prevent CRIME attacks for OpenSSL 1.0+ - # (issue #309) - options |= OP_NO_COMPRESSION - - context.options |= options - - context.verify_mode = cert_reqs - if getattr(context, 'check_hostname', None) is not None: # Platform-specific: Python 3.2 - # We do our own verification, including fingerprints and alternative - # hostnames. So disable it here - context.check_hostname = False - return context - - -def ssl_wrap_socket(sock, keyfile=None, certfile=None, cert_reqs=None, - ca_certs=None, server_hostname=None, - ssl_version=None, ciphers=None, ssl_context=None, - ca_cert_dir=None): - """ - All arguments except for server_hostname, ssl_context, and ca_cert_dir have - the same meaning as they do when using :func:`ssl.wrap_socket`. - - :param server_hostname: - When SNI is supported, the expected hostname of the certificate - :param ssl_context: - A pre-made :class:`SSLContext` object. If none is provided, one will - be created using :func:`create_urllib3_context`. - :param ciphers: - A string of ciphers we wish the client to support. - :param ca_cert_dir: - A directory containing CA certificates in multiple separate files, as - supported by OpenSSL's -CApath flag or the capath argument to - SSLContext.load_verify_locations(). - """ - context = ssl_context - if context is None: - # Note: This branch of code and all the variables in it are no longer - # used by urllib3 itself. We should consider deprecating and removing - # this code. - context = create_urllib3_context(ssl_version, cert_reqs, - ciphers=ciphers) - - if ca_certs or ca_cert_dir: - try: - context.load_verify_locations(ca_certs, ca_cert_dir) - except IOError as e: # Platform-specific: Python 2.7 - raise SSLError(e) - # Py33 raises FileNotFoundError which subclasses OSError - # These are not equivalent unless we check the errno attribute - except OSError as e: # Platform-specific: Python 3.3 and beyond - if e.errno == errno.ENOENT: - raise SSLError(e) - raise - elif getattr(context, 'load_default_certs', None) is not None: - # try to load OS default certs; works well on Windows (require Python3.4+) - context.load_default_certs() - - if certfile: - context.load_cert_chain(certfile, keyfile) - - # If we detect server_hostname is an IP address then the SNI - # extension should not be used according to RFC3546 Section 3.1 - # We shouldn't warn the user if SNI isn't available but we would - # not be using SNI anyways due to IP address for server_hostname. - if ((server_hostname is not None and not is_ipaddress(server_hostname)) - or IS_SECURETRANSPORT): - if HAS_SNI and server_hostname is not None: - return context.wrap_socket(sock, server_hostname=server_hostname) - - warnings.warn( - 'An HTTPS request has been made, but the SNI (Server Name ' - 'Indication) extension to TLS is not available on this platform. ' - 'This may cause the server to present an incorrect TLS ' - 'certificate, which can cause validation failures. You can upgrade to ' - 'a newer version of Python to solve this. For more information, see ' - 'https://urllib3.readthedocs.io/en/latest/advanced-usage.html' - '#ssl-warnings', - SNIMissingWarning - ) - - return context.wrap_socket(sock) - - -def is_ipaddress(hostname): - """Detects whether the hostname given is an IP address. - - :param str hostname: Hostname to examine. - :return: True if the hostname is an IP address, False otherwise. - """ - if six.PY3 and isinstance(hostname, bytes): - # IDN A-label bytes are ASCII compatible. - hostname = hostname.decode('ascii') - - families = [socket.AF_INET] - if hasattr(socket, 'AF_INET6'): - families.append(socket.AF_INET6) - - for af in families: - try: - inet_pton(af, hostname) - except (socket.error, ValueError, OSError): - pass - else: - return True - return False diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/ssl_.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/ssl_.pyc deleted file mode 100644 index c42a507dcaa413dd67e6ce966c8f4f59de9f549a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12270 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 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/timeout.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/timeout.py deleted file mode 100644 index cec817e..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/timeout.py +++ /dev/null @@ -1,242 +0,0 @@ -from __future__ import absolute_import -# The default socket timeout, used by httplib to indicate that no timeout was -# specified by the user -from socket import _GLOBAL_DEFAULT_TIMEOUT -import time - -from ..exceptions import TimeoutStateError - -# A sentinel value to indicate that no timeout was specified by the user in -# urllib3 -_Default = object() - - -# Use time.monotonic if available. -current_time = getattr(time, "monotonic", time.time) - - -class Timeout(object): - """ Timeout configuration. - - Timeouts can be defined as a default for a pool:: - - timeout = Timeout(connect=2.0, read=7.0) - http = PoolManager(timeout=timeout) - response = http.request('GET', 'http://example.com/') - - Or per-request (which overrides the default for the pool):: - - response = http.request('GET', 'http://example.com/', timeout=Timeout(10)) - - Timeouts can be disabled by setting all the parameters to ``None``:: - - no_timeout = Timeout(connect=None, read=None) - response = http.request('GET', 'http://example.com/, timeout=no_timeout) - - - :param total: - This combines the connect and read timeouts into one; the read timeout - will be set to the time leftover from the connect attempt. In the - event that both a connect timeout and a total are specified, or a read - timeout and a total are specified, the shorter timeout will be applied. - - Defaults to None. - - :type total: integer, float, or None - - :param connect: - The maximum amount of time to wait for a connection attempt to a server - to succeed. Omitting the parameter will default the connect timeout to - the system default, probably `the global default timeout in socket.py - <http://hg.python.org/cpython/file/603b4d593758/Lib/socket.py#l535>`_. - None will set an infinite timeout for connection attempts. - - :type connect: integer, float, or None - - :param read: - The maximum amount of time to wait between consecutive - read operations for a response from the server. Omitting - the parameter will default the read timeout to the system - default, probably `the global default timeout in socket.py - <http://hg.python.org/cpython/file/603b4d593758/Lib/socket.py#l535>`_. - None will set an infinite timeout. - - :type read: integer, float, or None - - .. note:: - - Many factors can affect the total amount of time for urllib3 to return - an HTTP response. - - For example, Python's DNS resolver does not obey the timeout specified - on the socket. Other factors that can affect total request time include - high CPU load, high swap, the program running at a low priority level, - or other behaviors. - - In addition, the read and total timeouts only measure the time between - read operations on the socket connecting the client and the server, - not the total amount of time for the request to return a complete - response. For most requests, the timeout is raised because the server - has not sent the first byte in the specified time. This is not always - the case; if a server streams one byte every fifteen seconds, a timeout - of 20 seconds will not trigger, even though the request will take - several minutes to complete. - - If your goal is to cut off any request after a set amount of wall clock - time, consider having a second "watcher" thread to cut off a slow - request. - """ - - #: A sentinel object representing the default timeout value - DEFAULT_TIMEOUT = _GLOBAL_DEFAULT_TIMEOUT - - def __init__(self, total=None, connect=_Default, read=_Default): - self._connect = self._validate_timeout(connect, 'connect') - self._read = self._validate_timeout(read, 'read') - self.total = self._validate_timeout(total, 'total') - self._start_connect = None - - def __str__(self): - return '%s(connect=%r, read=%r, total=%r)' % ( - type(self).__name__, self._connect, self._read, self.total) - - @classmethod - def _validate_timeout(cls, value, name): - """ Check that a timeout attribute is valid. - - :param value: The timeout value to validate - :param name: The name of the timeout attribute to validate. This is - used to specify in error messages. - :return: The validated and casted version of the given value. - :raises ValueError: If it is a numeric value less than or equal to - zero, or the type is not an integer, float, or None. - """ - if value is _Default: - return cls.DEFAULT_TIMEOUT - - if value is None or value is cls.DEFAULT_TIMEOUT: - return value - - if isinstance(value, bool): - raise ValueError("Timeout cannot be a boolean value. It must " - "be an int, float or None.") - try: - float(value) - except (TypeError, ValueError): - raise ValueError("Timeout value %s was %s, but it must be an " - "int, float or None." % (name, value)) - - try: - if value <= 0: - raise ValueError("Attempted to set %s timeout to %s, but the " - "timeout cannot be set to a value less " - "than or equal to 0." % (name, value)) - except TypeError: # Python 3 - raise ValueError("Timeout value %s was %s, but it must be an " - "int, float or None." % (name, value)) - - return value - - @classmethod - def from_float(cls, timeout): - """ Create a new Timeout from a legacy timeout value. - - The timeout value used by httplib.py sets the same timeout on the - connect(), and recv() socket requests. This creates a :class:`Timeout` - object that sets the individual timeouts to the ``timeout`` value - passed to this function. - - :param timeout: The legacy timeout value. - :type timeout: integer, float, sentinel default object, or None - :return: Timeout object - :rtype: :class:`Timeout` - """ - return Timeout(read=timeout, connect=timeout) - - def clone(self): - """ Create a copy of the timeout object - - Timeout properties are stored per-pool but each request needs a fresh - Timeout object to ensure each one has its own start/stop configured. - - :return: a copy of the timeout object - :rtype: :class:`Timeout` - """ - # We can't use copy.deepcopy because that will also create a new object - # for _GLOBAL_DEFAULT_TIMEOUT, which socket.py uses as a sentinel to - # detect the user default. - return Timeout(connect=self._connect, read=self._read, - total=self.total) - - def start_connect(self): - """ Start the timeout clock, used during a connect() attempt - - :raises urllib3.exceptions.TimeoutStateError: if you attempt - to start a timer that has been started already. - """ - if self._start_connect is not None: - raise TimeoutStateError("Timeout timer has already been started.") - self._start_connect = current_time() - return self._start_connect - - def get_connect_duration(self): - """ Gets the time elapsed since the call to :meth:`start_connect`. - - :return: Elapsed time. - :rtype: float - :raises urllib3.exceptions.TimeoutStateError: if you attempt - to get duration for a timer that hasn't been started. - """ - if self._start_connect is None: - raise TimeoutStateError("Can't get connect duration for timer " - "that has not started.") - return current_time() - self._start_connect - - @property - def connect_timeout(self): - """ Get the value to use when setting a connection timeout. - - This will be a positive float or integer, the value None - (never timeout), or the default system timeout. - - :return: Connect timeout. - :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None - """ - if self.total is None: - return self._connect - - if self._connect is None or self._connect is self.DEFAULT_TIMEOUT: - return self.total - - return min(self._connect, self.total) - - @property - def read_timeout(self): - """ Get the value for the read timeout. - - This assumes some time has elapsed in the connection timeout and - computes the read timeout appropriately. - - If self.total is set, the read timeout is dependent on the amount of - time taken by the connect timeout. If the connection time has not been - established, a :exc:`~urllib3.exceptions.TimeoutStateError` will be - raised. - - :return: Value to use for the read timeout. - :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None - :raises urllib3.exceptions.TimeoutStateError: If :meth:`start_connect` - has not yet been called on this object. - """ - if (self.total is not None and - self.total is not self.DEFAULT_TIMEOUT and - self._read is not None and - self._read is not self.DEFAULT_TIMEOUT): - # In case the connect timeout has not yet been established. - if self._start_connect is None: - return self._read - return max(0, min(self.total - self.get_connect_duration(), - self._read)) - elif self.total is not None and self.total is not self.DEFAULT_TIMEOUT: - return max(0, self.total - self.get_connect_duration()) - else: - return self._read diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/timeout.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/timeout.pyc deleted file mode 100644 index a9c790cf0ad9a391f659e2313de5287ea8ca4121..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10233 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 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/url.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/url.py deleted file mode 100644 index 6b6f996..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/url.py +++ /dev/null @@ -1,230 +0,0 @@ -from __future__ import absolute_import -from collections import namedtuple - -from ..exceptions import LocationParseError - - -url_attrs = ['scheme', 'auth', 'host', 'port', 'path', 'query', 'fragment'] - -# We only want to normalize urls with an HTTP(S) scheme. -# urllib3 infers URLs without a scheme (None) to be http. -NORMALIZABLE_SCHEMES = ('http', 'https', None) - - -class Url(namedtuple('Url', url_attrs)): - """ - Datastructure for representing an HTTP URL. Used as a return value for - :func:`parse_url`. Both the scheme and host are normalized as they are - both case-insensitive according to RFC 3986. - """ - __slots__ = () - - def __new__(cls, scheme=None, auth=None, host=None, port=None, path=None, - query=None, fragment=None): - if path and not path.startswith('/'): - path = '/' + path - if scheme: - scheme = scheme.lower() - if host and scheme in NORMALIZABLE_SCHEMES: - host = host.lower() - return super(Url, cls).__new__(cls, scheme, auth, host, port, path, - query, fragment) - - @property - def hostname(self): - """For backwards-compatibility with urlparse. We're nice like that.""" - return self.host - - @property - def request_uri(self): - """Absolute path including the query string.""" - uri = self.path or '/' - - if self.query is not None: - uri += '?' + self.query - - return uri - - @property - def netloc(self): - """Network location including host and port""" - if self.port: - return '%s:%d' % (self.host, self.port) - return self.host - - @property - def url(self): - """ - Convert self into a url - - This function should more or less round-trip with :func:`.parse_url`. The - returned url may not be exactly the same as the url inputted to - :func:`.parse_url`, but it should be equivalent by the RFC (e.g., urls - with a blank port will have : removed). - - Example: :: - - >>> U = parse_url('http://google.com/mail/') - >>> U.url - 'http://google.com/mail/' - >>> Url('http', 'username:password', 'host.com', 80, - ... '/path', 'query', 'fragment').url - 'http://username:password@host.com:80/path?query#fragment' - """ - scheme, auth, host, port, path, query, fragment = self - url = '' - - # We use "is not None" we want things to happen with empty strings (or 0 port) - if scheme is not None: - url += scheme + '://' - if auth is not None: - url += auth + '@' - if host is not None: - url += host - if port is not None: - url += ':' + str(port) - if path is not None: - url += path - if query is not None: - url += '?' + query - if fragment is not None: - url += '#' + fragment - - return url - - def __str__(self): - return self.url - - -def split_first(s, delims): - """ - Given a string and an iterable of delimiters, split on the first found - delimiter. Return two split parts and the matched delimiter. - - If not found, then the first part is the full input string. - - Example:: - - >>> split_first('foo/bar?baz', '?/=') - ('foo', 'bar?baz', '/') - >>> split_first('foo/bar?baz', '123') - ('foo/bar?baz', '', None) - - Scales linearly with number of delims. Not ideal for large number of delims. - """ - min_idx = None - min_delim = None - for d in delims: - idx = s.find(d) - if idx < 0: - continue - - if min_idx is None or idx < min_idx: - min_idx = idx - min_delim = d - - if min_idx is None or min_idx < 0: - return s, '', None - - return s[:min_idx], s[min_idx + 1:], min_delim - - -def parse_url(url): - """ - Given a url, return a parsed :class:`.Url` namedtuple. Best-effort is - performed to parse incomplete urls. Fields not provided will be None. - - Partly backwards-compatible with :mod:`urlparse`. - - Example:: - - >>> parse_url('http://google.com/mail/') - Url(scheme='http', host='google.com', port=None, path='/mail/', ...) - >>> parse_url('google.com:80') - Url(scheme=None, host='google.com', port=80, path=None, ...) - >>> parse_url('/foo?bar') - Url(scheme=None, host=None, port=None, path='/foo', query='bar', ...) - """ - - # While this code has overlap with stdlib's urlparse, it is much - # simplified for our needs and less annoying. - # Additionally, this implementations does silly things to be optimal - # on CPython. - - if not url: - # Empty - return Url() - - scheme = None - auth = None - host = None - port = None - path = None - fragment = None - query = None - - # Scheme - if '://' in url: - scheme, url = url.split('://', 1) - - # Find the earliest Authority Terminator - # (http://tools.ietf.org/html/rfc3986#section-3.2) - url, path_, delim = split_first(url, ['/', '?', '#']) - - if delim: - # Reassemble the path - path = delim + path_ - - # Auth - if '@' in url: - # Last '@' denotes end of auth part - auth, url = url.rsplit('@', 1) - - # IPv6 - if url and url[0] == '[': - host, url = url.split(']', 1) - host += ']' - - # Port - if ':' in url: - _host, port = url.split(':', 1) - - if not host: - host = _host - - if port: - # If given, ports must be integers. No whitespace, no plus or - # minus prefixes, no non-integer digits such as ^2 (superscript). - if not port.isdigit(): - raise LocationParseError(url) - try: - port = int(port) - except ValueError: - raise LocationParseError(url) - else: - # Blank ports are cool, too. (rfc3986#section-3.2.3) - port = None - - elif not host and url: - host = url - - if not path: - return Url(scheme, auth, host, port, path, query, fragment) - - # Fragment - if '#' in path: - path, fragment = path.split('#', 1) - - # Query - if '?' in path: - path, query = path.split('?', 1) - - return Url(scheme, auth, host, port, path, query, fragment) - - -def get_host(url): - """ - Deprecated. Use :func:`parse_url` instead. - """ - p = parse_url(url) - return p.scheme or 'http', p.hostname, p.port diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/url.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/url.pyc deleted file mode 100644 index 10016b1a0d0e4e3a2bcb98a6adbdf21e5acae441..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6910 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 C{9;1@ diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/wait.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/wait.py deleted file mode 100644 index 4db71ba..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/wait.py +++ /dev/null @@ -1,150 +0,0 @@ -import errno -from functools import partial -import select -import sys -try: - from time import monotonic -except ImportError: - from time import time as monotonic - -__all__ = ["NoWayToWaitForSocketError", "wait_for_read", "wait_for_write"] - - -class NoWayToWaitForSocketError(Exception): - pass - - -# How should we wait on sockets? -# -# There are two types of APIs you can use for waiting on sockets: the fancy -# modern stateful APIs like epoll/kqueue, and the older stateless APIs like -# select/poll. The stateful APIs are more efficient when you have a lots of -# sockets to keep track of, because you can set them up once and then use them -# lots of times. But we only ever want to wait on a single socket at a time -# and don't want to keep track of state, so the stateless APIs are actually -# more efficient. So we want to use select() or poll(). -# -# Now, how do we choose between select() and poll()? On traditional Unixes, -# select() has a strange calling convention that makes it slow, or fail -# altogether, for high-numbered file descriptors. The point of poll() is to fix -# that, so on Unixes, we prefer poll(). -# -# On Windows, there is no poll() (or at least Python doesn't provide a wrapper -# for it), but that's OK, because on Windows, select() doesn't have this -# strange calling convention; plain select() works fine. -# -# So: on Windows we use select(), and everywhere else we use poll(). We also -# fall back to select() in case poll() is somehow broken or missing. - -if sys.version_info >= (3, 5): - # Modern Python, that retries syscalls by default - def _retry_on_intr(fn, timeout): - return fn(timeout) -else: - # Old and broken Pythons. - def _retry_on_intr(fn, timeout): - if timeout is None: - deadline = float("inf") - else: - deadline = monotonic() + timeout - - while True: - try: - return fn(timeout) - # OSError for 3 <= pyver < 3.5, select.error for pyver <= 2.7 - except (OSError, select.error) as e: - # 'e.args[0]' incantation works for both OSError and select.error - if e.args[0] != errno.EINTR: - raise - else: - timeout = deadline - monotonic() - if timeout < 0: - timeout = 0 - if timeout == float("inf"): - timeout = None - continue - - -def select_wait_for_socket(sock, read=False, write=False, timeout=None): - if not read and not write: - raise RuntimeError("must specify at least one of read=True, write=True") - rcheck = [] - wcheck = [] - if read: - rcheck.append(sock) - if write: - wcheck.append(sock) - # When doing a non-blocking connect, most systems signal success by - # marking the socket writable. Windows, though, signals success by marked - # it as "exceptional". We paper over the difference by checking the write - # sockets for both conditions. (The stdlib selectors module does the same - # thing.) - fn = partial(select.select, rcheck, wcheck, wcheck) - rready, wready, xready = _retry_on_intr(fn, timeout) - return bool(rready or wready or xready) - - -def poll_wait_for_socket(sock, read=False, write=False, timeout=None): - if not read and not write: - raise RuntimeError("must specify at least one of read=True, write=True") - mask = 0 - if read: - mask |= select.POLLIN - if write: - mask |= select.POLLOUT - poll_obj = select.poll() - poll_obj.register(sock, mask) - - # For some reason, poll() takes timeout in milliseconds - def do_poll(t): - if t is not None: - t *= 1000 - return poll_obj.poll(t) - - return bool(_retry_on_intr(do_poll, timeout)) - - -def null_wait_for_socket(*args, **kwargs): - raise NoWayToWaitForSocketError("no select-equivalent available") - - -def _have_working_poll(): - # Apparently some systems have a select.poll that fails as soon as you try - # to use it, either due to strange configuration or broken monkeypatching - # from libraries like eventlet/greenlet. - try: - poll_obj = select.poll() - _retry_on_intr(poll_obj.poll, 0) - except (AttributeError, OSError): - return False - else: - return True - - -def wait_for_socket(*args, **kwargs): - # We delay choosing which implementation to use until the first time we're - # called. We could do it at import time, but then we might make the wrong - # decision if someone goes wild with monkeypatching select.poll after - # we're imported. - global wait_for_socket - if _have_working_poll(): - wait_for_socket = poll_wait_for_socket - elif hasattr(select, "select"): - wait_for_socket = select_wait_for_socket - else: # Platform-specific: Appengine. - wait_for_socket = null_wait_for_socket - return wait_for_socket(*args, **kwargs) - - -def wait_for_read(sock, timeout=None): - """ Waits for reading to be available on a given socket. - Returns True if the socket is readable, or False if the timeout expired. - """ - return wait_for_socket(sock, read=True, timeout=timeout) - - -def wait_for_write(sock, timeout=None): - """ Waits for writing to be available on a given socket. - Returns True if the socket is readable, or False if the timeout expired. - """ - return wait_for_socket(sock, write=True, timeout=timeout) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/wait.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/wait.pyc deleted file mode 100644 index 20bf8c9030f2fb030e68f3a78c35b384f72807c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4842 zcmd5=UvC@75udvwDN+_iMN(`zX@hHm225>-c2gL2(ez*H00vSiI4O`Lq##bbqkQ7= zj^0~JVjw*<GWrKa`_MkLK)*u2KnnDwpQi8q0PXKLN0F)@`p`bG)a`P1cDT1Q^PAaO zdH-lG-}%|<PkS=`RPp@-v|`N>iSRg*iX4=*E2$$xR}NfprgNSgcvo^2IjG2FQ-_|U zRT<XgpeD|K_BE-*OEOp%GZ4qo-&RzhssfoKPot_tHHntw2us!l!?+=RN20pC5V;ij z^k7-yiX7jNXj2ANF@Kim2Ime|Bx^{tGNt3D;K9D5ro6yfEe@xgRpqQn)KcMBBwABq zU7}Y=gd6(9b$Q{)0TjU^8%n=Qdbj;5ER*~bpY1lxBX$YhC^R++(~{8uW0+^T&9kIe zvMLlzhOxa3VmsdtCwu4;`(bW&^WGq~kB!NVZDRHm>~23dT@#0qUA@jZHHnR9UgFDt zgjUqi#V~;*!EPJ0v|V(T>~1#;hjF)Smvu1Aqj8F1DFv1&Rg6G&MkYB4ZQMBtO{bry zQEZCN=VzVCd*(1Z9XxpWJiGtUeCuKF+r`<V=yP))pQBM{uQN(U_mZrzVVd5v4}Nmg z{g^Cm-IF+ra?=@`G))fQ>x^xZcBtUHqe<Z5rBt}!Zfj1$aYE?z$hc}BfG)WEb3Be* z(gW0d`<kYd?Pux;8aW@^xq=JPP2C0uS~Kb9SvSe7d53y%qvEK3L_`fu_4^wLC>Mzg z>SA6O3tDx(a3yPsb%}il+`{<m_hLOUf0fDVHJj`|zate}5nGkxn)F?bvoFQD@WeUy z<akLUS8f9n#|;_a=O^-o$n(F*xjS8b>%!43;Fluij}!+d)7Q?nGjPS+;Wjaa7naXc zeC>m`+olJ%u{roL>nHe<Ha&-J5%gJ%&B0M=9@;=7hx|P=j@5HJyJZZ}C`FvcJ*(oe z1_mWVb5vZh5L{gA@ssVnpv}pk&W@3%xQ`G!X@WQMJ@JCk5YPzs(26(EiL>Ig+@{-b zJZIJ2a&I~{w+UXuSx4(p8Ol>V#m1jN!1XKUt8^B>tY&0H!WZhGBe<g??5h+s-<NY_ zNO%(&(-DU*gxfxmb3o%d7pQ`-jy;NF4$oypE^2hwc})PCOIJSg<YGxK>T=N_w9c1g z^anYwYu_k?k(k~tzKMP~F05aS;$G69_@VXFI0OTJ_w&BbZ1z5#eb?7CrgWRmwkzm@ zamLV{Lm(WDkUIiQNwCIlhNQzhPv^KQkUkY)nl5QIUA}|@mp8p<F+@n7DydM>vEgqf z<<y)!Q*yzWu{W{bG7P%26M?$M_Q#yzv^c9y%c<$#8v3=`ma|nNh}sfKjK$(N=>8*u z80&C4u=9vuK+qh!vIEu>J3Cig?}|&23X{^WM1Co93~1mT;Gih@1!5fe%aflgBw=2} zHvy)I(ge<}{kNFWywYP_vk`q8XvN#;u!jgKv?1oU(vCd35GuhfUO|6XPsi=#@34)M z0r9608s+Kq2-oyf9^G}!a-y3b9xEsobE2@yi1IFX(gRu0!%QVjr_CJ(x7aaI6wV*- zeDu+iZOyABcRtw*-r^iZO?;FTHZ}ok5e+L1!{9XzUuX9fcA87+s9{(P0-9H~SEB@9 z$8a%r*u<OF9WO=2K6mu*QK2yb6RmlzDs48aDRwBUwz`%{ft)EcG)-r@Uxwek`1u%x zQ5t8~4^P4*4G+_}v;q(`h0r=EHT>X|$5d%4@D^yKYz)l4WF#Ezvm%7MBg_e;56}vB z6Q8FGV&xLC3zb~P5r(Wr5Ze3M7OD)7(K0PDzQa-;C&TVjsJ}b6p+;$&pe?iaTck9F zuY&rawI(?n+cMt=EwJ=F|1eC8IH1HFW{b8ZUE6&Yp2XeL+zgWJNMkSuw_xIsiU){o zIvY;a?QzVE<e@3Z-Uk7L!kT8Cc{M~m_Xdw$Sg^FI`36-dA9=DyqBJ_P@o#5{R2!Do zypI)wJ6x7ld&$2V@Xx{`gndi9ze#b{9%ZVdGQnLA(H2?!Kfvn&t*H%b4U|4Dr{UJh z;+Qs^;gUfO8#1{&S{VbBERNl>;4E<7h`*0ZMd9Pxq=g2&<lEdojOP)HI>ZnCqXah+ zzdT3ZUH0(_Vmmfj;j=XHlfG}C#nX8|DReQ$`&}O^D>|=arWXxAJ{u(_j;4!g`ef!T z%}p&!I8&oC!|E(Xi?lw|`mfQ-3rR&UB>#)eS#mAR=Cjl4|J&v)O@BAHxo&oT=WP?^ z0V^3xfb_>%&!WyP0t}|-I+IE<DFTI(7AQBsc`_W~9|vXK%yirB;vS9*KUaBt){93r z$uqrcYn^?9TRj-KlJ;}W$3X{zS^@=cl45Gngb`?_Q3Mk%0rx-88cHpu0;ppn-!1=> s@jaSBOFx|QNW&|*Q*ELo+H_mq&DUD)N~LjYePeyIQE4<At(B#J0owIWga7~l diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/webencodings/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/webencodings/__init__.py deleted file mode 100644 index d21d697..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/webencodings/__init__.py +++ /dev/null @@ -1,342 +0,0 @@ -# coding: utf-8 -""" - - webencodings - ~~~~~~~~~~~~ - - This is a Python implementation of the `WHATWG Encoding standard - <http://encoding.spec.whatwg.org/>`. See README for details. - - :copyright: Copyright 2012 by Simon Sapin - :license: BSD, see LICENSE for details. - -""" - -from __future__ import unicode_literals - -import codecs - -from .labels import LABELS - - -VERSION = '0.5.1' - - -# Some names in Encoding are not valid Python aliases. Remap these. -PYTHON_NAMES = { - 'iso-8859-8-i': 'iso-8859-8', - 'x-mac-cyrillic': 'mac-cyrillic', - 'macintosh': 'mac-roman', - 'windows-874': 'cp874'} - -CACHE = {} - - -def ascii_lower(string): - r"""Transform (only) ASCII letters to lower case: A-Z is mapped to a-z. - - :param string: An Unicode string. - :returns: A new Unicode string. - - This is used for `ASCII case-insensitive - <http://encoding.spec.whatwg.org/#ascii-case-insensitive>`_ - matching of encoding labels. - The same matching is also used, among other things, - for `CSS keywords <http://dev.w3.org/csswg/css-values/#keywords>`_. - - This is different from the :meth:`~py:str.lower` method of Unicode strings - which also affect non-ASCII characters, - sometimes mapping them into the ASCII range: - - >>> keyword = u'Bac\N{KELVIN SIGN}ground' - >>> assert keyword.lower() == u'background' - >>> assert ascii_lower(keyword) != keyword.lower() - >>> assert ascii_lower(keyword) == u'bac\N{KELVIN SIGN}ground' - - """ - # This turns out to be faster than unicode.translate() - return string.encode('utf8').lower().decode('utf8') - - -def lookup(label): - """ - Look for an encoding by its label. - This is the spec’s `get an encoding - <http://encoding.spec.whatwg.org/#concept-encoding-get>`_ algorithm. - Supported labels are listed there. - - :param label: A string. - :returns: - An :class:`Encoding` object, or :obj:`None` for an unknown label. - - """ - # Only strip ASCII whitespace: U+0009, U+000A, U+000C, U+000D, and U+0020. - label = ascii_lower(label.strip('\t\n\f\r ')) - name = LABELS.get(label) - if name is None: - return None - encoding = CACHE.get(name) - if encoding is None: - if name == 'x-user-defined': - from .x_user_defined import codec_info - else: - python_name = PYTHON_NAMES.get(name, name) - # Any python_name value that gets to here should be valid. - codec_info = codecs.lookup(python_name) - encoding = Encoding(name, codec_info) - CACHE[name] = encoding - return encoding - - -def _get_encoding(encoding_or_label): - """ - Accept either an encoding object or label. - - :param encoding: An :class:`Encoding` object or a label string. - :returns: An :class:`Encoding` object. - :raises: :exc:`~exceptions.LookupError` for an unknown label. - - """ - if hasattr(encoding_or_label, 'codec_info'): - return encoding_or_label - - encoding = lookup(encoding_or_label) - if encoding is None: - raise LookupError('Unknown encoding label: %r' % encoding_or_label) - return encoding - - -class Encoding(object): - """Reresents a character encoding such as UTF-8, - that can be used for decoding or encoding. - - .. attribute:: name - - Canonical name of the encoding - - .. attribute:: codec_info - - The actual implementation of the encoding, - a stdlib :class:`~codecs.CodecInfo` object. - See :func:`codecs.register`. - - """ - def __init__(self, name, codec_info): - self.name = name - self.codec_info = codec_info - - def __repr__(self): - return '<Encoding %s>' % self.name - - -#: The UTF-8 encoding. Should be used for new content and formats. -UTF8 = lookup('utf-8') - -_UTF16LE = lookup('utf-16le') -_UTF16BE = lookup('utf-16be') - - -def decode(input, fallback_encoding, errors='replace'): - """ - Decode a single string. - - :param input: A byte string - :param fallback_encoding: - An :class:`Encoding` object or a label string. - The encoding to use if :obj:`input` does note have a BOM. - :param errors: Type of error handling. See :func:`codecs.register`. - :raises: :exc:`~exceptions.LookupError` for an unknown encoding label. - :return: - A ``(output, encoding)`` tuple of an Unicode string - and an :obj:`Encoding`. - - """ - # Fail early if `encoding` is an invalid label. - fallback_encoding = _get_encoding(fallback_encoding) - bom_encoding, input = _detect_bom(input) - encoding = bom_encoding or fallback_encoding - return encoding.codec_info.decode(input, errors)[0], encoding - - -def _detect_bom(input): - """Return (bom_encoding, input), with any BOM removed from the input.""" - if input.startswith(b'\xFF\xFE'): - return _UTF16LE, input[2:] - if input.startswith(b'\xFE\xFF'): - return _UTF16BE, input[2:] - if input.startswith(b'\xEF\xBB\xBF'): - return UTF8, input[3:] - return None, input - - -def encode(input, encoding=UTF8, errors='strict'): - """ - Encode a single string. - - :param input: An Unicode string. - :param encoding: An :class:`Encoding` object or a label string. - :param errors: Type of error handling. See :func:`codecs.register`. - :raises: :exc:`~exceptions.LookupError` for an unknown encoding label. - :return: A byte string. - - """ - return _get_encoding(encoding).codec_info.encode(input, errors)[0] - - -def iter_decode(input, fallback_encoding, errors='replace'): - """ - "Pull"-based decoder. - - :param input: - An iterable of byte strings. - - The input is first consumed just enough to determine the encoding - based on the precense of a BOM, - then consumed on demand when the return value is. - :param fallback_encoding: - An :class:`Encoding` object or a label string. - The encoding to use if :obj:`input` does note have a BOM. - :param errors: Type of error handling. See :func:`codecs.register`. - :raises: :exc:`~exceptions.LookupError` for an unknown encoding label. - :returns: - An ``(output, encoding)`` tuple. - :obj:`output` is an iterable of Unicode strings, - :obj:`encoding` is the :obj:`Encoding` that is being used. - - """ - - decoder = IncrementalDecoder(fallback_encoding, errors) - generator = _iter_decode_generator(input, decoder) - encoding = next(generator) - return generator, encoding - - -def _iter_decode_generator(input, decoder): - """Return a generator that first yields the :obj:`Encoding`, - then yields output chukns as Unicode strings. - - """ - decode = decoder.decode - input = iter(input) - for chunck in input: - output = decode(chunck) - if output: - assert decoder.encoding is not None - yield decoder.encoding - yield output - break - else: - # Input exhausted without determining the encoding - output = decode(b'', final=True) - assert decoder.encoding is not None - yield decoder.encoding - if output: - yield output - return - - for chunck in input: - output = decode(chunck) - if output: - yield output - output = decode(b'', final=True) - if output: - yield output - - -def iter_encode(input, encoding=UTF8, errors='strict'): - """ - “Pull”-based encoder. - - :param input: An iterable of Unicode strings. - :param encoding: An :class:`Encoding` object or a label string. - :param errors: Type of error handling. See :func:`codecs.register`. - :raises: :exc:`~exceptions.LookupError` for an unknown encoding label. - :returns: An iterable of byte strings. - - """ - # Fail early if `encoding` is an invalid label. - encode = IncrementalEncoder(encoding, errors).encode - return _iter_encode_generator(input, encode) - - -def _iter_encode_generator(input, encode): - for chunck in input: - output = encode(chunck) - if output: - yield output - output = encode('', final=True) - if output: - yield output - - -class IncrementalDecoder(object): - """ - “Push”-based decoder. - - :param fallback_encoding: - An :class:`Encoding` object or a label string. - The encoding to use if :obj:`input` does note have a BOM. - :param errors: Type of error handling. See :func:`codecs.register`. - :raises: :exc:`~exceptions.LookupError` for an unknown encoding label. - - """ - def __init__(self, fallback_encoding, errors='replace'): - # Fail early if `encoding` is an invalid label. - self._fallback_encoding = _get_encoding(fallback_encoding) - self._errors = errors - self._buffer = b'' - self._decoder = None - #: The actual :class:`Encoding` that is being used, - #: or :obj:`None` if that is not determined yet. - #: (Ie. if there is not enough input yet to determine - #: if there is a BOM.) - self.encoding = None # Not known yet. - - def decode(self, input, final=False): - """Decode one chunk of the input. - - :param input: A byte string. - :param final: - Indicate that no more input is available. - Must be :obj:`True` if this is the last call. - :returns: An Unicode string. - - """ - decoder = self._decoder - if decoder is not None: - return decoder(input, final) - - input = self._buffer + input - encoding, input = _detect_bom(input) - if encoding is None: - if len(input) < 3 and not final: # Not enough data yet. - self._buffer = input - return '' - else: # No BOM - encoding = self._fallback_encoding - decoder = encoding.codec_info.incrementaldecoder(self._errors).decode - self._decoder = decoder - self.encoding = encoding - return decoder(input, final) - - -class IncrementalEncoder(object): - """ - “Push”-based encoder. - - :param encoding: An :class:`Encoding` object or a label string. - :param errors: Type of error handling. See :func:`codecs.register`. - :raises: :exc:`~exceptions.LookupError` for an unknown encoding label. - - .. method:: encode(input, final=False) - - :param input: An Unicode string. - :param final: - Indicate that no more input is available. - Must be :obj:`True` if this is the last call. - :returns: A byte string. - - """ - def __init__(self, encoding=UTF8, errors='strict'): - encoding = _get_encoding(encoding) - self.encode = encoding.codec_info.incrementalencoder(errors).encode diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/webencodings/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/webencodings/__init__.pyc deleted file mode 100644 index 788dd3adf6ee0f0b7ea1fce410e51971e2dcea8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12364 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 IZ0f`R1&#}}bN~PV diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/webencodings/labels.py b/venv/lib/python2.7/site-packages/pip/_vendor/webencodings/labels.py deleted file mode 100644 index 29cbf91..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/webencodings/labels.py +++ /dev/null @@ -1,231 +0,0 @@ -""" - - webencodings.labels - ~~~~~~~~~~~~~~~~~~~ - - Map encoding labels to their name. - - :copyright: Copyright 2012 by Simon Sapin - :license: BSD, see LICENSE for details. - -""" - -# XXX Do not edit! -# This file is automatically generated by mklabels.py - -LABELS = { - 'unicode-1-1-utf-8': 'utf-8', - 'utf-8': 'utf-8', - 'utf8': 'utf-8', - '866': 'ibm866', - 'cp866': 'ibm866', - 'csibm866': 'ibm866', - 'ibm866': 'ibm866', - 'csisolatin2': 'iso-8859-2', - 'iso-8859-2': 'iso-8859-2', - 'iso-ir-101': 'iso-8859-2', - 'iso8859-2': 'iso-8859-2', - 'iso88592': 'iso-8859-2', - 'iso_8859-2': 'iso-8859-2', - 'iso_8859-2:1987': 'iso-8859-2', - 'l2': 'iso-8859-2', - 'latin2': 'iso-8859-2', - 'csisolatin3': 'iso-8859-3', - 'iso-8859-3': 'iso-8859-3', - 'iso-ir-109': 'iso-8859-3', - 'iso8859-3': 'iso-8859-3', - 'iso88593': 'iso-8859-3', - 'iso_8859-3': 'iso-8859-3', - 'iso_8859-3:1988': 'iso-8859-3', - 'l3': 'iso-8859-3', - 'latin3': 'iso-8859-3', - 'csisolatin4': 'iso-8859-4', - 'iso-8859-4': 'iso-8859-4', - 'iso-ir-110': 'iso-8859-4', - 'iso8859-4': 'iso-8859-4', - 'iso88594': 'iso-8859-4', - 'iso_8859-4': 'iso-8859-4', - 'iso_8859-4:1988': 'iso-8859-4', - 'l4': 'iso-8859-4', - 'latin4': 'iso-8859-4', - 'csisolatincyrillic': 'iso-8859-5', - 'cyrillic': 'iso-8859-5', - 'iso-8859-5': 'iso-8859-5', - 'iso-ir-144': 'iso-8859-5', - 'iso8859-5': 'iso-8859-5', - 'iso88595': 'iso-8859-5', - 'iso_8859-5': 'iso-8859-5', - 'iso_8859-5:1988': 'iso-8859-5', - 'arabic': 'iso-8859-6', - 'asmo-708': 'iso-8859-6', - 'csiso88596e': 'iso-8859-6', - 'csiso88596i': 'iso-8859-6', - 'csisolatinarabic': 'iso-8859-6', - 'ecma-114': 'iso-8859-6', - 'iso-8859-6': 'iso-8859-6', - 'iso-8859-6-e': 'iso-8859-6', - 'iso-8859-6-i': 'iso-8859-6', - 'iso-ir-127': 'iso-8859-6', - 'iso8859-6': 'iso-8859-6', - 'iso88596': 'iso-8859-6', - 'iso_8859-6': 'iso-8859-6', - 'iso_8859-6:1987': 'iso-8859-6', - 'csisolatingreek': 'iso-8859-7', - 'ecma-118': 'iso-8859-7', - 'elot_928': 'iso-8859-7', - 'greek': 'iso-8859-7', - 'greek8': 'iso-8859-7', - 'iso-8859-7': 'iso-8859-7', - 'iso-ir-126': 'iso-8859-7', - 'iso8859-7': 'iso-8859-7', - 'iso88597': 'iso-8859-7', - 'iso_8859-7': 'iso-8859-7', - 'iso_8859-7:1987': 'iso-8859-7', - 'sun_eu_greek': 'iso-8859-7', - 'csiso88598e': 'iso-8859-8', - 'csisolatinhebrew': 'iso-8859-8', - 'hebrew': 'iso-8859-8', - 'iso-8859-8': 'iso-8859-8', - 'iso-8859-8-e': 'iso-8859-8', - 'iso-ir-138': 'iso-8859-8', - 'iso8859-8': 'iso-8859-8', - 'iso88598': 'iso-8859-8', - 'iso_8859-8': 'iso-8859-8', - 'iso_8859-8:1988': 'iso-8859-8', - 'visual': 'iso-8859-8', - 'csiso88598i': 'iso-8859-8-i', - 'iso-8859-8-i': 'iso-8859-8-i', - 'logical': 'iso-8859-8-i', - 'csisolatin6': 'iso-8859-10', - 'iso-8859-10': 'iso-8859-10', - 'iso-ir-157': 'iso-8859-10', - 'iso8859-10': 'iso-8859-10', - 'iso885910': 'iso-8859-10', - 'l6': 'iso-8859-10', - 'latin6': 'iso-8859-10', - 'iso-8859-13': 'iso-8859-13', - 'iso8859-13': 'iso-8859-13', - 'iso885913': 'iso-8859-13', - 'iso-8859-14': 'iso-8859-14', - 'iso8859-14': 'iso-8859-14', - 'iso885914': 'iso-8859-14', - 'csisolatin9': 'iso-8859-15', - 'iso-8859-15': 'iso-8859-15', - 'iso8859-15': 'iso-8859-15', - 'iso885915': 'iso-8859-15', - 'iso_8859-15': 'iso-8859-15', - 'l9': 'iso-8859-15', - 'iso-8859-16': 'iso-8859-16', - 'cskoi8r': 'koi8-r', - 'koi': 'koi8-r', - 'koi8': 'koi8-r', - 'koi8-r': 'koi8-r', - 'koi8_r': 'koi8-r', - 'koi8-u': 'koi8-u', - 'csmacintosh': 'macintosh', - 'mac': 'macintosh', - 'macintosh': 'macintosh', - 'x-mac-roman': 'macintosh', - 'dos-874': 'windows-874', - 'iso-8859-11': 'windows-874', - 'iso8859-11': 'windows-874', - 'iso885911': 'windows-874', - 'tis-620': 'windows-874', - 'windows-874': 'windows-874', - 'cp1250': 'windows-1250', - 'windows-1250': 'windows-1250', - 'x-cp1250': 'windows-1250', - 'cp1251': 'windows-1251', - 'windows-1251': 'windows-1251', - 'x-cp1251': 'windows-1251', - 'ansi_x3.4-1968': 'windows-1252', - 'ascii': 'windows-1252', - 'cp1252': 'windows-1252', - 'cp819': 'windows-1252', - 'csisolatin1': 'windows-1252', - 'ibm819': 'windows-1252', - 'iso-8859-1': 'windows-1252', - 'iso-ir-100': 'windows-1252', - 'iso8859-1': 'windows-1252', - 'iso88591': 'windows-1252', - 'iso_8859-1': 'windows-1252', - 'iso_8859-1:1987': 'windows-1252', - 'l1': 'windows-1252', - 'latin1': 'windows-1252', - 'us-ascii': 'windows-1252', - 'windows-1252': 'windows-1252', - 'x-cp1252': 'windows-1252', - 'cp1253': 'windows-1253', - 'windows-1253': 'windows-1253', - 'x-cp1253': 'windows-1253', - 'cp1254': 'windows-1254', - 'csisolatin5': 'windows-1254', - 'iso-8859-9': 'windows-1254', - 'iso-ir-148': 'windows-1254', - 'iso8859-9': 'windows-1254', - 'iso88599': 'windows-1254', - 'iso_8859-9': 'windows-1254', - 'iso_8859-9:1989': 'windows-1254', - 'l5': 'windows-1254', - 'latin5': 'windows-1254', - 'windows-1254': 'windows-1254', - 'x-cp1254': 'windows-1254', - 'cp1255': 'windows-1255', - 'windows-1255': 'windows-1255', - 'x-cp1255': 'windows-1255', - 'cp1256': 'windows-1256', - 'windows-1256': 'windows-1256', - 'x-cp1256': 'windows-1256', - 'cp1257': 'windows-1257', - 'windows-1257': 'windows-1257', - 'x-cp1257': 'windows-1257', - 'cp1258': 'windows-1258', - 'windows-1258': 'windows-1258', - 'x-cp1258': 'windows-1258', - 'x-mac-cyrillic': 'x-mac-cyrillic', - 'x-mac-ukrainian': 'x-mac-cyrillic', - 'chinese': 'gbk', - 'csgb2312': 'gbk', - 'csiso58gb231280': 'gbk', - 'gb2312': 'gbk', - 'gb_2312': 'gbk', - 'gb_2312-80': 'gbk', - 'gbk': 'gbk', - 'iso-ir-58': 'gbk', - 'x-gbk': 'gbk', - 'gb18030': 'gb18030', - 'hz-gb-2312': 'hz-gb-2312', - 'big5': 'big5', - 'big5-hkscs': 'big5', - 'cn-big5': 'big5', - 'csbig5': 'big5', - 'x-x-big5': 'big5', - 'cseucpkdfmtjapanese': 'euc-jp', - 'euc-jp': 'euc-jp', - 'x-euc-jp': 'euc-jp', - 'csiso2022jp': 'iso-2022-jp', - 'iso-2022-jp': 'iso-2022-jp', - 'csshiftjis': 'shift_jis', - 'ms_kanji': 'shift_jis', - 'shift-jis': 'shift_jis', - 'shift_jis': 'shift_jis', - 'sjis': 'shift_jis', - 'windows-31j': 'shift_jis', - 'x-sjis': 'shift_jis', - 'cseuckr': 'euc-kr', - 'csksc56011987': 'euc-kr', - 'euc-kr': 'euc-kr', - 'iso-ir-149': 'euc-kr', - 'korean': 'euc-kr', - 'ks_c_5601-1987': 'euc-kr', - 'ks_c_5601-1989': 'euc-kr', - 'ksc5601': 'euc-kr', - 'ksc_5601': 'euc-kr', - 'windows-949': 'euc-kr', - 'csiso2022kr': 'iso-2022-kr', - 'iso-2022-kr': 'iso-2022-kr', - 'utf-16be': 'utf-16be', - 'utf-16': 'utf-16le', - 'utf-16le': 'utf-16le', - 'x-user-defined': 'x-user-defined', -} diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/webencodings/labels.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/webencodings/labels.pyc deleted file mode 100644 index cf8bd69746e986b4d90a48c82668ce7892431ef6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5361 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 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/webencodings/mklabels.py b/venv/lib/python2.7/site-packages/pip/_vendor/webencodings/mklabels.py deleted file mode 100644 index 295dc92..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/webencodings/mklabels.py +++ /dev/null @@ -1,59 +0,0 @@ -""" - - webencodings.mklabels - ~~~~~~~~~~~~~~~~~~~~~ - - Regenarate the webencodings.labels module. - - :copyright: Copyright 2012 by Simon Sapin - :license: BSD, see LICENSE for details. - -""" - -import json -try: - from urllib import urlopen -except ImportError: - from urllib.request import urlopen - - -def assert_lower(string): - assert string == string.lower() - return string - - -def generate(url): - parts = ['''\ -""" - - webencodings.labels - ~~~~~~~~~~~~~~~~~~~ - - Map encoding labels to their name. - - :copyright: Copyright 2012 by Simon Sapin - :license: BSD, see LICENSE for details. - -""" - -# XXX Do not edit! -# This file is automatically generated by mklabels.py - -LABELS = { -'''] - labels = [ - (repr(assert_lower(label)).lstrip('u'), - repr(encoding['name']).lstrip('u')) - for category in json.loads(urlopen(url).read().decode('ascii')) - for encoding in category['encodings'] - for label in encoding['labels']] - max_len = max(len(label) for label, name in labels) - parts.extend( - ' %s:%s %s,\n' % (label, ' ' * (max_len - len(label)), name) - for label, name in labels) - parts.append('}') - return ''.join(parts) - - -if __name__ == '__main__': - print(generate('http://encoding.spec.whatwg.org/encodings.json')) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/webencodings/mklabels.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/webencodings/mklabels.pyc deleted file mode 100644 index cb849407e1b3f42c9ce7313d2d72700f8dd1fa78..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2486 zcmd5;{Z1Q45TCuX4L%4`Q$#_k)P*RLrII@!5o#?OH38Jp5>(kyi%{t4xLcbu=iBq{ z@?nZAwW<2?T78c`MIWG@*~1BuqWo9Um3MA;_G|VxznQiB_Z{!!pJonYxGq)vevVaN zqDTM^P%=my$QT?j7|z<R3z-9b7Y<xt-{p%?5fwP`K<xlyjOOEn>UcuVU_YtAFSuC^ zlB#V?fS81&1}6@vGY}JyOu$P9UwoP4c@DH2lVro6C_Im2ITuGFk7bhPUG4Wzvgk-; z+K&AAwo)!?iLS^a6&b<Jv3PTjatGd*$!RA1a(*+G#ZaZ)W7FiD<0fBQSzY5tL*7pN zGUx56NOOB|GfQKUYtiIS+gr<A3&D4HHn;cM+q@$cPlSomOykz+KUnq}3@>9QP@Jkv z7I+&{P<60wV$~m_xU#<<z)K)-^gI{_KQq#|?G}3tns3NYnLHQD%wX$@*4RpAzO9s0 z<xw@%Yoidc2DZQoZLk#-Dm_C`g0n~k9hoIU>EQAr7(P@-`T5D}`XFCfSC7`?PxQs7 z$)#Gs(k+7LL6H^@(p;M;%O053XWj4{QrQ}wi9C@ixap^0>?gk%nrS>ZvQ~!H>{;yV z3JPHJ%tAr-lGk0V`Y#m7qb`FHO1v*XkAZOr2jof5C471n;tF>0w{`deMmX#c_ZGGe zzlM<uS1us&u-Al9g)lQUxT;*Q=ppH<)J8o`tib~9Jl1v`_`U*zuVAnN10P1X7#TZ3 z?7gbOR(a|l*ugb*_zj?gw4a1uZw@mW^dPCzF)Z<*H%0TY({4=R4fpi>NPwlKrMHm$ z-4rhuJc|lG4hw$GXd{X2sp5Im|Bs1n4Zp|t_xJgh<he9lB&k{S?(yfxspg$D6CA(M zsgeE2q%rbl$T1`Zg=9i8b%P<ExBKMj_HLVh#((fEy(1l`si`AQ<2!2fAJX0iKZXT{ zk|7GwO=Id3bu4}Gs~1rqTMj>f7Y?xq*?}x7;s2Hm(BrQ|iWVDMnTfnXUt}79zfy)7 zo!25e{s)1i$&L*I@uE<V*RZ3>)Ec}3fKtpu(yyZ+0G3|^fLBHUFtC2NAytAgKZ{Y* zabd1Rg|e>&krE5#-ut?FU!z?1EatpSWi1bf?Zg&QxkUk9f@HxYEBetzNPuD!GZBj0 z$UJWX_J~ZefH8ZS5t#)IGTu_Dr)6F`T}Fv+(V*2U5ha#<iNIG#T<Z$eBL0=Eq+DBA z65+kAN?aJsinbXQnDLYH2$|*$;<25JkAXd}h?LQoVE|$bj;>Tg+Zi*zgqJ`qIY=0{ z$U(P;t2J*N%nM}6916HwcU-5zX4oE^V>LF-rq~^3=Z0ZFO7k$(K2AF}rf3Gi_<FuB zMC_j*N9MfiOVxcfpndX4gGg`R&M-`59EPp;NI@VXepz}{I*NF>(=Vhl_8GJ<V>#|C zF*p_4Sa-EPqQwMt7*gs8!xB?e-1aL;Ms1Y;NgmT}^j#D+XPUWe7IB<)>(%<=H2W90 CS7kl` diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/webencodings/tests.py b/venv/lib/python2.7/site-packages/pip/_vendor/webencodings/tests.py deleted file mode 100644 index e12c10d..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/webencodings/tests.py +++ /dev/null @@ -1,153 +0,0 @@ -# coding: utf-8 -""" - - webencodings.tests - ~~~~~~~~~~~~~~~~~~ - - A basic test suite for Encoding. - - :copyright: Copyright 2012 by Simon Sapin - :license: BSD, see LICENSE for details. - -""" - -from __future__ import unicode_literals - -from . import (lookup, LABELS, decode, encode, iter_decode, iter_encode, - IncrementalDecoder, IncrementalEncoder, UTF8) - - -def assert_raises(exception, function, *args, **kwargs): - try: - function(*args, **kwargs) - except exception: - return - else: # pragma: no cover - raise AssertionError('Did not raise %s.' % exception) - - -def test_labels(): - assert lookup('utf-8').name == 'utf-8' - assert lookup('Utf-8').name == 'utf-8' - assert lookup('UTF-8').name == 'utf-8' - assert lookup('utf8').name == 'utf-8' - assert lookup('utf8').name == 'utf-8' - assert lookup('utf8 ').name == 'utf-8' - assert lookup(' \r\nutf8\t').name == 'utf-8' - assert lookup('u8') is None # Python label. - assert lookup('utf-8 ') is None # Non-ASCII white space. - - assert lookup('US-ASCII').name == 'windows-1252' - assert lookup('iso-8859-1').name == 'windows-1252' - assert lookup('latin1').name == 'windows-1252' - assert lookup('LATIN1').name == 'windows-1252' - assert lookup('latin-1') is None - assert lookup('LATİN1') is None # ASCII-only case insensitivity. - - -def test_all_labels(): - for label in LABELS: - assert decode(b'', label) == ('', lookup(label)) - assert encode('', label) == b'' - for repeat in [0, 1, 12]: - output, _ = iter_decode([b''] * repeat, label) - assert list(output) == [] - assert list(iter_encode([''] * repeat, label)) == [] - decoder = IncrementalDecoder(label) - assert decoder.decode(b'') == '' - assert decoder.decode(b'', final=True) == '' - encoder = IncrementalEncoder(label) - assert encoder.encode('') == b'' - assert encoder.encode('', final=True) == b'' - # All encoding names are valid labels too: - for name in set(LABELS.values()): - assert lookup(name).name == name - - -def test_invalid_label(): - assert_raises(LookupError, decode, b'\xEF\xBB\xBF\xc3\xa9', 'invalid') - assert_raises(LookupError, encode, 'é', 'invalid') - assert_raises(LookupError, iter_decode, [], 'invalid') - assert_raises(LookupError, iter_encode, [], 'invalid') - assert_raises(LookupError, IncrementalDecoder, 'invalid') - assert_raises(LookupError, IncrementalEncoder, 'invalid') - - -def test_decode(): - assert decode(b'\x80', 'latin1') == ('€', lookup('latin1')) - assert decode(b'\x80', lookup('latin1')) == ('€', lookup('latin1')) - assert decode(b'\xc3\xa9', 'utf8') == ('é', lookup('utf8')) - assert decode(b'\xc3\xa9', UTF8) == ('é', lookup('utf8')) - assert decode(b'\xc3\xa9', 'ascii') == ('é', lookup('ascii')) - assert decode(b'\xEF\xBB\xBF\xc3\xa9', 'ascii') == ('é', lookup('utf8')) # UTF-8 with BOM - - assert decode(b'\xFE\xFF\x00\xe9', 'ascii') == ('é', lookup('utf-16be')) # UTF-16-BE with BOM - assert decode(b'\xFF\xFE\xe9\x00', 'ascii') == ('é', lookup('utf-16le')) # UTF-16-LE with BOM - assert decode(b'\xFE\xFF\xe9\x00', 'ascii') == ('\ue900', lookup('utf-16be')) - assert decode(b'\xFF\xFE\x00\xe9', 'ascii') == ('\ue900', lookup('utf-16le')) - - assert decode(b'\x00\xe9', 'UTF-16BE') == ('é', lookup('utf-16be')) - assert decode(b'\xe9\x00', 'UTF-16LE') == ('é', lookup('utf-16le')) - assert decode(b'\xe9\x00', 'UTF-16') == ('é', lookup('utf-16le')) - - assert decode(b'\xe9\x00', 'UTF-16BE') == ('\ue900', lookup('utf-16be')) - assert decode(b'\x00\xe9', 'UTF-16LE') == ('\ue900', lookup('utf-16le')) - assert decode(b'\x00\xe9', 'UTF-16') == ('\ue900', lookup('utf-16le')) - - -def test_encode(): - assert encode('é', 'latin1') == b'\xe9' - assert encode('é', 'utf8') == b'\xc3\xa9' - assert encode('é', 'utf8') == b'\xc3\xa9' - assert encode('é', 'utf-16') == b'\xe9\x00' - assert encode('é', 'utf-16le') == b'\xe9\x00' - assert encode('é', 'utf-16be') == b'\x00\xe9' - - -def test_iter_decode(): - def iter_decode_to_string(input, fallback_encoding): - output, _encoding = iter_decode(input, fallback_encoding) - return ''.join(output) - assert iter_decode_to_string([], 'latin1') == '' - assert iter_decode_to_string([b''], 'latin1') == '' - assert iter_decode_to_string([b'\xe9'], 'latin1') == 'é' - assert iter_decode_to_string([b'hello'], 'latin1') == 'hello' - assert iter_decode_to_string([b'he', b'llo'], 'latin1') == 'hello' - assert iter_decode_to_string([b'hell', b'o'], 'latin1') == 'hello' - assert iter_decode_to_string([b'\xc3\xa9'], 'latin1') == 'é' - assert iter_decode_to_string([b'\xEF\xBB\xBF\xc3\xa9'], 'latin1') == 'é' - assert iter_decode_to_string([ - b'\xEF\xBB\xBF', b'\xc3', b'\xa9'], 'latin1') == 'é' - assert iter_decode_to_string([ - b'\xEF\xBB\xBF', b'a', b'\xc3'], 'latin1') == 'a\uFFFD' - assert iter_decode_to_string([ - b'', b'\xEF', b'', b'', b'\xBB\xBF\xc3', b'\xa9'], 'latin1') == 'é' - assert iter_decode_to_string([b'\xEF\xBB\xBF'], 'latin1') == '' - assert iter_decode_to_string([b'\xEF\xBB'], 'latin1') == 'ï»' - assert iter_decode_to_string([b'\xFE\xFF\x00\xe9'], 'latin1') == 'é' - assert iter_decode_to_string([b'\xFF\xFE\xe9\x00'], 'latin1') == 'é' - assert iter_decode_to_string([ - b'', b'\xFF', b'', b'', b'\xFE\xe9', b'\x00'], 'latin1') == 'é' - assert iter_decode_to_string([ - b'', b'h\xe9', b'llo'], 'x-user-defined') == 'h\uF7E9llo' - - -def test_iter_encode(): - assert b''.join(iter_encode([], 'latin1')) == b'' - assert b''.join(iter_encode([''], 'latin1')) == b'' - assert b''.join(iter_encode(['é'], 'latin1')) == b'\xe9' - assert b''.join(iter_encode(['', 'é', '', ''], 'latin1')) == b'\xe9' - assert b''.join(iter_encode(['', 'é', '', ''], 'utf-16')) == b'\xe9\x00' - assert b''.join(iter_encode(['', 'é', '', ''], 'utf-16le')) == b'\xe9\x00' - assert b''.join(iter_encode(['', 'é', '', ''], 'utf-16be')) == b'\x00\xe9' - assert b''.join(iter_encode([ - '', 'h\uF7E9', '', 'llo'], 'x-user-defined')) == b'h\xe9llo' - - -def test_x_user_defined(): - encoded = b'2,\x0c\x0b\x1aO\xd9#\xcb\x0f\xc9\xbbt\xcf\xa8\xca' - decoded = '2,\x0c\x0b\x1aO\uf7d9#\uf7cb\x0f\uf7c9\uf7bbt\uf7cf\uf7a8\uf7ca' - encoded = b'aa' - decoded = 'aa' - assert decode(encoded, 'x-user-defined') == (decoded, lookup('x-user-defined')) - assert encode(decoded, 'x-user-defined') == encoded diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/webencodings/tests.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/webencodings/tests.pyc deleted file mode 100644 index e31691bc74b6b44b88fcf530ee6390837fd6de0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7341 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 VcEw&!B$LU#_#~6V_#RC5{|97d6Dj}z diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/webencodings/x_user_defined.py b/venv/lib/python2.7/site-packages/pip/_vendor/webencodings/x_user_defined.py deleted file mode 100644 index d16e326..0000000 --- a/venv/lib/python2.7/site-packages/pip/_vendor/webencodings/x_user_defined.py +++ /dev/null @@ -1,325 +0,0 @@ -# coding: utf-8 -""" - - webencodings.x_user_defined - ~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - An implementation of the x-user-defined encoding. - - :copyright: Copyright 2012 by Simon Sapin - :license: BSD, see LICENSE for details. - -""" - -from __future__ import unicode_literals - -import codecs - - -### Codec APIs - -class Codec(codecs.Codec): - - def encode(self, input, errors='strict'): - return codecs.charmap_encode(input, errors, encoding_table) - - def decode(self, input, errors='strict'): - return codecs.charmap_decode(input, errors, decoding_table) - - -class IncrementalEncoder(codecs.IncrementalEncoder): - def encode(self, input, final=False): - return codecs.charmap_encode(input, self.errors, encoding_table)[0] - - -class IncrementalDecoder(codecs.IncrementalDecoder): - def decode(self, input, final=False): - return codecs.charmap_decode(input, self.errors, decoding_table)[0] - - -class StreamWriter(Codec, codecs.StreamWriter): - pass - - -class StreamReader(Codec, codecs.StreamReader): - pass - - -### encodings module API - -codec_info = codecs.CodecInfo( - name='x-user-defined', - encode=Codec().encode, - decode=Codec().decode, - incrementalencoder=IncrementalEncoder, - incrementaldecoder=IncrementalDecoder, - streamreader=StreamReader, - streamwriter=StreamWriter, -) - - -### Decoding Table - -# Python 3: -# for c in range(256): print(' %r' % chr(c if c < 128 else c + 0xF700)) -decoding_table = ( - '\x00' - '\x01' - '\x02' - '\x03' - '\x04' - '\x05' - '\x06' - '\x07' - '\x08' - '\t' - '\n' - '\x0b' - '\x0c' - '\r' - '\x0e' - '\x0f' - '\x10' - '\x11' - '\x12' - '\x13' - '\x14' - '\x15' - '\x16' - '\x17' - '\x18' - '\x19' - '\x1a' - '\x1b' - '\x1c' - '\x1d' - '\x1e' - '\x1f' - ' ' - '!' - '"' - '#' - '$' - '%' - '&' - "'" - '(' - ')' - '*' - '+' - ',' - '-' - '.' - '/' - '0' - '1' - '2' - '3' - '4' - '5' - '6' - '7' - '8' - '9' - ':' - ';' - '<' - '=' - '>' - '?' - '@' - 'A' - 'B' - 'C' - 'D' - 'E' - 'F' - 'G' - 'H' - 'I' - 'J' - 'K' - 'L' - 'M' - 'N' - 'O' - 'P' - 'Q' - 'R' - 'S' - 'T' - 'U' - 'V' - 'W' - 'X' - 'Y' - 'Z' - '[' - '\\' - ']' - '^' - '_' - '`' - 'a' - 'b' - 'c' - 'd' - 'e' - 'f' - 'g' - 'h' - 'i' - 'j' - 'k' - 'l' - 'm' - 'n' - 'o' - 'p' - 'q' - 'r' - 's' - 't' - 'u' - 'v' - 'w' - 'x' - 'y' - 'z' - '{' - '|' - '}' - '~' - '\x7f' - '\uf780' - '\uf781' - '\uf782' - '\uf783' - '\uf784' - '\uf785' - '\uf786' - '\uf787' - '\uf788' - '\uf789' - '\uf78a' - '\uf78b' - '\uf78c' - '\uf78d' - '\uf78e' - '\uf78f' - '\uf790' - '\uf791' - '\uf792' - '\uf793' - '\uf794' - '\uf795' - '\uf796' - '\uf797' - '\uf798' - '\uf799' - '\uf79a' - '\uf79b' - '\uf79c' - '\uf79d' - '\uf79e' - '\uf79f' - '\uf7a0' - '\uf7a1' - '\uf7a2' - '\uf7a3' - '\uf7a4' - '\uf7a5' - '\uf7a6' - '\uf7a7' - '\uf7a8' - '\uf7a9' - '\uf7aa' - '\uf7ab' - '\uf7ac' - '\uf7ad' - '\uf7ae' - '\uf7af' - '\uf7b0' - '\uf7b1' - '\uf7b2' - '\uf7b3' - '\uf7b4' - '\uf7b5' - '\uf7b6' - '\uf7b7' - '\uf7b8' - '\uf7b9' - '\uf7ba' - '\uf7bb' - '\uf7bc' - '\uf7bd' - '\uf7be' - '\uf7bf' - '\uf7c0' - '\uf7c1' - '\uf7c2' - '\uf7c3' - '\uf7c4' - '\uf7c5' - '\uf7c6' - '\uf7c7' - '\uf7c8' - '\uf7c9' - '\uf7ca' - '\uf7cb' - '\uf7cc' - '\uf7cd' - '\uf7ce' - '\uf7cf' - '\uf7d0' - '\uf7d1' - '\uf7d2' - '\uf7d3' - '\uf7d4' - '\uf7d5' - '\uf7d6' - '\uf7d7' - '\uf7d8' - '\uf7d9' - '\uf7da' - '\uf7db' - '\uf7dc' - '\uf7dd' - '\uf7de' - '\uf7df' - '\uf7e0' - '\uf7e1' - '\uf7e2' - '\uf7e3' - '\uf7e4' - '\uf7e5' - '\uf7e6' - '\uf7e7' - '\uf7e8' - '\uf7e9' - '\uf7ea' - '\uf7eb' - '\uf7ec' - '\uf7ed' - '\uf7ee' - '\uf7ef' - '\uf7f0' - '\uf7f1' - '\uf7f2' - '\uf7f3' - '\uf7f4' - '\uf7f5' - '\uf7f6' - '\uf7f7' - '\uf7f8' - '\uf7f9' - '\uf7fa' - '\uf7fb' - '\uf7fc' - '\uf7fd' - '\uf7fe' - '\uf7ff' -) - -### Encoding table -encoding_table = codecs.charmap_build(decoding_table) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/webencodings/x_user_defined.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/webencodings/x_user_defined.pyc deleted file mode 100644 index 9e13e78cf37c1b4c7290fb6a57abb44c1b3e5256..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3842 zcmdT`>0=XB5PwP9^q?)bSVdSBwF)KRfl^U{0*Xh~4T@ATrrDRWxY@+r4Ya5Tl=}t& z?-_5oJU~%y{|f((`QRUbGcU9$s9*e2-1NQ9d$VtL-pp@~#GlQL(>J!P%&Du-X#PK6 z#Z{<cN;yh(^Bhx7TzN57h^y|nipe^myoBmbD5pm0gj!vr^1NBAHY+ut)QavJ<s=QG z)-dXZ7`4i&H;klVGz>A4%4t-(BCSs4<H{K|#H&+I(;%<j@S2Bs6=@C1X;IE-<&2T{ zScTP%${9OIk5bM!rTNq2mFDkEP`X|@6P2#xH|x5alyj5nZZ=xADBY|EVyc@(B~-d? z5?iDE2TzTS7C&oskM?s#$Mt)|nSGgZsDq57^RBNQ!(adJPes52-*O8jPZzWwWh1xf zTgAK;t<qLsy9jH)D$E-E%FN2Kj$E<SAGp1%q7JKbkhJcfHT!<6r{7Au1s0UfmR#Rx z(c!r{?T5O<T9{rm!wR*wo?Y6xxGTNb$`=F6(NWg*LKf{_;irxLtfDb;QQzge>5S(_ zI>>rqS5(WpoxGJBf=8Tp779EpCN#r?-EI)FnT^IyV>+&cPAEIwmf)AlNuI(eaC1>k z)-q~%bc&SmOhoLhn0kl*;wp-(0kOO2)MbuGa$MBPg;9%;tFl2MTgn&<X|pwGtW1>c z@pR>sd?D0c-dw@;OXbK2(m_xR!Zv0qGllDzN|ge4O*Yc0HQ6AQFM5s+!qmFHRR04( zkH7ZK*>m3VXUz#7oRfPb?3?SX3uf`tTS_fUmE2Oh>xWU+^V*}?&-G?rkS#MZYqaka zgVb=uq^?EG%u;_vCqa}Jq=jN#75gt{vgPPC24ah`ShHnF#_TWy+2UGTY-`u?bYoeh zqWUeY*Hw$Oi94fuo-!FfThN(I)MyrkqEq&GX$#LD#Z&brh8kf9+XCc?JVLoaGTxMk z#xb$f&jpnn;4L=Z5B?rt6ZpMKfN2v~LqR1X{|*tcRyC41q&S!o5=@+}Thna<k1m%d zWo&8SVoN9*_uHbK37je}OyqEC%X(Flj<hw!%Tsv_hlSlFw`k_cXuO0Imo{*ys(nKs zL6X;$LEV$F>v6EigzL!Qpg}AsX~34Kx()}nbOcpfjx+=$#;5W4X9(C*$8N+tFqZYY zb5L#ezJN9z1v*<;9!R+zihqf2Q(y(_mH6jE%Cs^uTt$1;C59SlzerjWMT}prxuC7H zTv7k`7nD|I#;^-Y%9L7EmcYKYeXCX@6Xk9-+gG}l;QH-K!3zv3xK(0Q@L;12+gNL0 zQs$<KJA`<mrZ!nu-_SU!skvqJn6cx=PndYqq?=oBxpnewQ>I$C-*M-(yY9ZH?cV#Q z&uE{S;x_St2OpaA@FR0O9-a5t<4??Au&{H{;w4W$we;y{o_((C`4?Wa)5~6ZdHE|V zx?g>5<?ER@vOPI&M0;1ctKakrezEjc5Ju%SYy0}wz5UL+>)#{TK(LWu6Ttw%W`ZpQ zTM4!iY$w=3u#;dH!ES;*1bYeg5$q>8KyZ-YeS$*-hY5}ld_eFa!AAri6MRDODZyt1 zK!60F6MRANCBat&UlV*o@GZf21V;&u5gaEtL2#1bdx9SbekAyb;1t1Wf}aU~Avi<u zE5UCBX9>;`oF}+IaFO5=!DWKq2{#aKB-}(eK)9K33*lD6ZG_ticM$F*+(o#Xa1Y^L z!hMAM2@en+Bz&Ln5aD6MBZMCien|Kc;m3rZ5PnMd86glN;pc>35PnJc72(%}-w=LF z_#NR<!efNT2~QB7B>bN62f`l-e<D0Zc$)BM!e0o_5dKQ|8{t{PbA;y!FA!cNyhM1J z@b@-Ja*^cgOvWkZhMJ*#IVuOz3^7MlD!gP9TL5ZH0<tAYZPRm0$~T?;Qa@iDhF2*7 zrrXZA!jNSowRN!V?kT&TQ)w4?_r|FUra7EfX$K#d<QhtmNXEy+n`&DdT5DTtC)Z3) THpG&#CjKSOuc0A%Mb-QT=>b}- diff --git a/venv/lib/python2.7/site-packages/pkg_resources/__init__.py b/venv/lib/python2.7/site-packages/pkg_resources/__init__.py deleted file mode 100644 index 97e08d6..0000000 --- a/venv/lib/python2.7/site-packages/pkg_resources/__init__.py +++ /dev/null @@ -1,3286 +0,0 @@ -# coding: utf-8 -""" -Package resource API --------------------- - -A resource is a logical file contained within a package, or a logical -subdirectory thereof. The package resource API expects resource names -to have their path parts separated with ``/``, *not* whatever the local -path separator is. Do not use os.path operations to manipulate resource -names being passed into the API. - -The package resource API is designed to work with normal filesystem packages, -.egg files, and unpacked .egg files. It can also work in a limited way with -.zip files and with custom PEP 302 loaders that support the ``get_data()`` -method. -""" - -from __future__ import absolute_import - -import sys -import os -import io -import time -import re -import types -import zipfile -import zipimport -import warnings -import stat -import functools -import pkgutil -import operator -import platform -import collections -import plistlib -import email.parser -import errno -import tempfile -import textwrap -import itertools -import inspect -import ntpath -import posixpath -from pkgutil import get_importer - -try: - import _imp -except ImportError: - # Python 3.2 compatibility - import imp as _imp - -try: - FileExistsError -except NameError: - FileExistsError = OSError - -from pkg_resources.extern import six -from pkg_resources.extern.six.moves import urllib, map, filter - -# capture these to bypass sandboxing -from os import utime -try: - from os import mkdir, rename, unlink - WRITE_SUPPORT = True -except ImportError: - # no write support, probably under GAE - WRITE_SUPPORT = False - -from os import open as os_open -from os.path import isdir, split - -try: - import importlib.machinery as importlib_machinery - # access attribute to force import under delayed import mechanisms. - importlib_machinery.__name__ -except ImportError: - importlib_machinery = None - -from . import py31compat -from pkg_resources.extern import appdirs -from pkg_resources.extern import packaging -__import__('pkg_resources.extern.packaging.version') -__import__('pkg_resources.extern.packaging.specifiers') -__import__('pkg_resources.extern.packaging.requirements') -__import__('pkg_resources.extern.packaging.markers') - - -__metaclass__ = type - - -if (3, 0) < sys.version_info < (3, 4): - raise RuntimeError("Python 3.4 or later is required") - -if six.PY2: - # Those builtin exceptions are only defined in Python 3 - PermissionError = None - NotADirectoryError = None - -# declare some globals that will be defined later to -# satisfy the linters. -require = None -working_set = None -add_activation_listener = None -resources_stream = None -cleanup_resources = None -resource_dir = None -resource_stream = None -set_extraction_path = None -resource_isdir = None -resource_string = None -iter_entry_points = None -resource_listdir = None -resource_filename = None -resource_exists = None -_distribution_finders = None -_namespace_handlers = None -_namespace_packages = None - - -class PEP440Warning(RuntimeWarning): - """ - Used when there is an issue with a version or specifier not complying with - PEP 440. - """ - - -def parse_version(v): - try: - return packaging.version.Version(v) - except packaging.version.InvalidVersion: - return packaging.version.LegacyVersion(v) - - -_state_vars = {} - - -def _declare_state(vartype, **kw): - globals().update(kw) - _state_vars.update(dict.fromkeys(kw, vartype)) - - -def __getstate__(): - state = {} - g = globals() - for k, v in _state_vars.items(): - state[k] = g['_sget_' + v](g[k]) - return state - - -def __setstate__(state): - g = globals() - for k, v in state.items(): - g['_sset_' + _state_vars[k]](k, g[k], v) - return state - - -def _sget_dict(val): - return val.copy() - - -def _sset_dict(key, ob, state): - ob.clear() - ob.update(state) - - -def _sget_object(val): - return val.__getstate__() - - -def _sset_object(key, ob, state): - ob.__setstate__(state) - - -_sget_none = _sset_none = lambda *args: None - - -def get_supported_platform(): - """Return this platform's maximum compatible version. - - distutils.util.get_platform() normally reports the minimum version - of Mac OS X that would be required to *use* extensions produced by - distutils. But what we want when checking compatibility is to know the - version of Mac OS X that we are *running*. To allow usage of packages that - explicitly require a newer version of Mac OS X, we must also know the - current version of the OS. - - If this condition occurs for any other platform with a version in its - platform strings, this function should be extended accordingly. - """ - plat = get_build_platform() - m = macosVersionString.match(plat) - if m is not None and sys.platform == "darwin": - try: - plat = 'macosx-%s-%s' % ('.'.join(_macosx_vers()[:2]), m.group(3)) - except ValueError: - # not Mac OS X - pass - return plat - - -__all__ = [ - # Basic resource access and distribution/entry point discovery - 'require', 'run_script', 'get_provider', 'get_distribution', - 'load_entry_point', 'get_entry_map', 'get_entry_info', - 'iter_entry_points', - 'resource_string', 'resource_stream', 'resource_filename', - 'resource_listdir', 'resource_exists', 'resource_isdir', - - # Environmental control - 'declare_namespace', 'working_set', 'add_activation_listener', - 'find_distributions', 'set_extraction_path', 'cleanup_resources', - 'get_default_cache', - - # Primary implementation classes - 'Environment', 'WorkingSet', 'ResourceManager', - 'Distribution', 'Requirement', 'EntryPoint', - - # Exceptions - 'ResolutionError', 'VersionConflict', 'DistributionNotFound', - 'UnknownExtra', 'ExtractionError', - - # Warnings - 'PEP440Warning', - - # Parsing functions and string utilities - 'parse_requirements', 'parse_version', 'safe_name', 'safe_version', - 'get_platform', 'compatible_platforms', 'yield_lines', 'split_sections', - 'safe_extra', 'to_filename', 'invalid_marker', 'evaluate_marker', - - # filesystem utilities - 'ensure_directory', 'normalize_path', - - # Distribution "precedence" constants - 'EGG_DIST', 'BINARY_DIST', 'SOURCE_DIST', 'CHECKOUT_DIST', 'DEVELOP_DIST', - - # "Provider" interfaces, implementations, and registration/lookup APIs - 'IMetadataProvider', 'IResourceProvider', 'FileMetadata', - 'PathMetadata', 'EggMetadata', 'EmptyProvider', 'empty_provider', - 'NullProvider', 'EggProvider', 'DefaultProvider', 'ZipProvider', - 'register_finder', 'register_namespace_handler', 'register_loader_type', - 'fixup_namespace_packages', 'get_importer', - - # Warnings - 'PkgResourcesDeprecationWarning', - - # Deprecated/backward compatibility only - 'run_main', 'AvailableDistributions', -] - - -class ResolutionError(Exception): - """Abstract base for dependency resolution errors""" - - def __repr__(self): - return self.__class__.__name__ + repr(self.args) - - -class VersionConflict(ResolutionError): - """ - An already-installed version conflicts with the requested version. - - Should be initialized with the installed Distribution and the requested - Requirement. - """ - - _template = "{self.dist} is installed but {self.req} is required" - - @property - def dist(self): - return self.args[0] - - @property - def req(self): - return self.args[1] - - def report(self): - return self._template.format(**locals()) - - def with_context(self, required_by): - """ - If required_by is non-empty, return a version of self that is a - ContextualVersionConflict. - """ - if not required_by: - return self - args = self.args + (required_by,) - return ContextualVersionConflict(*args) - - -class ContextualVersionConflict(VersionConflict): - """ - A VersionConflict that accepts a third parameter, the set of the - requirements that required the installed Distribution. - """ - - _template = VersionConflict._template + ' by {self.required_by}' - - @property - def required_by(self): - return self.args[2] - - -class DistributionNotFound(ResolutionError): - """A requested distribution was not found""" - - _template = ("The '{self.req}' distribution was not found " - "and is required by {self.requirers_str}") - - @property - def req(self): - return self.args[0] - - @property - def requirers(self): - return self.args[1] - - @property - def requirers_str(self): - if not self.requirers: - return 'the application' - return ', '.join(self.requirers) - - def report(self): - return self._template.format(**locals()) - - def __str__(self): - return self.report() - - -class UnknownExtra(ResolutionError): - """Distribution doesn't have an "extra feature" of the given name""" - - -_provider_factories = {} - -PY_MAJOR = sys.version[:3] -EGG_DIST = 3 -BINARY_DIST = 2 -SOURCE_DIST = 1 -CHECKOUT_DIST = 0 -DEVELOP_DIST = -1 - - -def register_loader_type(loader_type, provider_factory): - """Register `provider_factory` to make providers for `loader_type` - - `loader_type` is the type or class of a PEP 302 ``module.__loader__``, - and `provider_factory` is a function that, passed a *module* object, - returns an ``IResourceProvider`` for that module. - """ - _provider_factories[loader_type] = provider_factory - - -def get_provider(moduleOrReq): - """Return an IResourceProvider for the named module or requirement""" - if isinstance(moduleOrReq, Requirement): - return working_set.find(moduleOrReq) or require(str(moduleOrReq))[0] - try: - module = sys.modules[moduleOrReq] - except KeyError: - __import__(moduleOrReq) - module = sys.modules[moduleOrReq] - loader = getattr(module, '__loader__', None) - return _find_adapter(_provider_factories, loader)(module) - - -def _macosx_vers(_cache=[]): - if not _cache: - version = platform.mac_ver()[0] - # fallback for MacPorts - if version == '': - plist = '/System/Library/CoreServices/SystemVersion.plist' - if os.path.exists(plist): - if hasattr(plistlib, 'readPlist'): - plist_content = plistlib.readPlist(plist) - if 'ProductVersion' in plist_content: - version = plist_content['ProductVersion'] - - _cache.append(version.split('.')) - return _cache[0] - - -def _macosx_arch(machine): - return {'PowerPC': 'ppc', 'Power_Macintosh': 'ppc'}.get(machine, machine) - - -def get_build_platform(): - """Return this platform's string for platform-specific distributions - - XXX Currently this is the same as ``distutils.util.get_platform()``, but it - needs some hacks for Linux and Mac OS X. - """ - from sysconfig import get_platform - - plat = get_platform() - if sys.platform == "darwin" and not plat.startswith('macosx-'): - try: - version = _macosx_vers() - machine = os.uname()[4].replace(" ", "_") - return "macosx-%d.%d-%s" % ( - int(version[0]), int(version[1]), - _macosx_arch(machine), - ) - except ValueError: - # if someone is running a non-Mac darwin system, this will fall - # through to the default implementation - pass - return plat - - -macosVersionString = re.compile(r"macosx-(\d+)\.(\d+)-(.*)") -darwinVersionString = re.compile(r"darwin-(\d+)\.(\d+)\.(\d+)-(.*)") -# XXX backward compat -get_platform = get_build_platform - - -def compatible_platforms(provided, required): - """Can code for the `provided` platform run on the `required` platform? - - Returns true if either platform is ``None``, or the platforms are equal. - - XXX Needs compatibility checks for Linux and other unixy OSes. - """ - if provided is None or required is None or provided == required: - # easy case - return True - - # Mac OS X special cases - reqMac = macosVersionString.match(required) - if reqMac: - provMac = macosVersionString.match(provided) - - # is this a Mac package? - if not provMac: - # this is backwards compatibility for packages built before - # setuptools 0.6. All packages built after this point will - # use the new macosx designation. - provDarwin = darwinVersionString.match(provided) - if provDarwin: - dversion = int(provDarwin.group(1)) - macosversion = "%s.%s" % (reqMac.group(1), reqMac.group(2)) - if dversion == 7 and macosversion >= "10.3" or \ - dversion == 8 and macosversion >= "10.4": - return True - # egg isn't macosx or legacy darwin - return False - - # are they the same major version and machine type? - if provMac.group(1) != reqMac.group(1) or \ - provMac.group(3) != reqMac.group(3): - return False - - # is the required OS major update >= the provided one? - if int(provMac.group(2)) > int(reqMac.group(2)): - return False - - return True - - # XXX Linux and other platforms' special cases should go here - return False - - -def run_script(dist_spec, script_name): - """Locate distribution `dist_spec` and run its `script_name` script""" - ns = sys._getframe(1).f_globals - name = ns['__name__'] - ns.clear() - ns['__name__'] = name - require(dist_spec)[0].run_script(script_name, ns) - - -# backward compatibility -run_main = run_script - - -def get_distribution(dist): - """Return a current distribution object for a Requirement or string""" - if isinstance(dist, six.string_types): - dist = Requirement.parse(dist) - if isinstance(dist, Requirement): - dist = get_provider(dist) - if not isinstance(dist, Distribution): - raise TypeError("Expected string, Requirement, or Distribution", dist) - return dist - - -def load_entry_point(dist, group, name): - """Return `name` entry point of `group` for `dist` or raise ImportError""" - return get_distribution(dist).load_entry_point(group, name) - - -def get_entry_map(dist, group=None): - """Return the entry point map for `group`, or the full entry map""" - return get_distribution(dist).get_entry_map(group) - - -def get_entry_info(dist, group, name): - """Return the EntryPoint object for `group`+`name`, or ``None``""" - return get_distribution(dist).get_entry_info(group, name) - - -class IMetadataProvider: - def has_metadata(name): - """Does the package's distribution contain the named metadata?""" - - def get_metadata(name): - """The named metadata resource as a string""" - - def get_metadata_lines(name): - """Yield named metadata resource as list of non-blank non-comment lines - - Leading and trailing whitespace is stripped from each line, and lines - with ``#`` as the first non-blank character are omitted.""" - - def metadata_isdir(name): - """Is the named metadata a directory? (like ``os.path.isdir()``)""" - - def metadata_listdir(name): - """List of metadata names in the directory (like ``os.listdir()``)""" - - def run_script(script_name, namespace): - """Execute the named script in the supplied namespace dictionary""" - - -class IResourceProvider(IMetadataProvider): - """An object that provides access to package resources""" - - def get_resource_filename(manager, resource_name): - """Return a true filesystem path for `resource_name` - - `manager` must be an ``IResourceManager``""" - - def get_resource_stream(manager, resource_name): - """Return a readable file-like object for `resource_name` - - `manager` must be an ``IResourceManager``""" - - def get_resource_string(manager, resource_name): - """Return a string containing the contents of `resource_name` - - `manager` must be an ``IResourceManager``""" - - def has_resource(resource_name): - """Does the package contain the named resource?""" - - def resource_isdir(resource_name): - """Is the named resource a directory? (like ``os.path.isdir()``)""" - - def resource_listdir(resource_name): - """List of resource names in the directory (like ``os.listdir()``)""" - - -class WorkingSet: - """A collection of active distributions on sys.path (or a similar list)""" - - def __init__(self, entries=None): - """Create working set from list of path entries (default=sys.path)""" - self.entries = [] - self.entry_keys = {} - self.by_key = {} - self.callbacks = [] - - if entries is None: - entries = sys.path - - for entry in entries: - self.add_entry(entry) - - @classmethod - def _build_master(cls): - """ - Prepare the master working set. - """ - ws = cls() - try: - from __main__ import __requires__ - except ImportError: - # The main program does not list any requirements - return ws - - # ensure the requirements are met - try: - ws.require(__requires__) - except VersionConflict: - return cls._build_from_requirements(__requires__) - - return ws - - @classmethod - def _build_from_requirements(cls, req_spec): - """ - Build a working set from a requirement spec. Rewrites sys.path. - """ - # try it without defaults already on sys.path - # by starting with an empty path - ws = cls([]) - reqs = parse_requirements(req_spec) - dists = ws.resolve(reqs, Environment()) - for dist in dists: - ws.add(dist) - - # add any missing entries from sys.path - for entry in sys.path: - if entry not in ws.entries: - ws.add_entry(entry) - - # then copy back to sys.path - sys.path[:] = ws.entries - return ws - - def add_entry(self, entry): - """Add a path item to ``.entries``, finding any distributions on it - - ``find_distributions(entry, True)`` is used to find distributions - corresponding to the path entry, and they are added. `entry` is - always appended to ``.entries``, even if it is already present. - (This is because ``sys.path`` can contain the same value more than - once, and the ``.entries`` of the ``sys.path`` WorkingSet should always - equal ``sys.path``.) - """ - self.entry_keys.setdefault(entry, []) - self.entries.append(entry) - for dist in find_distributions(entry, True): - self.add(dist, entry, False) - - def __contains__(self, dist): - """True if `dist` is the active distribution for its project""" - return self.by_key.get(dist.key) == dist - - def find(self, req): - """Find a distribution matching requirement `req` - - If there is an active distribution for the requested project, this - returns it as long as it meets the version requirement specified by - `req`. But, if there is an active distribution for the project and it - does *not* meet the `req` requirement, ``VersionConflict`` is raised. - If there is no active distribution for the requested project, ``None`` - is returned. - """ - dist = self.by_key.get(req.key) - if dist is not None and dist not in req: - # XXX add more info - raise VersionConflict(dist, req) - return dist - - def iter_entry_points(self, group, name=None): - """Yield entry point objects from `group` matching `name` - - If `name` is None, yields all entry points in `group` from all - distributions in the working set, otherwise only ones matching - both `group` and `name` are yielded (in distribution order). - """ - return ( - entry - for dist in self - for entry in dist.get_entry_map(group).values() - if name is None or name == entry.name - ) - - def run_script(self, requires, script_name): - """Locate distribution for `requires` and run `script_name` script""" - ns = sys._getframe(1).f_globals - name = ns['__name__'] - ns.clear() - ns['__name__'] = name - self.require(requires)[0].run_script(script_name, ns) - - def __iter__(self): - """Yield distributions for non-duplicate projects in the working set - - The yield order is the order in which the items' path entries were - added to the working set. - """ - seen = {} - for item in self.entries: - if item not in self.entry_keys: - # workaround a cache issue - continue - - for key in self.entry_keys[item]: - if key not in seen: - seen[key] = 1 - yield self.by_key[key] - - def add(self, dist, entry=None, insert=True, replace=False): - """Add `dist` to working set, associated with `entry` - - If `entry` is unspecified, it defaults to the ``.location`` of `dist`. - On exit from this routine, `entry` is added to the end of the working - set's ``.entries`` (if it wasn't already present). - - `dist` is only added to the working set if it's for a project that - doesn't already have a distribution in the set, unless `replace=True`. - If it's added, any callbacks registered with the ``subscribe()`` method - will be called. - """ - if insert: - dist.insert_on(self.entries, entry, replace=replace) - - if entry is None: - entry = dist.location - keys = self.entry_keys.setdefault(entry, []) - keys2 = self.entry_keys.setdefault(dist.location, []) - if not replace and dist.key in self.by_key: - # ignore hidden distros - return - - self.by_key[dist.key] = dist - if dist.key not in keys: - keys.append(dist.key) - if dist.key not in keys2: - keys2.append(dist.key) - self._added_new(dist) - - def resolve(self, requirements, env=None, installer=None, - replace_conflicting=False, extras=None): - """List all distributions needed to (recursively) meet `requirements` - - `requirements` must be a sequence of ``Requirement`` objects. `env`, - if supplied, should be an ``Environment`` instance. If - not supplied, it defaults to all distributions available within any - entry or distribution in the working set. `installer`, if supplied, - will be invoked with each requirement that cannot be met by an - already-installed distribution; it should return a ``Distribution`` or - ``None``. - - Unless `replace_conflicting=True`, raises a VersionConflict exception - if - any requirements are found on the path that have the correct name but - the wrong version. Otherwise, if an `installer` is supplied it will be - invoked to obtain the correct version of the requirement and activate - it. - - `extras` is a list of the extras to be used with these requirements. - This is important because extra requirements may look like `my_req; - extra = "my_extra"`, which would otherwise be interpreted as a purely - optional requirement. Instead, we want to be able to assert that these - requirements are truly required. - """ - - # set up the stack - requirements = list(requirements)[::-1] - # set of processed requirements - processed = {} - # key -> dist - best = {} - to_activate = [] - - req_extras = _ReqExtras() - - # Mapping of requirement to set of distributions that required it; - # useful for reporting info about conflicts. - required_by = collections.defaultdict(set) - - while requirements: - # process dependencies breadth-first - req = requirements.pop(0) - if req in processed: - # Ignore cyclic or redundant dependencies - continue - - if not req_extras.markers_pass(req, extras): - continue - - dist = best.get(req.key) - if dist is None: - # Find the best distribution and add it to the map - dist = self.by_key.get(req.key) - if dist is None or (dist not in req and replace_conflicting): - ws = self - if env is None: - if dist is None: - env = Environment(self.entries) - else: - # Use an empty environment and workingset to avoid - # any further conflicts with the conflicting - # distribution - env = Environment([]) - ws = WorkingSet([]) - dist = best[req.key] = env.best_match( - req, ws, installer, - replace_conflicting=replace_conflicting - ) - if dist is None: - requirers = required_by.get(req, None) - raise DistributionNotFound(req, requirers) - to_activate.append(dist) - if dist not in req: - # Oops, the "best" so far conflicts with a dependency - dependent_req = required_by[req] - raise VersionConflict(dist, req).with_context(dependent_req) - - # push the new requirements onto the stack - new_requirements = dist.requires(req.extras)[::-1] - requirements.extend(new_requirements) - - # Register the new requirements needed by req - for new_requirement in new_requirements: - required_by[new_requirement].add(req.project_name) - req_extras[new_requirement] = req.extras - - processed[req] = True - - # return list of distros to activate - return to_activate - - def find_plugins( - self, plugin_env, full_env=None, installer=None, fallback=True): - """Find all activatable distributions in `plugin_env` - - Example usage:: - - distributions, errors = working_set.find_plugins( - Environment(plugin_dirlist) - ) - # add plugins+libs to sys.path - map(working_set.add, distributions) - # display errors - print('Could not load', errors) - - The `plugin_env` should be an ``Environment`` instance that contains - only distributions that are in the project's "plugin directory" or - directories. The `full_env`, if supplied, should be an ``Environment`` - contains all currently-available distributions. If `full_env` is not - supplied, one is created automatically from the ``WorkingSet`` this - method is called on, which will typically mean that every directory on - ``sys.path`` will be scanned for distributions. - - `installer` is a standard installer callback as used by the - ``resolve()`` method. The `fallback` flag indicates whether we should - attempt to resolve older versions of a plugin if the newest version - cannot be resolved. - - This method returns a 2-tuple: (`distributions`, `error_info`), where - `distributions` is a list of the distributions found in `plugin_env` - that were loadable, along with any other distributions that are needed - to resolve their dependencies. `error_info` is a dictionary mapping - unloadable plugin distributions to an exception instance describing the - error that occurred. Usually this will be a ``DistributionNotFound`` or - ``VersionConflict`` instance. - """ - - plugin_projects = list(plugin_env) - # scan project names in alphabetic order - plugin_projects.sort() - - error_info = {} - distributions = {} - - if full_env is None: - env = Environment(self.entries) - env += plugin_env - else: - env = full_env + plugin_env - - shadow_set = self.__class__([]) - # put all our entries in shadow_set - list(map(shadow_set.add, self)) - - for project_name in plugin_projects: - - for dist in plugin_env[project_name]: - - req = [dist.as_requirement()] - - try: - resolvees = shadow_set.resolve(req, env, installer) - - except ResolutionError as v: - # save error info - error_info[dist] = v - if fallback: - # try the next older version of project - continue - else: - # give up on this project, keep going - break - - else: - list(map(shadow_set.add, resolvees)) - distributions.update(dict.fromkeys(resolvees)) - - # success, no need to try any more versions of this project - break - - distributions = list(distributions) - distributions.sort() - - return distributions, error_info - - def require(self, *requirements): - """Ensure that distributions matching `requirements` are activated - - `requirements` must be a string or a (possibly-nested) sequence - thereof, specifying the distributions and versions required. The - return value is a sequence of the distributions that needed to be - activated to fulfill the requirements; all relevant distributions are - included, even if they were already activated in this working set. - """ - needed = self.resolve(parse_requirements(requirements)) - - for dist in needed: - self.add(dist) - - return needed - - def subscribe(self, callback, existing=True): - """Invoke `callback` for all distributions - - If `existing=True` (default), - call on all existing ones, as well. - """ - if callback in self.callbacks: - return - self.callbacks.append(callback) - if not existing: - return - for dist in self: - callback(dist) - - def _added_new(self, dist): - for callback in self.callbacks: - callback(dist) - - def __getstate__(self): - return ( - self.entries[:], self.entry_keys.copy(), self.by_key.copy(), - self.callbacks[:] - ) - - def __setstate__(self, e_k_b_c): - entries, keys, by_key, callbacks = e_k_b_c - self.entries = entries[:] - self.entry_keys = keys.copy() - self.by_key = by_key.copy() - self.callbacks = callbacks[:] - - -class _ReqExtras(dict): - """ - Map each requirement to the extras that demanded it. - """ - - def markers_pass(self, req, extras=None): - """ - Evaluate markers for req against each extra that - demanded it. - - Return False if the req has a marker and fails - evaluation. Otherwise, return True. - """ - extra_evals = ( - req.marker.evaluate({'extra': extra}) - for extra in self.get(req, ()) + (extras or (None,)) - ) - return not req.marker or any(extra_evals) - - -class Environment: - """Searchable snapshot of distributions on a search path""" - - def __init__( - self, search_path=None, platform=get_supported_platform(), - python=PY_MAJOR): - """Snapshot distributions available on a search path - - Any distributions found on `search_path` are added to the environment. - `search_path` should be a sequence of ``sys.path`` items. If not - supplied, ``sys.path`` is used. - - `platform` is an optional string specifying the name of the platform - that platform-specific distributions must be compatible with. If - unspecified, it defaults to the current platform. `python` is an - optional string naming the desired version of Python (e.g. ``'3.6'``); - it defaults to the current version. - - You may explicitly set `platform` (and/or `python`) to ``None`` if you - wish to map *all* distributions, not just those compatible with the - running platform or Python version. - """ - self._distmap = {} - self.platform = platform - self.python = python - self.scan(search_path) - - def can_add(self, dist): - """Is distribution `dist` acceptable for this environment? - - The distribution must match the platform and python version - requirements specified when this environment was created, or False - is returned. - """ - py_compat = ( - self.python is None - or dist.py_version is None - or dist.py_version == self.python - ) - return py_compat and compatible_platforms(dist.platform, self.platform) - - def remove(self, dist): - """Remove `dist` from the environment""" - self._distmap[dist.key].remove(dist) - - def scan(self, search_path=None): - """Scan `search_path` for distributions usable in this environment - - Any distributions found are added to the environment. - `search_path` should be a sequence of ``sys.path`` items. If not - supplied, ``sys.path`` is used. Only distributions conforming to - the platform/python version defined at initialization are added. - """ - if search_path is None: - search_path = sys.path - - for item in search_path: - for dist in find_distributions(item): - self.add(dist) - - def __getitem__(self, project_name): - """Return a newest-to-oldest list of distributions for `project_name` - - Uses case-insensitive `project_name` comparison, assuming all the - project's distributions use their project's name converted to all - lowercase as their key. - - """ - distribution_key = project_name.lower() - return self._distmap.get(distribution_key, []) - - def add(self, dist): - """Add `dist` if we ``can_add()`` it and it has not already been added - """ - if self.can_add(dist) and dist.has_version(): - dists = self._distmap.setdefault(dist.key, []) - if dist not in dists: - dists.append(dist) - dists.sort(key=operator.attrgetter('hashcmp'), reverse=True) - - def best_match( - self, req, working_set, installer=None, replace_conflicting=False): - """Find distribution best matching `req` and usable on `working_set` - - This calls the ``find(req)`` method of the `working_set` to see if a - suitable distribution is already active. (This may raise - ``VersionConflict`` if an unsuitable version of the project is already - active in the specified `working_set`.) If a suitable distribution - isn't active, this method returns the newest distribution in the - environment that meets the ``Requirement`` in `req`. If no suitable - distribution is found, and `installer` is supplied, then the result of - calling the environment's ``obtain(req, installer)`` method will be - returned. - """ - try: - dist = working_set.find(req) - except VersionConflict: - if not replace_conflicting: - raise - dist = None - if dist is not None: - return dist - for dist in self[req.key]: - if dist in req: - return dist - # try to download/install - return self.obtain(req, installer) - - def obtain(self, requirement, installer=None): - """Obtain a distribution matching `requirement` (e.g. via download) - - Obtain a distro that matches requirement (e.g. via download). In the - base ``Environment`` class, this routine just returns - ``installer(requirement)``, unless `installer` is None, in which case - None is returned instead. This method is a hook that allows subclasses - to attempt other ways of obtaining a distribution before falling back - to the `installer` argument.""" - if installer is not None: - return installer(requirement) - - def __iter__(self): - """Yield the unique project names of the available distributions""" - for key in self._distmap.keys(): - if self[key]: - yield key - - def __iadd__(self, other): - """In-place addition of a distribution or environment""" - if isinstance(other, Distribution): - self.add(other) - elif isinstance(other, Environment): - for project in other: - for dist in other[project]: - self.add(dist) - else: - raise TypeError("Can't add %r to environment" % (other,)) - return self - - def __add__(self, other): - """Add an environment or distribution to an environment""" - new = self.__class__([], platform=None, python=None) - for env in self, other: - new += env - return new - - -# XXX backward compatibility -AvailableDistributions = Environment - - -class ExtractionError(RuntimeError): - """An error occurred extracting a resource - - The following attributes are available from instances of this exception: - - manager - The resource manager that raised this exception - - cache_path - The base directory for resource extraction - - original_error - The exception instance that caused extraction to fail - """ - - -class ResourceManager: - """Manage resource extraction and packages""" - extraction_path = None - - def __init__(self): - self.cached_files = {} - - def resource_exists(self, package_or_requirement, resource_name): - """Does the named resource exist?""" - return get_provider(package_or_requirement).has_resource(resource_name) - - def resource_isdir(self, package_or_requirement, resource_name): - """Is the named resource an existing directory?""" - return get_provider(package_or_requirement).resource_isdir( - resource_name - ) - - def resource_filename(self, package_or_requirement, resource_name): - """Return a true filesystem path for specified resource""" - return get_provider(package_or_requirement).get_resource_filename( - self, resource_name - ) - - def resource_stream(self, package_or_requirement, resource_name): - """Return a readable file-like object for specified resource""" - return get_provider(package_or_requirement).get_resource_stream( - self, resource_name - ) - - def resource_string(self, package_or_requirement, resource_name): - """Return specified resource as a string""" - return get_provider(package_or_requirement).get_resource_string( - self, resource_name - ) - - def resource_listdir(self, package_or_requirement, resource_name): - """List the contents of the named resource directory""" - return get_provider(package_or_requirement).resource_listdir( - resource_name - ) - - def extraction_error(self): - """Give an error message for problems extracting file(s)""" - - old_exc = sys.exc_info()[1] - cache_path = self.extraction_path or get_default_cache() - - tmpl = textwrap.dedent(""" - Can't extract file(s) to egg cache - - The following error occurred while trying to extract file(s) - to the Python egg cache: - - {old_exc} - - The Python egg cache directory is currently set to: - - {cache_path} - - Perhaps your account does not have write access to this directory? - You can change the cache directory by setting the PYTHON_EGG_CACHE - environment variable to point to an accessible directory. - """).lstrip() - err = ExtractionError(tmpl.format(**locals())) - err.manager = self - err.cache_path = cache_path - err.original_error = old_exc - raise err - - def get_cache_path(self, archive_name, names=()): - """Return absolute location in cache for `archive_name` and `names` - - The parent directory of the resulting path will be created if it does - not already exist. `archive_name` should be the base filename of the - enclosing egg (which may not be the name of the enclosing zipfile!), - including its ".egg" extension. `names`, if provided, should be a - sequence of path name parts "under" the egg's extraction location. - - This method should only be called by resource providers that need to - obtain an extraction location, and only for names they intend to - extract, as it tracks the generated names for possible cleanup later. - """ - extract_path = self.extraction_path or get_default_cache() - target_path = os.path.join(extract_path, archive_name + '-tmp', *names) - try: - _bypass_ensure_directory(target_path) - except Exception: - self.extraction_error() - - self._warn_unsafe_extraction_path(extract_path) - - self.cached_files[target_path] = 1 - return target_path - - @staticmethod - def _warn_unsafe_extraction_path(path): - """ - If the default extraction path is overridden and set to an insecure - location, such as /tmp, it opens up an opportunity for an attacker to - replace an extracted file with an unauthorized payload. Warn the user - if a known insecure location is used. - - See Distribute #375 for more details. - """ - if os.name == 'nt' and not path.startswith(os.environ['windir']): - # On Windows, permissions are generally restrictive by default - # and temp directories are not writable by other users, so - # bypass the warning. - return - mode = os.stat(path).st_mode - if mode & stat.S_IWOTH or mode & stat.S_IWGRP: - msg = ( - "%s is writable by group/others and vulnerable to attack " - "when " - "used with get_resource_filename. Consider a more secure " - "location (set with .set_extraction_path or the " - "PYTHON_EGG_CACHE environment variable)." % path - ) - warnings.warn(msg, UserWarning) - - def postprocess(self, tempname, filename): - """Perform any platform-specific postprocessing of `tempname` - - This is where Mac header rewrites should be done; other platforms don't - have anything special they should do. - - Resource providers should call this method ONLY after successfully - extracting a compressed resource. They must NOT call it on resources - that are already in the filesystem. - - `tempname` is the current (temporary) name of the file, and `filename` - is the name it will be renamed to by the caller after this routine - returns. - """ - - if os.name == 'posix': - # Make the resource executable - mode = ((os.stat(tempname).st_mode) | 0o555) & 0o7777 - os.chmod(tempname, mode) - - def set_extraction_path(self, path): - """Set the base path where resources will be extracted to, if needed. - - If you do not call this routine before any extractions take place, the - path defaults to the return value of ``get_default_cache()``. (Which - is based on the ``PYTHON_EGG_CACHE`` environment variable, with various - platform-specific fallbacks. See that routine's documentation for more - details.) - - Resources are extracted to subdirectories of this path based upon - information given by the ``IResourceProvider``. You may set this to a - temporary directory, but then you must call ``cleanup_resources()`` to - delete the extracted files when done. There is no guarantee that - ``cleanup_resources()`` will be able to remove all extracted files. - - (Note: you may not change the extraction path for a given resource - manager once resources have been extracted, unless you first call - ``cleanup_resources()``.) - """ - if self.cached_files: - raise ValueError( - "Can't change extraction path, files already extracted" - ) - - self.extraction_path = path - - def cleanup_resources(self, force=False): - """ - Delete all extracted resource files and directories, returning a list - of the file and directory names that could not be successfully removed. - This function does not have any concurrency protection, so it should - generally only be called when the extraction path is a temporary - directory exclusive to a single process. This method is not - automatically called; you must call it explicitly or register it as an - ``atexit`` function if you wish to ensure cleanup of a temporary - directory used for extractions. - """ - # XXX - - -def get_default_cache(): - """ - Return the ``PYTHON_EGG_CACHE`` environment variable - or a platform-relevant user cache dir for an app - named "Python-Eggs". - """ - return ( - os.environ.get('PYTHON_EGG_CACHE') - or appdirs.user_cache_dir(appname='Python-Eggs') - ) - - -def safe_name(name): - """Convert an arbitrary string to a standard distribution name - - Any runs of non-alphanumeric/. characters are replaced with a single '-'. - """ - return re.sub('[^A-Za-z0-9.]+', '-', name) - - -def safe_version(version): - """ - Convert an arbitrary string to a standard version string - """ - try: - # normalize the version - return str(packaging.version.Version(version)) - except packaging.version.InvalidVersion: - version = version.replace(' ', '.') - return re.sub('[^A-Za-z0-9.]+', '-', version) - - -def safe_extra(extra): - """Convert an arbitrary string to a standard 'extra' name - - Any runs of non-alphanumeric characters are replaced with a single '_', - and the result is always lowercased. - """ - return re.sub('[^A-Za-z0-9.-]+', '_', extra).lower() - - -def to_filename(name): - """Convert a project or version name to its filename-escaped form - - Any '-' characters are currently replaced with '_'. - """ - return name.replace('-', '_') - - -def invalid_marker(text): - """ - Validate text as a PEP 508 environment marker; return an exception - if invalid or False otherwise. - """ - try: - evaluate_marker(text) - except SyntaxError as e: - e.filename = None - e.lineno = None - return e - return False - - -def evaluate_marker(text, extra=None): - """ - Evaluate a PEP 508 environment marker. - Return a boolean indicating the marker result in this environment. - Raise SyntaxError if marker is invalid. - - This implementation uses the 'pyparsing' module. - """ - try: - marker = packaging.markers.Marker(text) - return marker.evaluate() - except packaging.markers.InvalidMarker as e: - raise SyntaxError(e) - - -class NullProvider: - """Try to implement resources and metadata for arbitrary PEP 302 loaders""" - - egg_name = None - egg_info = None - loader = None - - def __init__(self, module): - self.loader = getattr(module, '__loader__', None) - self.module_path = os.path.dirname(getattr(module, '__file__', '')) - - def get_resource_filename(self, manager, resource_name): - return self._fn(self.module_path, resource_name) - - def get_resource_stream(self, manager, resource_name): - return io.BytesIO(self.get_resource_string(manager, resource_name)) - - def get_resource_string(self, manager, resource_name): - return self._get(self._fn(self.module_path, resource_name)) - - def has_resource(self, resource_name): - return self._has(self._fn(self.module_path, resource_name)) - - def _get_metadata_path(self, name): - return self._fn(self.egg_info, name) - - def has_metadata(self, name): - if not self.egg_info: - return self.egg_info - - path = self._get_metadata_path(name) - return self._has(path) - - def get_metadata(self, name): - if not self.egg_info: - return "" - value = self._get(self._fn(self.egg_info, name)) - return value.decode('utf-8') if six.PY3 else value - - def get_metadata_lines(self, name): - return yield_lines(self.get_metadata(name)) - - def resource_isdir(self, resource_name): - return self._isdir(self._fn(self.module_path, resource_name)) - - def metadata_isdir(self, name): - return self.egg_info and self._isdir(self._fn(self.egg_info, name)) - - def resource_listdir(self, resource_name): - return self._listdir(self._fn(self.module_path, resource_name)) - - def metadata_listdir(self, name): - if self.egg_info: - return self._listdir(self._fn(self.egg_info, name)) - return [] - - def run_script(self, script_name, namespace): - script = 'scripts/' + script_name - if not self.has_metadata(script): - raise ResolutionError( - "Script {script!r} not found in metadata at {self.egg_info!r}" - .format(**locals()), - ) - script_text = self.get_metadata(script).replace('\r\n', '\n') - script_text = script_text.replace('\r', '\n') - script_filename = self._fn(self.egg_info, script) - namespace['__file__'] = script_filename - if os.path.exists(script_filename): - source = open(script_filename).read() - code = compile(source, script_filename, 'exec') - exec(code, namespace, namespace) - else: - from linecache import cache - cache[script_filename] = ( - len(script_text), 0, script_text.split('\n'), script_filename - ) - script_code = compile(script_text, script_filename, 'exec') - exec(script_code, namespace, namespace) - - def _has(self, path): - raise NotImplementedError( - "Can't perform this operation for unregistered loader type" - ) - - def _isdir(self, path): - raise NotImplementedError( - "Can't perform this operation for unregistered loader type" - ) - - def _listdir(self, path): - raise NotImplementedError( - "Can't perform this operation for unregistered loader type" - ) - - def _fn(self, base, resource_name): - self._validate_resource_path(resource_name) - if resource_name: - return os.path.join(base, *resource_name.split('/')) - return base - - @staticmethod - def _validate_resource_path(path): - """ - Validate the resource paths according to the docs. - https://setuptools.readthedocs.io/en/latest/pkg_resources.html#basic-resource-access - - >>> warned = getfixture('recwarn') - >>> warnings.simplefilter('always') - >>> vrp = NullProvider._validate_resource_path - >>> vrp('foo/bar.txt') - >>> bool(warned) - False - >>> vrp('../foo/bar.txt') - >>> bool(warned) - True - >>> warned.clear() - >>> vrp('/foo/bar.txt') - >>> bool(warned) - True - >>> vrp('foo/../../bar.txt') - >>> bool(warned) - True - >>> warned.clear() - >>> vrp('foo/f../bar.txt') - >>> bool(warned) - False - - Windows path separators are straight-up disallowed. - >>> vrp(r'\\foo/bar.txt') - Traceback (most recent call last): - ... - ValueError: Use of .. or absolute path in a resource path \ -is not allowed. - - >>> vrp(r'C:\\foo/bar.txt') - Traceback (most recent call last): - ... - ValueError: Use of .. or absolute path in a resource path \ -is not allowed. - - Blank values are allowed - - >>> vrp('') - >>> bool(warned) - False - - Non-string values are not. - - >>> vrp(None) - Traceback (most recent call last): - ... - AttributeError: ... - """ - invalid = ( - os.path.pardir in path.split(posixpath.sep) or - posixpath.isabs(path) or - ntpath.isabs(path) - ) - if not invalid: - return - - msg = "Use of .. or absolute path in a resource path is not allowed." - - # Aggressively disallow Windows absolute paths - if ntpath.isabs(path) and not posixpath.isabs(path): - raise ValueError(msg) - - # for compatibility, warn; in future - # raise ValueError(msg) - warnings.warn( - msg[:-1] + " and will raise exceptions in a future release.", - DeprecationWarning, - stacklevel=4, - ) - - def _get(self, path): - if hasattr(self.loader, 'get_data'): - return self.loader.get_data(path) - raise NotImplementedError( - "Can't perform this operation for loaders without 'get_data()'" - ) - - -register_loader_type(object, NullProvider) - - -class EggProvider(NullProvider): - """Provider based on a virtual filesystem""" - - def __init__(self, module): - NullProvider.__init__(self, module) - self._setup_prefix() - - def _setup_prefix(self): - # we assume here that our metadata may be nested inside a "basket" - # of multiple eggs; that's why we use module_path instead of .archive - path = self.module_path - old = None - while path != old: - if _is_egg_path(path): - self.egg_name = os.path.basename(path) - self.egg_info = os.path.join(path, 'EGG-INFO') - self.egg_root = path - break - old = path - path, base = os.path.split(path) - - -class DefaultProvider(EggProvider): - """Provides access to package resources in the filesystem""" - - def _has(self, path): - return os.path.exists(path) - - def _isdir(self, path): - return os.path.isdir(path) - - def _listdir(self, path): - return os.listdir(path) - - def get_resource_stream(self, manager, resource_name): - return open(self._fn(self.module_path, resource_name), 'rb') - - def _get(self, path): - with open(path, 'rb') as stream: - return stream.read() - - @classmethod - def _register(cls): - loader_names = 'SourceFileLoader', 'SourcelessFileLoader', - for name in loader_names: - loader_cls = getattr(importlib_machinery, name, type(None)) - register_loader_type(loader_cls, cls) - - -DefaultProvider._register() - - -class EmptyProvider(NullProvider): - """Provider that returns nothing for all requests""" - - module_path = None - - _isdir = _has = lambda self, path: False - - def _get(self, path): - return '' - - def _listdir(self, path): - return [] - - def __init__(self): - pass - - -empty_provider = EmptyProvider() - - -class ZipManifests(dict): - """ - zip manifest builder - """ - - @classmethod - def build(cls, path): - """ - Build a dictionary similar to the zipimport directory - caches, except instead of tuples, store ZipInfo objects. - - Use a platform-specific path separator (os.sep) for the path keys - for compatibility with pypy on Windows. - """ - with zipfile.ZipFile(path) as zfile: - items = ( - ( - name.replace('/', os.sep), - zfile.getinfo(name), - ) - for name in zfile.namelist() - ) - return dict(items) - - load = build - - -class MemoizedZipManifests(ZipManifests): - """ - Memoized zipfile manifests. - """ - manifest_mod = collections.namedtuple('manifest_mod', 'manifest mtime') - - def load(self, path): - """ - Load a manifest at path or return a suitable manifest already loaded. - """ - path = os.path.normpath(path) - mtime = os.stat(path).st_mtime - - if path not in self or self[path].mtime != mtime: - manifest = self.build(path) - self[path] = self.manifest_mod(manifest, mtime) - - return self[path].manifest - - -class ZipProvider(EggProvider): - """Resource support for zips and eggs""" - - eagers = None - _zip_manifests = MemoizedZipManifests() - - def __init__(self, module): - EggProvider.__init__(self, module) - self.zip_pre = self.loader.archive + os.sep - - def _zipinfo_name(self, fspath): - # Convert a virtual filename (full path to file) into a zipfile subpath - # usable with the zipimport directory cache for our target archive - fspath = fspath.rstrip(os.sep) - if fspath == self.loader.archive: - return '' - if fspath.startswith(self.zip_pre): - return fspath[len(self.zip_pre):] - raise AssertionError( - "%s is not a subpath of %s" % (fspath, self.zip_pre) - ) - - def _parts(self, zip_path): - # Convert a zipfile subpath into an egg-relative path part list. - # pseudo-fs path - fspath = self.zip_pre + zip_path - if fspath.startswith(self.egg_root + os.sep): - return fspath[len(self.egg_root) + 1:].split(os.sep) - raise AssertionError( - "%s is not a subpath of %s" % (fspath, self.egg_root) - ) - - @property - def zipinfo(self): - return self._zip_manifests.load(self.loader.archive) - - def get_resource_filename(self, manager, resource_name): - if not self.egg_name: - raise NotImplementedError( - "resource_filename() only supported for .egg, not .zip" - ) - # no need to lock for extraction, since we use temp names - zip_path = self._resource_to_zip(resource_name) - eagers = self._get_eager_resources() - if '/'.join(self._parts(zip_path)) in eagers: - for name in eagers: - self._extract_resource(manager, self._eager_to_zip(name)) - return self._extract_resource(manager, zip_path) - - @staticmethod - def _get_date_and_size(zip_stat): - size = zip_stat.file_size - # ymdhms+wday, yday, dst - date_time = zip_stat.date_time + (0, 0, -1) - # 1980 offset already done - timestamp = time.mktime(date_time) - return timestamp, size - - def _extract_resource(self, manager, zip_path): - - if zip_path in self._index(): - for name in self._index()[zip_path]: - last = self._extract_resource( - manager, os.path.join(zip_path, name) - ) - # return the extracted directory name - return os.path.dirname(last) - - timestamp, size = self._get_date_and_size(self.zipinfo[zip_path]) - - if not WRITE_SUPPORT: - raise IOError('"os.rename" and "os.unlink" are not supported ' - 'on this platform') - try: - - real_path = manager.get_cache_path( - self.egg_name, self._parts(zip_path) - ) - - if self._is_current(real_path, zip_path): - return real_path - - outf, tmpnam = _mkstemp( - ".$extract", - dir=os.path.dirname(real_path), - ) - os.write(outf, self.loader.get_data(zip_path)) - os.close(outf) - utime(tmpnam, (timestamp, timestamp)) - manager.postprocess(tmpnam, real_path) - - try: - rename(tmpnam, real_path) - - except os.error: - if os.path.isfile(real_path): - if self._is_current(real_path, zip_path): - # the file became current since it was checked above, - # so proceed. - return real_path - # Windows, del old file and retry - elif os.name == 'nt': - unlink(real_path) - rename(tmpnam, real_path) - return real_path - raise - - except os.error: - # report a user-friendly error - manager.extraction_error() - - return real_path - - def _is_current(self, file_path, zip_path): - """ - Return True if the file_path is current for this zip_path - """ - timestamp, size = self._get_date_and_size(self.zipinfo[zip_path]) - if not os.path.isfile(file_path): - return False - stat = os.stat(file_path) - if stat.st_size != size or stat.st_mtime != timestamp: - return False - # check that the contents match - zip_contents = self.loader.get_data(zip_path) - with open(file_path, 'rb') as f: - file_contents = f.read() - return zip_contents == file_contents - - def _get_eager_resources(self): - if self.eagers is None: - eagers = [] - for name in ('native_libs.txt', 'eager_resources.txt'): - if self.has_metadata(name): - eagers.extend(self.get_metadata_lines(name)) - self.eagers = eagers - return self.eagers - - def _index(self): - try: - return self._dirindex - except AttributeError: - ind = {} - for path in self.zipinfo: - parts = path.split(os.sep) - while parts: - parent = os.sep.join(parts[:-1]) - if parent in ind: - ind[parent].append(parts[-1]) - break - else: - ind[parent] = [parts.pop()] - self._dirindex = ind - return ind - - def _has(self, fspath): - zip_path = self._zipinfo_name(fspath) - return zip_path in self.zipinfo or zip_path in self._index() - - def _isdir(self, fspath): - return self._zipinfo_name(fspath) in self._index() - - def _listdir(self, fspath): - return list(self._index().get(self._zipinfo_name(fspath), ())) - - def _eager_to_zip(self, resource_name): - return self._zipinfo_name(self._fn(self.egg_root, resource_name)) - - def _resource_to_zip(self, resource_name): - return self._zipinfo_name(self._fn(self.module_path, resource_name)) - - -register_loader_type(zipimport.zipimporter, ZipProvider) - - -class FileMetadata(EmptyProvider): - """Metadata handler for standalone PKG-INFO files - - Usage:: - - metadata = FileMetadata("/path/to/PKG-INFO") - - This provider rejects all data and metadata requests except for PKG-INFO, - which is treated as existing, and will be the contents of the file at - the provided location. - """ - - def __init__(self, path): - self.path = path - - def _get_metadata_path(self, name): - return self.path - - def has_metadata(self, name): - return name == 'PKG-INFO' and os.path.isfile(self.path) - - def get_metadata(self, name): - if name != 'PKG-INFO': - raise KeyError("No metadata except PKG-INFO is available") - - with io.open(self.path, encoding='utf-8', errors="replace") as f: - metadata = f.read() - self._warn_on_replacement(metadata) - return metadata - - def _warn_on_replacement(self, metadata): - # Python 2.7 compat for: replacement_char = '�' - replacement_char = b'\xef\xbf\xbd'.decode('utf-8') - if replacement_char in metadata: - tmpl = "{self.path} could not be properly decoded in UTF-8" - msg = tmpl.format(**locals()) - warnings.warn(msg) - - def get_metadata_lines(self, name): - return yield_lines(self.get_metadata(name)) - - -class PathMetadata(DefaultProvider): - """Metadata provider for egg directories - - Usage:: - - # Development eggs: - - egg_info = "/path/to/PackageName.egg-info" - base_dir = os.path.dirname(egg_info) - metadata = PathMetadata(base_dir, egg_info) - dist_name = os.path.splitext(os.path.basename(egg_info))[0] - dist = Distribution(basedir, project_name=dist_name, metadata=metadata) - - # Unpacked egg directories: - - egg_path = "/path/to/PackageName-ver-pyver-etc.egg" - metadata = PathMetadata(egg_path, os.path.join(egg_path,'EGG-INFO')) - dist = Distribution.from_filename(egg_path, metadata=metadata) - """ - - def __init__(self, path, egg_info): - self.module_path = path - self.egg_info = egg_info - - -class EggMetadata(ZipProvider): - """Metadata provider for .egg files""" - - def __init__(self, importer): - """Create a metadata provider from a zipimporter""" - - self.zip_pre = importer.archive + os.sep - self.loader = importer - if importer.prefix: - self.module_path = os.path.join(importer.archive, importer.prefix) - else: - self.module_path = importer.archive - self._setup_prefix() - - -_declare_state('dict', _distribution_finders={}) - - -def register_finder(importer_type, distribution_finder): - """Register `distribution_finder` to find distributions in sys.path items - - `importer_type` is the type or class of a PEP 302 "Importer" (sys.path item - handler), and `distribution_finder` is a callable that, passed a path - item and the importer instance, yields ``Distribution`` instances found on - that path item. See ``pkg_resources.find_on_path`` for an example.""" - _distribution_finders[importer_type] = distribution_finder - - -def find_distributions(path_item, only=False): - """Yield distributions accessible via `path_item`""" - importer = get_importer(path_item) - finder = _find_adapter(_distribution_finders, importer) - return finder(importer, path_item, only) - - -def find_eggs_in_zip(importer, path_item, only=False): - """ - Find eggs in zip files; possibly multiple nested eggs. - """ - if importer.archive.endswith('.whl'): - # wheels are not supported with this finder - # they don't have PKG-INFO metadata, and won't ever contain eggs - return - metadata = EggMetadata(importer) - if metadata.has_metadata('PKG-INFO'): - yield Distribution.from_filename(path_item, metadata=metadata) - if only: - # don't yield nested distros - return - for subitem in metadata.resource_listdir(''): - if _is_egg_path(subitem): - subpath = os.path.join(path_item, subitem) - dists = find_eggs_in_zip(zipimport.zipimporter(subpath), subpath) - for dist in dists: - yield dist - elif subitem.lower().endswith('.dist-info'): - subpath = os.path.join(path_item, subitem) - submeta = EggMetadata(zipimport.zipimporter(subpath)) - submeta.egg_info = subpath - yield Distribution.from_location(path_item, subitem, submeta) - - -register_finder(zipimport.zipimporter, find_eggs_in_zip) - - -def find_nothing(importer, path_item, only=False): - return () - - -register_finder(object, find_nothing) - - -def _by_version_descending(names): - """ - Given a list of filenames, return them in descending order - by version number. - - >>> names = 'bar', 'foo', 'Python-2.7.10.egg', 'Python-2.7.2.egg' - >>> _by_version_descending(names) - ['Python-2.7.10.egg', 'Python-2.7.2.egg', 'foo', 'bar'] - >>> names = 'Setuptools-1.2.3b1.egg', 'Setuptools-1.2.3.egg' - >>> _by_version_descending(names) - ['Setuptools-1.2.3.egg', 'Setuptools-1.2.3b1.egg'] - >>> names = 'Setuptools-1.2.3b1.egg', 'Setuptools-1.2.3.post1.egg' - >>> _by_version_descending(names) - ['Setuptools-1.2.3.post1.egg', 'Setuptools-1.2.3b1.egg'] - """ - def _by_version(name): - """ - Parse each component of the filename - """ - name, ext = os.path.splitext(name) - parts = itertools.chain(name.split('-'), [ext]) - return [packaging.version.parse(part) for part in parts] - - return sorted(names, key=_by_version, reverse=True) - - -def find_on_path(importer, path_item, only=False): - """Yield distributions accessible on a sys.path directory""" - path_item = _normalize_cached(path_item) - - if _is_unpacked_egg(path_item): - yield Distribution.from_filename( - path_item, metadata=PathMetadata( - path_item, os.path.join(path_item, 'EGG-INFO') - ) - ) - return - - entries = safe_listdir(path_item) - - # for performance, before sorting by version, - # screen entries for only those that will yield - # distributions - filtered = ( - entry - for entry in entries - if dist_factory(path_item, entry, only) - ) - - # scan for .egg and .egg-info in directory - path_item_entries = _by_version_descending(filtered) - for entry in path_item_entries: - fullpath = os.path.join(path_item, entry) - factory = dist_factory(path_item, entry, only) - for dist in factory(fullpath): - yield dist - - -def dist_factory(path_item, entry, only): - """ - Return a dist_factory for a path_item and entry - """ - lower = entry.lower() - is_meta = any(map(lower.endswith, ('.egg-info', '.dist-info'))) - return ( - distributions_from_metadata - if is_meta else - find_distributions - if not only and _is_egg_path(entry) else - resolve_egg_link - if not only and lower.endswith('.egg-link') else - NoDists() - ) - - -class NoDists: - """ - >>> bool(NoDists()) - False - - >>> list(NoDists()('anything')) - [] - """ - def __bool__(self): - return False - if six.PY2: - __nonzero__ = __bool__ - - def __call__(self, fullpath): - return iter(()) - - -def safe_listdir(path): - """ - Attempt to list contents of path, but suppress some exceptions. - """ - try: - return os.listdir(path) - except (PermissionError, NotADirectoryError): - pass - except OSError as e: - # Ignore the directory if does not exist, not a directory or - # permission denied - ignorable = ( - e.errno in (errno.ENOTDIR, errno.EACCES, errno.ENOENT) - # Python 2 on Windows needs to be handled this way :( - or getattr(e, "winerror", None) == 267 - ) - if not ignorable: - raise - return () - - -def distributions_from_metadata(path): - root = os.path.dirname(path) - if os.path.isdir(path): - if len(os.listdir(path)) == 0: - # empty metadata dir; skip - return - metadata = PathMetadata(root, path) - else: - metadata = FileMetadata(path) - entry = os.path.basename(path) - yield Distribution.from_location( - root, entry, metadata, precedence=DEVELOP_DIST, - ) - - -def non_empty_lines(path): - """ - Yield non-empty lines from file at path - """ - with open(path) as f: - for line in f: - line = line.strip() - if line: - yield line - - -def resolve_egg_link(path): - """ - Given a path to an .egg-link, resolve distributions - present in the referenced path. - """ - referenced_paths = non_empty_lines(path) - resolved_paths = ( - os.path.join(os.path.dirname(path), ref) - for ref in referenced_paths - ) - dist_groups = map(find_distributions, resolved_paths) - return next(dist_groups, ()) - - -register_finder(pkgutil.ImpImporter, find_on_path) - -if hasattr(importlib_machinery, 'FileFinder'): - register_finder(importlib_machinery.FileFinder, find_on_path) - -_declare_state('dict', _namespace_handlers={}) -_declare_state('dict', _namespace_packages={}) - - -def register_namespace_handler(importer_type, namespace_handler): - """Register `namespace_handler` to declare namespace packages - - `importer_type` is the type or class of a PEP 302 "Importer" (sys.path item - handler), and `namespace_handler` is a callable like this:: - - def namespace_handler(importer, path_entry, moduleName, module): - # return a path_entry to use for child packages - - Namespace handlers are only called if the importer object has already - agreed that it can handle the relevant path item, and they should only - return a subpath if the module __path__ does not already contain an - equivalent subpath. For an example namespace handler, see - ``pkg_resources.file_ns_handler``. - """ - _namespace_handlers[importer_type] = namespace_handler - - -def _handle_ns(packageName, path_item): - """Ensure that named package includes a subpath of path_item (if needed)""" - - importer = get_importer(path_item) - if importer is None: - return None - - # capture warnings due to #1111 - with warnings.catch_warnings(): - warnings.simplefilter("ignore") - loader = importer.find_module(packageName) - - if loader is None: - return None - module = sys.modules.get(packageName) - if module is None: - module = sys.modules[packageName] = types.ModuleType(packageName) - module.__path__ = [] - _set_parent_ns(packageName) - elif not hasattr(module, '__path__'): - raise TypeError("Not a package:", packageName) - handler = _find_adapter(_namespace_handlers, importer) - subpath = handler(importer, path_item, packageName, module) - if subpath is not None: - path = module.__path__ - path.append(subpath) - loader.load_module(packageName) - _rebuild_mod_path(path, packageName, module) - return subpath - - -def _rebuild_mod_path(orig_path, package_name, module): - """ - Rebuild module.__path__ ensuring that all entries are ordered - corresponding to their sys.path order - """ - sys_path = [_normalize_cached(p) for p in sys.path] - - def safe_sys_path_index(entry): - """ - Workaround for #520 and #513. - """ - try: - return sys_path.index(entry) - except ValueError: - return float('inf') - - def position_in_sys_path(path): - """ - Return the ordinal of the path based on its position in sys.path - """ - path_parts = path.split(os.sep) - module_parts = package_name.count('.') + 1 - parts = path_parts[:-module_parts] - return safe_sys_path_index(_normalize_cached(os.sep.join(parts))) - - new_path = sorted(orig_path, key=position_in_sys_path) - new_path = [_normalize_cached(p) for p in new_path] - - if isinstance(module.__path__, list): - module.__path__[:] = new_path - else: - module.__path__ = new_path - - -def declare_namespace(packageName): - """Declare that package 'packageName' is a namespace package""" - - _imp.acquire_lock() - try: - if packageName in _namespace_packages: - return - - path = sys.path - parent, _, _ = packageName.rpartition('.') - - if parent: - declare_namespace(parent) - if parent not in _namespace_packages: - __import__(parent) - try: - path = sys.modules[parent].__path__ - except AttributeError: - raise TypeError("Not a package:", parent) - - # Track what packages are namespaces, so when new path items are added, - # they can be updated - _namespace_packages.setdefault(parent or None, []).append(packageName) - _namespace_packages.setdefault(packageName, []) - - for path_item in path: - # Ensure all the parent's path items are reflected in the child, - # if they apply - _handle_ns(packageName, path_item) - - finally: - _imp.release_lock() - - -def fixup_namespace_packages(path_item, parent=None): - """Ensure that previously-declared namespace packages include path_item""" - _imp.acquire_lock() - try: - for package in _namespace_packages.get(parent, ()): - subpath = _handle_ns(package, path_item) - if subpath: - fixup_namespace_packages(subpath, package) - finally: - _imp.release_lock() - - -def file_ns_handler(importer, path_item, packageName, module): - """Compute an ns-package subpath for a filesystem or zipfile importer""" - - subpath = os.path.join(path_item, packageName.split('.')[-1]) - normalized = _normalize_cached(subpath) - for item in module.__path__: - if _normalize_cached(item) == normalized: - break - else: - # Only return the path if it's not already there - return subpath - - -register_namespace_handler(pkgutil.ImpImporter, file_ns_handler) -register_namespace_handler(zipimport.zipimporter, file_ns_handler) - -if hasattr(importlib_machinery, 'FileFinder'): - register_namespace_handler(importlib_machinery.FileFinder, file_ns_handler) - - -def null_ns_handler(importer, path_item, packageName, module): - return None - - -register_namespace_handler(object, null_ns_handler) - - -def normalize_path(filename): - """Normalize a file/dir name for comparison purposes""" - return os.path.normcase(os.path.realpath(os.path.normpath(_cygwin_patch(filename)))) - - -def _cygwin_patch(filename): # pragma: nocover - """ - Contrary to POSIX 2008, on Cygwin, getcwd (3) contains - symlink components. Using - os.path.abspath() works around this limitation. A fix in os.getcwd() - would probably better, in Cygwin even more so, except - that this seems to be by design... - """ - return os.path.abspath(filename) if sys.platform == 'cygwin' else filename - - -def _normalize_cached(filename, _cache={}): - try: - return _cache[filename] - except KeyError: - _cache[filename] = result = normalize_path(filename) - return result - - -def _is_egg_path(path): - """ - Determine if given path appears to be an egg. - """ - return path.lower().endswith('.egg') - - -def _is_unpacked_egg(path): - """ - Determine if given path appears to be an unpacked egg. - """ - return ( - _is_egg_path(path) and - os.path.isfile(os.path.join(path, 'EGG-INFO', 'PKG-INFO')) - ) - - -def _set_parent_ns(packageName): - parts = packageName.split('.') - name = parts.pop() - if parts: - parent = '.'.join(parts) - setattr(sys.modules[parent], name, sys.modules[packageName]) - - -def yield_lines(strs): - """Yield non-empty/non-comment lines of a string or sequence""" - if isinstance(strs, six.string_types): - for s in strs.splitlines(): - s = s.strip() - # skip blank lines/comments - if s and not s.startswith('#'): - yield s - else: - for ss in strs: - for s in yield_lines(ss): - yield s - - -MODULE = re.compile(r"\w+(\.\w+)*$").match -EGG_NAME = re.compile( - r""" - (?P<name>[^-]+) ( - -(?P<ver>[^-]+) ( - -py(?P<pyver>[^-]+) ( - -(?P<plat>.+) - )? - )? - )? - """, - re.VERBOSE | re.IGNORECASE, -).match - - -class EntryPoint: - """Object representing an advertised importable object""" - - def __init__(self, name, module_name, attrs=(), extras=(), dist=None): - if not MODULE(module_name): - raise ValueError("Invalid module name", module_name) - self.name = name - self.module_name = module_name - self.attrs = tuple(attrs) - self.extras = tuple(extras) - self.dist = dist - - def __str__(self): - s = "%s = %s" % (self.name, self.module_name) - if self.attrs: - s += ':' + '.'.join(self.attrs) - if self.extras: - s += ' [%s]' % ','.join(self.extras) - return s - - def __repr__(self): - return "EntryPoint.parse(%r)" % str(self) - - def load(self, require=True, *args, **kwargs): - """ - Require packages for this EntryPoint, then resolve it. - """ - if not require or args or kwargs: - warnings.warn( - "Parameters to load are deprecated. Call .resolve and " - ".require separately.", - PkgResourcesDeprecationWarning, - stacklevel=2, - ) - if require: - self.require(*args, **kwargs) - return self.resolve() - - def resolve(self): - """ - Resolve the entry point from its module and attrs. - """ - module = __import__(self.module_name, fromlist=['__name__'], level=0) - try: - return functools.reduce(getattr, self.attrs, module) - except AttributeError as exc: - raise ImportError(str(exc)) - - def require(self, env=None, installer=None): - if self.extras and not self.dist: - raise UnknownExtra("Can't require() without a distribution", self) - - # Get the requirements for this entry point with all its extras and - # then resolve them. We have to pass `extras` along when resolving so - # that the working set knows what extras we want. Otherwise, for - # dist-info distributions, the working set will assume that the - # requirements for that extra are purely optional and skip over them. - reqs = self.dist.requires(self.extras) - items = working_set.resolve(reqs, env, installer, extras=self.extras) - list(map(working_set.add, items)) - - pattern = re.compile( - r'\s*' - r'(?P<name>.+?)\s*' - r'=\s*' - r'(?P<module>[\w.]+)\s*' - r'(:\s*(?P<attr>[\w.]+))?\s*' - r'(?P<extras>\[.*\])?\s*$' - ) - - @classmethod - def parse(cls, src, dist=None): - """Parse a single entry point from string `src` - - Entry point syntax follows the form:: - - name = some.module:some.attr [extra1, extra2] - - The entry name and module name are required, but the ``:attrs`` and - ``[extras]`` parts are optional - """ - m = cls.pattern.match(src) - if not m: - msg = "EntryPoint must be in 'name=module:attrs [extras]' format" - raise ValueError(msg, src) - res = m.groupdict() - extras = cls._parse_extras(res['extras']) - attrs = res['attr'].split('.') if res['attr'] else () - return cls(res['name'], res['module'], attrs, extras, dist) - - @classmethod - def _parse_extras(cls, extras_spec): - if not extras_spec: - return () - req = Requirement.parse('x' + extras_spec) - if req.specs: - raise ValueError() - return req.extras - - @classmethod - def parse_group(cls, group, lines, dist=None): - """Parse an entry point group""" - if not MODULE(group): - raise ValueError("Invalid group name", group) - this = {} - for line in yield_lines(lines): - ep = cls.parse(line, dist) - if ep.name in this: - raise ValueError("Duplicate entry point", group, ep.name) - this[ep.name] = ep - return this - - @classmethod - def parse_map(cls, data, dist=None): - """Parse a map of entry point groups""" - if isinstance(data, dict): - data = data.items() - else: - data = split_sections(data) - maps = {} - for group, lines in data: - if group is None: - if not lines: - continue - raise ValueError("Entry points must be listed in groups") - group = group.strip() - if group in maps: - raise ValueError("Duplicate group name", group) - maps[group] = cls.parse_group(group, lines, dist) - return maps - - -def _remove_md5_fragment(location): - if not location: - return '' - parsed = urllib.parse.urlparse(location) - if parsed[-1].startswith('md5='): - return urllib.parse.urlunparse(parsed[:-1] + ('',)) - return location - - -def _version_from_file(lines): - """ - Given an iterable of lines from a Metadata file, return - the value of the Version field, if present, or None otherwise. - """ - def is_version_line(line): - return line.lower().startswith('version:') - version_lines = filter(is_version_line, lines) - line = next(iter(version_lines), '') - _, _, value = line.partition(':') - return safe_version(value.strip()) or None - - -class Distribution: - """Wrap an actual or potential sys.path entry w/metadata""" - PKG_INFO = 'PKG-INFO' - - def __init__( - self, location=None, metadata=None, project_name=None, - version=None, py_version=PY_MAJOR, platform=None, - precedence=EGG_DIST): - self.project_name = safe_name(project_name or 'Unknown') - if version is not None: - self._version = safe_version(version) - self.py_version = py_version - self.platform = platform - self.location = location - self.precedence = precedence - self._provider = metadata or empty_provider - - @classmethod - def from_location(cls, location, basename, metadata=None, **kw): - project_name, version, py_version, platform = [None] * 4 - basename, ext = os.path.splitext(basename) - if ext.lower() in _distributionImpl: - cls = _distributionImpl[ext.lower()] - - match = EGG_NAME(basename) - if match: - project_name, version, py_version, platform = match.group( - 'name', 'ver', 'pyver', 'plat' - ) - return cls( - location, metadata, project_name=project_name, version=version, - py_version=py_version, platform=platform, **kw - )._reload_version() - - def _reload_version(self): - return self - - @property - def hashcmp(self): - return ( - self.parsed_version, - self.precedence, - self.key, - _remove_md5_fragment(self.location), - self.py_version or '', - self.platform or '', - ) - - def __hash__(self): - return hash(self.hashcmp) - - def __lt__(self, other): - return self.hashcmp < other.hashcmp - - def __le__(self, other): - return self.hashcmp <= other.hashcmp - - def __gt__(self, other): - return self.hashcmp > other.hashcmp - - def __ge__(self, other): - return self.hashcmp >= other.hashcmp - - def __eq__(self, other): - if not isinstance(other, self.__class__): - # It's not a Distribution, so they are not equal - return False - return self.hashcmp == other.hashcmp - - def __ne__(self, other): - return not self == other - - # These properties have to be lazy so that we don't have to load any - # metadata until/unless it's actually needed. (i.e., some distributions - # may not know their name or version without loading PKG-INFO) - - @property - def key(self): - try: - return self._key - except AttributeError: - self._key = key = self.project_name.lower() - return key - - @property - def parsed_version(self): - if not hasattr(self, "_parsed_version"): - self._parsed_version = parse_version(self.version) - - return self._parsed_version - - def _warn_legacy_version(self): - LV = packaging.version.LegacyVersion - is_legacy = isinstance(self._parsed_version, LV) - if not is_legacy: - return - - # While an empty version is technically a legacy version and - # is not a valid PEP 440 version, it's also unlikely to - # actually come from someone and instead it is more likely that - # it comes from setuptools attempting to parse a filename and - # including it in the list. So for that we'll gate this warning - # on if the version is anything at all or not. - if not self.version: - return - - tmpl = textwrap.dedent(""" - '{project_name} ({version})' is being parsed as a legacy, - non PEP 440, - version. You may find odd behavior and sort order. - In particular it will be sorted as less than 0.0. It - is recommended to migrate to PEP 440 compatible - versions. - """).strip().replace('\n', ' ') - - warnings.warn(tmpl.format(**vars(self)), PEP440Warning) - - @property - def version(self): - try: - return self._version - except AttributeError: - version = self._get_version() - if version is None: - path = self._get_metadata_path_for_display(self.PKG_INFO) - msg = ( - "Missing 'Version:' header and/or {} file at path: {}" - ).format(self.PKG_INFO, path) - raise ValueError(msg, self) - - return version - - @property - def _dep_map(self): - """ - A map of extra to its list of (direct) requirements - for this distribution, including the null extra. - """ - try: - return self.__dep_map - except AttributeError: - self.__dep_map = self._filter_extras(self._build_dep_map()) - return self.__dep_map - - @staticmethod - def _filter_extras(dm): - """ - Given a mapping of extras to dependencies, strip off - environment markers and filter out any dependencies - not matching the markers. - """ - for extra in list(filter(None, dm)): - new_extra = extra - reqs = dm.pop(extra) - new_extra, _, marker = extra.partition(':') - fails_marker = marker and ( - invalid_marker(marker) - or not evaluate_marker(marker) - ) - if fails_marker: - reqs = [] - new_extra = safe_extra(new_extra) or None - - dm.setdefault(new_extra, []).extend(reqs) - return dm - - def _build_dep_map(self): - dm = {} - for name in 'requires.txt', 'depends.txt': - for extra, reqs in split_sections(self._get_metadata(name)): - dm.setdefault(extra, []).extend(parse_requirements(reqs)) - return dm - - def requires(self, extras=()): - """List of Requirements needed for this distro if `extras` are used""" - dm = self._dep_map - deps = [] - deps.extend(dm.get(None, ())) - for ext in extras: - try: - deps.extend(dm[safe_extra(ext)]) - except KeyError: - raise UnknownExtra( - "%s has no such extra feature %r" % (self, ext) - ) - return deps - - def _get_metadata_path_for_display(self, name): - """ - Return the path to the given metadata file, if available. - """ - try: - # We need to access _get_metadata_path() on the provider object - # directly rather than through this class's __getattr__() - # since _get_metadata_path() is marked private. - path = self._provider._get_metadata_path(name) - - # Handle exceptions e.g. in case the distribution's metadata - # provider doesn't support _get_metadata_path(). - except Exception: - return '[could not detect]' - - return path - - def _get_metadata(self, name): - if self.has_metadata(name): - for line in self.get_metadata_lines(name): - yield line - - def _get_version(self): - lines = self._get_metadata(self.PKG_INFO) - version = _version_from_file(lines) - - return version - - def activate(self, path=None, replace=False): - """Ensure distribution is importable on `path` (default=sys.path)""" - if path is None: - path = sys.path - self.insert_on(path, replace=replace) - if path is sys.path: - fixup_namespace_packages(self.location) - for pkg in self._get_metadata('namespace_packages.txt'): - if pkg in sys.modules: - declare_namespace(pkg) - - def egg_name(self): - """Return what this distribution's standard .egg filename should be""" - filename = "%s-%s-py%s" % ( - to_filename(self.project_name), to_filename(self.version), - self.py_version or PY_MAJOR - ) - - if self.platform: - filename += '-' + self.platform - return filename - - def __repr__(self): - if self.location: - return "%s (%s)" % (self, self.location) - else: - return str(self) - - def __str__(self): - try: - version = getattr(self, 'version', None) - except ValueError: - version = None - version = version or "[unknown version]" - return "%s %s" % (self.project_name, version) - - def __getattr__(self, attr): - """Delegate all unrecognized public attributes to .metadata provider""" - if attr.startswith('_'): - raise AttributeError(attr) - return getattr(self._provider, attr) - - def __dir__(self): - return list( - set(super(Distribution, self).__dir__()) - | set( - attr for attr in self._provider.__dir__() - if not attr.startswith('_') - ) - ) - - if not hasattr(object, '__dir__'): - # python 2.7 not supported - del __dir__ - - @classmethod - def from_filename(cls, filename, metadata=None, **kw): - return cls.from_location( - _normalize_cached(filename), os.path.basename(filename), metadata, - **kw - ) - - def as_requirement(self): - """Return a ``Requirement`` that matches this distribution exactly""" - if isinstance(self.parsed_version, packaging.version.Version): - spec = "%s==%s" % (self.project_name, self.parsed_version) - else: - spec = "%s===%s" % (self.project_name, self.parsed_version) - - return Requirement.parse(spec) - - def load_entry_point(self, group, name): - """Return the `name` entry point of `group` or raise ImportError""" - ep = self.get_entry_info(group, name) - if ep is None: - raise ImportError("Entry point %r not found" % ((group, name),)) - return ep.load() - - def get_entry_map(self, group=None): - """Return the entry point map for `group`, or the full entry map""" - try: - ep_map = self._ep_map - except AttributeError: - ep_map = self._ep_map = EntryPoint.parse_map( - self._get_metadata('entry_points.txt'), self - ) - if group is not None: - return ep_map.get(group, {}) - return ep_map - - def get_entry_info(self, group, name): - """Return the EntryPoint object for `group`+`name`, or ``None``""" - return self.get_entry_map(group).get(name) - - def insert_on(self, path, loc=None, replace=False): - """Ensure self.location is on path - - If replace=False (default): - - If location is already in path anywhere, do nothing. - - Else: - - If it's an egg and its parent directory is on path, - insert just ahead of the parent. - - Else: add to the end of path. - If replace=True: - - If location is already on path anywhere (not eggs) - or higher priority than its parent (eggs) - do nothing. - - Else: - - If it's an egg and its parent directory is on path, - insert just ahead of the parent, - removing any lower-priority entries. - - Else: add it to the front of path. - """ - - loc = loc or self.location - if not loc: - return - - nloc = _normalize_cached(loc) - bdir = os.path.dirname(nloc) - npath = [(p and _normalize_cached(p) or p) for p in path] - - for p, item in enumerate(npath): - if item == nloc: - if replace: - break - else: - # don't modify path (even removing duplicates) if - # found and not replace - return - elif item == bdir and self.precedence == EGG_DIST: - # if it's an .egg, give it precedence over its directory - # UNLESS it's already been added to sys.path and replace=False - if (not replace) and nloc in npath[p:]: - return - if path is sys.path: - self.check_version_conflict() - path.insert(p, loc) - npath.insert(p, nloc) - break - else: - if path is sys.path: - self.check_version_conflict() - if replace: - path.insert(0, loc) - else: - path.append(loc) - return - - # p is the spot where we found or inserted loc; now remove duplicates - while True: - try: - np = npath.index(nloc, p + 1) - except ValueError: - break - else: - del npath[np], path[np] - # ha! - p = np - - return - - def check_version_conflict(self): - if self.key == 'setuptools': - # ignore the inevitable setuptools self-conflicts :( - return - - nsp = dict.fromkeys(self._get_metadata('namespace_packages.txt')) - loc = normalize_path(self.location) - for modname in self._get_metadata('top_level.txt'): - if (modname not in sys.modules or modname in nsp - or modname in _namespace_packages): - continue - if modname in ('pkg_resources', 'setuptools', 'site'): - continue - fn = getattr(sys.modules[modname], '__file__', None) - if fn and (normalize_path(fn).startswith(loc) or - fn.startswith(self.location)): - continue - issue_warning( - "Module %s was already imported from %s, but %s is being added" - " to sys.path" % (modname, fn, self.location), - ) - - def has_version(self): - try: - self.version - except ValueError: - issue_warning("Unbuilt egg for " + repr(self)) - return False - return True - - def clone(self, **kw): - """Copy this distribution, substituting in any changed keyword args""" - names = 'project_name version py_version platform location precedence' - for attr in names.split(): - kw.setdefault(attr, getattr(self, attr, None)) - kw.setdefault('metadata', self._provider) - return self.__class__(**kw) - - @property - def extras(self): - return [dep for dep in self._dep_map if dep] - - -class EggInfoDistribution(Distribution): - def _reload_version(self): - """ - Packages installed by distutils (e.g. numpy or scipy), - which uses an old safe_version, and so - their version numbers can get mangled when - converted to filenames (e.g., 1.11.0.dev0+2329eae to - 1.11.0.dev0_2329eae). These distributions will not be - parsed properly - downstream by Distribution and safe_version, so - take an extra step and try to get the version number from - the metadata file itself instead of the filename. - """ - md_version = self._get_version() - if md_version: - self._version = md_version - return self - - -class DistInfoDistribution(Distribution): - """ - Wrap an actual or potential sys.path entry - w/metadata, .dist-info style. - """ - PKG_INFO = 'METADATA' - EQEQ = re.compile(r"([\(,])\s*(\d.*?)\s*([,\)])") - - @property - def _parsed_pkg_info(self): - """Parse and cache metadata""" - try: - return self._pkg_info - except AttributeError: - metadata = self.get_metadata(self.PKG_INFO) - self._pkg_info = email.parser.Parser().parsestr(metadata) - return self._pkg_info - - @property - def _dep_map(self): - try: - return self.__dep_map - except AttributeError: - self.__dep_map = self._compute_dependencies() - return self.__dep_map - - def _compute_dependencies(self): - """Recompute this distribution's dependencies.""" - dm = self.__dep_map = {None: []} - - reqs = [] - # Including any condition expressions - for req in self._parsed_pkg_info.get_all('Requires-Dist') or []: - reqs.extend(parse_requirements(req)) - - def reqs_for_extra(extra): - for req in reqs: - if not req.marker or req.marker.evaluate({'extra': extra}): - yield req - - common = frozenset(reqs_for_extra(None)) - dm[None].extend(common) - - for extra in self._parsed_pkg_info.get_all('Provides-Extra') or []: - s_extra = safe_extra(extra.strip()) - dm[s_extra] = list(frozenset(reqs_for_extra(extra)) - common) - - return dm - - -_distributionImpl = { - '.egg': Distribution, - '.egg-info': EggInfoDistribution, - '.dist-info': DistInfoDistribution, -} - - -def issue_warning(*args, **kw): - level = 1 - g = globals() - try: - # find the first stack frame that is *not* code in - # the pkg_resources module, to use for the warning - while sys._getframe(level).f_globals is g: - level += 1 - except ValueError: - pass - warnings.warn(stacklevel=level + 1, *args, **kw) - - -class RequirementParseError(ValueError): - def __str__(self): - return ' '.join(self.args) - - -def parse_requirements(strs): - """Yield ``Requirement`` objects for each specification in `strs` - - `strs` must be a string, or a (possibly-nested) iterable thereof. - """ - # create a steppable iterator, so we can handle \-continuations - lines = iter(yield_lines(strs)) - - for line in lines: - # Drop comments -- a hash without a space may be in a URL. - if ' #' in line: - line = line[:line.find(' #')] - # If there is a line continuation, drop it, and append the next line. - if line.endswith('\\'): - line = line[:-2].strip() - try: - line += next(lines) - except StopIteration: - return - yield Requirement(line) - - -class Requirement(packaging.requirements.Requirement): - def __init__(self, requirement_string): - """DO NOT CALL THIS UNDOCUMENTED METHOD; use Requirement.parse()!""" - try: - super(Requirement, self).__init__(requirement_string) - except packaging.requirements.InvalidRequirement as e: - raise RequirementParseError(str(e)) - self.unsafe_name = self.name - project_name = safe_name(self.name) - self.project_name, self.key = project_name, project_name.lower() - self.specs = [ - (spec.operator, spec.version) for spec in self.specifier] - self.extras = tuple(map(safe_extra, self.extras)) - self.hashCmp = ( - self.key, - self.specifier, - frozenset(self.extras), - str(self.marker) if self.marker else None, - ) - self.__hash = hash(self.hashCmp) - - def __eq__(self, other): - return ( - isinstance(other, Requirement) and - self.hashCmp == other.hashCmp - ) - - def __ne__(self, other): - return not self == other - - def __contains__(self, item): - if isinstance(item, Distribution): - if item.key != self.key: - return False - - item = item.version - - # Allow prereleases always in order to match the previous behavior of - # this method. In the future this should be smarter and follow PEP 440 - # more accurately. - return self.specifier.contains(item, prereleases=True) - - def __hash__(self): - return self.__hash - - def __repr__(self): - return "Requirement.parse(%r)" % str(self) - - @staticmethod - def parse(s): - req, = parse_requirements(s) - return req - - -def _always_object(classes): - """ - Ensure object appears in the mro even - for old-style classes. - """ - if object not in classes: - return classes + (object,) - return classes - - -def _find_adapter(registry, ob): - """Return an adapter factory for `ob` from `registry`""" - types = _always_object(inspect.getmro(getattr(ob, '__class__', type(ob)))) - for t in types: - if t in registry: - return registry[t] - - -def ensure_directory(path): - """Ensure that the parent directory of `path` exists""" - dirname = os.path.dirname(path) - py31compat.makedirs(dirname, exist_ok=True) - - -def _bypass_ensure_directory(path): - """Sandbox-bypassing version of ensure_directory()""" - if not WRITE_SUPPORT: - raise IOError('"os.mkdir" not supported on this platform.') - dirname, filename = split(path) - if dirname and filename and not isdir(dirname): - _bypass_ensure_directory(dirname) - try: - mkdir(dirname, 0o755) - except FileExistsError: - pass - - -def split_sections(s): - """Split a string or iterable thereof into (section, content) pairs - - Each ``section`` is a stripped version of the section header ("[section]") - and each ``content`` is a list of stripped lines excluding blank lines and - comment-only lines. If there are any such lines before the first section - header, they're returned in a first ``section`` of ``None``. - """ - section = None - content = [] - for line in yield_lines(s): - if line.startswith("["): - if line.endswith("]"): - if section or content: - yield section, content - section = line[1:-1].strip() - content = [] - else: - raise ValueError("Invalid section heading", line) - else: - content.append(line) - - # wrap up last segment - yield section, content - - -def _mkstemp(*args, **kw): - old_open = os.open - try: - # temporarily bypass sandboxing - os.open = os_open - return tempfile.mkstemp(*args, **kw) - finally: - # and then put it back - os.open = old_open - - -# Silence the PEP440Warning by default, so that end users don't get hit by it -# randomly just because they use pkg_resources. We want to append the rule -# because we want earlier uses of filterwarnings to take precedence over this -# one. -warnings.filterwarnings("ignore", category=PEP440Warning, append=True) - - -# from jaraco.functools 1.3 -def _call_aside(f, *args, **kwargs): - f(*args, **kwargs) - return f - - -@_call_aside -def _initialize(g=globals()): - "Set up global resource manager (deliberately not state-saved)" - manager = ResourceManager() - g['_manager'] = manager - g.update( - (name, getattr(manager, name)) - for name in dir(manager) - if not name.startswith('_') - ) - - -@_call_aside -def _initialize_master_working_set(): - """ - Prepare the master working set and make the ``require()`` - API available. - - This function has explicit effects on the global state - of pkg_resources. It is intended to be invoked once at - the initialization of this module. - - Invocation by other packages is unsupported and done - at their own risk. - """ - working_set = WorkingSet._build_master() - _declare_state('object', working_set=working_set) - - require = working_set.require - iter_entry_points = working_set.iter_entry_points - add_activation_listener = working_set.subscribe - run_script = working_set.run_script - # backward compatibility - run_main = run_script - # Activate all distributions already on sys.path with replace=False and - # ensure that all distributions added to the working set in the future - # (e.g. by calling ``require()``) will get activated as well, - # with higher priority (replace=True). - tuple( - dist.activate(replace=False) - for dist in working_set - ) - add_activation_listener( - lambda dist: dist.activate(replace=True), - existing=False, - ) - working_set.entries = [] - # match order - list(map(working_set.add_entry, sys.path)) - globals().update(locals()) - -class PkgResourcesDeprecationWarning(Warning): - """ - Base class for warning about deprecations in ``pkg_resources`` - - This class is not derived from ``DeprecationWarning``, and as such is - visible by default. - """ diff --git a/venv/lib/python2.7/site-packages/pkg_resources/__init__.pyc b/venv/lib/python2.7/site-packages/pkg_resources/__init__.pyc deleted file mode 100644 index ee89a50abd22c9f429361d8e2af5261278385931..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 136325 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 Oi}5OTZQU@i_x}f?qo`K^ diff --git a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/__init__.py b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/__init__.pyc b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/__init__.pyc deleted file mode 100644 index 5a927863c8afc52e817ec616c716c6ec4ca9644d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 207 zcmZ9GK?=e!6htGs5JAr&Lj5gDQ4sM0ilAEwwTUGdllXsH+wMHG7cd1^4$K>v%}oC@ z9?jm9OU{1kh1><xAV4s7ns&`$8o>TQb?CsMsxmL3$`Ec=3yB164b1|t=5<ffr-@Ts zrumBMwP-O8Djb}_DHkb2KGQn#$-dx6An8lzt<?nXUT~CTOUxw!ucQ$cfpcY)=X~xO RKMdoWhZUuk+wLL-voC-$HW&Z^ diff --git a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/appdirs.py b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/appdirs.py deleted file mode 100644 index ae67001..0000000 --- a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/appdirs.py +++ /dev/null @@ -1,608 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# Copyright (c) 2005-2010 ActiveState Software Inc. -# Copyright (c) 2013 Eddy Petrișor - -"""Utilities for determining application-specific dirs. - -See <http://github.com/ActiveState/appdirs> for details and usage. -""" -# Dev Notes: -# - MSDN on where to store app data files: -# http://support.microsoft.com/default.aspx?scid=kb;en-us;310294#XSLTH3194121123120121120120 -# - Mac OS X: http://developer.apple.com/documentation/MacOSX/Conceptual/BPFileSystem/index.html -# - XDG spec for Un*x: http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html - -__version_info__ = (1, 4, 3) -__version__ = '.'.join(map(str, __version_info__)) - - -import sys -import os - -PY3 = sys.version_info[0] == 3 - -if PY3: - unicode = str - -if sys.platform.startswith('java'): - import platform - os_name = platform.java_ver()[3][0] - if os_name.startswith('Windows'): # "Windows XP", "Windows 7", etc. - system = 'win32' - elif os_name.startswith('Mac'): # "Mac OS X", etc. - system = 'darwin' - else: # "Linux", "SunOS", "FreeBSD", etc. - # Setting this to "linux2" is not ideal, but only Windows or Mac - # are actually checked for and the rest of the module expects - # *sys.platform* style strings. - system = 'linux2' -else: - system = sys.platform - - - -def user_data_dir(appname=None, appauthor=None, version=None, roaming=False): - r"""Return full path to the user-specific data dir for this application. - - "appname" is the name of application. - If None, just the system directory is returned. - "appauthor" (only used on Windows) is the name of the - appauthor or distributing body for this application. Typically - it is the owning company name. This falls back to appname. You may - pass False to disable it. - "version" is an optional version path element to append to the - path. You might want to use this if you want multiple versions - of your app to be able to run independently. If used, this - would typically be "<major>.<minor>". - Only applied when appname is present. - "roaming" (boolean, default False) can be set True to use the Windows - roaming appdata directory. That means that for users on a Windows - network setup for roaming profiles, this user data will be - sync'd on login. See - <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx> - for a discussion of issues. - - Typical user data directories are: - Mac OS X: ~/Library/Application Support/<AppName> - Unix: ~/.local/share/<AppName> # or in $XDG_DATA_HOME, if defined - Win XP (not roaming): C:\Documents and Settings\<username>\Application Data\<AppAuthor>\<AppName> - Win XP (roaming): C:\Documents and Settings\<username>\Local Settings\Application Data\<AppAuthor>\<AppName> - Win 7 (not roaming): C:\Users\<username>\AppData\Local\<AppAuthor>\<AppName> - Win 7 (roaming): C:\Users\<username>\AppData\Roaming\<AppAuthor>\<AppName> - - For Unix, we follow the XDG spec and support $XDG_DATA_HOME. - That means, by default "~/.local/share/<AppName>". - """ - if system == "win32": - if appauthor is None: - appauthor = appname - const = roaming and "CSIDL_APPDATA" or "CSIDL_LOCAL_APPDATA" - path = os.path.normpath(_get_win_folder(const)) - if appname: - if appauthor is not False: - path = os.path.join(path, appauthor, appname) - else: - path = os.path.join(path, appname) - elif system == 'darwin': - path = os.path.expanduser('~/Library/Application Support/') - if appname: - path = os.path.join(path, appname) - else: - path = os.getenv('XDG_DATA_HOME', os.path.expanduser("~/.local/share")) - if appname: - path = os.path.join(path, appname) - if appname and version: - path = os.path.join(path, version) - return path - - -def site_data_dir(appname=None, appauthor=None, version=None, multipath=False): - r"""Return full path to the user-shared data dir for this application. - - "appname" is the name of application. - If None, just the system directory is returned. - "appauthor" (only used on Windows) is the name of the - appauthor or distributing body for this application. Typically - it is the owning company name. This falls back to appname. You may - pass False to disable it. - "version" is an optional version path element to append to the - path. You might want to use this if you want multiple versions - of your app to be able to run independently. If used, this - would typically be "<major>.<minor>". - Only applied when appname is present. - "multipath" is an optional parameter only applicable to *nix - which indicates that the entire list of data dirs should be - returned. By default, the first item from XDG_DATA_DIRS is - returned, or '/usr/local/share/<AppName>', - if XDG_DATA_DIRS is not set - - Typical site data directories are: - Mac OS X: /Library/Application Support/<AppName> - Unix: /usr/local/share/<AppName> or /usr/share/<AppName> - Win XP: C:\Documents and Settings\All Users\Application Data\<AppAuthor>\<AppName> - Vista: (Fail! "C:\ProgramData" is a hidden *system* directory on Vista.) - Win 7: C:\ProgramData\<AppAuthor>\<AppName> # Hidden, but writeable on Win 7. - - For Unix, this is using the $XDG_DATA_DIRS[0] default. - - WARNING: Do not use this on Windows. See the Vista-Fail note above for why. - """ - if system == "win32": - if appauthor is None: - appauthor = appname - path = os.path.normpath(_get_win_folder("CSIDL_COMMON_APPDATA")) - if appname: - if appauthor is not False: - path = os.path.join(path, appauthor, appname) - else: - path = os.path.join(path, appname) - elif system == 'darwin': - path = os.path.expanduser('/Library/Application Support') - if appname: - path = os.path.join(path, appname) - else: - # XDG default for $XDG_DATA_DIRS - # only first, if multipath is False - path = os.getenv('XDG_DATA_DIRS', - os.pathsep.join(['/usr/local/share', '/usr/share'])) - pathlist = [os.path.expanduser(x.rstrip(os.sep)) for x in path.split(os.pathsep)] - if appname: - if version: - appname = os.path.join(appname, version) - pathlist = [os.sep.join([x, appname]) for x in pathlist] - - if multipath: - path = os.pathsep.join(pathlist) - else: - path = pathlist[0] - return path - - if appname and version: - path = os.path.join(path, version) - return path - - -def user_config_dir(appname=None, appauthor=None, version=None, roaming=False): - r"""Return full path to the user-specific config dir for this application. - - "appname" is the name of application. - If None, just the system directory is returned. - "appauthor" (only used on Windows) is the name of the - appauthor or distributing body for this application. Typically - it is the owning company name. This falls back to appname. You may - pass False to disable it. - "version" is an optional version path element to append to the - path. You might want to use this if you want multiple versions - of your app to be able to run independently. If used, this - would typically be "<major>.<minor>". - Only applied when appname is present. - "roaming" (boolean, default False) can be set True to use the Windows - roaming appdata directory. That means that for users on a Windows - network setup for roaming profiles, this user data will be - sync'd on login. See - <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx> - for a discussion of issues. - - Typical user config directories are: - Mac OS X: same as user_data_dir - Unix: ~/.config/<AppName> # or in $XDG_CONFIG_HOME, if defined - Win *: same as user_data_dir - - For Unix, we follow the XDG spec and support $XDG_CONFIG_HOME. - That means, by default "~/.config/<AppName>". - """ - if system in ["win32", "darwin"]: - path = user_data_dir(appname, appauthor, None, roaming) - else: - path = os.getenv('XDG_CONFIG_HOME', os.path.expanduser("~/.config")) - if appname: - path = os.path.join(path, appname) - if appname and version: - path = os.path.join(path, version) - return path - - -def site_config_dir(appname=None, appauthor=None, version=None, multipath=False): - r"""Return full path to the user-shared data dir for this application. - - "appname" is the name of application. - If None, just the system directory is returned. - "appauthor" (only used on Windows) is the name of the - appauthor or distributing body for this application. Typically - it is the owning company name. This falls back to appname. You may - pass False to disable it. - "version" is an optional version path element to append to the - path. You might want to use this if you want multiple versions - of your app to be able to run independently. If used, this - would typically be "<major>.<minor>". - Only applied when appname is present. - "multipath" is an optional parameter only applicable to *nix - which indicates that the entire list of config dirs should be - returned. By default, the first item from XDG_CONFIG_DIRS is - returned, or '/etc/xdg/<AppName>', if XDG_CONFIG_DIRS is not set - - Typical site config directories are: - Mac OS X: same as site_data_dir - Unix: /etc/xdg/<AppName> or $XDG_CONFIG_DIRS[i]/<AppName> for each value in - $XDG_CONFIG_DIRS - Win *: same as site_data_dir - Vista: (Fail! "C:\ProgramData" is a hidden *system* directory on Vista.) - - For Unix, this is using the $XDG_CONFIG_DIRS[0] default, if multipath=False - - WARNING: Do not use this on Windows. See the Vista-Fail note above for why. - """ - if system in ["win32", "darwin"]: - path = site_data_dir(appname, appauthor) - if appname and version: - path = os.path.join(path, version) - else: - # XDG default for $XDG_CONFIG_DIRS - # only first, if multipath is False - path = os.getenv('XDG_CONFIG_DIRS', '/etc/xdg') - pathlist = [os.path.expanduser(x.rstrip(os.sep)) for x in path.split(os.pathsep)] - if appname: - if version: - appname = os.path.join(appname, version) - pathlist = [os.sep.join([x, appname]) for x in pathlist] - - if multipath: - path = os.pathsep.join(pathlist) - else: - path = pathlist[0] - return path - - -def user_cache_dir(appname=None, appauthor=None, version=None, opinion=True): - r"""Return full path to the user-specific cache dir for this application. - - "appname" is the name of application. - If None, just the system directory is returned. - "appauthor" (only used on Windows) is the name of the - appauthor or distributing body for this application. Typically - it is the owning company name. This falls back to appname. You may - pass False to disable it. - "version" is an optional version path element to append to the - path. You might want to use this if you want multiple versions - of your app to be able to run independently. If used, this - would typically be "<major>.<minor>". - Only applied when appname is present. - "opinion" (boolean) can be False to disable the appending of - "Cache" to the base app data dir for Windows. See - discussion below. - - Typical user cache directories are: - Mac OS X: ~/Library/Caches/<AppName> - Unix: ~/.cache/<AppName> (XDG default) - Win XP: C:\Documents and Settings\<username>\Local Settings\Application Data\<AppAuthor>\<AppName>\Cache - Vista: C:\Users\<username>\AppData\Local\<AppAuthor>\<AppName>\Cache - - On Windows the only suggestion in the MSDN docs is that local settings go in - the `CSIDL_LOCAL_APPDATA` directory. This is identical to the non-roaming - app data dir (the default returned by `user_data_dir` above). Apps typically - put cache data somewhere *under* the given dir here. Some examples: - ...\Mozilla\Firefox\Profiles\<ProfileName>\Cache - ...\Acme\SuperApp\Cache\1.0 - OPINION: This function appends "Cache" to the `CSIDL_LOCAL_APPDATA` value. - This can be disabled with the `opinion=False` option. - """ - if system == "win32": - if appauthor is None: - appauthor = appname - path = os.path.normpath(_get_win_folder("CSIDL_LOCAL_APPDATA")) - if appname: - if appauthor is not False: - path = os.path.join(path, appauthor, appname) - else: - path = os.path.join(path, appname) - if opinion: - path = os.path.join(path, "Cache") - elif system == 'darwin': - path = os.path.expanduser('~/Library/Caches') - if appname: - path = os.path.join(path, appname) - else: - path = os.getenv('XDG_CACHE_HOME', os.path.expanduser('~/.cache')) - if appname: - path = os.path.join(path, appname) - if appname and version: - path = os.path.join(path, version) - return path - - -def user_state_dir(appname=None, appauthor=None, version=None, roaming=False): - r"""Return full path to the user-specific state dir for this application. - - "appname" is the name of application. - If None, just the system directory is returned. - "appauthor" (only used on Windows) is the name of the - appauthor or distributing body for this application. Typically - it is the owning company name. This falls back to appname. You may - pass False to disable it. - "version" is an optional version path element to append to the - path. You might want to use this if you want multiple versions - of your app to be able to run independently. If used, this - would typically be "<major>.<minor>". - Only applied when appname is present. - "roaming" (boolean, default False) can be set True to use the Windows - roaming appdata directory. That means that for users on a Windows - network setup for roaming profiles, this user data will be - sync'd on login. See - <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx> - for a discussion of issues. - - Typical user state directories are: - Mac OS X: same as user_data_dir - Unix: ~/.local/state/<AppName> # or in $XDG_STATE_HOME, if defined - Win *: same as user_data_dir - - For Unix, we follow this Debian proposal <https://wiki.debian.org/XDGBaseDirectorySpecification#state> - to extend the XDG spec and support $XDG_STATE_HOME. - - That means, by default "~/.local/state/<AppName>". - """ - if system in ["win32", "darwin"]: - path = user_data_dir(appname, appauthor, None, roaming) - else: - path = os.getenv('XDG_STATE_HOME', os.path.expanduser("~/.local/state")) - if appname: - path = os.path.join(path, appname) - if appname and version: - path = os.path.join(path, version) - return path - - -def user_log_dir(appname=None, appauthor=None, version=None, opinion=True): - r"""Return full path to the user-specific log dir for this application. - - "appname" is the name of application. - If None, just the system directory is returned. - "appauthor" (only used on Windows) is the name of the - appauthor or distributing body for this application. Typically - it is the owning company name. This falls back to appname. You may - pass False to disable it. - "version" is an optional version path element to append to the - path. You might want to use this if you want multiple versions - of your app to be able to run independently. If used, this - would typically be "<major>.<minor>". - Only applied when appname is present. - "opinion" (boolean) can be False to disable the appending of - "Logs" to the base app data dir for Windows, and "log" to the - base cache dir for Unix. See discussion below. - - Typical user log directories are: - Mac OS X: ~/Library/Logs/<AppName> - Unix: ~/.cache/<AppName>/log # or under $XDG_CACHE_HOME if defined - Win XP: C:\Documents and Settings\<username>\Local Settings\Application Data\<AppAuthor>\<AppName>\Logs - Vista: C:\Users\<username>\AppData\Local\<AppAuthor>\<AppName>\Logs - - On Windows the only suggestion in the MSDN docs is that local settings - go in the `CSIDL_LOCAL_APPDATA` directory. (Note: I'm interested in - examples of what some windows apps use for a logs dir.) - - OPINION: This function appends "Logs" to the `CSIDL_LOCAL_APPDATA` - value for Windows and appends "log" to the user cache dir for Unix. - This can be disabled with the `opinion=False` option. - """ - if system == "darwin": - path = os.path.join( - os.path.expanduser('~/Library/Logs'), - appname) - elif system == "win32": - path = user_data_dir(appname, appauthor, version) - version = False - if opinion: - path = os.path.join(path, "Logs") - else: - path = user_cache_dir(appname, appauthor, version) - version = False - if opinion: - path = os.path.join(path, "log") - if appname and version: - path = os.path.join(path, version) - return path - - -class AppDirs(object): - """Convenience wrapper for getting application dirs.""" - def __init__(self, appname=None, appauthor=None, version=None, - roaming=False, multipath=False): - self.appname = appname - self.appauthor = appauthor - self.version = version - self.roaming = roaming - self.multipath = multipath - - @property - def user_data_dir(self): - return user_data_dir(self.appname, self.appauthor, - version=self.version, roaming=self.roaming) - - @property - def site_data_dir(self): - return site_data_dir(self.appname, self.appauthor, - version=self.version, multipath=self.multipath) - - @property - def user_config_dir(self): - return user_config_dir(self.appname, self.appauthor, - version=self.version, roaming=self.roaming) - - @property - def site_config_dir(self): - return site_config_dir(self.appname, self.appauthor, - version=self.version, multipath=self.multipath) - - @property - def user_cache_dir(self): - return user_cache_dir(self.appname, self.appauthor, - version=self.version) - - @property - def user_state_dir(self): - return user_state_dir(self.appname, self.appauthor, - version=self.version) - - @property - def user_log_dir(self): - return user_log_dir(self.appname, self.appauthor, - version=self.version) - - -#---- internal support stuff - -def _get_win_folder_from_registry(csidl_name): - """This is a fallback technique at best. I'm not sure if using the - registry for this guarantees us the correct answer for all CSIDL_* - names. - """ - if PY3: - import winreg as _winreg - else: - import _winreg - - shell_folder_name = { - "CSIDL_APPDATA": "AppData", - "CSIDL_COMMON_APPDATA": "Common AppData", - "CSIDL_LOCAL_APPDATA": "Local AppData", - }[csidl_name] - - key = _winreg.OpenKey( - _winreg.HKEY_CURRENT_USER, - r"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" - ) - dir, type = _winreg.QueryValueEx(key, shell_folder_name) - return dir - - -def _get_win_folder_with_pywin32(csidl_name): - from win32com.shell import shellcon, shell - dir = shell.SHGetFolderPath(0, getattr(shellcon, csidl_name), 0, 0) - # Try to make this a unicode path because SHGetFolderPath does - # not return unicode strings when there is unicode data in the - # path. - try: - dir = unicode(dir) - - # Downgrade to short path name if have highbit chars. See - # <http://bugs.activestate.com/show_bug.cgi?id=85099>. - has_high_char = False - for c in dir: - if ord(c) > 255: - has_high_char = True - break - if has_high_char: - try: - import win32api - dir = win32api.GetShortPathName(dir) - except ImportError: - pass - except UnicodeError: - pass - return dir - - -def _get_win_folder_with_ctypes(csidl_name): - import ctypes - - csidl_const = { - "CSIDL_APPDATA": 26, - "CSIDL_COMMON_APPDATA": 35, - "CSIDL_LOCAL_APPDATA": 28, - }[csidl_name] - - buf = ctypes.create_unicode_buffer(1024) - ctypes.windll.shell32.SHGetFolderPathW(None, csidl_const, None, 0, buf) - - # Downgrade to short path name if have highbit chars. See - # <http://bugs.activestate.com/show_bug.cgi?id=85099>. - has_high_char = False - for c in buf: - if ord(c) > 255: - has_high_char = True - break - if has_high_char: - buf2 = ctypes.create_unicode_buffer(1024) - if ctypes.windll.kernel32.GetShortPathNameW(buf.value, buf2, 1024): - buf = buf2 - - return buf.value - -def _get_win_folder_with_jna(csidl_name): - import array - from com.sun import jna - from com.sun.jna.platform import win32 - - buf_size = win32.WinDef.MAX_PATH * 2 - buf = array.zeros('c', buf_size) - shell = win32.Shell32.INSTANCE - shell.SHGetFolderPath(None, getattr(win32.ShlObj, csidl_name), None, win32.ShlObj.SHGFP_TYPE_CURRENT, buf) - dir = jna.Native.toString(buf.tostring()).rstrip("\0") - - # Downgrade to short path name if have highbit chars. See - # <http://bugs.activestate.com/show_bug.cgi?id=85099>. - has_high_char = False - for c in dir: - if ord(c) > 255: - has_high_char = True - break - if has_high_char: - buf = array.zeros('c', buf_size) - kernel = win32.Kernel32.INSTANCE - if kernel.GetShortPathName(dir, buf, buf_size): - dir = jna.Native.toString(buf.tostring()).rstrip("\0") - - return dir - -if system == "win32": - try: - import win32com.shell - _get_win_folder = _get_win_folder_with_pywin32 - except ImportError: - try: - from ctypes import windll - _get_win_folder = _get_win_folder_with_ctypes - except ImportError: - try: - import com.sun.jna - _get_win_folder = _get_win_folder_with_jna - except ImportError: - _get_win_folder = _get_win_folder_from_registry - - -#---- self test code - -if __name__ == "__main__": - appname = "MyApp" - appauthor = "MyCompany" - - props = ("user_data_dir", - "user_config_dir", - "user_cache_dir", - "user_state_dir", - "user_log_dir", - "site_data_dir", - "site_config_dir") - - print("-- app dirs %s --" % __version__) - - print("-- app dirs (with optional 'version')") - dirs = AppDirs(appname, appauthor, version="1.0") - for prop in props: - print("%s: %s" % (prop, getattr(dirs, prop))) - - print("\n-- app dirs (without optional 'version')") - dirs = AppDirs(appname, appauthor) - for prop in props: - print("%s: %s" % (prop, getattr(dirs, prop))) - - print("\n-- app dirs (without optional 'appauthor')") - dirs = AppDirs(appname) - for prop in props: - print("%s: %s" % (prop, getattr(dirs, prop))) - - print("\n-- app dirs (with disabled 'appauthor')") - dirs = AppDirs(appname, appauthor=False) - for prop in props: - print("%s: %s" % (prop, getattr(dirs, prop))) diff --git a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/appdirs.pyc b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/appdirs.pyc deleted file mode 100644 index ebe49c2c308d37ddff33973f82a3818d4f54ab76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24415 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 diff --git a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/__about__.py b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/__about__.py deleted file mode 100644 index 95d330e..0000000 --- a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/__about__.py +++ /dev/null @@ -1,21 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. -from __future__ import absolute_import, division, print_function - -__all__ = [ - "__title__", "__summary__", "__uri__", "__version__", "__author__", - "__email__", "__license__", "__copyright__", -] - -__title__ = "packaging" -__summary__ = "Core utilities for Python packages" -__uri__ = "https://github.com/pypa/packaging" - -__version__ = "16.8" - -__author__ = "Donald Stufft and individual contributors" -__email__ = "donald@stufft.io" - -__license__ = "BSD or Apache License, Version 2.0" -__copyright__ = "Copyright 2014-2016 %s" % __author__ diff --git a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/__about__.pyc b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/__about__.pyc deleted file mode 100644 index 42bb711fe8ec9e6c09f40816ab065d2aff2a656f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 846 zcmYjPTW`}a6h3KoYj^3mXiq#CB&32^-Hxdm2%*9D2x!U>50OxCV>h*y*v6N#?hWyi z`2!rMgJCD1ea`uEe9q^jzju4jf9`!P;dX4{dipH^XK};vNuUO3637#1I*@muNg+=m z;T_;9@HOD;z&C(z0^b7Og=!0OboL-e|2E_p+JPLSyO1Mc5ArVXKIA>%`;cz~zXzfV z2l)>0`*1mUfXB*M%OFMYeFQdjx(;3xvN76vA4}wNA)VC9@1bF=RKA!6Rr=`aqN^yp z^tHfcyR}?s8fKShZ?<-@@?UHrY)plAuZ^+b=h~vVN+cR4>wn~0mO{Chc()~&+AOWC z=Khv%Sb4=NsVesb<7e6m61=RXm%@>mw&Y@o*%evwgmaIPHuv7R*OXS$&%<<B>V}%7 zVe~H98nVWd;fZ^On{%yL&B>(?vzaGMaUxX|ga=lW5*4s=8oaj7?IWAF>{HjWhf=qN zy}vvsSj;;-VJ^srRZ}m>mz5OcXgG2Q`0d%>?#R(-e0+#7Ay3_>LG1ljty%EFq8=H# zAWI^2Vsxc5t5LcvUS$?r$krolM2PV$US$?#&Z6`KeE$RY3r&ibyI@|>1+#RfYmODt zn`^p!X{YMP)p+t<jVAVZQl7Z$SNz6~a8!nVrbe1Wshr0O4*mFJRa{Ufd@x??+EH^= z6;?PMY$+Tq7D91t@ARfc!KOOkr4G%q{o&p;nul7vja|5h2#?Z!(oZ)MoE@AIlRwlX B)@A?z diff --git a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/__init__.py b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/__init__.py deleted file mode 100644 index 5ee6220..0000000 --- a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/__init__.py +++ /dev/null @@ -1,14 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. -from __future__ import absolute_import, division, print_function - -from .__about__ import ( - __author__, __copyright__, __email__, __license__, __summary__, __title__, - __uri__, __version__ -) - -__all__ = [ - "__title__", "__summary__", "__uri__", "__version__", "__author__", - "__email__", "__license__", "__copyright__", -] diff --git a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/__init__.pyc b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/__init__.pyc deleted file mode 100644 index 9a3824d242887534baf86d2ca9e8c5db4e72d681..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 668 zcmYjOTaMH)5UkAmxqAT)5Fstz6=(zqAuhlQ1->jHlZic9YvMTgG0f~ATzM}*J3AV% ztctr`-Bs-jpVo_)zpuVmIIkIfKmEwyk93f<Gc<t7z%!Tu_yA@IK13!5kV7;hm@)Vm zW&%EenSxJYX5cfJIrtoA0lt7)f-hlK;47*eL5?9OkW<JR<Q#GVxkOE6YseM8=4%qy z$x%Ke2-gJV*4riqCA8_R3n3Ym`k=kGZMdSKbGi*;7uzaON@tYH6DceRgeYTpuuh1O zdJ9q6?&Ng+5GXV6Gs={@p=jAhjjmMd)g|`Pn9`jt?4U!FZl^svI(=atluMq3D3W@S z2t`sTl8++IQ;ZW#5{wA$^JM>Qa~DH&)VQD&iZnzqNVm@(%dL&%__<4}{jXIo)JtB} z&hE;F=E{kUf8hU6$mq=uWl-!;I<~WoB<t+)$WE`_w*9rg+x%>AH}1`*dh3tx<fFT# zRd?(g>vVUcTOX+NO}P79i!aQp5W8S)<5{<_g;U-}S1HfLLABC4)|J)1taV#6A#|&0 bj91;M|BWAvm9bGD(?C8w%ZtJL$#wP@V4;+q diff --git a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/_compat.py b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/_compat.py deleted file mode 100644 index 210bb80..0000000 --- a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/_compat.py +++ /dev/null @@ -1,30 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. -from __future__ import absolute_import, division, print_function - -import sys - - -PY2 = sys.version_info[0] == 2 -PY3 = sys.version_info[0] == 3 - -# flake8: noqa - -if PY3: - string_types = str, -else: - string_types = basestring, - - -def with_metaclass(meta, *bases): - """ - Create a base class with a metaclass. - """ - # This requires a bit of explanation: the basic idea is to make a dummy - # metaclass for one level of class instantiation that replaces itself with - # the actual metaclass. - class metaclass(meta): - def __new__(cls, name, this_bases, d): - return meta(name, bases, d) - return type.__new__(metaclass, 'temporary_class', (), {}) diff --git a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/_compat.pyc b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/_compat.pyc deleted file mode 100644 index ca2121ac68c581f4b6a009da2cdc866d5d0c8f68..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1472 zcmd5+ZBG<25T1SEjyn-e@QX^~ecYHpL6m4>jESEmWbq4^n6m8lj&l2EJ9}^hKM;)g zfBgf_bWe_-aLw*?I-Pc(XZm!5zmNN`Z`Qx3FmFEfpHDonQ*ttTJjekG4~8BTJ`8;* z0vHD1@thBN2*VIm2<I!D{X7d`LRp=Mq0oi8pt@jAK&`@vcI!de1J$4V*$Vsu7(U`H zkD?BJS~H#~AcIfHB&W8@8&pykb!8A&DVFJ}wz?{Dod&hhCCX7#rbwX!%{(+OPdzg1 ztkBzKX79)$T7NwL_#MC<IX-{+H^42x@lPKR;M{|2iUyE{4CXc@V7!GDWcmYYUyMpn z4U)lWV$~qc6Ke+-8qX+FC`?>n+ht;p*4)QZ8o0(7eMa<x97X&e!U2Xu<&KXcW{`$t z{=XZ%=qUw=!!<DhxDMbpAcUNH5Rrk1lQAHZ<`#KSCIq3+(KBr&gSN=|S;Rn)$+baF zX0&b}dqX2Z<((2)F-?pZRe7e26<3#Hwr5Vui^=Z(k8)?<yxmXV+shBxmD!;-uEjS| z>v~I<7Lz>R!riZ9c_^&HrpBtut*9qsX_T!RlPW9ZRFzp}M4hCQWUR}vkZD!a32xUj z>=FtoOLZaTCb^a&gVzd##XxgJPfABn%A(4eoQ5&;ZR^1+Vor_uG?s{4%!l-nUPr3q zIl-f1p(kc0osJe1+)?7JRxLGN>j<^fc(}-2&|Q*K<eSP@MBZP9XUv-g2i;dev_}2> z1V;@vhEI^^V%BNwWXcTf%p#{wNrrUWr7lO6lltNDn|Z(IdW*&-Qcrr4TsG_WZ-vgm ln13&A$;eqIUAUjz$5zRoxI~uAx9P718{S6P@z(ra@DB?vV}<|# diff --git a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/_structures.py b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/_structures.py deleted file mode 100644 index ccc2786..0000000 --- a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/_structures.py +++ /dev/null @@ -1,68 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. -from __future__ import absolute_import, division, print_function - - -class Infinity(object): - - def __repr__(self): - return "Infinity" - - def __hash__(self): - return hash(repr(self)) - - def __lt__(self, other): - return False - - def __le__(self, other): - return False - - def __eq__(self, other): - return isinstance(other, self.__class__) - - def __ne__(self, other): - return not isinstance(other, self.__class__) - - def __gt__(self, other): - return True - - def __ge__(self, other): - return True - - def __neg__(self): - return NegativeInfinity - -Infinity = Infinity() - - -class NegativeInfinity(object): - - def __repr__(self): - return "-Infinity" - - def __hash__(self): - return hash(repr(self)) - - def __lt__(self, other): - return True - - def __le__(self, other): - return True - - def __eq__(self, other): - return isinstance(other, self.__class__) - - def __ne__(self, other): - return not isinstance(other, self.__class__) - - def __gt__(self, other): - return False - - def __ge__(self, other): - return False - - def __neg__(self): - return Infinity - -NegativeInfinity = NegativeInfinity() diff --git a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/_structures.pyc b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/_structures.pyc deleted file mode 100644 index e12c443f1c1cb63cef506d0232d2ca8c236abe08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5370 zcmds5S#Q%o5FRH@dQi%JNE{MR1VnMmQGq~+Lqg(#3T=65Bv@Q~<GOWh*SiiB@q&O~ z%pYLBO`L|Pjnp@%u6H}0b+hyBTwhcFdwSvS&!ta34X!%>e)+{A{h5V;Z--){u0w5y zx;1Los9UFYot&UXYKA%v1$FvO^owY--5}L~#6mDrE;okDO;Sy}+@zpM8?9O1BEr5c z>}t;N<ZbCRE{u{<H%oJ4=2#a*y+}uCVwU(J%cI1|PLcQqDy+XtI#CjteV=7}IXu4x zhD{a}o5MyDtYGUI4}?0g{Samb_V-POhK;i(w`XA`G;<WpT4A1oIV&uX*l5l3r~BBe z9B;7a3@dn(jaH3?bpd289@N5H2CG`doxTcs{f8%)Vf8$t+@6=aoiq+quHEn7-2I37 zR`PXsb!{(MS<4@-`A_t>r@{Apg|9GkKe}0zEk}tqUK}r*)%T(N;A&-x%%o|o-E23M zxzcHo`%1gAr;;Ge-OTfMy)a5bS89_NzA5;f``NxdOv!(c<x&Ei1_W}37=guNJj;UN z+o2!qc?b7~#kX!zTa??L-nIfh&n^mpuP|^}Eaf5_Spo-s47hISTn1i(wJvS&;#)7) z%3`-54Rop5R(U1iHrYBUV<RO}?l@ot!r}m@SimEX{#2n*9zax5o@eXEA&v*~4;#ok z9LTkyZ{c?Xd|Z2wV2Q5`&`asZp4L)M&oQVyDKAYrhI7D5G<pn+WsKt-#A!?@ztaOc zVc%b6i^qLGF_%%HKIX+pDpx(kL(bxB$Al^1@9FVm$ez480udf8$B|VTEoxnbo{4&@ zBnTDnLZCxZCMuNj)&bnsDV7JVIq|xD7Pcx$*-e8Y=0|~MBjzySRe=U3P}l{|K%oAK z3z$#>4vMvvs#CEoQNjsm7~HJQ*Z=<!7g=3JhNsaKmWLt64}GdvS+-;2<qn%!R>m@y z#=GKC^iH6;3iztp31xHQ-Uv{%G7JDds&Gt8ZM3=Wo>XwCVGj-gHy)y+jAd#Gi!IiV zC!sx2{LHqcCx^hDn3hxWkB4oy&rT{h(1;f!;L6T1(R0YziZ=={qgMyGEaeiHSs|`q zIvE5D1nM?G9!{{<?bmSwZrLgDr4VyVexC%~E6_L%I)A#gqkLoenk8kGrIeO5Kkw7z R7xs%ckmT$2%QxnE`~x5)F_8cO diff --git a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/markers.py b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/markers.py deleted file mode 100644 index 892e578..0000000 --- a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/markers.py +++ /dev/null @@ -1,301 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. -from __future__ import absolute_import, division, print_function - -import operator -import os -import platform -import sys - -from pkg_resources.extern.pyparsing import ParseException, ParseResults, stringStart, stringEnd -from pkg_resources.extern.pyparsing import ZeroOrMore, Group, Forward, QuotedString -from pkg_resources.extern.pyparsing import Literal as L # noqa - -from ._compat import string_types -from .specifiers import Specifier, InvalidSpecifier - - -__all__ = [ - "InvalidMarker", "UndefinedComparison", "UndefinedEnvironmentName", - "Marker", "default_environment", -] - - -class InvalidMarker(ValueError): - """ - An invalid marker was found, users should refer to PEP 508. - """ - - -class UndefinedComparison(ValueError): - """ - An invalid operation was attempted on a value that doesn't support it. - """ - - -class UndefinedEnvironmentName(ValueError): - """ - A name was attempted to be used that does not exist inside of the - environment. - """ - - -class Node(object): - - def __init__(self, value): - self.value = value - - def __str__(self): - return str(self.value) - - def __repr__(self): - return "<{0}({1!r})>".format(self.__class__.__name__, str(self)) - - def serialize(self): - raise NotImplementedError - - -class Variable(Node): - - def serialize(self): - return str(self) - - -class Value(Node): - - def serialize(self): - return '"{0}"'.format(self) - - -class Op(Node): - - def serialize(self): - return str(self) - - -VARIABLE = ( - L("implementation_version") | - L("platform_python_implementation") | - L("implementation_name") | - L("python_full_version") | - L("platform_release") | - L("platform_version") | - L("platform_machine") | - L("platform_system") | - L("python_version") | - L("sys_platform") | - L("os_name") | - L("os.name") | # PEP-345 - L("sys.platform") | # PEP-345 - L("platform.version") | # PEP-345 - L("platform.machine") | # PEP-345 - L("platform.python_implementation") | # PEP-345 - L("python_implementation") | # undocumented setuptools legacy - L("extra") -) -ALIASES = { - 'os.name': 'os_name', - 'sys.platform': 'sys_platform', - 'platform.version': 'platform_version', - 'platform.machine': 'platform_machine', - 'platform.python_implementation': 'platform_python_implementation', - 'python_implementation': 'platform_python_implementation' -} -VARIABLE.setParseAction(lambda s, l, t: Variable(ALIASES.get(t[0], t[0]))) - -VERSION_CMP = ( - L("===") | - L("==") | - L(">=") | - L("<=") | - L("!=") | - L("~=") | - L(">") | - L("<") -) - -MARKER_OP = VERSION_CMP | L("not in") | L("in") -MARKER_OP.setParseAction(lambda s, l, t: Op(t[0])) - -MARKER_VALUE = QuotedString("'") | QuotedString('"') -MARKER_VALUE.setParseAction(lambda s, l, t: Value(t[0])) - -BOOLOP = L("and") | L("or") - -MARKER_VAR = VARIABLE | MARKER_VALUE - -MARKER_ITEM = Group(MARKER_VAR + MARKER_OP + MARKER_VAR) -MARKER_ITEM.setParseAction(lambda s, l, t: tuple(t[0])) - -LPAREN = L("(").suppress() -RPAREN = L(")").suppress() - -MARKER_EXPR = Forward() -MARKER_ATOM = MARKER_ITEM | Group(LPAREN + MARKER_EXPR + RPAREN) -MARKER_EXPR << MARKER_ATOM + ZeroOrMore(BOOLOP + MARKER_EXPR) - -MARKER = stringStart + MARKER_EXPR + stringEnd - - -def _coerce_parse_result(results): - if isinstance(results, ParseResults): - return [_coerce_parse_result(i) for i in results] - else: - return results - - -def _format_marker(marker, first=True): - assert isinstance(marker, (list, tuple, string_types)) - - # Sometimes we have a structure like [[...]] which is a single item list - # where the single item is itself it's own list. In that case we want skip - # the rest of this function so that we don't get extraneous () on the - # outside. - if (isinstance(marker, list) and len(marker) == 1 and - isinstance(marker[0], (list, tuple))): - return _format_marker(marker[0]) - - if isinstance(marker, list): - inner = (_format_marker(m, first=False) for m in marker) - if first: - return " ".join(inner) - else: - return "(" + " ".join(inner) + ")" - elif isinstance(marker, tuple): - return " ".join([m.serialize() for m in marker]) - else: - return marker - - -_operators = { - "in": lambda lhs, rhs: lhs in rhs, - "not in": lambda lhs, rhs: lhs not in rhs, - "<": operator.lt, - "<=": operator.le, - "==": operator.eq, - "!=": operator.ne, - ">=": operator.ge, - ">": operator.gt, -} - - -def _eval_op(lhs, op, rhs): - try: - spec = Specifier("".join([op.serialize(), rhs])) - except InvalidSpecifier: - pass - else: - return spec.contains(lhs) - - oper = _operators.get(op.serialize()) - if oper is None: - raise UndefinedComparison( - "Undefined {0!r} on {1!r} and {2!r}.".format(op, lhs, rhs) - ) - - return oper(lhs, rhs) - - -_undefined = object() - - -def _get_env(environment, name): - value = environment.get(name, _undefined) - - if value is _undefined: - raise UndefinedEnvironmentName( - "{0!r} does not exist in evaluation environment.".format(name) - ) - - return value - - -def _evaluate_markers(markers, environment): - groups = [[]] - - for marker in markers: - assert isinstance(marker, (list, tuple, string_types)) - - if isinstance(marker, list): - groups[-1].append(_evaluate_markers(marker, environment)) - elif isinstance(marker, tuple): - lhs, op, rhs = marker - - if isinstance(lhs, Variable): - lhs_value = _get_env(environment, lhs.value) - rhs_value = rhs.value - else: - lhs_value = lhs.value - rhs_value = _get_env(environment, rhs.value) - - groups[-1].append(_eval_op(lhs_value, op, rhs_value)) - else: - assert marker in ["and", "or"] - if marker == "or": - groups.append([]) - - return any(all(item) for item in groups) - - -def format_full_version(info): - version = '{0.major}.{0.minor}.{0.micro}'.format(info) - kind = info.releaselevel - if kind != 'final': - version += kind[0] + str(info.serial) - return version - - -def default_environment(): - if hasattr(sys, 'implementation'): - iver = format_full_version(sys.implementation.version) - implementation_name = sys.implementation.name - else: - iver = '0' - implementation_name = '' - - return { - "implementation_name": implementation_name, - "implementation_version": iver, - "os_name": os.name, - "platform_machine": platform.machine(), - "platform_release": platform.release(), - "platform_system": platform.system(), - "platform_version": platform.version(), - "python_full_version": platform.python_version(), - "platform_python_implementation": platform.python_implementation(), - "python_version": platform.python_version()[:3], - "sys_platform": sys.platform, - } - - -class Marker(object): - - def __init__(self, marker): - try: - self._markers = _coerce_parse_result(MARKER.parseString(marker)) - except ParseException as e: - err_str = "Invalid marker: {0!r}, parse error at {1!r}".format( - marker, marker[e.loc:e.loc + 8]) - raise InvalidMarker(err_str) - - def __str__(self): - return _format_marker(self._markers) - - def __repr__(self): - return "<Marker({0!r})>".format(str(self)) - - def evaluate(self, environment=None): - """Evaluate a marker. - - Return the boolean from evaluating the given marker against the - environment. environment is an optional argument to override all or - part of the determined environment. - - The environment is determined from the current Python process. - """ - current_environment = default_environment() - if environment is not None: - current_environment.update(environment) - - return _evaluate_markers(self._markers, current_environment) diff --git a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/markers.pyc b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/markers.pyc deleted file mode 100644 index 8b6c1204801fd72f1f2c22e03a143445cc339137..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13962 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 J!`NFh{|m8s^)Ubd diff --git a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/requirements.py b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/requirements.py deleted file mode 100644 index 0c8c4a3..0000000 --- a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/requirements.py +++ /dev/null @@ -1,127 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. -from __future__ import absolute_import, division, print_function - -import string -import re - -from pkg_resources.extern.pyparsing import stringStart, stringEnd, originalTextFor, ParseException -from pkg_resources.extern.pyparsing import ZeroOrMore, Word, Optional, Regex, Combine -from pkg_resources.extern.pyparsing import Literal as L # noqa -from pkg_resources.extern.six.moves.urllib import parse as urlparse - -from .markers import MARKER_EXPR, Marker -from .specifiers import LegacySpecifier, Specifier, SpecifierSet - - -class InvalidRequirement(ValueError): - """ - An invalid requirement was found, users should refer to PEP 508. - """ - - -ALPHANUM = Word(string.ascii_letters + string.digits) - -LBRACKET = L("[").suppress() -RBRACKET = L("]").suppress() -LPAREN = L("(").suppress() -RPAREN = L(")").suppress() -COMMA = L(",").suppress() -SEMICOLON = L(";").suppress() -AT = L("@").suppress() - -PUNCTUATION = Word("-_.") -IDENTIFIER_END = ALPHANUM | (ZeroOrMore(PUNCTUATION) + ALPHANUM) -IDENTIFIER = Combine(ALPHANUM + ZeroOrMore(IDENTIFIER_END)) - -NAME = IDENTIFIER("name") -EXTRA = IDENTIFIER - -URI = Regex(r'[^ ]+')("url") -URL = (AT + URI) - -EXTRAS_LIST = EXTRA + ZeroOrMore(COMMA + EXTRA) -EXTRAS = (LBRACKET + Optional(EXTRAS_LIST) + RBRACKET)("extras") - -VERSION_PEP440 = Regex(Specifier._regex_str, re.VERBOSE | re.IGNORECASE) -VERSION_LEGACY = Regex(LegacySpecifier._regex_str, re.VERBOSE | re.IGNORECASE) - -VERSION_ONE = VERSION_PEP440 ^ VERSION_LEGACY -VERSION_MANY = Combine(VERSION_ONE + ZeroOrMore(COMMA + VERSION_ONE), - joinString=",", adjacent=False)("_raw_spec") -_VERSION_SPEC = Optional(((LPAREN + VERSION_MANY + RPAREN) | VERSION_MANY)) -_VERSION_SPEC.setParseAction(lambda s, l, t: t._raw_spec or '') - -VERSION_SPEC = originalTextFor(_VERSION_SPEC)("specifier") -VERSION_SPEC.setParseAction(lambda s, l, t: t[1]) - -MARKER_EXPR = originalTextFor(MARKER_EXPR())("marker") -MARKER_EXPR.setParseAction( - lambda s, l, t: Marker(s[t._original_start:t._original_end]) -) -MARKER_SEPERATOR = SEMICOLON -MARKER = MARKER_SEPERATOR + MARKER_EXPR - -VERSION_AND_MARKER = VERSION_SPEC + Optional(MARKER) -URL_AND_MARKER = URL + Optional(MARKER) - -NAMED_REQUIREMENT = \ - NAME + Optional(EXTRAS) + (URL_AND_MARKER | VERSION_AND_MARKER) - -REQUIREMENT = stringStart + NAMED_REQUIREMENT + stringEnd - - -class Requirement(object): - """Parse a requirement. - - Parse a given requirement string into its parts, such as name, specifier, - URL, and extras. Raises InvalidRequirement on a badly-formed requirement - string. - """ - - # TODO: Can we test whether something is contained within a requirement? - # If so how do we do that? Do we need to test against the _name_ of - # the thing as well as the version? What about the markers? - # TODO: Can we normalize the name and extra name? - - def __init__(self, requirement_string): - try: - req = REQUIREMENT.parseString(requirement_string) - except ParseException as e: - raise InvalidRequirement( - "Invalid requirement, parse error at \"{0!r}\"".format( - requirement_string[e.loc:e.loc + 8])) - - self.name = req.name - if req.url: - parsed_url = urlparse.urlparse(req.url) - if not (parsed_url.scheme and parsed_url.netloc) or ( - not parsed_url.scheme and not parsed_url.netloc): - raise InvalidRequirement("Invalid URL given") - self.url = req.url - else: - self.url = None - self.extras = set(req.extras.asList() if req.extras else []) - self.specifier = SpecifierSet(req.specifier) - self.marker = req.marker if req.marker else None - - def __str__(self): - parts = [self.name] - - if self.extras: - parts.append("[{0}]".format(",".join(sorted(self.extras)))) - - if self.specifier: - parts.append(str(self.specifier)) - - if self.url: - parts.append("@ {0}".format(self.url)) - - if self.marker: - parts.append("; {0}".format(self.marker)) - - return "".join(parts) - - def __repr__(self): - return "<Requirement({0!r})>".format(str(self)) diff --git a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/requirements.pyc b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/requirements.pyc deleted file mode 100644 index c53626b80a81dc25d71f6ab3be6a9832c12b1359..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5683 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 M59Acj7G{e726!VIOaK4? diff --git a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/specifiers.py b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/specifiers.py deleted file mode 100644 index 7f5a76c..0000000 --- a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/specifiers.py +++ /dev/null @@ -1,774 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. -from __future__ import absolute_import, division, print_function - -import abc -import functools -import itertools -import re - -from ._compat import string_types, with_metaclass -from .version import Version, LegacyVersion, parse - - -class InvalidSpecifier(ValueError): - """ - An invalid specifier was found, users should refer to PEP 440. - """ - - -class BaseSpecifier(with_metaclass(abc.ABCMeta, object)): - - @abc.abstractmethod - def __str__(self): - """ - Returns the str representation of this Specifier like object. This - should be representative of the Specifier itself. - """ - - @abc.abstractmethod - def __hash__(self): - """ - Returns a hash value for this Specifier like object. - """ - - @abc.abstractmethod - def __eq__(self, other): - """ - Returns a boolean representing whether or not the two Specifier like - objects are equal. - """ - - @abc.abstractmethod - def __ne__(self, other): - """ - Returns a boolean representing whether or not the two Specifier like - objects are not equal. - """ - - @abc.abstractproperty - def prereleases(self): - """ - Returns whether or not pre-releases as a whole are allowed by this - specifier. - """ - - @prereleases.setter - def prereleases(self, value): - """ - Sets whether or not pre-releases as a whole are allowed by this - specifier. - """ - - @abc.abstractmethod - def contains(self, item, prereleases=None): - """ - Determines if the given item is contained within this specifier. - """ - - @abc.abstractmethod - def filter(self, iterable, prereleases=None): - """ - Takes an iterable of items and filters them so that only items which - are contained within this specifier are allowed in it. - """ - - -class _IndividualSpecifier(BaseSpecifier): - - _operators = {} - - def __init__(self, spec="", prereleases=None): - match = self._regex.search(spec) - if not match: - raise InvalidSpecifier("Invalid specifier: '{0}'".format(spec)) - - self._spec = ( - match.group("operator").strip(), - match.group("version").strip(), - ) - - # Store whether or not this Specifier should accept prereleases - self._prereleases = prereleases - - def __repr__(self): - pre = ( - ", prereleases={0!r}".format(self.prereleases) - if self._prereleases is not None - else "" - ) - - return "<{0}({1!r}{2})>".format( - self.__class__.__name__, - str(self), - pre, - ) - - def __str__(self): - return "{0}{1}".format(*self._spec) - - def __hash__(self): - return hash(self._spec) - - def __eq__(self, other): - if isinstance(other, string_types): - try: - other = self.__class__(other) - except InvalidSpecifier: - return NotImplemented - elif not isinstance(other, self.__class__): - return NotImplemented - - return self._spec == other._spec - - def __ne__(self, other): - if isinstance(other, string_types): - try: - other = self.__class__(other) - except InvalidSpecifier: - return NotImplemented - elif not isinstance(other, self.__class__): - return NotImplemented - - return self._spec != other._spec - - def _get_operator(self, op): - return getattr(self, "_compare_{0}".format(self._operators[op])) - - def _coerce_version(self, version): - if not isinstance(version, (LegacyVersion, Version)): - version = parse(version) - return version - - @property - def operator(self): - return self._spec[0] - - @property - def version(self): - return self._spec[1] - - @property - def prereleases(self): - return self._prereleases - - @prereleases.setter - def prereleases(self, value): - self._prereleases = value - - def __contains__(self, item): - return self.contains(item) - - def contains(self, item, prereleases=None): - # Determine if prereleases are to be allowed or not. - if prereleases is None: - prereleases = self.prereleases - - # Normalize item to a Version or LegacyVersion, this allows us to have - # a shortcut for ``"2.0" in Specifier(">=2") - item = self._coerce_version(item) - - # Determine if we should be supporting prereleases in this specifier - # or not, if we do not support prereleases than we can short circuit - # logic if this version is a prereleases. - if item.is_prerelease and not prereleases: - return False - - # Actually do the comparison to determine if this item is contained - # within this Specifier or not. - return self._get_operator(self.operator)(item, self.version) - - def filter(self, iterable, prereleases=None): - yielded = False - found_prereleases = [] - - kw = {"prereleases": prereleases if prereleases is not None else True} - - # Attempt to iterate over all the values in the iterable and if any of - # them match, yield them. - for version in iterable: - parsed_version = self._coerce_version(version) - - if self.contains(parsed_version, **kw): - # If our version is a prerelease, and we were not set to allow - # prereleases, then we'll store it for later incase nothing - # else matches this specifier. - if (parsed_version.is_prerelease and not - (prereleases or self.prereleases)): - found_prereleases.append(version) - # Either this is not a prerelease, or we should have been - # accepting prereleases from the begining. - else: - yielded = True - yield version - - # Now that we've iterated over everything, determine if we've yielded - # any values, and if we have not and we have any prereleases stored up - # then we will go ahead and yield the prereleases. - if not yielded and found_prereleases: - for version in found_prereleases: - yield version - - -class LegacySpecifier(_IndividualSpecifier): - - _regex_str = ( - r""" - (?P<operator>(==|!=|<=|>=|<|>)) - \s* - (?P<version> - [^,;\s)]* # Since this is a "legacy" specifier, and the version - # string can be just about anything, we match everything - # except for whitespace, a semi-colon for marker support, - # a closing paren since versions can be enclosed in - # them, and a comma since it's a version separator. - ) - """ - ) - - _regex = re.compile( - r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE) - - _operators = { - "==": "equal", - "!=": "not_equal", - "<=": "less_than_equal", - ">=": "greater_than_equal", - "<": "less_than", - ">": "greater_than", - } - - def _coerce_version(self, version): - if not isinstance(version, LegacyVersion): - version = LegacyVersion(str(version)) - return version - - def _compare_equal(self, prospective, spec): - return prospective == self._coerce_version(spec) - - def _compare_not_equal(self, prospective, spec): - return prospective != self._coerce_version(spec) - - def _compare_less_than_equal(self, prospective, spec): - return prospective <= self._coerce_version(spec) - - def _compare_greater_than_equal(self, prospective, spec): - return prospective >= self._coerce_version(spec) - - def _compare_less_than(self, prospective, spec): - return prospective < self._coerce_version(spec) - - def _compare_greater_than(self, prospective, spec): - return prospective > self._coerce_version(spec) - - -def _require_version_compare(fn): - @functools.wraps(fn) - def wrapped(self, prospective, spec): - if not isinstance(prospective, Version): - return False - return fn(self, prospective, spec) - return wrapped - - -class Specifier(_IndividualSpecifier): - - _regex_str = ( - r""" - (?P<operator>(~=|==|!=|<=|>=|<|>|===)) - (?P<version> - (?: - # The identity operators allow for an escape hatch that will - # do an exact string match of the version you wish to install. - # This will not be parsed by PEP 440 and we cannot determine - # any semantic meaning from it. This operator is discouraged - # but included entirely as an escape hatch. - (?<====) # Only match for the identity operator - \s* - [^\s]* # We just match everything, except for whitespace - # since we are only testing for strict identity. - ) - | - (?: - # The (non)equality operators allow for wild card and local - # versions to be specified so we have to define these two - # operators separately to enable that. - (?<===|!=) # Only match for equals and not equals - - \s* - v? - (?:[0-9]+!)? # epoch - [0-9]+(?:\.[0-9]+)* # release - (?: # pre release - [-_\.]? - (a|b|c|rc|alpha|beta|pre|preview) - [-_\.]? - [0-9]* - )? - (?: # post release - (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) - )? - - # You cannot use a wild card and a dev or local version - # together so group them with a | and make them optional. - (?: - (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release - (?:\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*)? # local - | - \.\* # Wild card syntax of .* - )? - ) - | - (?: - # The compatible operator requires at least two digits in the - # release segment. - (?<=~=) # Only match for the compatible operator - - \s* - v? - (?:[0-9]+!)? # epoch - [0-9]+(?:\.[0-9]+)+ # release (We have a + instead of a *) - (?: # pre release - [-_\.]? - (a|b|c|rc|alpha|beta|pre|preview) - [-_\.]? - [0-9]* - )? - (?: # post release - (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) - )? - (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release - ) - | - (?: - # All other operators only allow a sub set of what the - # (non)equality operators do. Specifically they do not allow - # local versions to be specified nor do they allow the prefix - # matching wild cards. - (?<!==|!=|~=) # We have special cases for these - # operators so we want to make sure they - # don't match here. - - \s* - v? - (?:[0-9]+!)? # epoch - [0-9]+(?:\.[0-9]+)* # release - (?: # pre release - [-_\.]? - (a|b|c|rc|alpha|beta|pre|preview) - [-_\.]? - [0-9]* - )? - (?: # post release - (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) - )? - (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release - ) - ) - """ - ) - - _regex = re.compile( - r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE) - - _operators = { - "~=": "compatible", - "==": "equal", - "!=": "not_equal", - "<=": "less_than_equal", - ">=": "greater_than_equal", - "<": "less_than", - ">": "greater_than", - "===": "arbitrary", - } - - @_require_version_compare - def _compare_compatible(self, prospective, spec): - # Compatible releases have an equivalent combination of >= and ==. That - # is that ~=2.2 is equivalent to >=2.2,==2.*. This allows us to - # implement this in terms of the other specifiers instead of - # implementing it ourselves. The only thing we need to do is construct - # the other specifiers. - - # We want everything but the last item in the version, but we want to - # ignore post and dev releases and we want to treat the pre-release as - # it's own separate segment. - prefix = ".".join( - list( - itertools.takewhile( - lambda x: (not x.startswith("post") and not - x.startswith("dev")), - _version_split(spec), - ) - )[:-1] - ) - - # Add the prefix notation to the end of our string - prefix += ".*" - - return (self._get_operator(">=")(prospective, spec) and - self._get_operator("==")(prospective, prefix)) - - @_require_version_compare - def _compare_equal(self, prospective, spec): - # We need special logic to handle prefix matching - if spec.endswith(".*"): - # In the case of prefix matching we want to ignore local segment. - prospective = Version(prospective.public) - # Split the spec out by dots, and pretend that there is an implicit - # dot in between a release segment and a pre-release segment. - spec = _version_split(spec[:-2]) # Remove the trailing .* - - # Split the prospective version out by dots, and pretend that there - # is an implicit dot in between a release segment and a pre-release - # segment. - prospective = _version_split(str(prospective)) - - # Shorten the prospective version to be the same length as the spec - # so that we can determine if the specifier is a prefix of the - # prospective version or not. - prospective = prospective[:len(spec)] - - # Pad out our two sides with zeros so that they both equal the same - # length. - spec, prospective = _pad_version(spec, prospective) - else: - # Convert our spec string into a Version - spec = Version(spec) - - # If the specifier does not have a local segment, then we want to - # act as if the prospective version also does not have a local - # segment. - if not spec.local: - prospective = Version(prospective.public) - - return prospective == spec - - @_require_version_compare - def _compare_not_equal(self, prospective, spec): - return not self._compare_equal(prospective, spec) - - @_require_version_compare - def _compare_less_than_equal(self, prospective, spec): - return prospective <= Version(spec) - - @_require_version_compare - def _compare_greater_than_equal(self, prospective, spec): - return prospective >= Version(spec) - - @_require_version_compare - def _compare_less_than(self, prospective, spec): - # Convert our spec to a Version instance, since we'll want to work with - # it as a version. - spec = Version(spec) - - # Check to see if the prospective version is less than the spec - # version. If it's not we can short circuit and just return False now - # instead of doing extra unneeded work. - if not prospective < spec: - return False - - # This special case is here so that, unless the specifier itself - # includes is a pre-release version, that we do not accept pre-release - # versions for the version mentioned in the specifier (e.g. <3.1 should - # not match 3.1.dev0, but should match 3.0.dev0). - if not spec.is_prerelease and prospective.is_prerelease: - if Version(prospective.base_version) == Version(spec.base_version): - return False - - # If we've gotten to here, it means that prospective version is both - # less than the spec version *and* it's not a pre-release of the same - # version in the spec. - return True - - @_require_version_compare - def _compare_greater_than(self, prospective, spec): - # Convert our spec to a Version instance, since we'll want to work with - # it as a version. - spec = Version(spec) - - # Check to see if the prospective version is greater than the spec - # version. If it's not we can short circuit and just return False now - # instead of doing extra unneeded work. - if not prospective > spec: - return False - - # This special case is here so that, unless the specifier itself - # includes is a post-release version, that we do not accept - # post-release versions for the version mentioned in the specifier - # (e.g. >3.1 should not match 3.0.post0, but should match 3.2.post0). - if not spec.is_postrelease and prospective.is_postrelease: - if Version(prospective.base_version) == Version(spec.base_version): - return False - - # Ensure that we do not allow a local version of the version mentioned - # in the specifier, which is techincally greater than, to match. - if prospective.local is not None: - if Version(prospective.base_version) == Version(spec.base_version): - return False - - # If we've gotten to here, it means that prospective version is both - # greater than the spec version *and* it's not a pre-release of the - # same version in the spec. - return True - - def _compare_arbitrary(self, prospective, spec): - return str(prospective).lower() == str(spec).lower() - - @property - def prereleases(self): - # If there is an explicit prereleases set for this, then we'll just - # blindly use that. - if self._prereleases is not None: - return self._prereleases - - # Look at all of our specifiers and determine if they are inclusive - # operators, and if they are if they are including an explicit - # prerelease. - operator, version = self._spec - if operator in ["==", ">=", "<=", "~=", "==="]: - # The == specifier can include a trailing .*, if it does we - # want to remove before parsing. - if operator == "==" and version.endswith(".*"): - version = version[:-2] - - # Parse the version, and if it is a pre-release than this - # specifier allows pre-releases. - if parse(version).is_prerelease: - return True - - return False - - @prereleases.setter - def prereleases(self, value): - self._prereleases = value - - -_prefix_regex = re.compile(r"^([0-9]+)((?:a|b|c|rc)[0-9]+)$") - - -def _version_split(version): - result = [] - for item in version.split("."): - match = _prefix_regex.search(item) - if match: - result.extend(match.groups()) - else: - result.append(item) - return result - - -def _pad_version(left, right): - left_split, right_split = [], [] - - # Get the release segment of our versions - left_split.append(list(itertools.takewhile(lambda x: x.isdigit(), left))) - right_split.append(list(itertools.takewhile(lambda x: x.isdigit(), right))) - - # Get the rest of our versions - left_split.append(left[len(left_split[0]):]) - right_split.append(right[len(right_split[0]):]) - - # Insert our padding - left_split.insert( - 1, - ["0"] * max(0, len(right_split[0]) - len(left_split[0])), - ) - right_split.insert( - 1, - ["0"] * max(0, len(left_split[0]) - len(right_split[0])), - ) - - return ( - list(itertools.chain(*left_split)), - list(itertools.chain(*right_split)), - ) - - -class SpecifierSet(BaseSpecifier): - - def __init__(self, specifiers="", prereleases=None): - # Split on , to break each indidivual specifier into it's own item, and - # strip each item to remove leading/trailing whitespace. - specifiers = [s.strip() for s in specifiers.split(",") if s.strip()] - - # Parsed each individual specifier, attempting first to make it a - # Specifier and falling back to a LegacySpecifier. - parsed = set() - for specifier in specifiers: - try: - parsed.add(Specifier(specifier)) - except InvalidSpecifier: - parsed.add(LegacySpecifier(specifier)) - - # Turn our parsed specifiers into a frozen set and save them for later. - self._specs = frozenset(parsed) - - # Store our prereleases value so we can use it later to determine if - # we accept prereleases or not. - self._prereleases = prereleases - - def __repr__(self): - pre = ( - ", prereleases={0!r}".format(self.prereleases) - if self._prereleases is not None - else "" - ) - - return "<SpecifierSet({0!r}{1})>".format(str(self), pre) - - def __str__(self): - return ",".join(sorted(str(s) for s in self._specs)) - - def __hash__(self): - return hash(self._specs) - - def __and__(self, other): - if isinstance(other, string_types): - other = SpecifierSet(other) - elif not isinstance(other, SpecifierSet): - return NotImplemented - - specifier = SpecifierSet() - specifier._specs = frozenset(self._specs | other._specs) - - if self._prereleases is None and other._prereleases is not None: - specifier._prereleases = other._prereleases - elif self._prereleases is not None and other._prereleases is None: - specifier._prereleases = self._prereleases - elif self._prereleases == other._prereleases: - specifier._prereleases = self._prereleases - else: - raise ValueError( - "Cannot combine SpecifierSets with True and False prerelease " - "overrides." - ) - - return specifier - - def __eq__(self, other): - if isinstance(other, string_types): - other = SpecifierSet(other) - elif isinstance(other, _IndividualSpecifier): - other = SpecifierSet(str(other)) - elif not isinstance(other, SpecifierSet): - return NotImplemented - - return self._specs == other._specs - - def __ne__(self, other): - if isinstance(other, string_types): - other = SpecifierSet(other) - elif isinstance(other, _IndividualSpecifier): - other = SpecifierSet(str(other)) - elif not isinstance(other, SpecifierSet): - return NotImplemented - - return self._specs != other._specs - - def __len__(self): - return len(self._specs) - - def __iter__(self): - return iter(self._specs) - - @property - def prereleases(self): - # If we have been given an explicit prerelease modifier, then we'll - # pass that through here. - if self._prereleases is not None: - return self._prereleases - - # If we don't have any specifiers, and we don't have a forced value, - # then we'll just return None since we don't know if this should have - # pre-releases or not. - if not self._specs: - return None - - # Otherwise we'll see if any of the given specifiers accept - # prereleases, if any of them do we'll return True, otherwise False. - return any(s.prereleases for s in self._specs) - - @prereleases.setter - def prereleases(self, value): - self._prereleases = value - - def __contains__(self, item): - return self.contains(item) - - def contains(self, item, prereleases=None): - # Ensure that our item is a Version or LegacyVersion instance. - if not isinstance(item, (LegacyVersion, Version)): - item = parse(item) - - # Determine if we're forcing a prerelease or not, if we're not forcing - # one for this particular filter call, then we'll use whatever the - # SpecifierSet thinks for whether or not we should support prereleases. - if prereleases is None: - prereleases = self.prereleases - - # We can determine if we're going to allow pre-releases by looking to - # see if any of the underlying items supports them. If none of them do - # and this item is a pre-release then we do not allow it and we can - # short circuit that here. - # Note: This means that 1.0.dev1 would not be contained in something - # like >=1.0.devabc however it would be in >=1.0.debabc,>0.0.dev0 - if not prereleases and item.is_prerelease: - return False - - # We simply dispatch to the underlying specs here to make sure that the - # given version is contained within all of them. - # Note: This use of all() here means that an empty set of specifiers - # will always return True, this is an explicit design decision. - return all( - s.contains(item, prereleases=prereleases) - for s in self._specs - ) - - def filter(self, iterable, prereleases=None): - # Determine if we're forcing a prerelease or not, if we're not forcing - # one for this particular filter call, then we'll use whatever the - # SpecifierSet thinks for whether or not we should support prereleases. - if prereleases is None: - prereleases = self.prereleases - - # If we have any specifiers, then we want to wrap our iterable in the - # filter method for each one, this will act as a logical AND amongst - # each specifier. - if self._specs: - for spec in self._specs: - iterable = spec.filter(iterable, prereleases=bool(prereleases)) - return iterable - # If we do not have any specifiers, then we need to have a rough filter - # which will filter out any pre-releases, unless there are no final - # releases, and which will filter out LegacyVersion in general. - else: - filtered = [] - found_prereleases = [] - - for item in iterable: - # Ensure that we some kind of Version class for this item. - if not isinstance(item, (LegacyVersion, Version)): - parsed_version = parse(item) - else: - parsed_version = item - - # Filter out any item which is parsed as a LegacyVersion - if isinstance(parsed_version, LegacyVersion): - continue - - # Store any item which is a pre-release for later unless we've - # already found a final version or we are accepting prereleases - if parsed_version.is_prerelease and not prereleases: - if not filtered: - found_prereleases.append(item) - else: - filtered.append(item) - - # If we've found no items except for pre-releases, then we'll go - # ahead and use the pre-releases - if not filtered and found_prereleases and prereleases is None: - return found_prereleases - - return filtered diff --git a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/specifiers.pyc b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/specifiers.pyc deleted file mode 100644 index baae685489b3450cf4e699ab888eaff5586b736c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29374 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 Wndc9GbohFI|KXpj;S!IHJO1CnbP6Z{ diff --git a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/utils.py b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/utils.py deleted file mode 100644 index 942387c..0000000 --- a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/utils.py +++ /dev/null @@ -1,14 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. -from __future__ import absolute_import, division, print_function - -import re - - -_canonicalize_regex = re.compile(r"[-_.]+") - - -def canonicalize_name(name): - # This is taken from PEP 503. - return _canonicalize_regex.sub("-", name).lower() diff --git a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/utils.pyc b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/utils.pyc deleted file mode 100644 index 8f48b5b70b419d599f1e997cdeeb704bb20a915e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 708 zcmd5)?P?S;6utA&R!VIV!CyYWpls8kEDA*g{cDlYUn3=EGwG1sOcIkj+wCHVtZ(cK zcyATNH!w`jJ-NBLIVVi@^ZwzJ@5fgf{*031>(2$`w?umS3UB~p0bK!O30(<e1ziON z@0H+c=xQ)EEcc+VU`KWP(AV$-pgZ7#56vDmvfRC?2=IhJEpl)Z8fnKE65>6|^>%Hu z4IYna5tH>OuP3jOQkQw3a-U}M^y;ZDi1OrSZ&>IfA_%Z7SnF4ST?xw)c0gCNnM>sA z+3(9A5|vu{;H_59ZjDT4FdO7%d0HTAb>YUOh7Vy);MHgvif{+{8!<uh)(VYSt0b<2 z>rKjHyAij~(!$@Y&gWnJ**ra;>lb<RvfrjN8bcHxMYM5deMaTn4A0*U^1a9gr-&iA zEaGY)IXO&8n=Ito_&y{Nm0qdA`aw)+T|SMs_<%J0V}dmvQ8Ke(C>wrHJS33xhBzf7 yWy?D)yK1=z8Ir*R3ObC@I@7Y-mXH3m`~P@mT^D2MCud%<(7Rvaad}joRKEcCP_F6# diff --git a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/version.py b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/version.py deleted file mode 100644 index 83b5ee8..0000000 --- a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/version.py +++ /dev/null @@ -1,393 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. -from __future__ import absolute_import, division, print_function - -import collections -import itertools -import re - -from ._structures import Infinity - - -__all__ = [ - "parse", "Version", "LegacyVersion", "InvalidVersion", "VERSION_PATTERN" -] - - -_Version = collections.namedtuple( - "_Version", - ["epoch", "release", "dev", "pre", "post", "local"], -) - - -def parse(version): - """ - Parse the given version string and return either a :class:`Version` object - or a :class:`LegacyVersion` object depending on if the given version is - a valid PEP 440 version or a legacy version. - """ - try: - return Version(version) - except InvalidVersion: - return LegacyVersion(version) - - -class InvalidVersion(ValueError): - """ - An invalid version was found, users should refer to PEP 440. - """ - - -class _BaseVersion(object): - - def __hash__(self): - return hash(self._key) - - def __lt__(self, other): - return self._compare(other, lambda s, o: s < o) - - def __le__(self, other): - return self._compare(other, lambda s, o: s <= o) - - def __eq__(self, other): - return self._compare(other, lambda s, o: s == o) - - def __ge__(self, other): - return self._compare(other, lambda s, o: s >= o) - - def __gt__(self, other): - return self._compare(other, lambda s, o: s > o) - - def __ne__(self, other): - return self._compare(other, lambda s, o: s != o) - - def _compare(self, other, method): - if not isinstance(other, _BaseVersion): - return NotImplemented - - return method(self._key, other._key) - - -class LegacyVersion(_BaseVersion): - - def __init__(self, version): - self._version = str(version) - self._key = _legacy_cmpkey(self._version) - - def __str__(self): - return self._version - - def __repr__(self): - return "<LegacyVersion({0})>".format(repr(str(self))) - - @property - def public(self): - return self._version - - @property - def base_version(self): - return self._version - - @property - def local(self): - return None - - @property - def is_prerelease(self): - return False - - @property - def is_postrelease(self): - return False - - -_legacy_version_component_re = re.compile( - r"(\d+ | [a-z]+ | \.| -)", re.VERBOSE, -) - -_legacy_version_replacement_map = { - "pre": "c", "preview": "c", "-": "final-", "rc": "c", "dev": "@", -} - - -def _parse_version_parts(s): - for part in _legacy_version_component_re.split(s): - part = _legacy_version_replacement_map.get(part, part) - - if not part or part == ".": - continue - - if part[:1] in "0123456789": - # pad for numeric comparison - yield part.zfill(8) - else: - yield "*" + part - - # ensure that alpha/beta/candidate are before final - yield "*final" - - -def _legacy_cmpkey(version): - # We hardcode an epoch of -1 here. A PEP 440 version can only have a epoch - # greater than or equal to 0. This will effectively put the LegacyVersion, - # which uses the defacto standard originally implemented by setuptools, - # as before all PEP 440 versions. - epoch = -1 - - # This scheme is taken from pkg_resources.parse_version setuptools prior to - # it's adoption of the packaging library. - parts = [] - for part in _parse_version_parts(version.lower()): - if part.startswith("*"): - # remove "-" before a prerelease tag - if part < "*final": - while parts and parts[-1] == "*final-": - parts.pop() - - # remove trailing zeros from each series of numeric parts - while parts and parts[-1] == "00000000": - parts.pop() - - parts.append(part) - parts = tuple(parts) - - return epoch, parts - -# Deliberately not anchored to the start and end of the string, to make it -# easier for 3rd party code to reuse -VERSION_PATTERN = r""" - v? - (?: - (?:(?P<epoch>[0-9]+)!)? # epoch - (?P<release>[0-9]+(?:\.[0-9]+)*) # release segment - (?P<pre> # pre-release - [-_\.]? - (?P<pre_l>(a|b|c|rc|alpha|beta|pre|preview)) - [-_\.]? - (?P<pre_n>[0-9]+)? - )? - (?P<post> # post release - (?:-(?P<post_n1>[0-9]+)) - | - (?: - [-_\.]? - (?P<post_l>post|rev|r) - [-_\.]? - (?P<post_n2>[0-9]+)? - ) - )? - (?P<dev> # dev release - [-_\.]? - (?P<dev_l>dev) - [-_\.]? - (?P<dev_n>[0-9]+)? - )? - ) - (?:\+(?P<local>[a-z0-9]+(?:[-_\.][a-z0-9]+)*))? # local version -""" - - -class Version(_BaseVersion): - - _regex = re.compile( - r"^\s*" + VERSION_PATTERN + r"\s*$", - re.VERBOSE | re.IGNORECASE, - ) - - def __init__(self, version): - # Validate the version and parse it into pieces - match = self._regex.search(version) - if not match: - raise InvalidVersion("Invalid version: '{0}'".format(version)) - - # Store the parsed out pieces of the version - self._version = _Version( - epoch=int(match.group("epoch")) if match.group("epoch") else 0, - release=tuple(int(i) for i in match.group("release").split(".")), - pre=_parse_letter_version( - match.group("pre_l"), - match.group("pre_n"), - ), - post=_parse_letter_version( - match.group("post_l"), - match.group("post_n1") or match.group("post_n2"), - ), - dev=_parse_letter_version( - match.group("dev_l"), - match.group("dev_n"), - ), - local=_parse_local_version(match.group("local")), - ) - - # Generate a key which will be used for sorting - self._key = _cmpkey( - self._version.epoch, - self._version.release, - self._version.pre, - self._version.post, - self._version.dev, - self._version.local, - ) - - def __repr__(self): - return "<Version({0})>".format(repr(str(self))) - - def __str__(self): - parts = [] - - # Epoch - if self._version.epoch != 0: - parts.append("{0}!".format(self._version.epoch)) - - # Release segment - parts.append(".".join(str(x) for x in self._version.release)) - - # Pre-release - if self._version.pre is not None: - parts.append("".join(str(x) for x in self._version.pre)) - - # Post-release - if self._version.post is not None: - parts.append(".post{0}".format(self._version.post[1])) - - # Development release - if self._version.dev is not None: - parts.append(".dev{0}".format(self._version.dev[1])) - - # Local version segment - if self._version.local is not None: - parts.append( - "+{0}".format(".".join(str(x) for x in self._version.local)) - ) - - return "".join(parts) - - @property - def public(self): - return str(self).split("+", 1)[0] - - @property - def base_version(self): - parts = [] - - # Epoch - if self._version.epoch != 0: - parts.append("{0}!".format(self._version.epoch)) - - # Release segment - parts.append(".".join(str(x) for x in self._version.release)) - - return "".join(parts) - - @property - def local(self): - version_string = str(self) - if "+" in version_string: - return version_string.split("+", 1)[1] - - @property - def is_prerelease(self): - return bool(self._version.dev or self._version.pre) - - @property - def is_postrelease(self): - return bool(self._version.post) - - -def _parse_letter_version(letter, number): - if letter: - # We consider there to be an implicit 0 in a pre-release if there is - # not a numeral associated with it. - if number is None: - number = 0 - - # We normalize any letters to their lower case form - letter = letter.lower() - - # We consider some words to be alternate spellings of other words and - # in those cases we want to normalize the spellings to our preferred - # spelling. - if letter == "alpha": - letter = "a" - elif letter == "beta": - letter = "b" - elif letter in ["c", "pre", "preview"]: - letter = "rc" - elif letter in ["rev", "r"]: - letter = "post" - - return letter, int(number) - if not letter and number: - # We assume if we are given a number, but we are not given a letter - # then this is using the implicit post release syntax (e.g. 1.0-1) - letter = "post" - - return letter, int(number) - - -_local_version_seperators = re.compile(r"[\._-]") - - -def _parse_local_version(local): - """ - Takes a string like abc.1.twelve and turns it into ("abc", 1, "twelve"). - """ - if local is not None: - return tuple( - part.lower() if not part.isdigit() else int(part) - for part in _local_version_seperators.split(local) - ) - - -def _cmpkey(epoch, release, pre, post, dev, local): - # When we compare a release version, we want to compare it with all of the - # trailing zeros removed. So we'll use a reverse the list, drop all the now - # leading zeros until we come to something non zero, then take the rest - # re-reverse it back into the correct order and make it a tuple and use - # that for our sorting key. - release = tuple( - reversed(list( - itertools.dropwhile( - lambda x: x == 0, - reversed(release), - ) - )) - ) - - # We need to "trick" the sorting algorithm to put 1.0.dev0 before 1.0a0. - # We'll do this by abusing the pre segment, but we _only_ want to do this - # if there is not a pre or a post segment. If we have one of those then - # the normal sorting rules will handle this case correctly. - if pre is None and post is None and dev is not None: - pre = -Infinity - # Versions without a pre-release (except as noted above) should sort after - # those with one. - elif pre is None: - pre = Infinity - - # Versions without a post segment should sort before those with one. - if post is None: - post = -Infinity - - # Versions without a development segment should sort after those with one. - if dev is None: - dev = Infinity - - if local is None: - # Versions without a local segment should sort before those with one. - local = -Infinity - else: - # Versions with a local segment need that segment parsed to implement - # the sorting rules in PEP440. - # - Alpha numeric segments sort before numeric segments - # - Alpha numeric segments sort lexicographically - # - Numeric segments sort numerically - # - Shorter versions sort before longer versions when the prefixes - # match exactly - local = tuple( - (i, "") if isinstance(i, int) else (-Infinity, i) - for i in local - ) - - return epoch, release, pre, post, dev, local diff --git a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/version.pyc b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/version.pyc deleted file mode 100644 index a41605440090cbb1f921c6725a37748193cff6a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17248 zcmds9&2!vFc5loKM;v}rvM9-tEl8BDAtipu*2<Q{P?l{uk>ed}L6x*iiVJ}NI2;m# z837<gd8xy$y}9I)N~Mxi<$p+3a?K&P+)}Aj&iMmUm0NPiE&2Uk1DK&KWtG~f3e1Sp z)7^MzbieodeKu77_tBx*UyiN2D*X)N_tVFQibF#w4}XRVlxiDl)llt{S}mz|S*@0p z!D}TIRMcuk;7}h>s{>iRs#dGYD=V*}f@7*Zs8$DY4=$tknDPddS5r;gP*Z+IZ4W6A zf5XZfQQoNX#*{a%yb0B;s_*bj^iQhqm0HEsLFJFCO+$Id+4G%JKU)R#3FVJV?^}8A z1fSziNbkwKcT)LPwS8Q9Q&Kr0<G-a^nAj;k_XdAX<L8X>-qx+N_&LXE-B>-Tymw?G zQ_6c+Du6z(R!?(T>9frISs3Di0KJ_(^rHF>h&-#jY3awPm!$FzQMpoo54dlU4)rpM zWE_RF5qE;!#J5}RZYN3-lE-W9wc=JMOvcdYMy)WhH+MrfL06*%s;N2)0lgb;w!&8O zEEyoE6UBaV47CS-Bm<11{<Yt9+-F%2hrAo^IYG<Ix;TvocdV7W-!$xdx9{J-V>M)K zI|Ja@ez)Up$=Hz}_zs@KC3yax{B|Qhsi58M#EDEL=(tYca+>^dfX~TubErHUQ;AXs zpsk@+9)_n?B{9^_kc#TcFpQ*>UHU0FbERIw9q~V*7&7s>#}%5%mTxv&dwyu{>2;cM z0xUI6C-h9rWH$;;zXhnsbj(lOz=`8e9;b_WY<4!beK(QeI{g5L@RWg>p5OIDkArtY zv$gq>XSZS*%P|G1=Dj=j%<I<|^Qp-*0--_HH!n9dgb6I-#v;wEDhf?mHq)imQB_jJ zzeH^T?6Bt~{=%LUEo^oI4+vQJc7Ng7htWp(bm!WQC*k6a==u%!<9Pq3_ieO@PqVvl zf1%sz&b7igae`njx%T6xeQyCY-0dcvP7p72cbazO$DQ5C_2UH_sP#J0Lf3J3oF>-3 zkWOa4`^+MlPvaYtQ&qKWj2WYb%Q`=#_GhFt`OL?T#zsb2Qr3zrE&dYyvi#dXr{=>9 zE#^}vHa9!Fp?B5Xjj=E@-s<cIB<UtdnRGJTYW(Rv#97#O=(K&?PKKn>?s&Tan?$2+ zdmY!dduS{YE;+$V_{QY&YB?F<gg?XPN}2VCXuSuB9If9AX0c6Jfg~<T1=6}K6^Oiw zR3MQDqyo8Il?tTuF{#u@7~(MBtDK7LRmu*%QMV1*t3tqr>`2+{TTZ+s6??~jrWv<_ zdtyJ>?4i3DT&v}o%^BPFRZf!2REEnReksgk)hAGaY}!T%))mx3LuonG$iaEb3fY_- z2XMgdpeMx;`jkc!w?ho^rc|epC|L@e_J-#yFLIvv_GuQ|?X;m#d|8Nf3fDxicPLg1 zw-$;{+YS=jUO?>)5SOZmWNhfAlm6Bj7H^{{8ak}AnAC^(_DE`-<2+^BB&GEZoA?$< zwInGOA-X@n%-#SMxsi_+6>ks`LMP7q2vO00V%tA@GgKTna#Xx|RH@j+Ui|pYP_c64 zsJL`wsR+IJJ8y=H<s(PMTSt|OA@<^O9~Eh`W?wN~-$w@xc0<A9gwYzGQ1GT#4#cD0 zF7pCPv1YXrq_r+S6QT`t4MW$r-eMn}w?-$q+wKN_+Yb}pv!>9c9oF1_5PjYDldX<d zG*dzp<!wwkrcI%YaidbI(^j`8SsZ6UC)RqG#d#Jciwi6+vY2KeMiVN9GnIr)vzS;s zfudTfmHYp>oH9SO_rx0yQTdH-qYsBsJV(Z`5bnzSM>Y{@LsPs+HW8#lQ+!D_5#vKs zJW4i)a;K6L$iBj(@1aBUC;;I&*<e=9pW<V(2aasdl@b;umm|WXowzg<Av|j9xQgwz zyKq4@kMeQiu2@7((HJvzL>aTQ?XS2lu8<7sa!+Po!4;zeK*)9v8@z0BNn*vyDhszj z9drS?Y`cM(W>$Q*GA>tENAC&#HC6{{l}G)+75Gct?U=%7=}=s*{)@%uGs`;k!>zs9 ziP}ygQHaRzM%HEY6&N{#n4XPDTNl{*3F<Fmhgdqov?oQnyBk5vy`L|x^#6si8Jycd zY!1;;39kS2e_A5h+&jE+g-IKo&@V23T1*8z`c3PC{Lb8H@~eb}zI1}Pzza(l%xuLr z@)T+M;_?4-l@>!1#ig96LoN^rm~@3;zf``I>cgn_nLe}}tSc<$QHW0JMxCx7CC@Ad z&@9FSg&8b{k*w<|dWuGB#fa-l&gAzoyUY%%&<+}}=zp;ot&hAb=7G89%zeAg%A@%M zb8bdrvaVzZz!Q5d|EXAtNTxZ+kC3hBpp%q}TxonNLW~{U*e)Z#`>5;(G-ePUhnj}k z`eJ=eJr`xBt!)_Gu(r{I$_QqNA85Rtl8SDtCld-r8GA~~gxR%IRndl+=!oA}INAdP zFfh3Qb4uzDVQ@WQT6U#QCEJjh%}YX1toX%iAAETIM>jtD_-2cGMlR3FvSwvn^#S&t zLy_4{sU(w7F9Z|vjL4o5D((iYB%xjWA}DlM;JD%y*lnjP*}tZ*lYZZBwt_$h8L8bx z;30&Z^jN1DT$8-Tg-NzF6Xt9sam1z5Y*faSalCZGsFo&5lcmwJke{TdDJly3Z&3j; zLENTN&r53m&-#)jDL4E|J%`s-R@)^~86=JVluc3_oVBg?FDp1_(I!ibbp~`Nb4Z(> z8m95&bM+8>l0yD*4mlu@(#{~;0*RrvD|`wbXFNHt9)h0eLkp7xE1|y0Fep`ZqxE0- zSig&EADhHvF3mA>A{v-O<VWtYzQ9%Ck)ZPw0%M3bCq&*;WL$MJxYHHa(CIRDDzHd2 z27a9g6sz3gU2;LtZheks(U`=V!K6R}71L2v1Jz2^IAe^LMo><c@hwdnBc=Gy!4Z<r z+`A<|^;@6FFSFIC*KgfhlGOR~+Tz^J^(!+MW^VD)D?Zbv0QZe>Zz&b$=>Qn>(R@1A z?92~`nMSr$^7CfwH|e_{8Vj;+`G@zss%P2+{9HO-J`SPR=IlrF>w3l6-CQc*?O?g? z9Bdr82a$W=1l=t({KPrHC4MPtXJ%e|urR}0?^!dwsyq@J@AcP&B>_Ie(V=Movvb*i zc6cp&@Zq^0ym-r@_N!3C{(R_QnNv6bDh{H<gTL18;Ro5wdU)WCy`f$}5YA}4K7Pz; zoOsxKDSlo>bHIb<D0?$_)k25^g1?%odJHo86#~mKl4a^{**)mjv&eg9W@qvZHEjxb zcAQ|y<-X;Ia!0}-e}ak*gZL1W5@^8Tq*IW+r`R!|SXR|%(AtQ2r1^B@%5^@ymgUoj zl#dfjc`#%|nt3o}RGN7(WK5ca%(g=auZ~NzmNh3BDiImVN&fs%JSzbK{9bZtZa}&y z8s(yM)?k<DfB;Pn@sugl5$Ri`2aRQDy93X`->(c>7*N7k2ekqsG+GI*Dv0O)9sq}; zmY{%O66uwt0Ah-40|z*%1q(+HjZjZg%Z3=_g%rBRI<SYsUOj-}K7bL{yZ@ZQk7n>V z6O<1)-UmOC0ZcMdnLcGwI`JS?1v>0ug@Y5s%dpxW%_?JAWjw3E{?ag$S>?F;4v4@A zC$z7|uwX-s#`J_##!8=<ml1ckENV;6Z&@^`U7Cp*kz(3}%)4T|^+_=U#k|9EVZ0rR zX^GQB!s1|;J|@6H<`>0aYZXlo#x+cCsp*IQem7eFM>Hg8QB@XG3YMG_p~)zsU+Z)z zfzTR5pO^uZc1X?Bs*q}Ut*`!pMYmdR6FHLCLUBLpwA5r2Sf)*XU#hY1MDCV8GsUwU z7H23oHlxmN*ZP`$U$J1UKRJmaHTD7+s(zH&eEnviNRI4+gxF+~S!9trRA?^im9@#l zwU6{dY@7z9Ob3xEcdKahv}Q5AzsEP8N1;l`jjD0FTs3Bmx=}VpVD_@SAm#DW*-F`{ z<^P1^$-Wd;B9dMwibqaZN>4QP#qTVk9Zv)nJZdLS^1ou9{n0vZS+c!gVFfs$8vr>d z@mh#y2;-fyiarvT4gyj1O@0+p0e=SMGsHOE12_rd_d!dfKm(buC1BczgIr4O)Kv5r z*?j|YpXi<(CKb}z1N4j_!S${GkllJrv_*b(P@U<UmF|Yd(>Iljbe^@on{f4IH{qPG zzUj;CrXkU_dWpl-eCbq&`j(i^7P^P-i=bzvPT9~9fh$@OGWdc>9rw48yqeiaKI_LQ zMCk4pZId1ry8nTBra~9thTl%{ys&(09pe>y_5ayhy_`9nrxpP#NZ>=9)p@86bO?`J zLFNCDJ&pi=2Cx}Y?$B{Ql2c3->n>{)vl5Eg?zF-_C3cM$DVuwmtnYx>AK*gK_(DRK z|AvXh=TIo4T0U-^FTam+2H)xQTQ#ogcnyUF%`6eoJg0}v1IYtPqvbQrVG+G&RwOi` z18P@<uSDo*bX>-rVo4M?`YS=(p^OidPPtITRkG!8qw+>I)M3G`qf2<E&Tqa6!F>dF z=BbP#FqVG~T<8GWOSY$F<Em`UqVGT^2FAE7TEwc9?!X?y<@=3*`F?|81bYZtol)+q zVt`0bx&uq<%nEFV6-nzhtjD-jzvd!Zy0`zNDJPLBwzA;0e)pqrvWi~&Sz?NNK_P57 z(o6AkAtIG1$2688l3)jRPm66Njy&X4mS*EN77@OIw>88&(K4IPSAnGxb4M4lJ&;Nz zG{t9@<%_4J%|Tgy-;&8l)&>jNFC=(@S9%@Od#|_Bx|}kSf-wc1Nz!j-@l<^)@U21i zA47pRuRi-`<&Ff>@BUun8|%*Jw^#014{%9bHSs=lvX19zk63<=F4EuOD^ZndscH-x zC(5;HWa-{Tj&5|kI$n`D7k5Oito{ZKDC+2sC@CNqb_P|1cj_eDLYE2734=fCxzr&< zm^E3V6NR4e76A~+V&_j7%wp%PbdHJu+T^Q=>^v!*W77ExzM9BR8I$Kx#0O!n1jCI) zf5i@z8VX&9Kty_R$7^pzynl&(i+kbdy^AQgG&igpfYgzMk67dJV9A^yCM*z<*k$^- z9bsec1_W5d+D(J#qABD8?y>>^Xm~N}zC=^vAOa;(6CL}IYPj3pDBepP*3U5MS#BZ| z6<T*AMy)(DfD*DZ|CT0<(Q>sUVs-7&ygj!r=04?0&Oi(*kO{yUaF%E2<biv>7ossl zs`GP@HWWC3(wZl>aGS*Q?>jqwY&zL%g+Xh_H=PZ4{@Q%<)DQO1z>9`_%`i4w30`Bv zt7-L%0JwP7ymr;RsDUod==aoQdgN~sQNo0ji<rauOqv^paRzRVFQkeQ^|03CuNT9I z97ZHZEB0E=R$?6{ws^IL%%~l9YOPFMR*i<v3<~Fd#nmyYWFHF2*)iV3jGUws#eKFo zcU<8V|0*W+H5W$_uPP&ms#Oh_Rsg>g`J(&&1r?}%uqGr4c0c1knn%S_B6CW(UUMl! zOYl{+EL@W;a$d)cI^eR#Q0XvI0+ehybeFyC1k*_zn&R{iHE3CS^#JJoO98D&C(;G_ z34g6Y2UIx431hopBOT=7sprTqqb>8p_y>sI45-a&X3Yurb8~VB^uIEP#X>@-C;ha$ z1&CD1ud^mi7R5L<Aa7M6%CFzY$#->y6J+q8qMW;Wt{40VaY4lB643)}LYag}jFi+c z+GyyVogH@+7a@Hq_!7p_acu5(?G!LtWi{BuR~N-V%;A0g>)yVWV=5AfmvaQrQ#d*2 zd!h}47Ty%EVIeI<<mDw~X?Zw?^mK~`l1KwtJ-3aHXE5vXvIu<9Fk-D?q7R9P_fg?X z(pC9)x^~GJ(rQirmPSfLHC`Pp*Lf6OtUw!Y`$M_lxIYz=qM%e3w@)Hjr%n*y{dN3b z0I?PGikn@r;R)@!yfe0PC1Klm<2!vdnr}&aauh>SCh{t`Jn?}O?D}`2s1r$6MT`Xf zn!Fq|ms3_27+6`zo+^uPAy}WX_=3d@3ko~^E<4q@)n!3RD5&VsM{31jTj9wi{j&IS z1ye;9RjG60sg0B-DkpK^qime5)JCSNQ}0e)s2bztvhjYUHd(t_El=&#&X1RC!~YHa Cd$s2P diff --git a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/pyparsing.py b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/pyparsing.py deleted file mode 100644 index cf75e1e..0000000 --- a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/pyparsing.py +++ /dev/null @@ -1,5742 +0,0 @@ -# module pyparsing.py -# -# Copyright (c) 2003-2018 Paul T. McGuire -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be -# included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__doc__ = \ -""" -pyparsing module - Classes and methods to define and execute parsing grammars -============================================================================= - -The pyparsing module is an alternative approach to creating and executing simple grammars, -vs. the traditional lex/yacc approach, or the use of regular expressions. With pyparsing, you -don't need to learn a new syntax for defining grammars or matching expressions - the parsing module -provides a library of classes that you use to construct the grammar directly in Python. - -Here is a program to parse "Hello, World!" (or any greeting of the form -C{"<salutation>, <addressee>!"}), built up using L{Word}, L{Literal}, and L{And} elements -(L{'+'<ParserElement.__add__>} operator gives L{And} expressions, strings are auto-converted to -L{Literal} expressions):: - - from pyparsing import Word, alphas - - # define grammar of a greeting - greet = Word(alphas) + "," + Word(alphas) + "!" - - hello = "Hello, World!" - print (hello, "->", greet.parseString(hello)) - -The program outputs the following:: - - Hello, World! -> ['Hello', ',', 'World', '!'] - -The Python representation of the grammar is quite readable, owing to the self-explanatory -class names, and the use of '+', '|' and '^' operators. - -The L{ParseResults} object returned from L{ParserElement.parseString<ParserElement.parseString>} can be accessed as a nested list, a dictionary, or an -object with named attributes. - -The pyparsing module handles some of the problems that are typically vexing when writing text parsers: - - extra or missing whitespace (the above program will also handle "Hello,World!", "Hello , World !", etc.) - - quoted strings - - embedded comments - - -Getting Started - ------------------ -Visit the classes L{ParserElement} and L{ParseResults} to see the base classes that most other pyparsing -classes inherit from. Use the docstrings for examples of how to: - - construct literal match expressions from L{Literal} and L{CaselessLiteral} classes - - construct character word-group expressions using the L{Word} class - - see how to create repetitive expressions using L{ZeroOrMore} and L{OneOrMore} classes - - use L{'+'<And>}, L{'|'<MatchFirst>}, L{'^'<Or>}, and L{'&'<Each>} operators to combine simple expressions into more complex ones - - associate names with your parsed results using L{ParserElement.setResultsName} - - find some helpful expression short-cuts like L{delimitedList} and L{oneOf} - - find more useful common expressions in the L{pyparsing_common} namespace class -""" - -__version__ = "2.2.1" -__versionTime__ = "18 Sep 2018 00:49 UTC" -__author__ = "Paul McGuire <ptmcg@users.sourceforge.net>" - -import string -from weakref import ref as wkref -import copy -import sys -import warnings -import re -import sre_constants -import collections -import pprint -import traceback -import types -from datetime import datetime - -try: - from _thread import RLock -except ImportError: - from threading import RLock - -try: - # Python 3 - from collections.abc import Iterable - from collections.abc import MutableMapping -except ImportError: - # Python 2.7 - from collections import Iterable - from collections import MutableMapping - -try: - from collections import OrderedDict as _OrderedDict -except ImportError: - try: - from ordereddict import OrderedDict as _OrderedDict - except ImportError: - _OrderedDict = None - -#~ sys.stderr.write( "testing pyparsing module, version %s, %s\n" % (__version__,__versionTime__ ) ) - -__all__ = [ -'And', 'CaselessKeyword', 'CaselessLiteral', 'CharsNotIn', 'Combine', 'Dict', 'Each', 'Empty', -'FollowedBy', 'Forward', 'GoToColumn', 'Group', 'Keyword', 'LineEnd', 'LineStart', 'Literal', -'MatchFirst', 'NoMatch', 'NotAny', 'OneOrMore', 'OnlyOnce', 'Optional', 'Or', -'ParseBaseException', 'ParseElementEnhance', 'ParseException', 'ParseExpression', 'ParseFatalException', -'ParseResults', 'ParseSyntaxException', 'ParserElement', 'QuotedString', 'RecursiveGrammarException', -'Regex', 'SkipTo', 'StringEnd', 'StringStart', 'Suppress', 'Token', 'TokenConverter', -'White', 'Word', 'WordEnd', 'WordStart', 'ZeroOrMore', -'alphanums', 'alphas', 'alphas8bit', 'anyCloseTag', 'anyOpenTag', 'cStyleComment', 'col', -'commaSeparatedList', 'commonHTMLEntity', 'countedArray', 'cppStyleComment', 'dblQuotedString', -'dblSlashComment', 'delimitedList', 'dictOf', 'downcaseTokens', 'empty', 'hexnums', -'htmlComment', 'javaStyleComment', 'line', 'lineEnd', 'lineStart', 'lineno', -'makeHTMLTags', 'makeXMLTags', 'matchOnlyAtCol', 'matchPreviousExpr', 'matchPreviousLiteral', -'nestedExpr', 'nullDebugAction', 'nums', 'oneOf', 'opAssoc', 'operatorPrecedence', 'printables', -'punc8bit', 'pythonStyleComment', 'quotedString', 'removeQuotes', 'replaceHTMLEntity', -'replaceWith', 'restOfLine', 'sglQuotedString', 'srange', 'stringEnd', -'stringStart', 'traceParseAction', 'unicodeString', 'upcaseTokens', 'withAttribute', -'indentedBlock', 'originalTextFor', 'ungroup', 'infixNotation','locatedExpr', 'withClass', -'CloseMatch', 'tokenMap', 'pyparsing_common', -] - -system_version = tuple(sys.version_info)[:3] -PY_3 = system_version[0] == 3 -if PY_3: - _MAX_INT = sys.maxsize - basestring = str - unichr = chr - _ustr = str - - # build list of single arg builtins, that can be used as parse actions - singleArgBuiltins = [sum, len, sorted, reversed, list, tuple, set, any, all, min, max] - -else: - _MAX_INT = sys.maxint - range = xrange - - def _ustr(obj): - """Drop-in replacement for str(obj) that tries to be Unicode friendly. It first tries - str(obj). If that fails with a UnicodeEncodeError, then it tries unicode(obj). It - then < returns the unicode object | encodes it with the default encoding | ... >. - """ - if isinstance(obj,unicode): - return obj - - try: - # If this works, then _ustr(obj) has the same behaviour as str(obj), so - # it won't break any existing code. - return str(obj) - - except UnicodeEncodeError: - # Else encode it - ret = unicode(obj).encode(sys.getdefaultencoding(), 'xmlcharrefreplace') - xmlcharref = Regex(r'&#\d+;') - xmlcharref.setParseAction(lambda t: '\\u' + hex(int(t[0][2:-1]))[2:]) - return xmlcharref.transformString(ret) - - # build list of single arg builtins, tolerant of Python version, that can be used as parse actions - singleArgBuiltins = [] - import __builtin__ - for fname in "sum len sorted reversed list tuple set any all min max".split(): - try: - singleArgBuiltins.append(getattr(__builtin__,fname)) - except AttributeError: - continue - -_generatorType = type((y for y in range(1))) - -def _xml_escape(data): - """Escape &, <, >, ", ', etc. in a string of data.""" - - # ampersand must be replaced first - from_symbols = '&><"\'' - to_symbols = ('&'+s+';' for s in "amp gt lt quot apos".split()) - for from_,to_ in zip(from_symbols, to_symbols): - data = data.replace(from_, to_) - return data - -class _Constants(object): - pass - -alphas = string.ascii_uppercase + string.ascii_lowercase -nums = "0123456789" -hexnums = nums + "ABCDEFabcdef" -alphanums = alphas + nums -_bslash = chr(92) -printables = "".join(c for c in string.printable if c not in string.whitespace) - -class ParseBaseException(Exception): - """base exception class for all parsing runtime exceptions""" - # Performance tuning: we construct a *lot* of these, so keep this - # constructor as small and fast as possible - def __init__( self, pstr, loc=0, msg=None, elem=None ): - self.loc = loc - if msg is None: - self.msg = pstr - self.pstr = "" - else: - self.msg = msg - self.pstr = pstr - self.parserElement = elem - self.args = (pstr, loc, msg) - - @classmethod - def _from_exception(cls, pe): - """ - internal factory method to simplify creating one type of ParseException - from another - avoids having __init__ signature conflicts among subclasses - """ - return cls(pe.pstr, pe.loc, pe.msg, pe.parserElement) - - def __getattr__( self, aname ): - """supported attributes by name are: - - lineno - returns the line number of the exception text - - col - returns the column number of the exception text - - line - returns the line containing the exception text - """ - if( aname == "lineno" ): - return lineno( self.loc, self.pstr ) - elif( aname in ("col", "column") ): - return col( self.loc, self.pstr ) - elif( aname == "line" ): - return line( self.loc, self.pstr ) - else: - raise AttributeError(aname) - - def __str__( self ): - return "%s (at char %d), (line:%d, col:%d)" % \ - ( self.msg, self.loc, self.lineno, self.column ) - def __repr__( self ): - return _ustr(self) - def markInputline( self, markerString = ">!<" ): - """Extracts the exception line from the input string, and marks - the location of the exception with a special symbol. - """ - line_str = self.line - line_column = self.column - 1 - if markerString: - line_str = "".join((line_str[:line_column], - markerString, line_str[line_column:])) - return line_str.strip() - def __dir__(self): - return "lineno col line".split() + dir(type(self)) - -class ParseException(ParseBaseException): - """ - Exception thrown when parse expressions don't match class; - supported attributes by name are: - - lineno - returns the line number of the exception text - - col - returns the column number of the exception text - - line - returns the line containing the exception text - - Example:: - try: - Word(nums).setName("integer").parseString("ABC") - except ParseException as pe: - print(pe) - print("column: {}".format(pe.col)) - - prints:: - Expected integer (at char 0), (line:1, col:1) - column: 1 - """ - pass - -class ParseFatalException(ParseBaseException): - """user-throwable exception thrown when inconsistent parse content - is found; stops all parsing immediately""" - pass - -class ParseSyntaxException(ParseFatalException): - """just like L{ParseFatalException}, but thrown internally when an - L{ErrorStop<And._ErrorStop>} ('-' operator) indicates that parsing is to stop - immediately because an unbacktrackable syntax error has been found""" - pass - -#~ class ReparseException(ParseBaseException): - #~ """Experimental class - parse actions can raise this exception to cause - #~ pyparsing to reparse the input string: - #~ - with a modified input string, and/or - #~ - with a modified start location - #~ Set the values of the ReparseException in the constructor, and raise the - #~ exception in a parse action to cause pyparsing to use the new string/location. - #~ Setting the values as None causes no change to be made. - #~ """ - #~ def __init_( self, newstring, restartLoc ): - #~ self.newParseText = newstring - #~ self.reparseLoc = restartLoc - -class RecursiveGrammarException(Exception): - """exception thrown by L{ParserElement.validate} if the grammar could be improperly recursive""" - def __init__( self, parseElementList ): - self.parseElementTrace = parseElementList - - def __str__( self ): - return "RecursiveGrammarException: %s" % self.parseElementTrace - -class _ParseResultsWithOffset(object): - def __init__(self,p1,p2): - self.tup = (p1,p2) - def __getitem__(self,i): - return self.tup[i] - def __repr__(self): - return repr(self.tup[0]) - def setOffset(self,i): - self.tup = (self.tup[0],i) - -class ParseResults(object): - """ - Structured parse results, to provide multiple means of access to the parsed data: - - as a list (C{len(results)}) - - by list index (C{results[0], results[1]}, etc.) - - by attribute (C{results.<resultsName>} - see L{ParserElement.setResultsName}) - - Example:: - integer = Word(nums) - date_str = (integer.setResultsName("year") + '/' - + integer.setResultsName("month") + '/' - + integer.setResultsName("day")) - # equivalent form: - # date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - - # parseString returns a ParseResults object - result = date_str.parseString("1999/12/31") - - def test(s, fn=repr): - print("%s -> %s" % (s, fn(eval(s)))) - test("list(result)") - test("result[0]") - test("result['month']") - test("result.day") - test("'month' in result") - test("'minutes' in result") - test("result.dump()", str) - prints:: - list(result) -> ['1999', '/', '12', '/', '31'] - result[0] -> '1999' - result['month'] -> '12' - result.day -> '31' - 'month' in result -> True - 'minutes' in result -> False - result.dump() -> ['1999', '/', '12', '/', '31'] - - day: 31 - - month: 12 - - year: 1999 - """ - def __new__(cls, toklist=None, name=None, asList=True, modal=True ): - if isinstance(toklist, cls): - return toklist - retobj = object.__new__(cls) - retobj.__doinit = True - return retobj - - # Performance tuning: we construct a *lot* of these, so keep this - # constructor as small and fast as possible - def __init__( self, toklist=None, name=None, asList=True, modal=True, isinstance=isinstance ): - if self.__doinit: - self.__doinit = False - self.__name = None - self.__parent = None - self.__accumNames = {} - self.__asList = asList - self.__modal = modal - if toklist is None: - toklist = [] - if isinstance(toklist, list): - self.__toklist = toklist[:] - elif isinstance(toklist, _generatorType): - self.__toklist = list(toklist) - else: - self.__toklist = [toklist] - self.__tokdict = dict() - - if name is not None and name: - if not modal: - self.__accumNames[name] = 0 - if isinstance(name,int): - name = _ustr(name) # will always return a str, but use _ustr for consistency - self.__name = name - if not (isinstance(toklist, (type(None), basestring, list)) and toklist in (None,'',[])): - if isinstance(toklist,basestring): - toklist = [ toklist ] - if asList: - if isinstance(toklist,ParseResults): - self[name] = _ParseResultsWithOffset(toklist.copy(),0) - else: - self[name] = _ParseResultsWithOffset(ParseResults(toklist[0]),0) - self[name].__name = name - else: - try: - self[name] = toklist[0] - except (KeyError,TypeError,IndexError): - self[name] = toklist - - def __getitem__( self, i ): - if isinstance( i, (int,slice) ): - return self.__toklist[i] - else: - if i not in self.__accumNames: - return self.__tokdict[i][-1][0] - else: - return ParseResults([ v[0] for v in self.__tokdict[i] ]) - - def __setitem__( self, k, v, isinstance=isinstance ): - if isinstance(v,_ParseResultsWithOffset): - self.__tokdict[k] = self.__tokdict.get(k,list()) + [v] - sub = v[0] - elif isinstance(k,(int,slice)): - self.__toklist[k] = v - sub = v - else: - self.__tokdict[k] = self.__tokdict.get(k,list()) + [_ParseResultsWithOffset(v,0)] - sub = v - if isinstance(sub,ParseResults): - sub.__parent = wkref(self) - - def __delitem__( self, i ): - if isinstance(i,(int,slice)): - mylen = len( self.__toklist ) - del self.__toklist[i] - - # convert int to slice - if isinstance(i, int): - if i < 0: - i += mylen - i = slice(i, i+1) - # get removed indices - removed = list(range(*i.indices(mylen))) - removed.reverse() - # fixup indices in token dictionary - for name,occurrences in self.__tokdict.items(): - for j in removed: - for k, (value, position) in enumerate(occurrences): - occurrences[k] = _ParseResultsWithOffset(value, position - (position > j)) - else: - del self.__tokdict[i] - - def __contains__( self, k ): - return k in self.__tokdict - - def __len__( self ): return len( self.__toklist ) - def __bool__(self): return ( not not self.__toklist ) - __nonzero__ = __bool__ - def __iter__( self ): return iter( self.__toklist ) - def __reversed__( self ): return iter( self.__toklist[::-1] ) - def _iterkeys( self ): - if hasattr(self.__tokdict, "iterkeys"): - return self.__tokdict.iterkeys() - else: - return iter(self.__tokdict) - - def _itervalues( self ): - return (self[k] for k in self._iterkeys()) - - def _iteritems( self ): - return ((k, self[k]) for k in self._iterkeys()) - - if PY_3: - keys = _iterkeys - """Returns an iterator of all named result keys (Python 3.x only).""" - - values = _itervalues - """Returns an iterator of all named result values (Python 3.x only).""" - - items = _iteritems - """Returns an iterator of all named result key-value tuples (Python 3.x only).""" - - else: - iterkeys = _iterkeys - """Returns an iterator of all named result keys (Python 2.x only).""" - - itervalues = _itervalues - """Returns an iterator of all named result values (Python 2.x only).""" - - iteritems = _iteritems - """Returns an iterator of all named result key-value tuples (Python 2.x only).""" - - def keys( self ): - """Returns all named result keys (as a list in Python 2.x, as an iterator in Python 3.x).""" - return list(self.iterkeys()) - - def values( self ): - """Returns all named result values (as a list in Python 2.x, as an iterator in Python 3.x).""" - return list(self.itervalues()) - - def items( self ): - """Returns all named result key-values (as a list of tuples in Python 2.x, as an iterator in Python 3.x).""" - return list(self.iteritems()) - - def haskeys( self ): - """Since keys() returns an iterator, this method is helpful in bypassing - code that looks for the existence of any defined results names.""" - return bool(self.__tokdict) - - def pop( self, *args, **kwargs): - """ - Removes and returns item at specified index (default=C{last}). - Supports both C{list} and C{dict} semantics for C{pop()}. If passed no - argument or an integer argument, it will use C{list} semantics - and pop tokens from the list of parsed tokens. If passed a - non-integer argument (most likely a string), it will use C{dict} - semantics and pop the corresponding value from any defined - results names. A second default return value argument is - supported, just as in C{dict.pop()}. - - Example:: - def remove_first(tokens): - tokens.pop(0) - print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] - print(OneOrMore(Word(nums)).addParseAction(remove_first).parseString("0 123 321")) # -> ['123', '321'] - - label = Word(alphas) - patt = label("LABEL") + OneOrMore(Word(nums)) - print(patt.parseString("AAB 123 321").dump()) - - # Use pop() in a parse action to remove named result (note that corresponding value is not - # removed from list form of results) - def remove_LABEL(tokens): - tokens.pop("LABEL") - return tokens - patt.addParseAction(remove_LABEL) - print(patt.parseString("AAB 123 321").dump()) - prints:: - ['AAB', '123', '321'] - - LABEL: AAB - - ['AAB', '123', '321'] - """ - if not args: - args = [-1] - for k,v in kwargs.items(): - if k == 'default': - args = (args[0], v) - else: - raise TypeError("pop() got an unexpected keyword argument '%s'" % k) - if (isinstance(args[0], int) or - len(args) == 1 or - args[0] in self): - index = args[0] - ret = self[index] - del self[index] - return ret - else: - defaultvalue = args[1] - return defaultvalue - - def get(self, key, defaultValue=None): - """ - Returns named result matching the given key, or if there is no - such name, then returns the given C{defaultValue} or C{None} if no - C{defaultValue} is specified. - - Similar to C{dict.get()}. - - Example:: - integer = Word(nums) - date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - - result = date_str.parseString("1999/12/31") - print(result.get("year")) # -> '1999' - print(result.get("hour", "not specified")) # -> 'not specified' - print(result.get("hour")) # -> None - """ - if key in self: - return self[key] - else: - return defaultValue - - def insert( self, index, insStr ): - """ - Inserts new element at location index in the list of parsed tokens. - - Similar to C{list.insert()}. - - Example:: - print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] - - # use a parse action to insert the parse location in the front of the parsed results - def insert_locn(locn, tokens): - tokens.insert(0, locn) - print(OneOrMore(Word(nums)).addParseAction(insert_locn).parseString("0 123 321")) # -> [0, '0', '123', '321'] - """ - self.__toklist.insert(index, insStr) - # fixup indices in token dictionary - for name,occurrences in self.__tokdict.items(): - for k, (value, position) in enumerate(occurrences): - occurrences[k] = _ParseResultsWithOffset(value, position + (position > index)) - - def append( self, item ): - """ - Add single element to end of ParseResults list of elements. - - Example:: - print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] - - # use a parse action to compute the sum of the parsed integers, and add it to the end - def append_sum(tokens): - tokens.append(sum(map(int, tokens))) - print(OneOrMore(Word(nums)).addParseAction(append_sum).parseString("0 123 321")) # -> ['0', '123', '321', 444] - """ - self.__toklist.append(item) - - def extend( self, itemseq ): - """ - Add sequence of elements to end of ParseResults list of elements. - - Example:: - patt = OneOrMore(Word(alphas)) - - # use a parse action to append the reverse of the matched strings, to make a palindrome - def make_palindrome(tokens): - tokens.extend(reversed([t[::-1] for t in tokens])) - return ''.join(tokens) - print(patt.addParseAction(make_palindrome).parseString("lskdj sdlkjf lksd")) # -> 'lskdjsdlkjflksddsklfjkldsjdksl' - """ - if isinstance(itemseq, ParseResults): - self += itemseq - else: - self.__toklist.extend(itemseq) - - def clear( self ): - """ - Clear all elements and results names. - """ - del self.__toklist[:] - self.__tokdict.clear() - - def __getattr__( self, name ): - try: - return self[name] - except KeyError: - return "" - - if name in self.__tokdict: - if name not in self.__accumNames: - return self.__tokdict[name][-1][0] - else: - return ParseResults([ v[0] for v in self.__tokdict[name] ]) - else: - return "" - - def __add__( self, other ): - ret = self.copy() - ret += other - return ret - - def __iadd__( self, other ): - if other.__tokdict: - offset = len(self.__toklist) - addoffset = lambda a: offset if a<0 else a+offset - otheritems = other.__tokdict.items() - otherdictitems = [(k, _ParseResultsWithOffset(v[0],addoffset(v[1])) ) - for (k,vlist) in otheritems for v in vlist] - for k,v in otherdictitems: - self[k] = v - if isinstance(v[0],ParseResults): - v[0].__parent = wkref(self) - - self.__toklist += other.__toklist - self.__accumNames.update( other.__accumNames ) - return self - - def __radd__(self, other): - if isinstance(other,int) and other == 0: - # useful for merging many ParseResults using sum() builtin - return self.copy() - else: - # this may raise a TypeError - so be it - return other + self - - def __repr__( self ): - return "(%s, %s)" % ( repr( self.__toklist ), repr( self.__tokdict ) ) - - def __str__( self ): - return '[' + ', '.join(_ustr(i) if isinstance(i, ParseResults) else repr(i) for i in self.__toklist) + ']' - - def _asStringList( self, sep='' ): - out = [] - for item in self.__toklist: - if out and sep: - out.append(sep) - if isinstance( item, ParseResults ): - out += item._asStringList() - else: - out.append( _ustr(item) ) - return out - - def asList( self ): - """ - Returns the parse results as a nested list of matching tokens, all converted to strings. - - Example:: - patt = OneOrMore(Word(alphas)) - result = patt.parseString("sldkj lsdkj sldkj") - # even though the result prints in string-like form, it is actually a pyparsing ParseResults - print(type(result), result) # -> <class 'pyparsing.ParseResults'> ['sldkj', 'lsdkj', 'sldkj'] - - # Use asList() to create an actual list - result_list = result.asList() - print(type(result_list), result_list) # -> <class 'list'> ['sldkj', 'lsdkj', 'sldkj'] - """ - return [res.asList() if isinstance(res,ParseResults) else res for res in self.__toklist] - - def asDict( self ): - """ - Returns the named parse results as a nested dictionary. - - Example:: - integer = Word(nums) - date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - - result = date_str.parseString('12/31/1999') - print(type(result), repr(result)) # -> <class 'pyparsing.ParseResults'> (['12', '/', '31', '/', '1999'], {'day': [('1999', 4)], 'year': [('12', 0)], 'month': [('31', 2)]}) - - result_dict = result.asDict() - print(type(result_dict), repr(result_dict)) # -> <class 'dict'> {'day': '1999', 'year': '12', 'month': '31'} - - # even though a ParseResults supports dict-like access, sometime you just need to have a dict - import json - print(json.dumps(result)) # -> Exception: TypeError: ... is not JSON serializable - print(json.dumps(result.asDict())) # -> {"month": "31", "day": "1999", "year": "12"} - """ - if PY_3: - item_fn = self.items - else: - item_fn = self.iteritems - - def toItem(obj): - if isinstance(obj, ParseResults): - if obj.haskeys(): - return obj.asDict() - else: - return [toItem(v) for v in obj] - else: - return obj - - return dict((k,toItem(v)) for k,v in item_fn()) - - def copy( self ): - """ - Returns a new copy of a C{ParseResults} object. - """ - ret = ParseResults( self.__toklist ) - ret.__tokdict = self.__tokdict.copy() - ret.__parent = self.__parent - ret.__accumNames.update( self.__accumNames ) - ret.__name = self.__name - return ret - - def asXML( self, doctag=None, namedItemsOnly=False, indent="", formatted=True ): - """ - (Deprecated) Returns the parse results as XML. Tags are created for tokens and lists that have defined results names. - """ - nl = "\n" - out = [] - namedItems = dict((v[1],k) for (k,vlist) in self.__tokdict.items() - for v in vlist) - nextLevelIndent = indent + " " - - # collapse out indents if formatting is not desired - if not formatted: - indent = "" - nextLevelIndent = "" - nl = "" - - selfTag = None - if doctag is not None: - selfTag = doctag - else: - if self.__name: - selfTag = self.__name - - if not selfTag: - if namedItemsOnly: - return "" - else: - selfTag = "ITEM" - - out += [ nl, indent, "<", selfTag, ">" ] - - for i,res in enumerate(self.__toklist): - if isinstance(res,ParseResults): - if i in namedItems: - out += [ res.asXML(namedItems[i], - namedItemsOnly and doctag is None, - nextLevelIndent, - formatted)] - else: - out += [ res.asXML(None, - namedItemsOnly and doctag is None, - nextLevelIndent, - formatted)] - else: - # individual token, see if there is a name for it - resTag = None - if i in namedItems: - resTag = namedItems[i] - if not resTag: - if namedItemsOnly: - continue - else: - resTag = "ITEM" - xmlBodyText = _xml_escape(_ustr(res)) - out += [ nl, nextLevelIndent, "<", resTag, ">", - xmlBodyText, - "</", resTag, ">" ] - - out += [ nl, indent, "</", selfTag, ">" ] - return "".join(out) - - def __lookup(self,sub): - for k,vlist in self.__tokdict.items(): - for v,loc in vlist: - if sub is v: - return k - return None - - def getName(self): - r""" - Returns the results name for this token expression. Useful when several - different expressions might match at a particular location. - - Example:: - integer = Word(nums) - ssn_expr = Regex(r"\d\d\d-\d\d-\d\d\d\d") - house_number_expr = Suppress('#') + Word(nums, alphanums) - user_data = (Group(house_number_expr)("house_number") - | Group(ssn_expr)("ssn") - | Group(integer)("age")) - user_info = OneOrMore(user_data) - - result = user_info.parseString("22 111-22-3333 #221B") - for item in result: - print(item.getName(), ':', item[0]) - prints:: - age : 22 - ssn : 111-22-3333 - house_number : 221B - """ - if self.__name: - return self.__name - elif self.__parent: - par = self.__parent() - if par: - return par.__lookup(self) - else: - return None - elif (len(self) == 1 and - len(self.__tokdict) == 1 and - next(iter(self.__tokdict.values()))[0][1] in (0,-1)): - return next(iter(self.__tokdict.keys())) - else: - return None - - def dump(self, indent='', depth=0, full=True): - """ - Diagnostic method for listing out the contents of a C{ParseResults}. - Accepts an optional C{indent} argument so that this string can be embedded - in a nested display of other data. - - Example:: - integer = Word(nums) - date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - - result = date_str.parseString('12/31/1999') - print(result.dump()) - prints:: - ['12', '/', '31', '/', '1999'] - - day: 1999 - - month: 31 - - year: 12 - """ - out = [] - NL = '\n' - out.append( indent+_ustr(self.asList()) ) - if full: - if self.haskeys(): - items = sorted((str(k), v) for k,v in self.items()) - for k,v in items: - if out: - out.append(NL) - out.append( "%s%s- %s: " % (indent,(' '*depth), k) ) - if isinstance(v,ParseResults): - if v: - out.append( v.dump(indent,depth+1) ) - else: - out.append(_ustr(v)) - else: - out.append(repr(v)) - elif any(isinstance(vv,ParseResults) for vv in self): - v = self - for i,vv in enumerate(v): - if isinstance(vv,ParseResults): - out.append("\n%s%s[%d]:\n%s%s%s" % (indent,(' '*(depth)),i,indent,(' '*(depth+1)),vv.dump(indent,depth+1) )) - else: - out.append("\n%s%s[%d]:\n%s%s%s" % (indent,(' '*(depth)),i,indent,(' '*(depth+1)),_ustr(vv))) - - return "".join(out) - - def pprint(self, *args, **kwargs): - """ - Pretty-printer for parsed results as a list, using the C{pprint} module. - Accepts additional positional or keyword args as defined for the - C{pprint.pprint} method. (U{http://docs.python.org/3/library/pprint.html#pprint.pprint}) - - Example:: - ident = Word(alphas, alphanums) - num = Word(nums) - func = Forward() - term = ident | num | Group('(' + func + ')') - func <<= ident + Group(Optional(delimitedList(term))) - result = func.parseString("fna a,b,(fnb c,d,200),100") - result.pprint(width=40) - prints:: - ['fna', - ['a', - 'b', - ['(', 'fnb', ['c', 'd', '200'], ')'], - '100']] - """ - pprint.pprint(self.asList(), *args, **kwargs) - - # add support for pickle protocol - def __getstate__(self): - return ( self.__toklist, - ( self.__tokdict.copy(), - self.__parent is not None and self.__parent() or None, - self.__accumNames, - self.__name ) ) - - def __setstate__(self,state): - self.__toklist = state[0] - (self.__tokdict, - par, - inAccumNames, - self.__name) = state[1] - self.__accumNames = {} - self.__accumNames.update(inAccumNames) - if par is not None: - self.__parent = wkref(par) - else: - self.__parent = None - - def __getnewargs__(self): - return self.__toklist, self.__name, self.__asList, self.__modal - - def __dir__(self): - return (dir(type(self)) + list(self.keys())) - -MutableMapping.register(ParseResults) - -def col (loc,strg): - """Returns current column within a string, counting newlines as line separators. - The first column is number 1. - - Note: the default parsing behavior is to expand tabs in the input string - before starting the parsing process. See L{I{ParserElement.parseString}<ParserElement.parseString>} for more information - on parsing strings containing C{<TAB>}s, and suggested methods to maintain a - consistent view of the parsed string, the parse location, and line and column - positions within the parsed string. - """ - s = strg - return 1 if 0<loc<len(s) and s[loc-1] == '\n' else loc - s.rfind("\n", 0, loc) - -def lineno(loc,strg): - """Returns current line number within a string, counting newlines as line separators. - The first line is number 1. - - Note: the default parsing behavior is to expand tabs in the input string - before starting the parsing process. See L{I{ParserElement.parseString}<ParserElement.parseString>} for more information - on parsing strings containing C{<TAB>}s, and suggested methods to maintain a - consistent view of the parsed string, the parse location, and line and column - positions within the parsed string. - """ - return strg.count("\n",0,loc) + 1 - -def line( loc, strg ): - """Returns the line of text containing loc within a string, counting newlines as line separators. - """ - lastCR = strg.rfind("\n", 0, loc) - nextCR = strg.find("\n", loc) - if nextCR >= 0: - return strg[lastCR+1:nextCR] - else: - return strg[lastCR+1:] - -def _defaultStartDebugAction( instring, loc, expr ): - print (("Match " + _ustr(expr) + " at loc " + _ustr(loc) + "(%d,%d)" % ( lineno(loc,instring), col(loc,instring) ))) - -def _defaultSuccessDebugAction( instring, startloc, endloc, expr, toks ): - print ("Matched " + _ustr(expr) + " -> " + str(toks.asList())) - -def _defaultExceptionDebugAction( instring, loc, expr, exc ): - print ("Exception raised:" + _ustr(exc)) - -def nullDebugAction(*args): - """'Do-nothing' debug action, to suppress debugging output during parsing.""" - pass - -# Only works on Python 3.x - nonlocal is toxic to Python 2 installs -#~ 'decorator to trim function calls to match the arity of the target' -#~ def _trim_arity(func, maxargs=3): - #~ if func in singleArgBuiltins: - #~ return lambda s,l,t: func(t) - #~ limit = 0 - #~ foundArity = False - #~ def wrapper(*args): - #~ nonlocal limit,foundArity - #~ while 1: - #~ try: - #~ ret = func(*args[limit:]) - #~ foundArity = True - #~ return ret - #~ except TypeError: - #~ if limit == maxargs or foundArity: - #~ raise - #~ limit += 1 - #~ continue - #~ return wrapper - -# this version is Python 2.x-3.x cross-compatible -'decorator to trim function calls to match the arity of the target' -def _trim_arity(func, maxargs=2): - if func in singleArgBuiltins: - return lambda s,l,t: func(t) - limit = [0] - foundArity = [False] - - # traceback return data structure changed in Py3.5 - normalize back to plain tuples - if system_version[:2] >= (3,5): - def extract_stack(limit=0): - # special handling for Python 3.5.0 - extra deep call stack by 1 - offset = -3 if system_version == (3,5,0) else -2 - frame_summary = traceback.extract_stack(limit=-offset+limit-1)[offset] - return [frame_summary[:2]] - def extract_tb(tb, limit=0): - frames = traceback.extract_tb(tb, limit=limit) - frame_summary = frames[-1] - return [frame_summary[:2]] - else: - extract_stack = traceback.extract_stack - extract_tb = traceback.extract_tb - - # synthesize what would be returned by traceback.extract_stack at the call to - # user's parse action 'func', so that we don't incur call penalty at parse time - - LINE_DIFF = 6 - # IF ANY CODE CHANGES, EVEN JUST COMMENTS OR BLANK LINES, BETWEEN THE NEXT LINE AND - # THE CALL TO FUNC INSIDE WRAPPER, LINE_DIFF MUST BE MODIFIED!!!! - this_line = extract_stack(limit=2)[-1] - pa_call_line_synth = (this_line[0], this_line[1]+LINE_DIFF) - - def wrapper(*args): - while 1: - try: - ret = func(*args[limit[0]:]) - foundArity[0] = True - return ret - except TypeError: - # re-raise TypeErrors if they did not come from our arity testing - if foundArity[0]: - raise - else: - try: - tb = sys.exc_info()[-1] - if not extract_tb(tb, limit=2)[-1][:2] == pa_call_line_synth: - raise - finally: - del tb - - if limit[0] <= maxargs: - limit[0] += 1 - continue - raise - - # copy func name to wrapper for sensible debug output - func_name = "<parse action>" - try: - func_name = getattr(func, '__name__', - getattr(func, '__class__').__name__) - except Exception: - func_name = str(func) - wrapper.__name__ = func_name - - return wrapper - -class ParserElement(object): - """Abstract base level parser element class.""" - DEFAULT_WHITE_CHARS = " \n\t\r" - verbose_stacktrace = False - - @staticmethod - def setDefaultWhitespaceChars( chars ): - r""" - Overrides the default whitespace chars - - Example:: - # default whitespace chars are space, <TAB> and newline - OneOrMore(Word(alphas)).parseString("abc def\nghi jkl") # -> ['abc', 'def', 'ghi', 'jkl'] - - # change to just treat newline as significant - ParserElement.setDefaultWhitespaceChars(" \t") - OneOrMore(Word(alphas)).parseString("abc def\nghi jkl") # -> ['abc', 'def'] - """ - ParserElement.DEFAULT_WHITE_CHARS = chars - - @staticmethod - def inlineLiteralsUsing(cls): - """ - Set class to be used for inclusion of string literals into a parser. - - Example:: - # default literal class used is Literal - integer = Word(nums) - date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - - date_str.parseString("1999/12/31") # -> ['1999', '/', '12', '/', '31'] - - - # change to Suppress - ParserElement.inlineLiteralsUsing(Suppress) - date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - - date_str.parseString("1999/12/31") # -> ['1999', '12', '31'] - """ - ParserElement._literalStringClass = cls - - def __init__( self, savelist=False ): - self.parseAction = list() - self.failAction = None - #~ self.name = "<unknown>" # don't define self.name, let subclasses try/except upcall - self.strRepr = None - self.resultsName = None - self.saveAsList = savelist - self.skipWhitespace = True - self.whiteChars = ParserElement.DEFAULT_WHITE_CHARS - self.copyDefaultWhiteChars = True - self.mayReturnEmpty = False # used when checking for left-recursion - self.keepTabs = False - self.ignoreExprs = list() - self.debug = False - self.streamlined = False - self.mayIndexError = True # used to optimize exception handling for subclasses that don't advance parse index - self.errmsg = "" - self.modalResults = True # used to mark results names as modal (report only last) or cumulative (list all) - self.debugActions = ( None, None, None ) #custom debug actions - self.re = None - self.callPreparse = True # used to avoid redundant calls to preParse - self.callDuringTry = False - - def copy( self ): - """ - Make a copy of this C{ParserElement}. Useful for defining different parse actions - for the same parsing pattern, using copies of the original parse element. - - Example:: - integer = Word(nums).setParseAction(lambda toks: int(toks[0])) - integerK = integer.copy().addParseAction(lambda toks: toks[0]*1024) + Suppress("K") - integerM = integer.copy().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M") - - print(OneOrMore(integerK | integerM | integer).parseString("5K 100 640K 256M")) - prints:: - [5120, 100, 655360, 268435456] - Equivalent form of C{expr.copy()} is just C{expr()}:: - integerM = integer().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M") - """ - cpy = copy.copy( self ) - cpy.parseAction = self.parseAction[:] - cpy.ignoreExprs = self.ignoreExprs[:] - if self.copyDefaultWhiteChars: - cpy.whiteChars = ParserElement.DEFAULT_WHITE_CHARS - return cpy - - def setName( self, name ): - """ - Define name for this expression, makes debugging and exception messages clearer. - - Example:: - Word(nums).parseString("ABC") # -> Exception: Expected W:(0123...) (at char 0), (line:1, col:1) - Word(nums).setName("integer").parseString("ABC") # -> Exception: Expected integer (at char 0), (line:1, col:1) - """ - self.name = name - self.errmsg = "Expected " + self.name - if hasattr(self,"exception"): - self.exception.msg = self.errmsg - return self - - def setResultsName( self, name, listAllMatches=False ): - """ - Define name for referencing matching tokens as a nested attribute - of the returned parse results. - NOTE: this returns a *copy* of the original C{ParserElement} object; - this is so that the client can define a basic element, such as an - integer, and reference it in multiple places with different names. - - You can also set results names using the abbreviated syntax, - C{expr("name")} in place of C{expr.setResultsName("name")} - - see L{I{__call__}<__call__>}. - - Example:: - date_str = (integer.setResultsName("year") + '/' - + integer.setResultsName("month") + '/' - + integer.setResultsName("day")) - - # equivalent form: - date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - """ - newself = self.copy() - if name.endswith("*"): - name = name[:-1] - listAllMatches=True - newself.resultsName = name - newself.modalResults = not listAllMatches - return newself - - def setBreak(self,breakFlag = True): - """Method to invoke the Python pdb debugger when this element is - about to be parsed. Set C{breakFlag} to True to enable, False to - disable. - """ - if breakFlag: - _parseMethod = self._parse - def breaker(instring, loc, doActions=True, callPreParse=True): - import pdb - pdb.set_trace() - return _parseMethod( instring, loc, doActions, callPreParse ) - breaker._originalParseMethod = _parseMethod - self._parse = breaker - else: - if hasattr(self._parse,"_originalParseMethod"): - self._parse = self._parse._originalParseMethod - return self - - def setParseAction( self, *fns, **kwargs ): - """ - Define one or more actions to perform when successfully matching parse element definition. - Parse action fn is a callable method with 0-3 arguments, called as C{fn(s,loc,toks)}, - C{fn(loc,toks)}, C{fn(toks)}, or just C{fn()}, where: - - s = the original string being parsed (see note below) - - loc = the location of the matching substring - - toks = a list of the matched tokens, packaged as a C{L{ParseResults}} object - If the functions in fns modify the tokens, they can return them as the return - value from fn, and the modified list of tokens will replace the original. - Otherwise, fn does not need to return any value. - - Optional keyword arguments: - - callDuringTry = (default=C{False}) indicate if parse action should be run during lookaheads and alternate testing - - Note: the default parsing behavior is to expand tabs in the input string - before starting the parsing process. See L{I{parseString}<parseString>} for more information - on parsing strings containing C{<TAB>}s, and suggested methods to maintain a - consistent view of the parsed string, the parse location, and line and column - positions within the parsed string. - - Example:: - integer = Word(nums) - date_str = integer + '/' + integer + '/' + integer - - date_str.parseString("1999/12/31") # -> ['1999', '/', '12', '/', '31'] - - # use parse action to convert to ints at parse time - integer = Word(nums).setParseAction(lambda toks: int(toks[0])) - date_str = integer + '/' + integer + '/' + integer - - # note that integer fields are now ints, not strings - date_str.parseString("1999/12/31") # -> [1999, '/', 12, '/', 31] - """ - self.parseAction = list(map(_trim_arity, list(fns))) - self.callDuringTry = kwargs.get("callDuringTry", False) - return self - - def addParseAction( self, *fns, **kwargs ): - """ - Add one or more parse actions to expression's list of parse actions. See L{I{setParseAction}<setParseAction>}. - - See examples in L{I{copy}<copy>}. - """ - self.parseAction += list(map(_trim_arity, list(fns))) - self.callDuringTry = self.callDuringTry or kwargs.get("callDuringTry", False) - return self - - def addCondition(self, *fns, **kwargs): - """Add a boolean predicate function to expression's list of parse actions. See - L{I{setParseAction}<setParseAction>} for function call signatures. Unlike C{setParseAction}, - functions passed to C{addCondition} need to return boolean success/fail of the condition. - - Optional keyword arguments: - - message = define a custom message to be used in the raised exception - - fatal = if True, will raise ParseFatalException to stop parsing immediately; otherwise will raise ParseException - - Example:: - integer = Word(nums).setParseAction(lambda toks: int(toks[0])) - year_int = integer.copy() - year_int.addCondition(lambda toks: toks[0] >= 2000, message="Only support years 2000 and later") - date_str = year_int + '/' + integer + '/' + integer - - result = date_str.parseString("1999/12/31") # -> Exception: Only support years 2000 and later (at char 0), (line:1, col:1) - """ - msg = kwargs.get("message", "failed user-defined condition") - exc_type = ParseFatalException if kwargs.get("fatal", False) else ParseException - for fn in fns: - def pa(s,l,t): - if not bool(_trim_arity(fn)(s,l,t)): - raise exc_type(s,l,msg) - self.parseAction.append(pa) - self.callDuringTry = self.callDuringTry or kwargs.get("callDuringTry", False) - return self - - def setFailAction( self, fn ): - """Define action to perform if parsing fails at this expression. - Fail acton fn is a callable function that takes the arguments - C{fn(s,loc,expr,err)} where: - - s = string being parsed - - loc = location where expression match was attempted and failed - - expr = the parse expression that failed - - err = the exception thrown - The function returns no value. It may throw C{L{ParseFatalException}} - if it is desired to stop parsing immediately.""" - self.failAction = fn - return self - - def _skipIgnorables( self, instring, loc ): - exprsFound = True - while exprsFound: - exprsFound = False - for e in self.ignoreExprs: - try: - while 1: - loc,dummy = e._parse( instring, loc ) - exprsFound = True - except ParseException: - pass - return loc - - def preParse( self, instring, loc ): - if self.ignoreExprs: - loc = self._skipIgnorables( instring, loc ) - - if self.skipWhitespace: - wt = self.whiteChars - instrlen = len(instring) - while loc < instrlen and instring[loc] in wt: - loc += 1 - - return loc - - def parseImpl( self, instring, loc, doActions=True ): - return loc, [] - - def postParse( self, instring, loc, tokenlist ): - return tokenlist - - #~ @profile - def _parseNoCache( self, instring, loc, doActions=True, callPreParse=True ): - debugging = ( self.debug ) #and doActions ) - - if debugging or self.failAction: - #~ print ("Match",self,"at loc",loc,"(%d,%d)" % ( lineno(loc,instring), col(loc,instring) )) - if (self.debugActions[0] ): - self.debugActions[0]( instring, loc, self ) - if callPreParse and self.callPreparse: - preloc = self.preParse( instring, loc ) - else: - preloc = loc - tokensStart = preloc - try: - try: - loc,tokens = self.parseImpl( instring, preloc, doActions ) - except IndexError: - raise ParseException( instring, len(instring), self.errmsg, self ) - except ParseBaseException as err: - #~ print ("Exception raised:", err) - if self.debugActions[2]: - self.debugActions[2]( instring, tokensStart, self, err ) - if self.failAction: - self.failAction( instring, tokensStart, self, err ) - raise - else: - if callPreParse and self.callPreparse: - preloc = self.preParse( instring, loc ) - else: - preloc = loc - tokensStart = preloc - if self.mayIndexError or preloc >= len(instring): - try: - loc,tokens = self.parseImpl( instring, preloc, doActions ) - except IndexError: - raise ParseException( instring, len(instring), self.errmsg, self ) - else: - loc,tokens = self.parseImpl( instring, preloc, doActions ) - - tokens = self.postParse( instring, loc, tokens ) - - retTokens = ParseResults( tokens, self.resultsName, asList=self.saveAsList, modal=self.modalResults ) - if self.parseAction and (doActions or self.callDuringTry): - if debugging: - try: - for fn in self.parseAction: - tokens = fn( instring, tokensStart, retTokens ) - if tokens is not None: - retTokens = ParseResults( tokens, - self.resultsName, - asList=self.saveAsList and isinstance(tokens,(ParseResults,list)), - modal=self.modalResults ) - except ParseBaseException as err: - #~ print "Exception raised in user parse action:", err - if (self.debugActions[2] ): - self.debugActions[2]( instring, tokensStart, self, err ) - raise - else: - for fn in self.parseAction: - tokens = fn( instring, tokensStart, retTokens ) - if tokens is not None: - retTokens = ParseResults( tokens, - self.resultsName, - asList=self.saveAsList and isinstance(tokens,(ParseResults,list)), - modal=self.modalResults ) - if debugging: - #~ print ("Matched",self,"->",retTokens.asList()) - if (self.debugActions[1] ): - self.debugActions[1]( instring, tokensStart, loc, self, retTokens ) - - return loc, retTokens - - def tryParse( self, instring, loc ): - try: - return self._parse( instring, loc, doActions=False )[0] - except ParseFatalException: - raise ParseException( instring, loc, self.errmsg, self) - - def canParseNext(self, instring, loc): - try: - self.tryParse(instring, loc) - except (ParseException, IndexError): - return False - else: - return True - - class _UnboundedCache(object): - def __init__(self): - cache = {} - self.not_in_cache = not_in_cache = object() - - def get(self, key): - return cache.get(key, not_in_cache) - - def set(self, key, value): - cache[key] = value - - def clear(self): - cache.clear() - - def cache_len(self): - return len(cache) - - self.get = types.MethodType(get, self) - self.set = types.MethodType(set, self) - self.clear = types.MethodType(clear, self) - self.__len__ = types.MethodType(cache_len, self) - - if _OrderedDict is not None: - class _FifoCache(object): - def __init__(self, size): - self.not_in_cache = not_in_cache = object() - - cache = _OrderedDict() - - def get(self, key): - return cache.get(key, not_in_cache) - - def set(self, key, value): - cache[key] = value - while len(cache) > size: - try: - cache.popitem(False) - except KeyError: - pass - - def clear(self): - cache.clear() - - def cache_len(self): - return len(cache) - - self.get = types.MethodType(get, self) - self.set = types.MethodType(set, self) - self.clear = types.MethodType(clear, self) - self.__len__ = types.MethodType(cache_len, self) - - else: - class _FifoCache(object): - def __init__(self, size): - self.not_in_cache = not_in_cache = object() - - cache = {} - key_fifo = collections.deque([], size) - - def get(self, key): - return cache.get(key, not_in_cache) - - def set(self, key, value): - cache[key] = value - while len(key_fifo) > size: - cache.pop(key_fifo.popleft(), None) - key_fifo.append(key) - - def clear(self): - cache.clear() - key_fifo.clear() - - def cache_len(self): - return len(cache) - - self.get = types.MethodType(get, self) - self.set = types.MethodType(set, self) - self.clear = types.MethodType(clear, self) - self.__len__ = types.MethodType(cache_len, self) - - # argument cache for optimizing repeated calls when backtracking through recursive expressions - packrat_cache = {} # this is set later by enabledPackrat(); this is here so that resetCache() doesn't fail - packrat_cache_lock = RLock() - packrat_cache_stats = [0, 0] - - # this method gets repeatedly called during backtracking with the same arguments - - # we can cache these arguments and save ourselves the trouble of re-parsing the contained expression - def _parseCache( self, instring, loc, doActions=True, callPreParse=True ): - HIT, MISS = 0, 1 - lookup = (self, instring, loc, callPreParse, doActions) - with ParserElement.packrat_cache_lock: - cache = ParserElement.packrat_cache - value = cache.get(lookup) - if value is cache.not_in_cache: - ParserElement.packrat_cache_stats[MISS] += 1 - try: - value = self._parseNoCache(instring, loc, doActions, callPreParse) - except ParseBaseException as pe: - # cache a copy of the exception, without the traceback - cache.set(lookup, pe.__class__(*pe.args)) - raise - else: - cache.set(lookup, (value[0], value[1].copy())) - return value - else: - ParserElement.packrat_cache_stats[HIT] += 1 - if isinstance(value, Exception): - raise value - return (value[0], value[1].copy()) - - _parse = _parseNoCache - - @staticmethod - def resetCache(): - ParserElement.packrat_cache.clear() - ParserElement.packrat_cache_stats[:] = [0] * len(ParserElement.packrat_cache_stats) - - _packratEnabled = False - @staticmethod - def enablePackrat(cache_size_limit=128): - """Enables "packrat" parsing, which adds memoizing to the parsing logic. - Repeated parse attempts at the same string location (which happens - often in many complex grammars) can immediately return a cached value, - instead of re-executing parsing/validating code. Memoizing is done of - both valid results and parsing exceptions. - - Parameters: - - cache_size_limit - (default=C{128}) - if an integer value is provided - will limit the size of the packrat cache; if None is passed, then - the cache size will be unbounded; if 0 is passed, the cache will - be effectively disabled. - - This speedup may break existing programs that use parse actions that - have side-effects. For this reason, packrat parsing is disabled when - you first import pyparsing. To activate the packrat feature, your - program must call the class method C{ParserElement.enablePackrat()}. If - your program uses C{psyco} to "compile as you go", you must call - C{enablePackrat} before calling C{psyco.full()}. If you do not do this, - Python will crash. For best results, call C{enablePackrat()} immediately - after importing pyparsing. - - Example:: - import pyparsing - pyparsing.ParserElement.enablePackrat() - """ - if not ParserElement._packratEnabled: - ParserElement._packratEnabled = True - if cache_size_limit is None: - ParserElement.packrat_cache = ParserElement._UnboundedCache() - else: - ParserElement.packrat_cache = ParserElement._FifoCache(cache_size_limit) - ParserElement._parse = ParserElement._parseCache - - def parseString( self, instring, parseAll=False ): - """ - Execute the parse expression with the given string. - This is the main interface to the client code, once the complete - expression has been built. - - If you want the grammar to require that the entire input string be - successfully parsed, then set C{parseAll} to True (equivalent to ending - the grammar with C{L{StringEnd()}}). - - Note: C{parseString} implicitly calls C{expandtabs()} on the input string, - in order to report proper column numbers in parse actions. - If the input string contains tabs and - the grammar uses parse actions that use the C{loc} argument to index into the - string being parsed, you can ensure you have a consistent view of the input - string by: - - calling C{parseWithTabs} on your grammar before calling C{parseString} - (see L{I{parseWithTabs}<parseWithTabs>}) - - define your parse action using the full C{(s,loc,toks)} signature, and - reference the input string using the parse action's C{s} argument - - explictly expand the tabs in your input string before calling - C{parseString} - - Example:: - Word('a').parseString('aaaaabaaa') # -> ['aaaaa'] - Word('a').parseString('aaaaabaaa', parseAll=True) # -> Exception: Expected end of text - """ - ParserElement.resetCache() - if not self.streamlined: - self.streamline() - #~ self.saveAsList = True - for e in self.ignoreExprs: - e.streamline() - if not self.keepTabs: - instring = instring.expandtabs() - try: - loc, tokens = self._parse( instring, 0 ) - if parseAll: - loc = self.preParse( instring, loc ) - se = Empty() + StringEnd() - se._parse( instring, loc ) - except ParseBaseException as exc: - if ParserElement.verbose_stacktrace: - raise - else: - # catch and re-raise exception from here, clears out pyparsing internal stack trace - raise exc - else: - return tokens - - def scanString( self, instring, maxMatches=_MAX_INT, overlap=False ): - """ - Scan the input string for expression matches. Each match will return the - matching tokens, start location, and end location. May be called with optional - C{maxMatches} argument, to clip scanning after 'n' matches are found. If - C{overlap} is specified, then overlapping matches will be reported. - - Note that the start and end locations are reported relative to the string - being parsed. See L{I{parseString}<parseString>} for more information on parsing - strings with embedded tabs. - - Example:: - source = "sldjf123lsdjjkf345sldkjf879lkjsfd987" - print(source) - for tokens,start,end in Word(alphas).scanString(source): - print(' '*start + '^'*(end-start)) - print(' '*start + tokens[0]) - - prints:: - - sldjf123lsdjjkf345sldkjf879lkjsfd987 - ^^^^^ - sldjf - ^^^^^^^ - lsdjjkf - ^^^^^^ - sldkjf - ^^^^^^ - lkjsfd - """ - if not self.streamlined: - self.streamline() - for e in self.ignoreExprs: - e.streamline() - - if not self.keepTabs: - instring = _ustr(instring).expandtabs() - instrlen = len(instring) - loc = 0 - preparseFn = self.preParse - parseFn = self._parse - ParserElement.resetCache() - matches = 0 - try: - while loc <= instrlen and matches < maxMatches: - try: - preloc = preparseFn( instring, loc ) - nextLoc,tokens = parseFn( instring, preloc, callPreParse=False ) - except ParseException: - loc = preloc+1 - else: - if nextLoc > loc: - matches += 1 - yield tokens, preloc, nextLoc - if overlap: - nextloc = preparseFn( instring, loc ) - if nextloc > loc: - loc = nextLoc - else: - loc += 1 - else: - loc = nextLoc - else: - loc = preloc+1 - except ParseBaseException as exc: - if ParserElement.verbose_stacktrace: - raise - else: - # catch and re-raise exception from here, clears out pyparsing internal stack trace - raise exc - - def transformString( self, instring ): - """ - Extension to C{L{scanString}}, to modify matching text with modified tokens that may - be returned from a parse action. To use C{transformString}, define a grammar and - attach a parse action to it that modifies the returned token list. - Invoking C{transformString()} on a target string will then scan for matches, - and replace the matched text patterns according to the logic in the parse - action. C{transformString()} returns the resulting transformed string. - - Example:: - wd = Word(alphas) - wd.setParseAction(lambda toks: toks[0].title()) - - print(wd.transformString("now is the winter of our discontent made glorious summer by this sun of york.")) - Prints:: - Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York. - """ - out = [] - lastE = 0 - # force preservation of <TAB>s, to minimize unwanted transformation of string, and to - # keep string locs straight between transformString and scanString - self.keepTabs = True - try: - for t,s,e in self.scanString( instring ): - out.append( instring[lastE:s] ) - if t: - if isinstance(t,ParseResults): - out += t.asList() - elif isinstance(t,list): - out += t - else: - out.append(t) - lastE = e - out.append(instring[lastE:]) - out = [o for o in out if o] - return "".join(map(_ustr,_flatten(out))) - except ParseBaseException as exc: - if ParserElement.verbose_stacktrace: - raise - else: - # catch and re-raise exception from here, clears out pyparsing internal stack trace - raise exc - - def searchString( self, instring, maxMatches=_MAX_INT ): - """ - Another extension to C{L{scanString}}, simplifying the access to the tokens found - to match the given parse expression. May be called with optional - C{maxMatches} argument, to clip searching after 'n' matches are found. - - Example:: - # a capitalized word starts with an uppercase letter, followed by zero or more lowercase letters - cap_word = Word(alphas.upper(), alphas.lower()) - - print(cap_word.searchString("More than Iron, more than Lead, more than Gold I need Electricity")) - - # the sum() builtin can be used to merge results into a single ParseResults object - print(sum(cap_word.searchString("More than Iron, more than Lead, more than Gold I need Electricity"))) - prints:: - [['More'], ['Iron'], ['Lead'], ['Gold'], ['I'], ['Electricity']] - ['More', 'Iron', 'Lead', 'Gold', 'I', 'Electricity'] - """ - try: - return ParseResults([ t for t,s,e in self.scanString( instring, maxMatches ) ]) - except ParseBaseException as exc: - if ParserElement.verbose_stacktrace: - raise - else: - # catch and re-raise exception from here, clears out pyparsing internal stack trace - raise exc - - def split(self, instring, maxsplit=_MAX_INT, includeSeparators=False): - """ - Generator method to split a string using the given expression as a separator. - May be called with optional C{maxsplit} argument, to limit the number of splits; - and the optional C{includeSeparators} argument (default=C{False}), if the separating - matching text should be included in the split results. - - Example:: - punc = oneOf(list(".,;:/-!?")) - print(list(punc.split("This, this?, this sentence, is badly punctuated!"))) - prints:: - ['This', ' this', '', ' this sentence', ' is badly punctuated', ''] - """ - splits = 0 - last = 0 - for t,s,e in self.scanString(instring, maxMatches=maxsplit): - yield instring[last:s] - if includeSeparators: - yield t[0] - last = e - yield instring[last:] - - def __add__(self, other ): - """ - Implementation of + operator - returns C{L{And}}. Adding strings to a ParserElement - converts them to L{Literal}s by default. - - Example:: - greet = Word(alphas) + "," + Word(alphas) + "!" - hello = "Hello, World!" - print (hello, "->", greet.parseString(hello)) - Prints:: - Hello, World! -> ['Hello', ',', 'World', '!'] - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return And( [ self, other ] ) - - def __radd__(self, other ): - """ - Implementation of + operator when left operand is not a C{L{ParserElement}} - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return other + self - - def __sub__(self, other): - """ - Implementation of - operator, returns C{L{And}} with error stop - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return self + And._ErrorStop() + other - - def __rsub__(self, other ): - """ - Implementation of - operator when left operand is not a C{L{ParserElement}} - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return other - self - - def __mul__(self,other): - """ - Implementation of * operator, allows use of C{expr * 3} in place of - C{expr + expr + expr}. Expressions may also me multiplied by a 2-integer - tuple, similar to C{{min,max}} multipliers in regular expressions. Tuples - may also include C{None} as in: - - C{expr*(n,None)} or C{expr*(n,)} is equivalent - to C{expr*n + L{ZeroOrMore}(expr)} - (read as "at least n instances of C{expr}") - - C{expr*(None,n)} is equivalent to C{expr*(0,n)} - (read as "0 to n instances of C{expr}") - - C{expr*(None,None)} is equivalent to C{L{ZeroOrMore}(expr)} - - C{expr*(1,None)} is equivalent to C{L{OneOrMore}(expr)} - - Note that C{expr*(None,n)} does not raise an exception if - more than n exprs exist in the input stream; that is, - C{expr*(None,n)} does not enforce a maximum number of expr - occurrences. If this behavior is desired, then write - C{expr*(None,n) + ~expr} - """ - if isinstance(other,int): - minElements, optElements = other,0 - elif isinstance(other,tuple): - other = (other + (None, None))[:2] - if other[0] is None: - other = (0, other[1]) - if isinstance(other[0],int) and other[1] is None: - if other[0] == 0: - return ZeroOrMore(self) - if other[0] == 1: - return OneOrMore(self) - else: - return self*other[0] + ZeroOrMore(self) - elif isinstance(other[0],int) and isinstance(other[1],int): - minElements, optElements = other - optElements -= minElements - else: - raise TypeError("cannot multiply 'ParserElement' and ('%s','%s') objects", type(other[0]),type(other[1])) - else: - raise TypeError("cannot multiply 'ParserElement' and '%s' objects", type(other)) - - if minElements < 0: - raise ValueError("cannot multiply ParserElement by negative value") - if optElements < 0: - raise ValueError("second tuple value must be greater or equal to first tuple value") - if minElements == optElements == 0: - raise ValueError("cannot multiply ParserElement by 0 or (0,0)") - - if (optElements): - def makeOptionalList(n): - if n>1: - return Optional(self + makeOptionalList(n-1)) - else: - return Optional(self) - if minElements: - if minElements == 1: - ret = self + makeOptionalList(optElements) - else: - ret = And([self]*minElements) + makeOptionalList(optElements) - else: - ret = makeOptionalList(optElements) - else: - if minElements == 1: - ret = self - else: - ret = And([self]*minElements) - return ret - - def __rmul__(self, other): - return self.__mul__(other) - - def __or__(self, other ): - """ - Implementation of | operator - returns C{L{MatchFirst}} - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return MatchFirst( [ self, other ] ) - - def __ror__(self, other ): - """ - Implementation of | operator when left operand is not a C{L{ParserElement}} - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return other | self - - def __xor__(self, other ): - """ - Implementation of ^ operator - returns C{L{Or}} - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return Or( [ self, other ] ) - - def __rxor__(self, other ): - """ - Implementation of ^ operator when left operand is not a C{L{ParserElement}} - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return other ^ self - - def __and__(self, other ): - """ - Implementation of & operator - returns C{L{Each}} - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return Each( [ self, other ] ) - - def __rand__(self, other ): - """ - Implementation of & operator when left operand is not a C{L{ParserElement}} - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return other & self - - def __invert__( self ): - """ - Implementation of ~ operator - returns C{L{NotAny}} - """ - return NotAny( self ) - - def __call__(self, name=None): - """ - Shortcut for C{L{setResultsName}}, with C{listAllMatches=False}. - - If C{name} is given with a trailing C{'*'} character, then C{listAllMatches} will be - passed as C{True}. - - If C{name} is omitted, same as calling C{L{copy}}. - - Example:: - # these are equivalent - userdata = Word(alphas).setResultsName("name") + Word(nums+"-").setResultsName("socsecno") - userdata = Word(alphas)("name") + Word(nums+"-")("socsecno") - """ - if name is not None: - return self.setResultsName(name) - else: - return self.copy() - - def suppress( self ): - """ - Suppresses the output of this C{ParserElement}; useful to keep punctuation from - cluttering up returned output. - """ - return Suppress( self ) - - def leaveWhitespace( self ): - """ - Disables the skipping of whitespace before matching the characters in the - C{ParserElement}'s defined pattern. This is normally only used internally by - the pyparsing module, but may be needed in some whitespace-sensitive grammars. - """ - self.skipWhitespace = False - return self - - def setWhitespaceChars( self, chars ): - """ - Overrides the default whitespace chars - """ - self.skipWhitespace = True - self.whiteChars = chars - self.copyDefaultWhiteChars = False - return self - - def parseWithTabs( self ): - """ - Overrides default behavior to expand C{<TAB>}s to spaces before parsing the input string. - Must be called before C{parseString} when the input grammar contains elements that - match C{<TAB>} characters. - """ - self.keepTabs = True - return self - - def ignore( self, other ): - """ - Define expression to be ignored (e.g., comments) while doing pattern - matching; may be called repeatedly, to define multiple comment or other - ignorable patterns. - - Example:: - patt = OneOrMore(Word(alphas)) - patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj'] - - patt.ignore(cStyleComment) - patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj', 'lskjd'] - """ - if isinstance(other, basestring): - other = Suppress(other) - - if isinstance( other, Suppress ): - if other not in self.ignoreExprs: - self.ignoreExprs.append(other) - else: - self.ignoreExprs.append( Suppress( other.copy() ) ) - return self - - def setDebugActions( self, startAction, successAction, exceptionAction ): - """ - Enable display of debugging messages while doing pattern matching. - """ - self.debugActions = (startAction or _defaultStartDebugAction, - successAction or _defaultSuccessDebugAction, - exceptionAction or _defaultExceptionDebugAction) - self.debug = True - return self - - def setDebug( self, flag=True ): - """ - Enable display of debugging messages while doing pattern matching. - Set C{flag} to True to enable, False to disable. - - Example:: - wd = Word(alphas).setName("alphaword") - integer = Word(nums).setName("numword") - term = wd | integer - - # turn on debugging for wd - wd.setDebug() - - OneOrMore(term).parseString("abc 123 xyz 890") - - prints:: - Match alphaword at loc 0(1,1) - Matched alphaword -> ['abc'] - Match alphaword at loc 3(1,4) - Exception raised:Expected alphaword (at char 4), (line:1, col:5) - Match alphaword at loc 7(1,8) - Matched alphaword -> ['xyz'] - Match alphaword at loc 11(1,12) - Exception raised:Expected alphaword (at char 12), (line:1, col:13) - Match alphaword at loc 15(1,16) - Exception raised:Expected alphaword (at char 15), (line:1, col:16) - - The output shown is that produced by the default debug actions - custom debug actions can be - specified using L{setDebugActions}. Prior to attempting - to match the C{wd} expression, the debugging message C{"Match <exprname> at loc <n>(<line>,<col>)"} - is shown. Then if the parse succeeds, a C{"Matched"} message is shown, or an C{"Exception raised"} - message is shown. Also note the use of L{setName} to assign a human-readable name to the expression, - which makes debugging and exception messages easier to understand - for instance, the default - name created for the C{Word} expression without calling C{setName} is C{"W:(ABCD...)"}. - """ - if flag: - self.setDebugActions( _defaultStartDebugAction, _defaultSuccessDebugAction, _defaultExceptionDebugAction ) - else: - self.debug = False - return self - - def __str__( self ): - return self.name - - def __repr__( self ): - return _ustr(self) - - def streamline( self ): - self.streamlined = True - self.strRepr = None - return self - - def checkRecursion( self, parseElementList ): - pass - - def validate( self, validateTrace=[] ): - """ - Check defined expressions for valid structure, check for infinite recursive definitions. - """ - self.checkRecursion( [] ) - - def parseFile( self, file_or_filename, parseAll=False ): - """ - Execute the parse expression on the given file or filename. - If a filename is specified (instead of a file object), - the entire file is opened, read, and closed before parsing. - """ - try: - file_contents = file_or_filename.read() - except AttributeError: - with open(file_or_filename, "r") as f: - file_contents = f.read() - try: - return self.parseString(file_contents, parseAll) - except ParseBaseException as exc: - if ParserElement.verbose_stacktrace: - raise - else: - # catch and re-raise exception from here, clears out pyparsing internal stack trace - raise exc - - def __eq__(self,other): - if isinstance(other, ParserElement): - return self is other or vars(self) == vars(other) - elif isinstance(other, basestring): - return self.matches(other) - else: - return super(ParserElement,self)==other - - def __ne__(self,other): - return not (self == other) - - def __hash__(self): - return hash(id(self)) - - def __req__(self,other): - return self == other - - def __rne__(self,other): - return not (self == other) - - def matches(self, testString, parseAll=True): - """ - Method for quick testing of a parser against a test string. Good for simple - inline microtests of sub expressions while building up larger parser. - - Parameters: - - testString - to test against this expression for a match - - parseAll - (default=C{True}) - flag to pass to C{L{parseString}} when running tests - - Example:: - expr = Word(nums) - assert expr.matches("100") - """ - try: - self.parseString(_ustr(testString), parseAll=parseAll) - return True - except ParseBaseException: - return False - - def runTests(self, tests, parseAll=True, comment='#', fullDump=True, printResults=True, failureTests=False): - """ - Execute the parse expression on a series of test strings, showing each - test, the parsed results or where the parse failed. Quick and easy way to - run a parse expression against a list of sample strings. - - Parameters: - - tests - a list of separate test strings, or a multiline string of test strings - - parseAll - (default=C{True}) - flag to pass to C{L{parseString}} when running tests - - comment - (default=C{'#'}) - expression for indicating embedded comments in the test - string; pass None to disable comment filtering - - fullDump - (default=C{True}) - dump results as list followed by results names in nested outline; - if False, only dump nested list - - printResults - (default=C{True}) prints test output to stdout - - failureTests - (default=C{False}) indicates if these tests are expected to fail parsing - - Returns: a (success, results) tuple, where success indicates that all tests succeeded - (or failed if C{failureTests} is True), and the results contain a list of lines of each - test's output - - Example:: - number_expr = pyparsing_common.number.copy() - - result = number_expr.runTests(''' - # unsigned integer - 100 - # negative integer - -100 - # float with scientific notation - 6.02e23 - # integer with scientific notation - 1e-12 - ''') - print("Success" if result[0] else "Failed!") - - result = number_expr.runTests(''' - # stray character - 100Z - # missing leading digit before '.' - -.100 - # too many '.' - 3.14.159 - ''', failureTests=True) - print("Success" if result[0] else "Failed!") - prints:: - # unsigned integer - 100 - [100] - - # negative integer - -100 - [-100] - - # float with scientific notation - 6.02e23 - [6.02e+23] - - # integer with scientific notation - 1e-12 - [1e-12] - - Success - - # stray character - 100Z - ^ - FAIL: Expected end of text (at char 3), (line:1, col:4) - - # missing leading digit before '.' - -.100 - ^ - FAIL: Expected {real number with scientific notation | real number | signed integer} (at char 0), (line:1, col:1) - - # too many '.' - 3.14.159 - ^ - FAIL: Expected end of text (at char 4), (line:1, col:5) - - Success - - Each test string must be on a single line. If you want to test a string that spans multiple - lines, create a test like this:: - - expr.runTest(r"this is a test\\n of strings that spans \\n 3 lines") - - (Note that this is a raw string literal, you must include the leading 'r'.) - """ - if isinstance(tests, basestring): - tests = list(map(str.strip, tests.rstrip().splitlines())) - if isinstance(comment, basestring): - comment = Literal(comment) - allResults = [] - comments = [] - success = True - for t in tests: - if comment is not None and comment.matches(t, False) or comments and not t: - comments.append(t) - continue - if not t: - continue - out = ['\n'.join(comments), t] - comments = [] - try: - t = t.replace(r'\n','\n') - result = self.parseString(t, parseAll=parseAll) - out.append(result.dump(full=fullDump)) - success = success and not failureTests - except ParseBaseException as pe: - fatal = "(FATAL)" if isinstance(pe, ParseFatalException) else "" - if '\n' in t: - out.append(line(pe.loc, t)) - out.append(' '*(col(pe.loc,t)-1) + '^' + fatal) - else: - out.append(' '*pe.loc + '^' + fatal) - out.append("FAIL: " + str(pe)) - success = success and failureTests - result = pe - except Exception as exc: - out.append("FAIL-EXCEPTION: " + str(exc)) - success = success and failureTests - result = exc - - if printResults: - if fullDump: - out.append('') - print('\n'.join(out)) - - allResults.append((t, result)) - - return success, allResults - - -class Token(ParserElement): - """ - Abstract C{ParserElement} subclass, for defining atomic matching patterns. - """ - def __init__( self ): - super(Token,self).__init__( savelist=False ) - - -class Empty(Token): - """ - An empty token, will always match. - """ - def __init__( self ): - super(Empty,self).__init__() - self.name = "Empty" - self.mayReturnEmpty = True - self.mayIndexError = False - - -class NoMatch(Token): - """ - A token that will never match. - """ - def __init__( self ): - super(NoMatch,self).__init__() - self.name = "NoMatch" - self.mayReturnEmpty = True - self.mayIndexError = False - self.errmsg = "Unmatchable token" - - def parseImpl( self, instring, loc, doActions=True ): - raise ParseException(instring, loc, self.errmsg, self) - - -class Literal(Token): - """ - Token to exactly match a specified string. - - Example:: - Literal('blah').parseString('blah') # -> ['blah'] - Literal('blah').parseString('blahfooblah') # -> ['blah'] - Literal('blah').parseString('bla') # -> Exception: Expected "blah" - - For case-insensitive matching, use L{CaselessLiteral}. - - For keyword matching (force word break before and after the matched string), - use L{Keyword} or L{CaselessKeyword}. - """ - def __init__( self, matchString ): - super(Literal,self).__init__() - self.match = matchString - self.matchLen = len(matchString) - try: - self.firstMatchChar = matchString[0] - except IndexError: - warnings.warn("null string passed to Literal; use Empty() instead", - SyntaxWarning, stacklevel=2) - self.__class__ = Empty - self.name = '"%s"' % _ustr(self.match) - self.errmsg = "Expected " + self.name - self.mayReturnEmpty = False - self.mayIndexError = False - - # Performance tuning: this routine gets called a *lot* - # if this is a single character match string and the first character matches, - # short-circuit as quickly as possible, and avoid calling startswith - #~ @profile - def parseImpl( self, instring, loc, doActions=True ): - if (instring[loc] == self.firstMatchChar and - (self.matchLen==1 or instring.startswith(self.match,loc)) ): - return loc+self.matchLen, self.match - raise ParseException(instring, loc, self.errmsg, self) -_L = Literal -ParserElement._literalStringClass = Literal - -class Keyword(Token): - """ - Token to exactly match a specified string as a keyword, that is, it must be - immediately followed by a non-keyword character. Compare with C{L{Literal}}: - - C{Literal("if")} will match the leading C{'if'} in C{'ifAndOnlyIf'}. - - C{Keyword("if")} will not; it will only match the leading C{'if'} in C{'if x=1'}, or C{'if(y==2)'} - Accepts two optional constructor arguments in addition to the keyword string: - - C{identChars} is a string of characters that would be valid identifier characters, - defaulting to all alphanumerics + "_" and "$" - - C{caseless} allows case-insensitive matching, default is C{False}. - - Example:: - Keyword("start").parseString("start") # -> ['start'] - Keyword("start").parseString("starting") # -> Exception - - For case-insensitive matching, use L{CaselessKeyword}. - """ - DEFAULT_KEYWORD_CHARS = alphanums+"_$" - - def __init__( self, matchString, identChars=None, caseless=False ): - super(Keyword,self).__init__() - if identChars is None: - identChars = Keyword.DEFAULT_KEYWORD_CHARS - self.match = matchString - self.matchLen = len(matchString) - try: - self.firstMatchChar = matchString[0] - except IndexError: - warnings.warn("null string passed to Keyword; use Empty() instead", - SyntaxWarning, stacklevel=2) - self.name = '"%s"' % self.match - self.errmsg = "Expected " + self.name - self.mayReturnEmpty = False - self.mayIndexError = False - self.caseless = caseless - if caseless: - self.caselessmatch = matchString.upper() - identChars = identChars.upper() - self.identChars = set(identChars) - - def parseImpl( self, instring, loc, doActions=True ): - if self.caseless: - if ( (instring[ loc:loc+self.matchLen ].upper() == self.caselessmatch) and - (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen].upper() not in self.identChars) and - (loc == 0 or instring[loc-1].upper() not in self.identChars) ): - return loc+self.matchLen, self.match - else: - if (instring[loc] == self.firstMatchChar and - (self.matchLen==1 or instring.startswith(self.match,loc)) and - (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen] not in self.identChars) and - (loc == 0 or instring[loc-1] not in self.identChars) ): - return loc+self.matchLen, self.match - raise ParseException(instring, loc, self.errmsg, self) - - def copy(self): - c = super(Keyword,self).copy() - c.identChars = Keyword.DEFAULT_KEYWORD_CHARS - return c - - @staticmethod - def setDefaultKeywordChars( chars ): - """Overrides the default Keyword chars - """ - Keyword.DEFAULT_KEYWORD_CHARS = chars - -class CaselessLiteral(Literal): - """ - Token to match a specified string, ignoring case of letters. - Note: the matched results will always be in the case of the given - match string, NOT the case of the input text. - - Example:: - OneOrMore(CaselessLiteral("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD', 'CMD'] - - (Contrast with example for L{CaselessKeyword}.) - """ - def __init__( self, matchString ): - super(CaselessLiteral,self).__init__( matchString.upper() ) - # Preserve the defining literal. - self.returnString = matchString - self.name = "'%s'" % self.returnString - self.errmsg = "Expected " + self.name - - def parseImpl( self, instring, loc, doActions=True ): - if instring[ loc:loc+self.matchLen ].upper() == self.match: - return loc+self.matchLen, self.returnString - raise ParseException(instring, loc, self.errmsg, self) - -class CaselessKeyword(Keyword): - """ - Caseless version of L{Keyword}. - - Example:: - OneOrMore(CaselessKeyword("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD'] - - (Contrast with example for L{CaselessLiteral}.) - """ - def __init__( self, matchString, identChars=None ): - super(CaselessKeyword,self).__init__( matchString, identChars, caseless=True ) - - def parseImpl( self, instring, loc, doActions=True ): - if ( (instring[ loc:loc+self.matchLen ].upper() == self.caselessmatch) and - (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen].upper() not in self.identChars) ): - return loc+self.matchLen, self.match - raise ParseException(instring, loc, self.errmsg, self) - -class CloseMatch(Token): - """ - A variation on L{Literal} which matches "close" matches, that is, - strings with at most 'n' mismatching characters. C{CloseMatch} takes parameters: - - C{match_string} - string to be matched - - C{maxMismatches} - (C{default=1}) maximum number of mismatches allowed to count as a match - - The results from a successful parse will contain the matched text from the input string and the following named results: - - C{mismatches} - a list of the positions within the match_string where mismatches were found - - C{original} - the original match_string used to compare against the input string - - If C{mismatches} is an empty list, then the match was an exact match. - - Example:: - patt = CloseMatch("ATCATCGAATGGA") - patt.parseString("ATCATCGAAXGGA") # -> (['ATCATCGAAXGGA'], {'mismatches': [[9]], 'original': ['ATCATCGAATGGA']}) - patt.parseString("ATCAXCGAAXGGA") # -> Exception: Expected 'ATCATCGAATGGA' (with up to 1 mismatches) (at char 0), (line:1, col:1) - - # exact match - patt.parseString("ATCATCGAATGGA") # -> (['ATCATCGAATGGA'], {'mismatches': [[]], 'original': ['ATCATCGAATGGA']}) - - # close match allowing up to 2 mismatches - patt = CloseMatch("ATCATCGAATGGA", maxMismatches=2) - patt.parseString("ATCAXCGAAXGGA") # -> (['ATCAXCGAAXGGA'], {'mismatches': [[4, 9]], 'original': ['ATCATCGAATGGA']}) - """ - def __init__(self, match_string, maxMismatches=1): - super(CloseMatch,self).__init__() - self.name = match_string - self.match_string = match_string - self.maxMismatches = maxMismatches - self.errmsg = "Expected %r (with up to %d mismatches)" % (self.match_string, self.maxMismatches) - self.mayIndexError = False - self.mayReturnEmpty = False - - def parseImpl( self, instring, loc, doActions=True ): - start = loc - instrlen = len(instring) - maxloc = start + len(self.match_string) - - if maxloc <= instrlen: - match_string = self.match_string - match_stringloc = 0 - mismatches = [] - maxMismatches = self.maxMismatches - - for match_stringloc,s_m in enumerate(zip(instring[loc:maxloc], self.match_string)): - src,mat = s_m - if src != mat: - mismatches.append(match_stringloc) - if len(mismatches) > maxMismatches: - break - else: - loc = match_stringloc + 1 - results = ParseResults([instring[start:loc]]) - results['original'] = self.match_string - results['mismatches'] = mismatches - return loc, results - - raise ParseException(instring, loc, self.errmsg, self) - - -class Word(Token): - """ - Token for matching words composed of allowed character sets. - Defined with string containing all allowed initial characters, - an optional string containing allowed body characters (if omitted, - defaults to the initial character set), and an optional minimum, - maximum, and/or exact length. The default value for C{min} is 1 (a - minimum value < 1 is not valid); the default values for C{max} and C{exact} - are 0, meaning no maximum or exact length restriction. An optional - C{excludeChars} parameter can list characters that might be found in - the input C{bodyChars} string; useful to define a word of all printables - except for one or two characters, for instance. - - L{srange} is useful for defining custom character set strings for defining - C{Word} expressions, using range notation from regular expression character sets. - - A common mistake is to use C{Word} to match a specific literal string, as in - C{Word("Address")}. Remember that C{Word} uses the string argument to define - I{sets} of matchable characters. This expression would match "Add", "AAA", - "dAred", or any other word made up of the characters 'A', 'd', 'r', 'e', and 's'. - To match an exact literal string, use L{Literal} or L{Keyword}. - - pyparsing includes helper strings for building Words: - - L{alphas} - - L{nums} - - L{alphanums} - - L{hexnums} - - L{alphas8bit} (alphabetic characters in ASCII range 128-255 - accented, tilded, umlauted, etc.) - - L{punc8bit} (non-alphabetic characters in ASCII range 128-255 - currency, symbols, superscripts, diacriticals, etc.) - - L{printables} (any non-whitespace character) - - Example:: - # a word composed of digits - integer = Word(nums) # equivalent to Word("0123456789") or Word(srange("0-9")) - - # a word with a leading capital, and zero or more lowercase - capital_word = Word(alphas.upper(), alphas.lower()) - - # hostnames are alphanumeric, with leading alpha, and '-' - hostname = Word(alphas, alphanums+'-') - - # roman numeral (not a strict parser, accepts invalid mix of characters) - roman = Word("IVXLCDM") - - # any string of non-whitespace characters, except for ',' - csv_value = Word(printables, excludeChars=",") - """ - def __init__( self, initChars, bodyChars=None, min=1, max=0, exact=0, asKeyword=False, excludeChars=None ): - super(Word,self).__init__() - if excludeChars: - initChars = ''.join(c for c in initChars if c not in excludeChars) - if bodyChars: - bodyChars = ''.join(c for c in bodyChars if c not in excludeChars) - self.initCharsOrig = initChars - self.initChars = set(initChars) - if bodyChars : - self.bodyCharsOrig = bodyChars - self.bodyChars = set(bodyChars) - else: - self.bodyCharsOrig = initChars - self.bodyChars = set(initChars) - - self.maxSpecified = max > 0 - - if min < 1: - raise ValueError("cannot specify a minimum length < 1; use Optional(Word()) if zero-length word is permitted") - - self.minLen = min - - if max > 0: - self.maxLen = max - else: - self.maxLen = _MAX_INT - - if exact > 0: - self.maxLen = exact - self.minLen = exact - - self.name = _ustr(self) - self.errmsg = "Expected " + self.name - self.mayIndexError = False - self.asKeyword = asKeyword - - if ' ' not in self.initCharsOrig+self.bodyCharsOrig and (min==1 and max==0 and exact==0): - if self.bodyCharsOrig == self.initCharsOrig: - self.reString = "[%s]+" % _escapeRegexRangeChars(self.initCharsOrig) - elif len(self.initCharsOrig) == 1: - self.reString = "%s[%s]*" % \ - (re.escape(self.initCharsOrig), - _escapeRegexRangeChars(self.bodyCharsOrig),) - else: - self.reString = "[%s][%s]*" % \ - (_escapeRegexRangeChars(self.initCharsOrig), - _escapeRegexRangeChars(self.bodyCharsOrig),) - if self.asKeyword: - self.reString = r"\b"+self.reString+r"\b" - try: - self.re = re.compile( self.reString ) - except Exception: - self.re = None - - def parseImpl( self, instring, loc, doActions=True ): - if self.re: - result = self.re.match(instring,loc) - if not result: - raise ParseException(instring, loc, self.errmsg, self) - - loc = result.end() - return loc, result.group() - - if not(instring[ loc ] in self.initChars): - raise ParseException(instring, loc, self.errmsg, self) - - start = loc - loc += 1 - instrlen = len(instring) - bodychars = self.bodyChars - maxloc = start + self.maxLen - maxloc = min( maxloc, instrlen ) - while loc < maxloc and instring[loc] in bodychars: - loc += 1 - - throwException = False - if loc - start < self.minLen: - throwException = True - if self.maxSpecified and loc < instrlen and instring[loc] in bodychars: - throwException = True - if self.asKeyword: - if (start>0 and instring[start-1] in bodychars) or (loc<instrlen and instring[loc] in bodychars): - throwException = True - - if throwException: - raise ParseException(instring, loc, self.errmsg, self) - - return loc, instring[start:loc] - - def __str__( self ): - try: - return super(Word,self).__str__() - except Exception: - pass - - - if self.strRepr is None: - - def charsAsStr(s): - if len(s)>4: - return s[:4]+"..." - else: - return s - - if ( self.initCharsOrig != self.bodyCharsOrig ): - self.strRepr = "W:(%s,%s)" % ( charsAsStr(self.initCharsOrig), charsAsStr(self.bodyCharsOrig) ) - else: - self.strRepr = "W:(%s)" % charsAsStr(self.initCharsOrig) - - return self.strRepr - - -class Regex(Token): - r""" - Token for matching strings that match a given regular expression. - Defined with string specifying the regular expression in a form recognized by the inbuilt Python re module. - If the given regex contains named groups (defined using C{(?P<name>...)}), these will be preserved as - named parse results. - - Example:: - realnum = Regex(r"[+-]?\d+\.\d*") - date = Regex(r'(?P<year>\d{4})-(?P<month>\d\d?)-(?P<day>\d\d?)') - # ref: http://stackoverflow.com/questions/267399/how-do-you-match-only-valid-roman-numerals-with-a-regular-expression - roman = Regex(r"M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})") - """ - compiledREtype = type(re.compile("[A-Z]")) - def __init__( self, pattern, flags=0): - """The parameters C{pattern} and C{flags} are passed to the C{re.compile()} function as-is. See the Python C{re} module for an explanation of the acceptable patterns and flags.""" - super(Regex,self).__init__() - - if isinstance(pattern, basestring): - if not pattern: - warnings.warn("null string passed to Regex; use Empty() instead", - SyntaxWarning, stacklevel=2) - - self.pattern = pattern - self.flags = flags - - try: - self.re = re.compile(self.pattern, self.flags) - self.reString = self.pattern - except sre_constants.error: - warnings.warn("invalid pattern (%s) passed to Regex" % pattern, - SyntaxWarning, stacklevel=2) - raise - - elif isinstance(pattern, Regex.compiledREtype): - self.re = pattern - self.pattern = \ - self.reString = str(pattern) - self.flags = flags - - else: - raise ValueError("Regex may only be constructed with a string or a compiled RE object") - - self.name = _ustr(self) - self.errmsg = "Expected " + self.name - self.mayIndexError = False - self.mayReturnEmpty = True - - def parseImpl( self, instring, loc, doActions=True ): - result = self.re.match(instring,loc) - if not result: - raise ParseException(instring, loc, self.errmsg, self) - - loc = result.end() - d = result.groupdict() - ret = ParseResults(result.group()) - if d: - for k in d: - ret[k] = d[k] - return loc,ret - - def __str__( self ): - try: - return super(Regex,self).__str__() - except Exception: - pass - - if self.strRepr is None: - self.strRepr = "Re:(%s)" % repr(self.pattern) - - return self.strRepr - - -class QuotedString(Token): - r""" - Token for matching strings that are delimited by quoting characters. - - Defined with the following parameters: - - quoteChar - string of one or more characters defining the quote delimiting string - - escChar - character to escape quotes, typically backslash (default=C{None}) - - escQuote - special quote sequence to escape an embedded quote string (such as SQL's "" to escape an embedded ") (default=C{None}) - - multiline - boolean indicating whether quotes can span multiple lines (default=C{False}) - - unquoteResults - boolean indicating whether the matched text should be unquoted (default=C{True}) - - endQuoteChar - string of one or more characters defining the end of the quote delimited string (default=C{None} => same as quoteChar) - - convertWhitespaceEscapes - convert escaped whitespace (C{'\t'}, C{'\n'}, etc.) to actual whitespace (default=C{True}) - - Example:: - qs = QuotedString('"') - print(qs.searchString('lsjdf "This is the quote" sldjf')) - complex_qs = QuotedString('{{', endQuoteChar='}}') - print(complex_qs.searchString('lsjdf {{This is the "quote"}} sldjf')) - sql_qs = QuotedString('"', escQuote='""') - print(sql_qs.searchString('lsjdf "This is the quote with ""embedded"" quotes" sldjf')) - prints:: - [['This is the quote']] - [['This is the "quote"']] - [['This is the quote with "embedded" quotes']] - """ - def __init__( self, quoteChar, escChar=None, escQuote=None, multiline=False, unquoteResults=True, endQuoteChar=None, convertWhitespaceEscapes=True): - super(QuotedString,self).__init__() - - # remove white space from quote chars - wont work anyway - quoteChar = quoteChar.strip() - if not quoteChar: - warnings.warn("quoteChar cannot be the empty string",SyntaxWarning,stacklevel=2) - raise SyntaxError() - - if endQuoteChar is None: - endQuoteChar = quoteChar - else: - endQuoteChar = endQuoteChar.strip() - if not endQuoteChar: - warnings.warn("endQuoteChar cannot be the empty string",SyntaxWarning,stacklevel=2) - raise SyntaxError() - - self.quoteChar = quoteChar - self.quoteCharLen = len(quoteChar) - self.firstQuoteChar = quoteChar[0] - self.endQuoteChar = endQuoteChar - self.endQuoteCharLen = len(endQuoteChar) - self.escChar = escChar - self.escQuote = escQuote - self.unquoteResults = unquoteResults - self.convertWhitespaceEscapes = convertWhitespaceEscapes - - if multiline: - self.flags = re.MULTILINE | re.DOTALL - self.pattern = r'%s(?:[^%s%s]' % \ - ( re.escape(self.quoteChar), - _escapeRegexRangeChars(self.endQuoteChar[0]), - (escChar is not None and _escapeRegexRangeChars(escChar) or '') ) - else: - self.flags = 0 - self.pattern = r'%s(?:[^%s\n\r%s]' % \ - ( re.escape(self.quoteChar), - _escapeRegexRangeChars(self.endQuoteChar[0]), - (escChar is not None and _escapeRegexRangeChars(escChar) or '') ) - if len(self.endQuoteChar) > 1: - self.pattern += ( - '|(?:' + ')|(?:'.join("%s[^%s]" % (re.escape(self.endQuoteChar[:i]), - _escapeRegexRangeChars(self.endQuoteChar[i])) - for i in range(len(self.endQuoteChar)-1,0,-1)) + ')' - ) - if escQuote: - self.pattern += (r'|(?:%s)' % re.escape(escQuote)) - if escChar: - self.pattern += (r'|(?:%s.)' % re.escape(escChar)) - self.escCharReplacePattern = re.escape(self.escChar)+"(.)" - self.pattern += (r')*%s' % re.escape(self.endQuoteChar)) - - try: - self.re = re.compile(self.pattern, self.flags) - self.reString = self.pattern - except sre_constants.error: - warnings.warn("invalid pattern (%s) passed to Regex" % self.pattern, - SyntaxWarning, stacklevel=2) - raise - - self.name = _ustr(self) - self.errmsg = "Expected " + self.name - self.mayIndexError = False - self.mayReturnEmpty = True - - def parseImpl( self, instring, loc, doActions=True ): - result = instring[loc] == self.firstQuoteChar and self.re.match(instring,loc) or None - if not result: - raise ParseException(instring, loc, self.errmsg, self) - - loc = result.end() - ret = result.group() - - if self.unquoteResults: - - # strip off quotes - ret = ret[self.quoteCharLen:-self.endQuoteCharLen] - - if isinstance(ret,basestring): - # replace escaped whitespace - if '\\' in ret and self.convertWhitespaceEscapes: - ws_map = { - r'\t' : '\t', - r'\n' : '\n', - r'\f' : '\f', - r'\r' : '\r', - } - for wslit,wschar in ws_map.items(): - ret = ret.replace(wslit, wschar) - - # replace escaped characters - if self.escChar: - ret = re.sub(self.escCharReplacePattern, r"\g<1>", ret) - - # replace escaped quotes - if self.escQuote: - ret = ret.replace(self.escQuote, self.endQuoteChar) - - return loc, ret - - def __str__( self ): - try: - return super(QuotedString,self).__str__() - except Exception: - pass - - if self.strRepr is None: - self.strRepr = "quoted string, starting with %s ending with %s" % (self.quoteChar, self.endQuoteChar) - - return self.strRepr - - -class CharsNotIn(Token): - """ - Token for matching words composed of characters I{not} in a given set (will - include whitespace in matched characters if not listed in the provided exclusion set - see example). - Defined with string containing all disallowed characters, and an optional - minimum, maximum, and/or exact length. The default value for C{min} is 1 (a - minimum value < 1 is not valid); the default values for C{max} and C{exact} - are 0, meaning no maximum or exact length restriction. - - Example:: - # define a comma-separated-value as anything that is not a ',' - csv_value = CharsNotIn(',') - print(delimitedList(csv_value).parseString("dkls,lsdkjf,s12 34,@!#,213")) - prints:: - ['dkls', 'lsdkjf', 's12 34', '@!#', '213'] - """ - def __init__( self, notChars, min=1, max=0, exact=0 ): - super(CharsNotIn,self).__init__() - self.skipWhitespace = False - self.notChars = notChars - - if min < 1: - raise ValueError("cannot specify a minimum length < 1; use Optional(CharsNotIn()) if zero-length char group is permitted") - - self.minLen = min - - if max > 0: - self.maxLen = max - else: - self.maxLen = _MAX_INT - - if exact > 0: - self.maxLen = exact - self.minLen = exact - - self.name = _ustr(self) - self.errmsg = "Expected " + self.name - self.mayReturnEmpty = ( self.minLen == 0 ) - self.mayIndexError = False - - def parseImpl( self, instring, loc, doActions=True ): - if instring[loc] in self.notChars: - raise ParseException(instring, loc, self.errmsg, self) - - start = loc - loc += 1 - notchars = self.notChars - maxlen = min( start+self.maxLen, len(instring) ) - while loc < maxlen and \ - (instring[loc] not in notchars): - loc += 1 - - if loc - start < self.minLen: - raise ParseException(instring, loc, self.errmsg, self) - - return loc, instring[start:loc] - - def __str__( self ): - try: - return super(CharsNotIn, self).__str__() - except Exception: - pass - - if self.strRepr is None: - if len(self.notChars) > 4: - self.strRepr = "!W:(%s...)" % self.notChars[:4] - else: - self.strRepr = "!W:(%s)" % self.notChars - - return self.strRepr - -class White(Token): - """ - Special matching class for matching whitespace. Normally, whitespace is ignored - by pyparsing grammars. This class is included when some whitespace structures - are significant. Define with a string containing the whitespace characters to be - matched; default is C{" \\t\\r\\n"}. Also takes optional C{min}, C{max}, and C{exact} arguments, - as defined for the C{L{Word}} class. - """ - whiteStrs = { - " " : "<SPC>", - "\t": "<TAB>", - "\n": "<LF>", - "\r": "<CR>", - "\f": "<FF>", - } - def __init__(self, ws=" \t\r\n", min=1, max=0, exact=0): - super(White,self).__init__() - self.matchWhite = ws - self.setWhitespaceChars( "".join(c for c in self.whiteChars if c not in self.matchWhite) ) - #~ self.leaveWhitespace() - self.name = ("".join(White.whiteStrs[c] for c in self.matchWhite)) - self.mayReturnEmpty = True - self.errmsg = "Expected " + self.name - - self.minLen = min - - if max > 0: - self.maxLen = max - else: - self.maxLen = _MAX_INT - - if exact > 0: - self.maxLen = exact - self.minLen = exact - - def parseImpl( self, instring, loc, doActions=True ): - if not(instring[ loc ] in self.matchWhite): - raise ParseException(instring, loc, self.errmsg, self) - start = loc - loc += 1 - maxloc = start + self.maxLen - maxloc = min( maxloc, len(instring) ) - while loc < maxloc and instring[loc] in self.matchWhite: - loc += 1 - - if loc - start < self.minLen: - raise ParseException(instring, loc, self.errmsg, self) - - return loc, instring[start:loc] - - -class _PositionToken(Token): - def __init__( self ): - super(_PositionToken,self).__init__() - self.name=self.__class__.__name__ - self.mayReturnEmpty = True - self.mayIndexError = False - -class GoToColumn(_PositionToken): - """ - Token to advance to a specific column of input text; useful for tabular report scraping. - """ - def __init__( self, colno ): - super(GoToColumn,self).__init__() - self.col = colno - - def preParse( self, instring, loc ): - if col(loc,instring) != self.col: - instrlen = len(instring) - if self.ignoreExprs: - loc = self._skipIgnorables( instring, loc ) - while loc < instrlen and instring[loc].isspace() and col( loc, instring ) != self.col : - loc += 1 - return loc - - def parseImpl( self, instring, loc, doActions=True ): - thiscol = col( loc, instring ) - if thiscol > self.col: - raise ParseException( instring, loc, "Text not in expected column", self ) - newloc = loc + self.col - thiscol - ret = instring[ loc: newloc ] - return newloc, ret - - -class LineStart(_PositionToken): - """ - Matches if current position is at the beginning of a line within the parse string - - Example:: - - test = '''\ - AAA this line - AAA and this line - AAA but not this one - B AAA and definitely not this one - ''' - - for t in (LineStart() + 'AAA' + restOfLine).searchString(test): - print(t) - - Prints:: - ['AAA', ' this line'] - ['AAA', ' and this line'] - - """ - def __init__( self ): - super(LineStart,self).__init__() - self.errmsg = "Expected start of line" - - def parseImpl( self, instring, loc, doActions=True ): - if col(loc, instring) == 1: - return loc, [] - raise ParseException(instring, loc, self.errmsg, self) - -class LineEnd(_PositionToken): - """ - Matches if current position is at the end of a line within the parse string - """ - def __init__( self ): - super(LineEnd,self).__init__() - self.setWhitespaceChars( ParserElement.DEFAULT_WHITE_CHARS.replace("\n","") ) - self.errmsg = "Expected end of line" - - def parseImpl( self, instring, loc, doActions=True ): - if loc<len(instring): - if instring[loc] == "\n": - return loc+1, "\n" - else: - raise ParseException(instring, loc, self.errmsg, self) - elif loc == len(instring): - return loc+1, [] - else: - raise ParseException(instring, loc, self.errmsg, self) - -class StringStart(_PositionToken): - """ - Matches if current position is at the beginning of the parse string - """ - def __init__( self ): - super(StringStart,self).__init__() - self.errmsg = "Expected start of text" - - def parseImpl( self, instring, loc, doActions=True ): - if loc != 0: - # see if entire string up to here is just whitespace and ignoreables - if loc != self.preParse( instring, 0 ): - raise ParseException(instring, loc, self.errmsg, self) - return loc, [] - -class StringEnd(_PositionToken): - """ - Matches if current position is at the end of the parse string - """ - def __init__( self ): - super(StringEnd,self).__init__() - self.errmsg = "Expected end of text" - - def parseImpl( self, instring, loc, doActions=True ): - if loc < len(instring): - raise ParseException(instring, loc, self.errmsg, self) - elif loc == len(instring): - return loc+1, [] - elif loc > len(instring): - return loc, [] - else: - raise ParseException(instring, loc, self.errmsg, self) - -class WordStart(_PositionToken): - """ - Matches if the current position is at the beginning of a Word, and - is not preceded by any character in a given set of C{wordChars} - (default=C{printables}). To emulate the C{\b} behavior of regular expressions, - use C{WordStart(alphanums)}. C{WordStart} will also match at the beginning of - the string being parsed, or at the beginning of a line. - """ - def __init__(self, wordChars = printables): - super(WordStart,self).__init__() - self.wordChars = set(wordChars) - self.errmsg = "Not at the start of a word" - - def parseImpl(self, instring, loc, doActions=True ): - if loc != 0: - if (instring[loc-1] in self.wordChars or - instring[loc] not in self.wordChars): - raise ParseException(instring, loc, self.errmsg, self) - return loc, [] - -class WordEnd(_PositionToken): - """ - Matches if the current position is at the end of a Word, and - is not followed by any character in a given set of C{wordChars} - (default=C{printables}). To emulate the C{\b} behavior of regular expressions, - use C{WordEnd(alphanums)}. C{WordEnd} will also match at the end of - the string being parsed, or at the end of a line. - """ - def __init__(self, wordChars = printables): - super(WordEnd,self).__init__() - self.wordChars = set(wordChars) - self.skipWhitespace = False - self.errmsg = "Not at the end of a word" - - def parseImpl(self, instring, loc, doActions=True ): - instrlen = len(instring) - if instrlen>0 and loc<instrlen: - if (instring[loc] in self.wordChars or - instring[loc-1] not in self.wordChars): - raise ParseException(instring, loc, self.errmsg, self) - return loc, [] - - -class ParseExpression(ParserElement): - """ - Abstract subclass of ParserElement, for combining and post-processing parsed tokens. - """ - def __init__( self, exprs, savelist = False ): - super(ParseExpression,self).__init__(savelist) - if isinstance( exprs, _generatorType ): - exprs = list(exprs) - - if isinstance( exprs, basestring ): - self.exprs = [ ParserElement._literalStringClass( exprs ) ] - elif isinstance( exprs, Iterable ): - exprs = list(exprs) - # if sequence of strings provided, wrap with Literal - if all(isinstance(expr, basestring) for expr in exprs): - exprs = map(ParserElement._literalStringClass, exprs) - self.exprs = list(exprs) - else: - try: - self.exprs = list( exprs ) - except TypeError: - self.exprs = [ exprs ] - self.callPreparse = False - - def __getitem__( self, i ): - return self.exprs[i] - - def append( self, other ): - self.exprs.append( other ) - self.strRepr = None - return self - - def leaveWhitespace( self ): - """Extends C{leaveWhitespace} defined in base class, and also invokes C{leaveWhitespace} on - all contained expressions.""" - self.skipWhitespace = False - self.exprs = [ e.copy() for e in self.exprs ] - for e in self.exprs: - e.leaveWhitespace() - return self - - def ignore( self, other ): - if isinstance( other, Suppress ): - if other not in self.ignoreExprs: - super( ParseExpression, self).ignore( other ) - for e in self.exprs: - e.ignore( self.ignoreExprs[-1] ) - else: - super( ParseExpression, self).ignore( other ) - for e in self.exprs: - e.ignore( self.ignoreExprs[-1] ) - return self - - def __str__( self ): - try: - return super(ParseExpression,self).__str__() - except Exception: - pass - - if self.strRepr is None: - self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.exprs) ) - return self.strRepr - - def streamline( self ): - super(ParseExpression,self).streamline() - - for e in self.exprs: - e.streamline() - - # collapse nested And's of the form And( And( And( a,b), c), d) to And( a,b,c,d ) - # but only if there are no parse actions or resultsNames on the nested And's - # (likewise for Or's and MatchFirst's) - if ( len(self.exprs) == 2 ): - other = self.exprs[0] - if ( isinstance( other, self.__class__ ) and - not(other.parseAction) and - other.resultsName is None and - not other.debug ): - self.exprs = other.exprs[:] + [ self.exprs[1] ] - self.strRepr = None - self.mayReturnEmpty |= other.mayReturnEmpty - self.mayIndexError |= other.mayIndexError - - other = self.exprs[-1] - if ( isinstance( other, self.__class__ ) and - not(other.parseAction) and - other.resultsName is None and - not other.debug ): - self.exprs = self.exprs[:-1] + other.exprs[:] - self.strRepr = None - self.mayReturnEmpty |= other.mayReturnEmpty - self.mayIndexError |= other.mayIndexError - - self.errmsg = "Expected " + _ustr(self) - - return self - - def setResultsName( self, name, listAllMatches=False ): - ret = super(ParseExpression,self).setResultsName(name,listAllMatches) - return ret - - def validate( self, validateTrace=[] ): - tmp = validateTrace[:]+[self] - for e in self.exprs: - e.validate(tmp) - self.checkRecursion( [] ) - - def copy(self): - ret = super(ParseExpression,self).copy() - ret.exprs = [e.copy() for e in self.exprs] - return ret - -class And(ParseExpression): - """ - Requires all given C{ParseExpression}s to be found in the given order. - Expressions may be separated by whitespace. - May be constructed using the C{'+'} operator. - May also be constructed using the C{'-'} operator, which will suppress backtracking. - - Example:: - integer = Word(nums) - name_expr = OneOrMore(Word(alphas)) - - expr = And([integer("id"),name_expr("name"),integer("age")]) - # more easily written as: - expr = integer("id") + name_expr("name") + integer("age") - """ - - class _ErrorStop(Empty): - def __init__(self, *args, **kwargs): - super(And._ErrorStop,self).__init__(*args, **kwargs) - self.name = '-' - self.leaveWhitespace() - - def __init__( self, exprs, savelist = True ): - super(And,self).__init__(exprs, savelist) - self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) - self.setWhitespaceChars( self.exprs[0].whiteChars ) - self.skipWhitespace = self.exprs[0].skipWhitespace - self.callPreparse = True - - def parseImpl( self, instring, loc, doActions=True ): - # pass False as last arg to _parse for first element, since we already - # pre-parsed the string as part of our And pre-parsing - loc, resultlist = self.exprs[0]._parse( instring, loc, doActions, callPreParse=False ) - errorStop = False - for e in self.exprs[1:]: - if isinstance(e, And._ErrorStop): - errorStop = True - continue - if errorStop: - try: - loc, exprtokens = e._parse( instring, loc, doActions ) - except ParseSyntaxException: - raise - except ParseBaseException as pe: - pe.__traceback__ = None - raise ParseSyntaxException._from_exception(pe) - except IndexError: - raise ParseSyntaxException(instring, len(instring), self.errmsg, self) - else: - loc, exprtokens = e._parse( instring, loc, doActions ) - if exprtokens or exprtokens.haskeys(): - resultlist += exprtokens - return loc, resultlist - - def __iadd__(self, other ): - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - return self.append( other ) #And( [ self, other ] ) - - def checkRecursion( self, parseElementList ): - subRecCheckList = parseElementList[:] + [ self ] - for e in self.exprs: - e.checkRecursion( subRecCheckList ) - if not e.mayReturnEmpty: - break - - def __str__( self ): - if hasattr(self,"name"): - return self.name - - if self.strRepr is None: - self.strRepr = "{" + " ".join(_ustr(e) for e in self.exprs) + "}" - - return self.strRepr - - -class Or(ParseExpression): - """ - Requires that at least one C{ParseExpression} is found. - If two expressions match, the expression that matches the longest string will be used. - May be constructed using the C{'^'} operator. - - Example:: - # construct Or using '^' operator - - number = Word(nums) ^ Combine(Word(nums) + '.' + Word(nums)) - print(number.searchString("123 3.1416 789")) - prints:: - [['123'], ['3.1416'], ['789']] - """ - def __init__( self, exprs, savelist = False ): - super(Or,self).__init__(exprs, savelist) - if self.exprs: - self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs) - else: - self.mayReturnEmpty = True - - def parseImpl( self, instring, loc, doActions=True ): - maxExcLoc = -1 - maxException = None - matches = [] - for e in self.exprs: - try: - loc2 = e.tryParse( instring, loc ) - except ParseException as err: - err.__traceback__ = None - if err.loc > maxExcLoc: - maxException = err - maxExcLoc = err.loc - except IndexError: - if len(instring) > maxExcLoc: - maxException = ParseException(instring,len(instring),e.errmsg,self) - maxExcLoc = len(instring) - else: - # save match among all matches, to retry longest to shortest - matches.append((loc2, e)) - - if matches: - matches.sort(key=lambda x: -x[0]) - for _,e in matches: - try: - return e._parse( instring, loc, doActions ) - except ParseException as err: - err.__traceback__ = None - if err.loc > maxExcLoc: - maxException = err - maxExcLoc = err.loc - - if maxException is not None: - maxException.msg = self.errmsg - raise maxException - else: - raise ParseException(instring, loc, "no defined alternatives to match", self) - - - def __ixor__(self, other ): - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - return self.append( other ) #Or( [ self, other ] ) - - def __str__( self ): - if hasattr(self,"name"): - return self.name - - if self.strRepr is None: - self.strRepr = "{" + " ^ ".join(_ustr(e) for e in self.exprs) + "}" - - return self.strRepr - - def checkRecursion( self, parseElementList ): - subRecCheckList = parseElementList[:] + [ self ] - for e in self.exprs: - e.checkRecursion( subRecCheckList ) - - -class MatchFirst(ParseExpression): - """ - Requires that at least one C{ParseExpression} is found. - If two expressions match, the first one listed is the one that will match. - May be constructed using the C{'|'} operator. - - Example:: - # construct MatchFirst using '|' operator - - # watch the order of expressions to match - number = Word(nums) | Combine(Word(nums) + '.' + Word(nums)) - print(number.searchString("123 3.1416 789")) # Fail! -> [['123'], ['3'], ['1416'], ['789']] - - # put more selective expression first - number = Combine(Word(nums) + '.' + Word(nums)) | Word(nums) - print(number.searchString("123 3.1416 789")) # Better -> [['123'], ['3.1416'], ['789']] - """ - def __init__( self, exprs, savelist = False ): - super(MatchFirst,self).__init__(exprs, savelist) - if self.exprs: - self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs) - else: - self.mayReturnEmpty = True - - def parseImpl( self, instring, loc, doActions=True ): - maxExcLoc = -1 - maxException = None - for e in self.exprs: - try: - ret = e._parse( instring, loc, doActions ) - return ret - except ParseException as err: - if err.loc > maxExcLoc: - maxException = err - maxExcLoc = err.loc - except IndexError: - if len(instring) > maxExcLoc: - maxException = ParseException(instring,len(instring),e.errmsg,self) - maxExcLoc = len(instring) - - # only got here if no expression matched, raise exception for match that made it the furthest - else: - if maxException is not None: - maxException.msg = self.errmsg - raise maxException - else: - raise ParseException(instring, loc, "no defined alternatives to match", self) - - def __ior__(self, other ): - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - return self.append( other ) #MatchFirst( [ self, other ] ) - - def __str__( self ): - if hasattr(self,"name"): - return self.name - - if self.strRepr is None: - self.strRepr = "{" + " | ".join(_ustr(e) for e in self.exprs) + "}" - - return self.strRepr - - def checkRecursion( self, parseElementList ): - subRecCheckList = parseElementList[:] + [ self ] - for e in self.exprs: - e.checkRecursion( subRecCheckList ) - - -class Each(ParseExpression): - """ - Requires all given C{ParseExpression}s to be found, but in any order. - Expressions may be separated by whitespace. - May be constructed using the C{'&'} operator. - - Example:: - color = oneOf("RED ORANGE YELLOW GREEN BLUE PURPLE BLACK WHITE BROWN") - shape_type = oneOf("SQUARE CIRCLE TRIANGLE STAR HEXAGON OCTAGON") - integer = Word(nums) - shape_attr = "shape:" + shape_type("shape") - posn_attr = "posn:" + Group(integer("x") + ',' + integer("y"))("posn") - color_attr = "color:" + color("color") - size_attr = "size:" + integer("size") - - # use Each (using operator '&') to accept attributes in any order - # (shape and posn are required, color and size are optional) - shape_spec = shape_attr & posn_attr & Optional(color_attr) & Optional(size_attr) - - shape_spec.runTests(''' - shape: SQUARE color: BLACK posn: 100, 120 - shape: CIRCLE size: 50 color: BLUE posn: 50,80 - color:GREEN size:20 shape:TRIANGLE posn:20,40 - ''' - ) - prints:: - shape: SQUARE color: BLACK posn: 100, 120 - ['shape:', 'SQUARE', 'color:', 'BLACK', 'posn:', ['100', ',', '120']] - - color: BLACK - - posn: ['100', ',', '120'] - - x: 100 - - y: 120 - - shape: SQUARE - - - shape: CIRCLE size: 50 color: BLUE posn: 50,80 - ['shape:', 'CIRCLE', 'size:', '50', 'color:', 'BLUE', 'posn:', ['50', ',', '80']] - - color: BLUE - - posn: ['50', ',', '80'] - - x: 50 - - y: 80 - - shape: CIRCLE - - size: 50 - - - color: GREEN size: 20 shape: TRIANGLE posn: 20,40 - ['color:', 'GREEN', 'size:', '20', 'shape:', 'TRIANGLE', 'posn:', ['20', ',', '40']] - - color: GREEN - - posn: ['20', ',', '40'] - - x: 20 - - y: 40 - - shape: TRIANGLE - - size: 20 - """ - def __init__( self, exprs, savelist = True ): - super(Each,self).__init__(exprs, savelist) - self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) - self.skipWhitespace = True - self.initExprGroups = True - - def parseImpl( self, instring, loc, doActions=True ): - if self.initExprGroups: - self.opt1map = dict((id(e.expr),e) for e in self.exprs if isinstance(e,Optional)) - opt1 = [ e.expr for e in self.exprs if isinstance(e,Optional) ] - opt2 = [ e for e in self.exprs if e.mayReturnEmpty and not isinstance(e,Optional)] - self.optionals = opt1 + opt2 - self.multioptionals = [ e.expr for e in self.exprs if isinstance(e,ZeroOrMore) ] - self.multirequired = [ e.expr for e in self.exprs if isinstance(e,OneOrMore) ] - self.required = [ e for e in self.exprs if not isinstance(e,(Optional,ZeroOrMore,OneOrMore)) ] - self.required += self.multirequired - self.initExprGroups = False - tmpLoc = loc - tmpReqd = self.required[:] - tmpOpt = self.optionals[:] - matchOrder = [] - - keepMatching = True - while keepMatching: - tmpExprs = tmpReqd + tmpOpt + self.multioptionals + self.multirequired - failed = [] - for e in tmpExprs: - try: - tmpLoc = e.tryParse( instring, tmpLoc ) - except ParseException: - failed.append(e) - else: - matchOrder.append(self.opt1map.get(id(e),e)) - if e in tmpReqd: - tmpReqd.remove(e) - elif e in tmpOpt: - tmpOpt.remove(e) - if len(failed) == len(tmpExprs): - keepMatching = False - - if tmpReqd: - missing = ", ".join(_ustr(e) for e in tmpReqd) - raise ParseException(instring,loc,"Missing one or more required elements (%s)" % missing ) - - # add any unmatched Optionals, in case they have default values defined - matchOrder += [e for e in self.exprs if isinstance(e,Optional) and e.expr in tmpOpt] - - resultlist = [] - for e in matchOrder: - loc,results = e._parse(instring,loc,doActions) - resultlist.append(results) - - finalResults = sum(resultlist, ParseResults([])) - return loc, finalResults - - def __str__( self ): - if hasattr(self,"name"): - return self.name - - if self.strRepr is None: - self.strRepr = "{" + " & ".join(_ustr(e) for e in self.exprs) + "}" - - return self.strRepr - - def checkRecursion( self, parseElementList ): - subRecCheckList = parseElementList[:] + [ self ] - for e in self.exprs: - e.checkRecursion( subRecCheckList ) - - -class ParseElementEnhance(ParserElement): - """ - Abstract subclass of C{ParserElement}, for combining and post-processing parsed tokens. - """ - def __init__( self, expr, savelist=False ): - super(ParseElementEnhance,self).__init__(savelist) - if isinstance( expr, basestring ): - if issubclass(ParserElement._literalStringClass, Token): - expr = ParserElement._literalStringClass(expr) - else: - expr = ParserElement._literalStringClass(Literal(expr)) - self.expr = expr - self.strRepr = None - if expr is not None: - self.mayIndexError = expr.mayIndexError - self.mayReturnEmpty = expr.mayReturnEmpty - self.setWhitespaceChars( expr.whiteChars ) - self.skipWhitespace = expr.skipWhitespace - self.saveAsList = expr.saveAsList - self.callPreparse = expr.callPreparse - self.ignoreExprs.extend(expr.ignoreExprs) - - def parseImpl( self, instring, loc, doActions=True ): - if self.expr is not None: - return self.expr._parse( instring, loc, doActions, callPreParse=False ) - else: - raise ParseException("",loc,self.errmsg,self) - - def leaveWhitespace( self ): - self.skipWhitespace = False - self.expr = self.expr.copy() - if self.expr is not None: - self.expr.leaveWhitespace() - return self - - def ignore( self, other ): - if isinstance( other, Suppress ): - if other not in self.ignoreExprs: - super( ParseElementEnhance, self).ignore( other ) - if self.expr is not None: - self.expr.ignore( self.ignoreExprs[-1] ) - else: - super( ParseElementEnhance, self).ignore( other ) - if self.expr is not None: - self.expr.ignore( self.ignoreExprs[-1] ) - return self - - def streamline( self ): - super(ParseElementEnhance,self).streamline() - if self.expr is not None: - self.expr.streamline() - return self - - def checkRecursion( self, parseElementList ): - if self in parseElementList: - raise RecursiveGrammarException( parseElementList+[self] ) - subRecCheckList = parseElementList[:] + [ self ] - if self.expr is not None: - self.expr.checkRecursion( subRecCheckList ) - - def validate( self, validateTrace=[] ): - tmp = validateTrace[:]+[self] - if self.expr is not None: - self.expr.validate(tmp) - self.checkRecursion( [] ) - - def __str__( self ): - try: - return super(ParseElementEnhance,self).__str__() - except Exception: - pass - - if self.strRepr is None and self.expr is not None: - self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.expr) ) - return self.strRepr - - -class FollowedBy(ParseElementEnhance): - """ - Lookahead matching of the given parse expression. C{FollowedBy} - does I{not} advance the parsing position within the input string, it only - verifies that the specified parse expression matches at the current - position. C{FollowedBy} always returns a null token list. - - Example:: - # use FollowedBy to match a label only if it is followed by a ':' - data_word = Word(alphas) - label = data_word + FollowedBy(':') - attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) - - OneOrMore(attr_expr).parseString("shape: SQUARE color: BLACK posn: upper left").pprint() - prints:: - [['shape', 'SQUARE'], ['color', 'BLACK'], ['posn', 'upper left']] - """ - def __init__( self, expr ): - super(FollowedBy,self).__init__(expr) - self.mayReturnEmpty = True - - def parseImpl( self, instring, loc, doActions=True ): - self.expr.tryParse( instring, loc ) - return loc, [] - - -class NotAny(ParseElementEnhance): - """ - Lookahead to disallow matching with the given parse expression. C{NotAny} - does I{not} advance the parsing position within the input string, it only - verifies that the specified parse expression does I{not} match at the current - position. Also, C{NotAny} does I{not} skip over leading whitespace. C{NotAny} - always returns a null token list. May be constructed using the '~' operator. - - Example:: - - """ - def __init__( self, expr ): - super(NotAny,self).__init__(expr) - #~ self.leaveWhitespace() - self.skipWhitespace = False # do NOT use self.leaveWhitespace(), don't want to propagate to exprs - self.mayReturnEmpty = True - self.errmsg = "Found unwanted token, "+_ustr(self.expr) - - def parseImpl( self, instring, loc, doActions=True ): - if self.expr.canParseNext(instring, loc): - raise ParseException(instring, loc, self.errmsg, self) - return loc, [] - - def __str__( self ): - if hasattr(self,"name"): - return self.name - - if self.strRepr is None: - self.strRepr = "~{" + _ustr(self.expr) + "}" - - return self.strRepr - -class _MultipleMatch(ParseElementEnhance): - def __init__( self, expr, stopOn=None): - super(_MultipleMatch, self).__init__(expr) - self.saveAsList = True - ender = stopOn - if isinstance(ender, basestring): - ender = ParserElement._literalStringClass(ender) - self.not_ender = ~ender if ender is not None else None - - def parseImpl( self, instring, loc, doActions=True ): - self_expr_parse = self.expr._parse - self_skip_ignorables = self._skipIgnorables - check_ender = self.not_ender is not None - if check_ender: - try_not_ender = self.not_ender.tryParse - - # must be at least one (but first see if we are the stopOn sentinel; - # if so, fail) - if check_ender: - try_not_ender(instring, loc) - loc, tokens = self_expr_parse( instring, loc, doActions, callPreParse=False ) - try: - hasIgnoreExprs = (not not self.ignoreExprs) - while 1: - if check_ender: - try_not_ender(instring, loc) - if hasIgnoreExprs: - preloc = self_skip_ignorables( instring, loc ) - else: - preloc = loc - loc, tmptokens = self_expr_parse( instring, preloc, doActions ) - if tmptokens or tmptokens.haskeys(): - tokens += tmptokens - except (ParseException,IndexError): - pass - - return loc, tokens - -class OneOrMore(_MultipleMatch): - """ - Repetition of one or more of the given expression. - - Parameters: - - expr - expression that must match one or more times - - stopOn - (default=C{None}) - expression for a terminating sentinel - (only required if the sentinel would ordinarily match the repetition - expression) - - Example:: - data_word = Word(alphas) - label = data_word + FollowedBy(':') - attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join)) - - text = "shape: SQUARE posn: upper left color: BLACK" - OneOrMore(attr_expr).parseString(text).pprint() # Fail! read 'color' as data instead of next label -> [['shape', 'SQUARE color']] - - # use stopOn attribute for OneOrMore to avoid reading label string as part of the data - attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) - OneOrMore(attr_expr).parseString(text).pprint() # Better -> [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'BLACK']] - - # could also be written as - (attr_expr * (1,)).parseString(text).pprint() - """ - - def __str__( self ): - if hasattr(self,"name"): - return self.name - - if self.strRepr is None: - self.strRepr = "{" + _ustr(self.expr) + "}..." - - return self.strRepr - -class ZeroOrMore(_MultipleMatch): - """ - Optional repetition of zero or more of the given expression. - - Parameters: - - expr - expression that must match zero or more times - - stopOn - (default=C{None}) - expression for a terminating sentinel - (only required if the sentinel would ordinarily match the repetition - expression) - - Example: similar to L{OneOrMore} - """ - def __init__( self, expr, stopOn=None): - super(ZeroOrMore,self).__init__(expr, stopOn=stopOn) - self.mayReturnEmpty = True - - def parseImpl( self, instring, loc, doActions=True ): - try: - return super(ZeroOrMore, self).parseImpl(instring, loc, doActions) - except (ParseException,IndexError): - return loc, [] - - def __str__( self ): - if hasattr(self,"name"): - return self.name - - if self.strRepr is None: - self.strRepr = "[" + _ustr(self.expr) + "]..." - - return self.strRepr - -class _NullToken(object): - def __bool__(self): - return False - __nonzero__ = __bool__ - def __str__(self): - return "" - -_optionalNotMatched = _NullToken() -class Optional(ParseElementEnhance): - """ - Optional matching of the given expression. - - Parameters: - - expr - expression that must match zero or more times - - default (optional) - value to be returned if the optional expression is not found. - - Example:: - # US postal code can be a 5-digit zip, plus optional 4-digit qualifier - zip = Combine(Word(nums, exact=5) + Optional('-' + Word(nums, exact=4))) - zip.runTests(''' - # traditional ZIP code - 12345 - - # ZIP+4 form - 12101-0001 - - # invalid ZIP - 98765- - ''') - prints:: - # traditional ZIP code - 12345 - ['12345'] - - # ZIP+4 form - 12101-0001 - ['12101-0001'] - - # invalid ZIP - 98765- - ^ - FAIL: Expected end of text (at char 5), (line:1, col:6) - """ - def __init__( self, expr, default=_optionalNotMatched ): - super(Optional,self).__init__( expr, savelist=False ) - self.saveAsList = self.expr.saveAsList - self.defaultValue = default - self.mayReturnEmpty = True - - def parseImpl( self, instring, loc, doActions=True ): - try: - loc, tokens = self.expr._parse( instring, loc, doActions, callPreParse=False ) - except (ParseException,IndexError): - if self.defaultValue is not _optionalNotMatched: - if self.expr.resultsName: - tokens = ParseResults([ self.defaultValue ]) - tokens[self.expr.resultsName] = self.defaultValue - else: - tokens = [ self.defaultValue ] - else: - tokens = [] - return loc, tokens - - def __str__( self ): - if hasattr(self,"name"): - return self.name - - if self.strRepr is None: - self.strRepr = "[" + _ustr(self.expr) + "]" - - return self.strRepr - -class SkipTo(ParseElementEnhance): - """ - Token for skipping over all undefined text until the matched expression is found. - - Parameters: - - expr - target expression marking the end of the data to be skipped - - include - (default=C{False}) if True, the target expression is also parsed - (the skipped text and target expression are returned as a 2-element list). - - ignore - (default=C{None}) used to define grammars (typically quoted strings and - comments) that might contain false matches to the target expression - - failOn - (default=C{None}) define expressions that are not allowed to be - included in the skipped test; if found before the target expression is found, - the SkipTo is not a match - - Example:: - report = ''' - Outstanding Issues Report - 1 Jan 2000 - - # | Severity | Description | Days Open - -----+----------+-------------------------------------------+----------- - 101 | Critical | Intermittent system crash | 6 - 94 | Cosmetic | Spelling error on Login ('log|n') | 14 - 79 | Minor | System slow when running too many reports | 47 - ''' - integer = Word(nums) - SEP = Suppress('|') - # use SkipTo to simply match everything up until the next SEP - # - ignore quoted strings, so that a '|' character inside a quoted string does not match - # - parse action will call token.strip() for each matched token, i.e., the description body - string_data = SkipTo(SEP, ignore=quotedString) - string_data.setParseAction(tokenMap(str.strip)) - ticket_expr = (integer("issue_num") + SEP - + string_data("sev") + SEP - + string_data("desc") + SEP - + integer("days_open")) - - for tkt in ticket_expr.searchString(report): - print tkt.dump() - prints:: - ['101', 'Critical', 'Intermittent system crash', '6'] - - days_open: 6 - - desc: Intermittent system crash - - issue_num: 101 - - sev: Critical - ['94', 'Cosmetic', "Spelling error on Login ('log|n')", '14'] - - days_open: 14 - - desc: Spelling error on Login ('log|n') - - issue_num: 94 - - sev: Cosmetic - ['79', 'Minor', 'System slow when running too many reports', '47'] - - days_open: 47 - - desc: System slow when running too many reports - - issue_num: 79 - - sev: Minor - """ - def __init__( self, other, include=False, ignore=None, failOn=None ): - super( SkipTo, self ).__init__( other ) - self.ignoreExpr = ignore - self.mayReturnEmpty = True - self.mayIndexError = False - self.includeMatch = include - self.asList = False - if isinstance(failOn, basestring): - self.failOn = ParserElement._literalStringClass(failOn) - else: - self.failOn = failOn - self.errmsg = "No match found for "+_ustr(self.expr) - - def parseImpl( self, instring, loc, doActions=True ): - startloc = loc - instrlen = len(instring) - expr = self.expr - expr_parse = self.expr._parse - self_failOn_canParseNext = self.failOn.canParseNext if self.failOn is not None else None - self_ignoreExpr_tryParse = self.ignoreExpr.tryParse if self.ignoreExpr is not None else None - - tmploc = loc - while tmploc <= instrlen: - if self_failOn_canParseNext is not None: - # break if failOn expression matches - if self_failOn_canParseNext(instring, tmploc): - break - - if self_ignoreExpr_tryParse is not None: - # advance past ignore expressions - while 1: - try: - tmploc = self_ignoreExpr_tryParse(instring, tmploc) - except ParseBaseException: - break - - try: - expr_parse(instring, tmploc, doActions=False, callPreParse=False) - except (ParseException, IndexError): - # no match, advance loc in string - tmploc += 1 - else: - # matched skipto expr, done - break - - else: - # ran off the end of the input string without matching skipto expr, fail - raise ParseException(instring, loc, self.errmsg, self) - - # build up return values - loc = tmploc - skiptext = instring[startloc:loc] - skipresult = ParseResults(skiptext) - - if self.includeMatch: - loc, mat = expr_parse(instring,loc,doActions,callPreParse=False) - skipresult += mat - - return loc, skipresult - -class Forward(ParseElementEnhance): - """ - Forward declaration of an expression to be defined later - - used for recursive grammars, such as algebraic infix notation. - When the expression is known, it is assigned to the C{Forward} variable using the '<<' operator. - - Note: take care when assigning to C{Forward} not to overlook precedence of operators. - Specifically, '|' has a lower precedence than '<<', so that:: - fwdExpr << a | b | c - will actually be evaluated as:: - (fwdExpr << a) | b | c - thereby leaving b and c out as parseable alternatives. It is recommended that you - explicitly group the values inserted into the C{Forward}:: - fwdExpr << (a | b | c) - Converting to use the '<<=' operator instead will avoid this problem. - - See L{ParseResults.pprint} for an example of a recursive parser created using - C{Forward}. - """ - def __init__( self, other=None ): - super(Forward,self).__init__( other, savelist=False ) - - def __lshift__( self, other ): - if isinstance( other, basestring ): - other = ParserElement._literalStringClass(other) - self.expr = other - self.strRepr = None - self.mayIndexError = self.expr.mayIndexError - self.mayReturnEmpty = self.expr.mayReturnEmpty - self.setWhitespaceChars( self.expr.whiteChars ) - self.skipWhitespace = self.expr.skipWhitespace - self.saveAsList = self.expr.saveAsList - self.ignoreExprs.extend(self.expr.ignoreExprs) - return self - - def __ilshift__(self, other): - return self << other - - def leaveWhitespace( self ): - self.skipWhitespace = False - return self - - def streamline( self ): - if not self.streamlined: - self.streamlined = True - if self.expr is not None: - self.expr.streamline() - return self - - def validate( self, validateTrace=[] ): - if self not in validateTrace: - tmp = validateTrace[:]+[self] - if self.expr is not None: - self.expr.validate(tmp) - self.checkRecursion([]) - - def __str__( self ): - if hasattr(self,"name"): - return self.name - return self.__class__.__name__ + ": ..." - - # stubbed out for now - creates awful memory and perf issues - self._revertClass = self.__class__ - self.__class__ = _ForwardNoRecurse - try: - if self.expr is not None: - retString = _ustr(self.expr) - else: - retString = "None" - finally: - self.__class__ = self._revertClass - return self.__class__.__name__ + ": " + retString - - def copy(self): - if self.expr is not None: - return super(Forward,self).copy() - else: - ret = Forward() - ret <<= self - return ret - -class _ForwardNoRecurse(Forward): - def __str__( self ): - return "..." - -class TokenConverter(ParseElementEnhance): - """ - Abstract subclass of C{ParseExpression}, for converting parsed results. - """ - def __init__( self, expr, savelist=False ): - super(TokenConverter,self).__init__( expr )#, savelist ) - self.saveAsList = False - -class Combine(TokenConverter): - """ - Converter to concatenate all matching tokens to a single string. - By default, the matching patterns must also be contiguous in the input string; - this can be disabled by specifying C{'adjacent=False'} in the constructor. - - Example:: - real = Word(nums) + '.' + Word(nums) - print(real.parseString('3.1416')) # -> ['3', '.', '1416'] - # will also erroneously match the following - print(real.parseString('3. 1416')) # -> ['3', '.', '1416'] - - real = Combine(Word(nums) + '.' + Word(nums)) - print(real.parseString('3.1416')) # -> ['3.1416'] - # no match when there are internal spaces - print(real.parseString('3. 1416')) # -> Exception: Expected W:(0123...) - """ - def __init__( self, expr, joinString="", adjacent=True ): - super(Combine,self).__init__( expr ) - # suppress whitespace-stripping in contained parse expressions, but re-enable it on the Combine itself - if adjacent: - self.leaveWhitespace() - self.adjacent = adjacent - self.skipWhitespace = True - self.joinString = joinString - self.callPreparse = True - - def ignore( self, other ): - if self.adjacent: - ParserElement.ignore(self, other) - else: - super( Combine, self).ignore( other ) - return self - - def postParse( self, instring, loc, tokenlist ): - retToks = tokenlist.copy() - del retToks[:] - retToks += ParseResults([ "".join(tokenlist._asStringList(self.joinString)) ], modal=self.modalResults) - - if self.resultsName and retToks.haskeys(): - return [ retToks ] - else: - return retToks - -class Group(TokenConverter): - """ - Converter to return the matched tokens as a list - useful for returning tokens of C{L{ZeroOrMore}} and C{L{OneOrMore}} expressions. - - Example:: - ident = Word(alphas) - num = Word(nums) - term = ident | num - func = ident + Optional(delimitedList(term)) - print(func.parseString("fn a,b,100")) # -> ['fn', 'a', 'b', '100'] - - func = ident + Group(Optional(delimitedList(term))) - print(func.parseString("fn a,b,100")) # -> ['fn', ['a', 'b', '100']] - """ - def __init__( self, expr ): - super(Group,self).__init__( expr ) - self.saveAsList = True - - def postParse( self, instring, loc, tokenlist ): - return [ tokenlist ] - -class Dict(TokenConverter): - """ - Converter to return a repetitive expression as a list, but also as a dictionary. - Each element can also be referenced using the first token in the expression as its key. - Useful for tabular report scraping when the first column can be used as a item key. - - Example:: - data_word = Word(alphas) - label = data_word + FollowedBy(':') - attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join)) - - text = "shape: SQUARE posn: upper left color: light blue texture: burlap" - attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) - - # print attributes as plain groups - print(OneOrMore(attr_expr).parseString(text).dump()) - - # instead of OneOrMore(expr), parse using Dict(OneOrMore(Group(expr))) - Dict will auto-assign names - result = Dict(OneOrMore(Group(attr_expr))).parseString(text) - print(result.dump()) - - # access named fields as dict entries, or output as dict - print(result['shape']) - print(result.asDict()) - prints:: - ['shape', 'SQUARE', 'posn', 'upper left', 'color', 'light blue', 'texture', 'burlap'] - - [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']] - - color: light blue - - posn: upper left - - shape: SQUARE - - texture: burlap - SQUARE - {'color': 'light blue', 'posn': 'upper left', 'texture': 'burlap', 'shape': 'SQUARE'} - See more examples at L{ParseResults} of accessing fields by results name. - """ - def __init__( self, expr ): - super(Dict,self).__init__( expr ) - self.saveAsList = True - - def postParse( self, instring, loc, tokenlist ): - for i,tok in enumerate(tokenlist): - if len(tok) == 0: - continue - ikey = tok[0] - if isinstance(ikey,int): - ikey = _ustr(tok[0]).strip() - if len(tok)==1: - tokenlist[ikey] = _ParseResultsWithOffset("",i) - elif len(tok)==2 and not isinstance(tok[1],ParseResults): - tokenlist[ikey] = _ParseResultsWithOffset(tok[1],i) - else: - dictvalue = tok.copy() #ParseResults(i) - del dictvalue[0] - if len(dictvalue)!= 1 or (isinstance(dictvalue,ParseResults) and dictvalue.haskeys()): - tokenlist[ikey] = _ParseResultsWithOffset(dictvalue,i) - else: - tokenlist[ikey] = _ParseResultsWithOffset(dictvalue[0],i) - - if self.resultsName: - return [ tokenlist ] - else: - return tokenlist - - -class Suppress(TokenConverter): - """ - Converter for ignoring the results of a parsed expression. - - Example:: - source = "a, b, c,d" - wd = Word(alphas) - wd_list1 = wd + ZeroOrMore(',' + wd) - print(wd_list1.parseString(source)) - - # often, delimiters that are useful during parsing are just in the - # way afterward - use Suppress to keep them out of the parsed output - wd_list2 = wd + ZeroOrMore(Suppress(',') + wd) - print(wd_list2.parseString(source)) - prints:: - ['a', ',', 'b', ',', 'c', ',', 'd'] - ['a', 'b', 'c', 'd'] - (See also L{delimitedList}.) - """ - def postParse( self, instring, loc, tokenlist ): - return [] - - def suppress( self ): - return self - - -class OnlyOnce(object): - """ - Wrapper for parse actions, to ensure they are only called once. - """ - def __init__(self, methodCall): - self.callable = _trim_arity(methodCall) - self.called = False - def __call__(self,s,l,t): - if not self.called: - results = self.callable(s,l,t) - self.called = True - return results - raise ParseException(s,l,"") - def reset(self): - self.called = False - -def traceParseAction(f): - """ - Decorator for debugging parse actions. - - When the parse action is called, this decorator will print C{">> entering I{method-name}(line:I{current_source_line}, I{parse_location}, I{matched_tokens})".} - When the parse action completes, the decorator will print C{"<<"} followed by the returned value, or any exception that the parse action raised. - - Example:: - wd = Word(alphas) - - @traceParseAction - def remove_duplicate_chars(tokens): - return ''.join(sorted(set(''.join(tokens)))) - - wds = OneOrMore(wd).setParseAction(remove_duplicate_chars) - print(wds.parseString("slkdjs sld sldd sdlf sdljf")) - prints:: - >>entering remove_duplicate_chars(line: 'slkdjs sld sldd sdlf sdljf', 0, (['slkdjs', 'sld', 'sldd', 'sdlf', 'sdljf'], {})) - <<leaving remove_duplicate_chars (ret: 'dfjkls') - ['dfjkls'] - """ - f = _trim_arity(f) - def z(*paArgs): - thisFunc = f.__name__ - s,l,t = paArgs[-3:] - if len(paArgs)>3: - thisFunc = paArgs[0].__class__.__name__ + '.' + thisFunc - sys.stderr.write( ">>entering %s(line: '%s', %d, %r)\n" % (thisFunc,line(l,s),l,t) ) - try: - ret = f(*paArgs) - except Exception as exc: - sys.stderr.write( "<<leaving %s (exception: %s)\n" % (thisFunc,exc) ) - raise - sys.stderr.write( "<<leaving %s (ret: %r)\n" % (thisFunc,ret) ) - return ret - try: - z.__name__ = f.__name__ - except AttributeError: - pass - return z - -# -# global helpers -# -def delimitedList( expr, delim=",", combine=False ): - """ - Helper to define a delimited list of expressions - the delimiter defaults to ','. - By default, the list elements and delimiters can have intervening whitespace, and - comments, but this can be overridden by passing C{combine=True} in the constructor. - If C{combine} is set to C{True}, the matching tokens are returned as a single token - string, with the delimiters included; otherwise, the matching tokens are returned - as a list of tokens, with the delimiters suppressed. - - Example:: - delimitedList(Word(alphas)).parseString("aa,bb,cc") # -> ['aa', 'bb', 'cc'] - delimitedList(Word(hexnums), delim=':', combine=True).parseString("AA:BB:CC:DD:EE") # -> ['AA:BB:CC:DD:EE'] - """ - dlName = _ustr(expr)+" ["+_ustr(delim)+" "+_ustr(expr)+"]..." - if combine: - return Combine( expr + ZeroOrMore( delim + expr ) ).setName(dlName) - else: - return ( expr + ZeroOrMore( Suppress( delim ) + expr ) ).setName(dlName) - -def countedArray( expr, intExpr=None ): - """ - Helper to define a counted list of expressions. - This helper defines a pattern of the form:: - integer expr expr expr... - where the leading integer tells how many expr expressions follow. - The matched tokens returns the array of expr tokens as a list - the leading count token is suppressed. - - If C{intExpr} is specified, it should be a pyparsing expression that produces an integer value. - - Example:: - countedArray(Word(alphas)).parseString('2 ab cd ef') # -> ['ab', 'cd'] - - # in this parser, the leading integer value is given in binary, - # '10' indicating that 2 values are in the array - binaryConstant = Word('01').setParseAction(lambda t: int(t[0], 2)) - countedArray(Word(alphas), intExpr=binaryConstant).parseString('10 ab cd ef') # -> ['ab', 'cd'] - """ - arrayExpr = Forward() - def countFieldParseAction(s,l,t): - n = t[0] - arrayExpr << (n and Group(And([expr]*n)) or Group(empty)) - return [] - if intExpr is None: - intExpr = Word(nums).setParseAction(lambda t:int(t[0])) - else: - intExpr = intExpr.copy() - intExpr.setName("arrayLen") - intExpr.addParseAction(countFieldParseAction, callDuringTry=True) - return ( intExpr + arrayExpr ).setName('(len) ' + _ustr(expr) + '...') - -def _flatten(L): - ret = [] - for i in L: - if isinstance(i,list): - ret.extend(_flatten(i)) - else: - ret.append(i) - return ret - -def matchPreviousLiteral(expr): - """ - Helper to define an expression that is indirectly defined from - the tokens matched in a previous expression, that is, it looks - for a 'repeat' of a previous expression. For example:: - first = Word(nums) - second = matchPreviousLiteral(first) - matchExpr = first + ":" + second - will match C{"1:1"}, but not C{"1:2"}. Because this matches a - previous literal, will also match the leading C{"1:1"} in C{"1:10"}. - If this is not desired, use C{matchPreviousExpr}. - Do I{not} use with packrat parsing enabled. - """ - rep = Forward() - def copyTokenToRepeater(s,l,t): - if t: - if len(t) == 1: - rep << t[0] - else: - # flatten t tokens - tflat = _flatten(t.asList()) - rep << And(Literal(tt) for tt in tflat) - else: - rep << Empty() - expr.addParseAction(copyTokenToRepeater, callDuringTry=True) - rep.setName('(prev) ' + _ustr(expr)) - return rep - -def matchPreviousExpr(expr): - """ - Helper to define an expression that is indirectly defined from - the tokens matched in a previous expression, that is, it looks - for a 'repeat' of a previous expression. For example:: - first = Word(nums) - second = matchPreviousExpr(first) - matchExpr = first + ":" + second - will match C{"1:1"}, but not C{"1:2"}. Because this matches by - expressions, will I{not} match the leading C{"1:1"} in C{"1:10"}; - the expressions are evaluated first, and then compared, so - C{"1"} is compared with C{"10"}. - Do I{not} use with packrat parsing enabled. - """ - rep = Forward() - e2 = expr.copy() - rep <<= e2 - def copyTokenToRepeater(s,l,t): - matchTokens = _flatten(t.asList()) - def mustMatchTheseTokens(s,l,t): - theseTokens = _flatten(t.asList()) - if theseTokens != matchTokens: - raise ParseException("",0,"") - rep.setParseAction( mustMatchTheseTokens, callDuringTry=True ) - expr.addParseAction(copyTokenToRepeater, callDuringTry=True) - rep.setName('(prev) ' + _ustr(expr)) - return rep - -def _escapeRegexRangeChars(s): - #~ escape these chars: ^-] - for c in r"\^-]": - s = s.replace(c,_bslash+c) - s = s.replace("\n",r"\n") - s = s.replace("\t",r"\t") - return _ustr(s) - -def oneOf( strs, caseless=False, useRegex=True ): - """ - Helper to quickly define a set of alternative Literals, and makes sure to do - longest-first testing when there is a conflict, regardless of the input order, - but returns a C{L{MatchFirst}} for best performance. - - Parameters: - - strs - a string of space-delimited literals, or a collection of string literals - - caseless - (default=C{False}) - treat all literals as caseless - - useRegex - (default=C{True}) - as an optimization, will generate a Regex - object; otherwise, will generate a C{MatchFirst} object (if C{caseless=True}, or - if creating a C{Regex} raises an exception) - - Example:: - comp_oper = oneOf("< = > <= >= !=") - var = Word(alphas) - number = Word(nums) - term = var | number - comparison_expr = term + comp_oper + term - print(comparison_expr.searchString("B = 12 AA=23 B<=AA AA>12")) - prints:: - [['B', '=', '12'], ['AA', '=', '23'], ['B', '<=', 'AA'], ['AA', '>', '12']] - """ - if caseless: - isequal = ( lambda a,b: a.upper() == b.upper() ) - masks = ( lambda a,b: b.upper().startswith(a.upper()) ) - parseElementClass = CaselessLiteral - else: - isequal = ( lambda a,b: a == b ) - masks = ( lambda a,b: b.startswith(a) ) - parseElementClass = Literal - - symbols = [] - if isinstance(strs,basestring): - symbols = strs.split() - elif isinstance(strs, Iterable): - symbols = list(strs) - else: - warnings.warn("Invalid argument to oneOf, expected string or iterable", - SyntaxWarning, stacklevel=2) - if not symbols: - return NoMatch() - - i = 0 - while i < len(symbols)-1: - cur = symbols[i] - for j,other in enumerate(symbols[i+1:]): - if ( isequal(other, cur) ): - del symbols[i+j+1] - break - elif ( masks(cur, other) ): - del symbols[i+j+1] - symbols.insert(i,other) - cur = other - break - else: - i += 1 - - if not caseless and useRegex: - #~ print (strs,"->", "|".join( [ _escapeRegexChars(sym) for sym in symbols] )) - try: - if len(symbols)==len("".join(symbols)): - return Regex( "[%s]" % "".join(_escapeRegexRangeChars(sym) for sym in symbols) ).setName(' | '.join(symbols)) - else: - return Regex( "|".join(re.escape(sym) for sym in symbols) ).setName(' | '.join(symbols)) - except Exception: - warnings.warn("Exception creating Regex for oneOf, building MatchFirst", - SyntaxWarning, stacklevel=2) - - - # last resort, just use MatchFirst - return MatchFirst(parseElementClass(sym) for sym in symbols).setName(' | '.join(symbols)) - -def dictOf( key, value ): - """ - Helper to easily and clearly define a dictionary by specifying the respective patterns - for the key and value. Takes care of defining the C{L{Dict}}, C{L{ZeroOrMore}}, and C{L{Group}} tokens - in the proper order. The key pattern can include delimiting markers or punctuation, - as long as they are suppressed, thereby leaving the significant key text. The value - pattern can include named results, so that the C{Dict} results can include named token - fields. - - Example:: - text = "shape: SQUARE posn: upper left color: light blue texture: burlap" - attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) - print(OneOrMore(attr_expr).parseString(text).dump()) - - attr_label = label - attr_value = Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join) - - # similar to Dict, but simpler call format - result = dictOf(attr_label, attr_value).parseString(text) - print(result.dump()) - print(result['shape']) - print(result.shape) # object attribute access works too - print(result.asDict()) - prints:: - [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']] - - color: light blue - - posn: upper left - - shape: SQUARE - - texture: burlap - SQUARE - SQUARE - {'color': 'light blue', 'shape': 'SQUARE', 'posn': 'upper left', 'texture': 'burlap'} - """ - return Dict( ZeroOrMore( Group ( key + value ) ) ) - -def originalTextFor(expr, asString=True): - """ - Helper to return the original, untokenized text for a given expression. Useful to - restore the parsed fields of an HTML start tag into the raw tag text itself, or to - revert separate tokens with intervening whitespace back to the original matching - input text. By default, returns astring containing the original parsed text. - - If the optional C{asString} argument is passed as C{False}, then the return value is a - C{L{ParseResults}} containing any results names that were originally matched, and a - single token containing the original matched text from the input string. So if - the expression passed to C{L{originalTextFor}} contains expressions with defined - results names, you must set C{asString} to C{False} if you want to preserve those - results name values. - - Example:: - src = "this is test <b> bold <i>text</i> </b> normal text " - for tag in ("b","i"): - opener,closer = makeHTMLTags(tag) - patt = originalTextFor(opener + SkipTo(closer) + closer) - print(patt.searchString(src)[0]) - prints:: - ['<b> bold <i>text</i> </b>'] - ['<i>text</i>'] - """ - locMarker = Empty().setParseAction(lambda s,loc,t: loc) - endlocMarker = locMarker.copy() - endlocMarker.callPreparse = False - matchExpr = locMarker("_original_start") + expr + endlocMarker("_original_end") - if asString: - extractText = lambda s,l,t: s[t._original_start:t._original_end] - else: - def extractText(s,l,t): - t[:] = [s[t.pop('_original_start'):t.pop('_original_end')]] - matchExpr.setParseAction(extractText) - matchExpr.ignoreExprs = expr.ignoreExprs - return matchExpr - -def ungroup(expr): - """ - Helper to undo pyparsing's default grouping of And expressions, even - if all but one are non-empty. - """ - return TokenConverter(expr).setParseAction(lambda t:t[0]) - -def locatedExpr(expr): - """ - Helper to decorate a returned token with its starting and ending locations in the input string. - This helper adds the following results names: - - locn_start = location where matched expression begins - - locn_end = location where matched expression ends - - value = the actual parsed results - - Be careful if the input text contains C{<TAB>} characters, you may want to call - C{L{ParserElement.parseWithTabs}} - - Example:: - wd = Word(alphas) - for match in locatedExpr(wd).searchString("ljsdf123lksdjjf123lkkjj1222"): - print(match) - prints:: - [[0, 'ljsdf', 5]] - [[8, 'lksdjjf', 15]] - [[18, 'lkkjj', 23]] - """ - locator = Empty().setParseAction(lambda s,l,t: l) - return Group(locator("locn_start") + expr("value") + locator.copy().leaveWhitespace()("locn_end")) - - -# convenience constants for positional expressions -empty = Empty().setName("empty") -lineStart = LineStart().setName("lineStart") -lineEnd = LineEnd().setName("lineEnd") -stringStart = StringStart().setName("stringStart") -stringEnd = StringEnd().setName("stringEnd") - -_escapedPunc = Word( _bslash, r"\[]-*.$+^?()~ ", exact=2 ).setParseAction(lambda s,l,t:t[0][1]) -_escapedHexChar = Regex(r"\\0?[xX][0-9a-fA-F]+").setParseAction(lambda s,l,t:unichr(int(t[0].lstrip(r'\0x'),16))) -_escapedOctChar = Regex(r"\\0[0-7]+").setParseAction(lambda s,l,t:unichr(int(t[0][1:],8))) -_singleChar = _escapedPunc | _escapedHexChar | _escapedOctChar | CharsNotIn(r'\]', exact=1) -_charRange = Group(_singleChar + Suppress("-") + _singleChar) -_reBracketExpr = Literal("[") + Optional("^").setResultsName("negate") + Group( OneOrMore( _charRange | _singleChar ) ).setResultsName("body") + "]" - -def srange(s): - r""" - Helper to easily define string ranges for use in Word construction. Borrows - syntax from regexp '[]' string range definitions:: - srange("[0-9]") -> "0123456789" - srange("[a-z]") -> "abcdefghijklmnopqrstuvwxyz" - srange("[a-z$_]") -> "abcdefghijklmnopqrstuvwxyz$_" - The input string must be enclosed in []'s, and the returned string is the expanded - character set joined into a single string. - The values enclosed in the []'s may be: - - a single character - - an escaped character with a leading backslash (such as C{\-} or C{\]}) - - an escaped hex character with a leading C{'\x'} (C{\x21}, which is a C{'!'} character) - (C{\0x##} is also supported for backwards compatibility) - - an escaped octal character with a leading C{'\0'} (C{\041}, which is a C{'!'} character) - - a range of any of the above, separated by a dash (C{'a-z'}, etc.) - - any combination of the above (C{'aeiouy'}, C{'a-zA-Z0-9_$'}, etc.) - """ - _expanded = lambda p: p if not isinstance(p,ParseResults) else ''.join(unichr(c) for c in range(ord(p[0]),ord(p[1])+1)) - try: - return "".join(_expanded(part) for part in _reBracketExpr.parseString(s).body) - except Exception: - return "" - -def matchOnlyAtCol(n): - """ - Helper method for defining parse actions that require matching at a specific - column in the input text. - """ - def verifyCol(strg,locn,toks): - if col(locn,strg) != n: - raise ParseException(strg,locn,"matched token not at column %d" % n) - return verifyCol - -def replaceWith(replStr): - """ - Helper method for common parse actions that simply return a literal value. Especially - useful when used with C{L{transformString<ParserElement.transformString>}()}. - - Example:: - num = Word(nums).setParseAction(lambda toks: int(toks[0])) - na = oneOf("N/A NA").setParseAction(replaceWith(math.nan)) - term = na | num - - OneOrMore(term).parseString("324 234 N/A 234") # -> [324, 234, nan, 234] - """ - return lambda s,l,t: [replStr] - -def removeQuotes(s,l,t): - """ - Helper parse action for removing quotation marks from parsed quoted strings. - - Example:: - # by default, quotation marks are included in parsed results - quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["'Now is the Winter of our Discontent'"] - - # use removeQuotes to strip quotation marks from parsed results - quotedString.setParseAction(removeQuotes) - quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["Now is the Winter of our Discontent"] - """ - return t[0][1:-1] - -def tokenMap(func, *args): - """ - Helper to define a parse action by mapping a function to all elements of a ParseResults list.If any additional - args are passed, they are forwarded to the given function as additional arguments after - the token, as in C{hex_integer = Word(hexnums).setParseAction(tokenMap(int, 16))}, which will convert the - parsed data to an integer using base 16. - - Example (compare the last to example in L{ParserElement.transformString}:: - hex_ints = OneOrMore(Word(hexnums)).setParseAction(tokenMap(int, 16)) - hex_ints.runTests(''' - 00 11 22 aa FF 0a 0d 1a - ''') - - upperword = Word(alphas).setParseAction(tokenMap(str.upper)) - OneOrMore(upperword).runTests(''' - my kingdom for a horse - ''') - - wd = Word(alphas).setParseAction(tokenMap(str.title)) - OneOrMore(wd).setParseAction(' '.join).runTests(''' - now is the winter of our discontent made glorious summer by this sun of york - ''') - prints:: - 00 11 22 aa FF 0a 0d 1a - [0, 17, 34, 170, 255, 10, 13, 26] - - my kingdom for a horse - ['MY', 'KINGDOM', 'FOR', 'A', 'HORSE'] - - now is the winter of our discontent made glorious summer by this sun of york - ['Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York'] - """ - def pa(s,l,t): - return [func(tokn, *args) for tokn in t] - - try: - func_name = getattr(func, '__name__', - getattr(func, '__class__').__name__) - except Exception: - func_name = str(func) - pa.__name__ = func_name - - return pa - -upcaseTokens = tokenMap(lambda t: _ustr(t).upper()) -"""(Deprecated) Helper parse action to convert tokens to upper case. Deprecated in favor of L{pyparsing_common.upcaseTokens}""" - -downcaseTokens = tokenMap(lambda t: _ustr(t).lower()) -"""(Deprecated) Helper parse action to convert tokens to lower case. Deprecated in favor of L{pyparsing_common.downcaseTokens}""" - -def _makeTags(tagStr, xml): - """Internal helper to construct opening and closing tag expressions, given a tag name""" - if isinstance(tagStr,basestring): - resname = tagStr - tagStr = Keyword(tagStr, caseless=not xml) - else: - resname = tagStr.name - - tagAttrName = Word(alphas,alphanums+"_-:") - if (xml): - tagAttrValue = dblQuotedString.copy().setParseAction( removeQuotes ) - openTag = Suppress("<") + tagStr("tag") + \ - Dict(ZeroOrMore(Group( tagAttrName + Suppress("=") + tagAttrValue ))) + \ - Optional("/",default=[False]).setResultsName("empty").setParseAction(lambda s,l,t:t[0]=='/') + Suppress(">") - else: - printablesLessRAbrack = "".join(c for c in printables if c not in ">") - tagAttrValue = quotedString.copy().setParseAction( removeQuotes ) | Word(printablesLessRAbrack) - openTag = Suppress("<") + tagStr("tag") + \ - Dict(ZeroOrMore(Group( tagAttrName.setParseAction(downcaseTokens) + \ - Optional( Suppress("=") + tagAttrValue ) ))) + \ - Optional("/",default=[False]).setResultsName("empty").setParseAction(lambda s,l,t:t[0]=='/') + Suppress(">") - closeTag = Combine(_L("</") + tagStr + ">") - - openTag = openTag.setResultsName("start"+"".join(resname.replace(":"," ").title().split())).setName("<%s>" % resname) - closeTag = closeTag.setResultsName("end"+"".join(resname.replace(":"," ").title().split())).setName("</%s>" % resname) - openTag.tag = resname - closeTag.tag = resname - return openTag, closeTag - -def makeHTMLTags(tagStr): - """ - Helper to construct opening and closing tag expressions for HTML, given a tag name. Matches - tags in either upper or lower case, attributes with namespaces and with quoted or unquoted values. - - Example:: - text = '<td>More info at the <a href="http://pyparsing.wikispaces.com">pyparsing</a> wiki page</td>' - # makeHTMLTags returns pyparsing expressions for the opening and closing tags as a 2-tuple - a,a_end = makeHTMLTags("A") - link_expr = a + SkipTo(a_end)("link_text") + a_end - - for link in link_expr.searchString(text): - # attributes in the <A> tag (like "href" shown here) are also accessible as named results - print(link.link_text, '->', link.href) - prints:: - pyparsing -> http://pyparsing.wikispaces.com - """ - return _makeTags( tagStr, False ) - -def makeXMLTags(tagStr): - """ - Helper to construct opening and closing tag expressions for XML, given a tag name. Matches - tags only in the given upper/lower case. - - Example: similar to L{makeHTMLTags} - """ - return _makeTags( tagStr, True ) - -def withAttribute(*args,**attrDict): - """ - Helper to create a validating parse action to be used with start tags created - with C{L{makeXMLTags}} or C{L{makeHTMLTags}}. Use C{withAttribute} to qualify a starting tag - with a required attribute value, to avoid false matches on common tags such as - C{<TD>} or C{<DIV>}. - - Call C{withAttribute} with a series of attribute names and values. Specify the list - of filter attributes names and values as: - - keyword arguments, as in C{(align="right")}, or - - as an explicit dict with C{**} operator, when an attribute name is also a Python - reserved word, as in C{**{"class":"Customer", "align":"right"}} - - a list of name-value tuples, as in ( ("ns1:class", "Customer"), ("ns2:align","right") ) - For attribute names with a namespace prefix, you must use the second form. Attribute - names are matched insensitive to upper/lower case. - - If just testing for C{class} (with or without a namespace), use C{L{withClass}}. - - To verify that the attribute exists, but without specifying a value, pass - C{withAttribute.ANY_VALUE} as the value. - - Example:: - html = ''' - <div> - Some text - <div type="grid">1 4 0 1 0</div> - <div type="graph">1,3 2,3 1,1</div> - <div>this has no type</div> - </div> - - ''' - div,div_end = makeHTMLTags("div") - - # only match div tag having a type attribute with value "grid" - div_grid = div().setParseAction(withAttribute(type="grid")) - grid_expr = div_grid + SkipTo(div | div_end)("body") - for grid_header in grid_expr.searchString(html): - print(grid_header.body) - - # construct a match with any div tag having a type attribute, regardless of the value - div_any_type = div().setParseAction(withAttribute(type=withAttribute.ANY_VALUE)) - div_expr = div_any_type + SkipTo(div | div_end)("body") - for div_header in div_expr.searchString(html): - print(div_header.body) - prints:: - 1 4 0 1 0 - - 1 4 0 1 0 - 1,3 2,3 1,1 - """ - if args: - attrs = args[:] - else: - attrs = attrDict.items() - attrs = [(k,v) for k,v in attrs] - def pa(s,l,tokens): - for attrName,attrValue in attrs: - if attrName not in tokens: - raise ParseException(s,l,"no matching attribute " + attrName) - if attrValue != withAttribute.ANY_VALUE and tokens[attrName] != attrValue: - raise ParseException(s,l,"attribute '%s' has value '%s', must be '%s'" % - (attrName, tokens[attrName], attrValue)) - return pa -withAttribute.ANY_VALUE = object() - -def withClass(classname, namespace=''): - """ - Simplified version of C{L{withAttribute}} when matching on a div class - made - difficult because C{class} is a reserved word in Python. - - Example:: - html = ''' - <div> - Some text - <div class="grid">1 4 0 1 0</div> - <div class="graph">1,3 2,3 1,1</div> - <div>this <div> has no class</div> - </div> - - ''' - div,div_end = makeHTMLTags("div") - div_grid = div().setParseAction(withClass("grid")) - - grid_expr = div_grid + SkipTo(div | div_end)("body") - for grid_header in grid_expr.searchString(html): - print(grid_header.body) - - div_any_type = div().setParseAction(withClass(withAttribute.ANY_VALUE)) - div_expr = div_any_type + SkipTo(div | div_end)("body") - for div_header in div_expr.searchString(html): - print(div_header.body) - prints:: - 1 4 0 1 0 - - 1 4 0 1 0 - 1,3 2,3 1,1 - """ - classattr = "%s:class" % namespace if namespace else "class" - return withAttribute(**{classattr : classname}) - -opAssoc = _Constants() -opAssoc.LEFT = object() -opAssoc.RIGHT = object() - -def infixNotation( baseExpr, opList, lpar=Suppress('('), rpar=Suppress(')') ): - """ - Helper method for constructing grammars of expressions made up of - operators working in a precedence hierarchy. Operators may be unary or - binary, left- or right-associative. Parse actions can also be attached - to operator expressions. The generated parser will also recognize the use - of parentheses to override operator precedences (see example below). - - Note: if you define a deep operator list, you may see performance issues - when using infixNotation. See L{ParserElement.enablePackrat} for a - mechanism to potentially improve your parser performance. - - Parameters: - - baseExpr - expression representing the most basic element for the nested - - opList - list of tuples, one for each operator precedence level in the - expression grammar; each tuple is of the form - (opExpr, numTerms, rightLeftAssoc, parseAction), where: - - opExpr is the pyparsing expression for the operator; - may also be a string, which will be converted to a Literal; - if numTerms is 3, opExpr is a tuple of two expressions, for the - two operators separating the 3 terms - - numTerms is the number of terms for this operator (must - be 1, 2, or 3) - - rightLeftAssoc is the indicator whether the operator is - right or left associative, using the pyparsing-defined - constants C{opAssoc.RIGHT} and C{opAssoc.LEFT}. - - parseAction is the parse action to be associated with - expressions matching this operator expression (the - parse action tuple member may be omitted); if the parse action - is passed a tuple or list of functions, this is equivalent to - calling C{setParseAction(*fn)} (L{ParserElement.setParseAction}) - - lpar - expression for matching left-parentheses (default=C{Suppress('(')}) - - rpar - expression for matching right-parentheses (default=C{Suppress(')')}) - - Example:: - # simple example of four-function arithmetic with ints and variable names - integer = pyparsing_common.signed_integer - varname = pyparsing_common.identifier - - arith_expr = infixNotation(integer | varname, - [ - ('-', 1, opAssoc.RIGHT), - (oneOf('* /'), 2, opAssoc.LEFT), - (oneOf('+ -'), 2, opAssoc.LEFT), - ]) - - arith_expr.runTests(''' - 5+3*6 - (5+3)*6 - -2--11 - ''', fullDump=False) - prints:: - 5+3*6 - [[5, '+', [3, '*', 6]]] - - (5+3)*6 - [[[5, '+', 3], '*', 6]] - - -2--11 - [[['-', 2], '-', ['-', 11]]] - """ - ret = Forward() - lastExpr = baseExpr | ( lpar + ret + rpar ) - for i,operDef in enumerate(opList): - opExpr,arity,rightLeftAssoc,pa = (operDef + (None,))[:4] - termName = "%s term" % opExpr if arity < 3 else "%s%s term" % opExpr - if arity == 3: - if opExpr is None or len(opExpr) != 2: - raise ValueError("if numterms=3, opExpr must be a tuple or list of two expressions") - opExpr1, opExpr2 = opExpr - thisExpr = Forward().setName(termName) - if rightLeftAssoc == opAssoc.LEFT: - if arity == 1: - matchExpr = FollowedBy(lastExpr + opExpr) + Group( lastExpr + OneOrMore( opExpr ) ) - elif arity == 2: - if opExpr is not None: - matchExpr = FollowedBy(lastExpr + opExpr + lastExpr) + Group( lastExpr + OneOrMore( opExpr + lastExpr ) ) - else: - matchExpr = FollowedBy(lastExpr+lastExpr) + Group( lastExpr + OneOrMore(lastExpr) ) - elif arity == 3: - matchExpr = FollowedBy(lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr) + \ - Group( lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr ) - else: - raise ValueError("operator must be unary (1), binary (2), or ternary (3)") - elif rightLeftAssoc == opAssoc.RIGHT: - if arity == 1: - # try to avoid LR with this extra test - if not isinstance(opExpr, Optional): - opExpr = Optional(opExpr) - matchExpr = FollowedBy(opExpr.expr + thisExpr) + Group( opExpr + thisExpr ) - elif arity == 2: - if opExpr is not None: - matchExpr = FollowedBy(lastExpr + opExpr + thisExpr) + Group( lastExpr + OneOrMore( opExpr + thisExpr ) ) - else: - matchExpr = FollowedBy(lastExpr + thisExpr) + Group( lastExpr + OneOrMore( thisExpr ) ) - elif arity == 3: - matchExpr = FollowedBy(lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr) + \ - Group( lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr ) - else: - raise ValueError("operator must be unary (1), binary (2), or ternary (3)") - else: - raise ValueError("operator must indicate right or left associativity") - if pa: - if isinstance(pa, (tuple, list)): - matchExpr.setParseAction(*pa) - else: - matchExpr.setParseAction(pa) - thisExpr <<= ( matchExpr.setName(termName) | lastExpr ) - lastExpr = thisExpr - ret <<= lastExpr - return ret - -operatorPrecedence = infixNotation -"""(Deprecated) Former name of C{L{infixNotation}}, will be dropped in a future release.""" - -dblQuotedString = Combine(Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*')+'"').setName("string enclosed in double quotes") -sglQuotedString = Combine(Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*")+"'").setName("string enclosed in single quotes") -quotedString = Combine(Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*')+'"'| - Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*")+"'").setName("quotedString using single or double quotes") -unicodeString = Combine(_L('u') + quotedString.copy()).setName("unicode string literal") - -def nestedExpr(opener="(", closer=")", content=None, ignoreExpr=quotedString.copy()): - """ - Helper method for defining nested lists enclosed in opening and closing - delimiters ("(" and ")" are the default). - - Parameters: - - opener - opening character for a nested list (default=C{"("}); can also be a pyparsing expression - - closer - closing character for a nested list (default=C{")"}); can also be a pyparsing expression - - content - expression for items within the nested lists (default=C{None}) - - ignoreExpr - expression for ignoring opening and closing delimiters (default=C{quotedString}) - - If an expression is not provided for the content argument, the nested - expression will capture all whitespace-delimited content between delimiters - as a list of separate values. - - Use the C{ignoreExpr} argument to define expressions that may contain - opening or closing characters that should not be treated as opening - or closing characters for nesting, such as quotedString or a comment - expression. Specify multiple expressions using an C{L{Or}} or C{L{MatchFirst}}. - The default is L{quotedString}, but if no expressions are to be ignored, - then pass C{None} for this argument. - - Example:: - data_type = oneOf("void int short long char float double") - decl_data_type = Combine(data_type + Optional(Word('*'))) - ident = Word(alphas+'_', alphanums+'_') - number = pyparsing_common.number - arg = Group(decl_data_type + ident) - LPAR,RPAR = map(Suppress, "()") - - code_body = nestedExpr('{', '}', ignoreExpr=(quotedString | cStyleComment)) - - c_function = (decl_data_type("type") - + ident("name") - + LPAR + Optional(delimitedList(arg), [])("args") + RPAR - + code_body("body")) - c_function.ignore(cStyleComment) - - source_code = ''' - int is_odd(int x) { - return (x%2); - } - - int dec_to_hex(char hchar) { - if (hchar >= '0' && hchar <= '9') { - return (ord(hchar)-ord('0')); - } else { - return (10+ord(hchar)-ord('A')); - } - } - ''' - for func in c_function.searchString(source_code): - print("%(name)s (%(type)s) args: %(args)s" % func) - - prints:: - is_odd (int) args: [['int', 'x']] - dec_to_hex (int) args: [['char', 'hchar']] - """ - if opener == closer: - raise ValueError("opening and closing strings cannot be the same") - if content is None: - if isinstance(opener,basestring) and isinstance(closer,basestring): - if len(opener) == 1 and len(closer)==1: - if ignoreExpr is not None: - content = (Combine(OneOrMore(~ignoreExpr + - CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS,exact=1)) - ).setParseAction(lambda t:t[0].strip())) - else: - content = (empty.copy()+CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS - ).setParseAction(lambda t:t[0].strip())) - else: - if ignoreExpr is not None: - content = (Combine(OneOrMore(~ignoreExpr + - ~Literal(opener) + ~Literal(closer) + - CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1)) - ).setParseAction(lambda t:t[0].strip())) - else: - content = (Combine(OneOrMore(~Literal(opener) + ~Literal(closer) + - CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1)) - ).setParseAction(lambda t:t[0].strip())) - else: - raise ValueError("opening and closing arguments must be strings if no content expression is given") - ret = Forward() - if ignoreExpr is not None: - ret <<= Group( Suppress(opener) + ZeroOrMore( ignoreExpr | ret | content ) + Suppress(closer) ) - else: - ret <<= Group( Suppress(opener) + ZeroOrMore( ret | content ) + Suppress(closer) ) - ret.setName('nested %s%s expression' % (opener,closer)) - return ret - -def indentedBlock(blockStatementExpr, indentStack, indent=True): - """ - Helper method for defining space-delimited indentation blocks, such as - those used to define block statements in Python source code. - - Parameters: - - blockStatementExpr - expression defining syntax of statement that - is repeated within the indented block - - indentStack - list created by caller to manage indentation stack - (multiple statementWithIndentedBlock expressions within a single grammar - should share a common indentStack) - - indent - boolean indicating whether block must be indented beyond the - the current level; set to False for block of left-most statements - (default=C{True}) - - A valid block must contain at least one C{blockStatement}. - - Example:: - data = ''' - def A(z): - A1 - B = 100 - G = A2 - A2 - A3 - B - def BB(a,b,c): - BB1 - def BBA(): - bba1 - bba2 - bba3 - C - D - def spam(x,y): - def eggs(z): - pass - ''' - - - indentStack = [1] - stmt = Forward() - - identifier = Word(alphas, alphanums) - funcDecl = ("def" + identifier + Group( "(" + Optional( delimitedList(identifier) ) + ")" ) + ":") - func_body = indentedBlock(stmt, indentStack) - funcDef = Group( funcDecl + func_body ) - - rvalue = Forward() - funcCall = Group(identifier + "(" + Optional(delimitedList(rvalue)) + ")") - rvalue << (funcCall | identifier | Word(nums)) - assignment = Group(identifier + "=" + rvalue) - stmt << ( funcDef | assignment | identifier ) - - module_body = OneOrMore(stmt) - - parseTree = module_body.parseString(data) - parseTree.pprint() - prints:: - [['def', - 'A', - ['(', 'z', ')'], - ':', - [['A1'], [['B', '=', '100']], [['G', '=', 'A2']], ['A2'], ['A3']]], - 'B', - ['def', - 'BB', - ['(', 'a', 'b', 'c', ')'], - ':', - [['BB1'], [['def', 'BBA', ['(', ')'], ':', [['bba1'], ['bba2'], ['bba3']]]]]], - 'C', - 'D', - ['def', - 'spam', - ['(', 'x', 'y', ')'], - ':', - [[['def', 'eggs', ['(', 'z', ')'], ':', [['pass']]]]]]] - """ - def checkPeerIndent(s,l,t): - if l >= len(s): return - curCol = col(l,s) - if curCol != indentStack[-1]: - if curCol > indentStack[-1]: - raise ParseFatalException(s,l,"illegal nesting") - raise ParseException(s,l,"not a peer entry") - - def checkSubIndent(s,l,t): - curCol = col(l,s) - if curCol > indentStack[-1]: - indentStack.append( curCol ) - else: - raise ParseException(s,l,"not a subentry") - - def checkUnindent(s,l,t): - if l >= len(s): return - curCol = col(l,s) - if not(indentStack and curCol < indentStack[-1] and curCol <= indentStack[-2]): - raise ParseException(s,l,"not an unindent") - indentStack.pop() - - NL = OneOrMore(LineEnd().setWhitespaceChars("\t ").suppress()) - INDENT = (Empty() + Empty().setParseAction(checkSubIndent)).setName('INDENT') - PEER = Empty().setParseAction(checkPeerIndent).setName('') - UNDENT = Empty().setParseAction(checkUnindent).setName('UNINDENT') - if indent: - smExpr = Group( Optional(NL) + - #~ FollowedBy(blockStatementExpr) + - INDENT + (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) + UNDENT) - else: - smExpr = Group( Optional(NL) + - (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) ) - blockStatementExpr.ignore(_bslash + LineEnd()) - return smExpr.setName('indented block') - -alphas8bit = srange(r"[\0xc0-\0xd6\0xd8-\0xf6\0xf8-\0xff]") -punc8bit = srange(r"[\0xa1-\0xbf\0xd7\0xf7]") - -anyOpenTag,anyCloseTag = makeHTMLTags(Word(alphas,alphanums+"_:").setName('any tag')) -_htmlEntityMap = dict(zip("gt lt amp nbsp quot apos".split(),'><& "\'')) -commonHTMLEntity = Regex('&(?P<entity>' + '|'.join(_htmlEntityMap.keys()) +");").setName("common HTML entity") -def replaceHTMLEntity(t): - """Helper parser action to replace common HTML entities with their special characters""" - return _htmlEntityMap.get(t.entity) - -# it's easy to get these comment structures wrong - they're very common, so may as well make them available -cStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/').setName("C style comment") -"Comment of the form C{/* ... */}" - -htmlComment = Regex(r"<!--[\s\S]*?-->").setName("HTML comment") -"Comment of the form C{<!-- ... -->}" - -restOfLine = Regex(r".*").leaveWhitespace().setName("rest of line") -dblSlashComment = Regex(r"//(?:\\\n|[^\n])*").setName("// comment") -"Comment of the form C{// ... (to end of line)}" - -cppStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/'| dblSlashComment).setName("C++ style comment") -"Comment of either form C{L{cStyleComment}} or C{L{dblSlashComment}}" - -javaStyleComment = cppStyleComment -"Same as C{L{cppStyleComment}}" - -pythonStyleComment = Regex(r"#.*").setName("Python style comment") -"Comment of the form C{# ... (to end of line)}" - -_commasepitem = Combine(OneOrMore(Word(printables, excludeChars=',') + - Optional( Word(" \t") + - ~Literal(",") + ~LineEnd() ) ) ).streamline().setName("commaItem") -commaSeparatedList = delimitedList( Optional( quotedString.copy() | _commasepitem, default="") ).setName("commaSeparatedList") -"""(Deprecated) Predefined expression of 1 or more printable words or quoted strings, separated by commas. - This expression is deprecated in favor of L{pyparsing_common.comma_separated_list}.""" - -# some other useful expressions - using lower-case class name since we are really using this as a namespace -class pyparsing_common: - """ - Here are some common low-level expressions that may be useful in jump-starting parser development: - - numeric forms (L{integers<integer>}, L{reals<real>}, L{scientific notation<sci_real>}) - - common L{programming identifiers<identifier>} - - network addresses (L{MAC<mac_address>}, L{IPv4<ipv4_address>}, L{IPv6<ipv6_address>}) - - ISO8601 L{dates<iso8601_date>} and L{datetime<iso8601_datetime>} - - L{UUID<uuid>} - - L{comma-separated list<comma_separated_list>} - Parse actions: - - C{L{convertToInteger}} - - C{L{convertToFloat}} - - C{L{convertToDate}} - - C{L{convertToDatetime}} - - C{L{stripHTMLTags}} - - C{L{upcaseTokens}} - - C{L{downcaseTokens}} - - Example:: - pyparsing_common.number.runTests(''' - # any int or real number, returned as the appropriate type - 100 - -100 - +100 - 3.14159 - 6.02e23 - 1e-12 - ''') - - pyparsing_common.fnumber.runTests(''' - # any int or real number, returned as float - 100 - -100 - +100 - 3.14159 - 6.02e23 - 1e-12 - ''') - - pyparsing_common.hex_integer.runTests(''' - # hex numbers - 100 - FF - ''') - - pyparsing_common.fraction.runTests(''' - # fractions - 1/2 - -3/4 - ''') - - pyparsing_common.mixed_integer.runTests(''' - # mixed fractions - 1 - 1/2 - -3/4 - 1-3/4 - ''') - - import uuid - pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID)) - pyparsing_common.uuid.runTests(''' - # uuid - 12345678-1234-5678-1234-567812345678 - ''') - prints:: - # any int or real number, returned as the appropriate type - 100 - [100] - - -100 - [-100] - - +100 - [100] - - 3.14159 - [3.14159] - - 6.02e23 - [6.02e+23] - - 1e-12 - [1e-12] - - # any int or real number, returned as float - 100 - [100.0] - - -100 - [-100.0] - - +100 - [100.0] - - 3.14159 - [3.14159] - - 6.02e23 - [6.02e+23] - - 1e-12 - [1e-12] - - # hex numbers - 100 - [256] - - FF - [255] - - # fractions - 1/2 - [0.5] - - -3/4 - [-0.75] - - # mixed fractions - 1 - [1] - - 1/2 - [0.5] - - -3/4 - [-0.75] - - 1-3/4 - [1.75] - - # uuid - 12345678-1234-5678-1234-567812345678 - [UUID('12345678-1234-5678-1234-567812345678')] - """ - - convertToInteger = tokenMap(int) - """ - Parse action for converting parsed integers to Python int - """ - - convertToFloat = tokenMap(float) - """ - Parse action for converting parsed numbers to Python float - """ - - integer = Word(nums).setName("integer").setParseAction(convertToInteger) - """expression that parses an unsigned integer, returns an int""" - - hex_integer = Word(hexnums).setName("hex integer").setParseAction(tokenMap(int,16)) - """expression that parses a hexadecimal integer, returns an int""" - - signed_integer = Regex(r'[+-]?\d+').setName("signed integer").setParseAction(convertToInteger) - """expression that parses an integer with optional leading sign, returns an int""" - - fraction = (signed_integer().setParseAction(convertToFloat) + '/' + signed_integer().setParseAction(convertToFloat)).setName("fraction") - """fractional expression of an integer divided by an integer, returns a float""" - fraction.addParseAction(lambda t: t[0]/t[-1]) - - mixed_integer = (fraction | signed_integer + Optional(Optional('-').suppress() + fraction)).setName("fraction or mixed integer-fraction") - """mixed integer of the form 'integer - fraction', with optional leading integer, returns float""" - mixed_integer.addParseAction(sum) - - real = Regex(r'[+-]?\d+\.\d*').setName("real number").setParseAction(convertToFloat) - """expression that parses a floating point number and returns a float""" - - sci_real = Regex(r'[+-]?\d+([eE][+-]?\d+|\.\d*([eE][+-]?\d+)?)').setName("real number with scientific notation").setParseAction(convertToFloat) - """expression that parses a floating point number with optional scientific notation and returns a float""" - - # streamlining this expression makes the docs nicer-looking - number = (sci_real | real | signed_integer).streamline() - """any numeric expression, returns the corresponding Python type""" - - fnumber = Regex(r'[+-]?\d+\.?\d*([eE][+-]?\d+)?').setName("fnumber").setParseAction(convertToFloat) - """any int or real number, returned as float""" - - identifier = Word(alphas+'_', alphanums+'_').setName("identifier") - """typical code identifier (leading alpha or '_', followed by 0 or more alphas, nums, or '_')""" - - ipv4_address = Regex(r'(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})(\.(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})){3}').setName("IPv4 address") - "IPv4 address (C{0.0.0.0 - 255.255.255.255})" - - _ipv6_part = Regex(r'[0-9a-fA-F]{1,4}').setName("hex_integer") - _full_ipv6_address = (_ipv6_part + (':' + _ipv6_part)*7).setName("full IPv6 address") - _short_ipv6_address = (Optional(_ipv6_part + (':' + _ipv6_part)*(0,6)) + "::" + Optional(_ipv6_part + (':' + _ipv6_part)*(0,6))).setName("short IPv6 address") - _short_ipv6_address.addCondition(lambda t: sum(1 for tt in t if pyparsing_common._ipv6_part.matches(tt)) < 8) - _mixed_ipv6_address = ("::ffff:" + ipv4_address).setName("mixed IPv6 address") - ipv6_address = Combine((_full_ipv6_address | _mixed_ipv6_address | _short_ipv6_address).setName("IPv6 address")).setName("IPv6 address") - "IPv6 address (long, short, or mixed form)" - - mac_address = Regex(r'[0-9a-fA-F]{2}([:.-])[0-9a-fA-F]{2}(?:\1[0-9a-fA-F]{2}){4}').setName("MAC address") - "MAC address xx:xx:xx:xx:xx (may also have '-' or '.' delimiters)" - - @staticmethod - def convertToDate(fmt="%Y-%m-%d"): - """ - Helper to create a parse action for converting parsed date string to Python datetime.date - - Params - - - fmt - format to be passed to datetime.strptime (default=C{"%Y-%m-%d"}) - - Example:: - date_expr = pyparsing_common.iso8601_date.copy() - date_expr.setParseAction(pyparsing_common.convertToDate()) - print(date_expr.parseString("1999-12-31")) - prints:: - [datetime.date(1999, 12, 31)] - """ - def cvt_fn(s,l,t): - try: - return datetime.strptime(t[0], fmt).date() - except ValueError as ve: - raise ParseException(s, l, str(ve)) - return cvt_fn - - @staticmethod - def convertToDatetime(fmt="%Y-%m-%dT%H:%M:%S.%f"): - """ - Helper to create a parse action for converting parsed datetime string to Python datetime.datetime - - Params - - - fmt - format to be passed to datetime.strptime (default=C{"%Y-%m-%dT%H:%M:%S.%f"}) - - Example:: - dt_expr = pyparsing_common.iso8601_datetime.copy() - dt_expr.setParseAction(pyparsing_common.convertToDatetime()) - print(dt_expr.parseString("1999-12-31T23:59:59.999")) - prints:: - [datetime.datetime(1999, 12, 31, 23, 59, 59, 999000)] - """ - def cvt_fn(s,l,t): - try: - return datetime.strptime(t[0], fmt) - except ValueError as ve: - raise ParseException(s, l, str(ve)) - return cvt_fn - - iso8601_date = Regex(r'(?P<year>\d{4})(?:-(?P<month>\d\d)(?:-(?P<day>\d\d))?)?').setName("ISO8601 date") - "ISO8601 date (C{yyyy-mm-dd})" - - iso8601_datetime = Regex(r'(?P<year>\d{4})-(?P<month>\d\d)-(?P<day>\d\d)[T ](?P<hour>\d\d):(?P<minute>\d\d)(:(?P<second>\d\d(\.\d*)?)?)?(?P<tz>Z|[+-]\d\d:?\d\d)?').setName("ISO8601 datetime") - "ISO8601 datetime (C{yyyy-mm-ddThh:mm:ss.s(Z|+-00:00)}) - trailing seconds, milliseconds, and timezone optional; accepts separating C{'T'} or C{' '}" - - uuid = Regex(r'[0-9a-fA-F]{8}(-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}').setName("UUID") - "UUID (C{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx})" - - _html_stripper = anyOpenTag.suppress() | anyCloseTag.suppress() - @staticmethod - def stripHTMLTags(s, l, tokens): - """ - Parse action to remove HTML tags from web page HTML source - - Example:: - # strip HTML links from normal text - text = '<td>More info at the <a href="http://pyparsing.wikispaces.com">pyparsing</a> wiki page</td>' - td,td_end = makeHTMLTags("TD") - table_text = td + SkipTo(td_end).setParseAction(pyparsing_common.stripHTMLTags)("body") + td_end - - print(table_text.parseString(text).body) # -> 'More info at the pyparsing wiki page' - """ - return pyparsing_common._html_stripper.transformString(tokens[0]) - - _commasepitem = Combine(OneOrMore(~Literal(",") + ~LineEnd() + Word(printables, excludeChars=',') - + Optional( White(" \t") ) ) ).streamline().setName("commaItem") - comma_separated_list = delimitedList( Optional( quotedString.copy() | _commasepitem, default="") ).setName("comma separated list") - """Predefined expression of 1 or more printable words or quoted strings, separated by commas.""" - - upcaseTokens = staticmethod(tokenMap(lambda t: _ustr(t).upper())) - """Parse action to convert tokens to upper case.""" - - downcaseTokens = staticmethod(tokenMap(lambda t: _ustr(t).lower())) - """Parse action to convert tokens to lower case.""" - - -if __name__ == "__main__": - - selectToken = CaselessLiteral("select") - fromToken = CaselessLiteral("from") - - ident = Word(alphas, alphanums + "_$") - - columnName = delimitedList(ident, ".", combine=True).setParseAction(upcaseTokens) - columnNameList = Group(delimitedList(columnName)).setName("columns") - columnSpec = ('*' | columnNameList) - - tableName = delimitedList(ident, ".", combine=True).setParseAction(upcaseTokens) - tableNameList = Group(delimitedList(tableName)).setName("tables") - - simpleSQL = selectToken("command") + columnSpec("columns") + fromToken + tableNameList("tables") - - # demo runTests method, including embedded comments in test string - simpleSQL.runTests(""" - # '*' as column list and dotted table name - select * from SYS.XYZZY - - # caseless match on "SELECT", and casts back to "select" - SELECT * from XYZZY, ABC - - # list of column names, and mixed case SELECT keyword - Select AA,BB,CC from Sys.dual - - # multiple tables - Select A, B, C from Sys.dual, Table2 - - # invalid SELECT keyword - should fail - Xelect A, B, C from Sys.dual - - # incomplete command - should fail - Select - - # invalid column name - should fail - Select ^^^ frox Sys.dual - - """) - - pyparsing_common.number.runTests(""" - 100 - -100 - +100 - 3.14159 - 6.02e23 - 1e-12 - """) - - # any int or real number, returned as float - pyparsing_common.fnumber.runTests(""" - 100 - -100 - +100 - 3.14159 - 6.02e23 - 1e-12 - """) - - pyparsing_common.hex_integer.runTests(""" - 100 - FF - """) - - import uuid - pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID)) - pyparsing_common.uuid.runTests(""" - 12345678-1234-5678-1234-567812345678 - """) diff --git a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/pyparsing.pyc b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/pyparsing.pyc deleted file mode 100644 index 19d10b17b5f12952b9123de06ce9fb6371c65b41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 260233 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%0A9PfbJ^i= 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 Xv1?PumQ9;F`R&-!xrrQ4(EtA*7^^jt diff --git a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/six.py b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/six.py deleted file mode 100644 index 190c023..0000000 --- a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/six.py +++ /dev/null @@ -1,868 +0,0 @@ -"""Utilities for writing code that runs on Python 2 and 3""" - -# Copyright (c) 2010-2015 Benjamin Peterson -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -from __future__ import absolute_import - -import functools -import itertools -import operator -import sys -import types - -__author__ = "Benjamin Peterson <benjamin@python.org>" -__version__ = "1.10.0" - - -# Useful for very coarse version differentiation. -PY2 = sys.version_info[0] == 2 -PY3 = sys.version_info[0] == 3 -PY34 = sys.version_info[0:2] >= (3, 4) - -if PY3: - string_types = str, - integer_types = int, - class_types = type, - text_type = str - binary_type = bytes - - MAXSIZE = sys.maxsize -else: - string_types = basestring, - integer_types = (int, long) - class_types = (type, types.ClassType) - text_type = unicode - binary_type = str - - if sys.platform.startswith("java"): - # Jython always uses 32 bits. - MAXSIZE = int((1 << 31) - 1) - else: - # It's possible to have sizeof(long) != sizeof(Py_ssize_t). - class X(object): - - def __len__(self): - return 1 << 31 - try: - len(X()) - except OverflowError: - # 32-bit - MAXSIZE = int((1 << 31) - 1) - else: - # 64-bit - MAXSIZE = int((1 << 63) - 1) - del X - - -def _add_doc(func, doc): - """Add documentation to a function.""" - func.__doc__ = doc - - -def _import_module(name): - """Import module, returning the module after the last dot.""" - __import__(name) - return sys.modules[name] - - -class _LazyDescr(object): - - def __init__(self, name): - self.name = name - - def __get__(self, obj, tp): - result = self._resolve() - setattr(obj, self.name, result) # Invokes __set__. - try: - # This is a bit ugly, but it avoids running this again by - # removing this descriptor. - delattr(obj.__class__, self.name) - except AttributeError: - pass - return result - - -class MovedModule(_LazyDescr): - - def __init__(self, name, old, new=None): - super(MovedModule, self).__init__(name) - if PY3: - if new is None: - new = name - self.mod = new - else: - self.mod = old - - def _resolve(self): - return _import_module(self.mod) - - def __getattr__(self, attr): - _module = self._resolve() - value = getattr(_module, attr) - setattr(self, attr, value) - return value - - -class _LazyModule(types.ModuleType): - - def __init__(self, name): - super(_LazyModule, self).__init__(name) - self.__doc__ = self.__class__.__doc__ - - def __dir__(self): - attrs = ["__doc__", "__name__"] - attrs += [attr.name for attr in self._moved_attributes] - return attrs - - # Subclasses should override this - _moved_attributes = [] - - -class MovedAttribute(_LazyDescr): - - def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): - super(MovedAttribute, self).__init__(name) - if PY3: - if new_mod is None: - new_mod = name - self.mod = new_mod - if new_attr is None: - if old_attr is None: - new_attr = name - else: - new_attr = old_attr - self.attr = new_attr - else: - self.mod = old_mod - if old_attr is None: - old_attr = name - self.attr = old_attr - - def _resolve(self): - module = _import_module(self.mod) - return getattr(module, self.attr) - - -class _SixMetaPathImporter(object): - - """ - A meta path importer to import six.moves and its submodules. - - This class implements a PEP302 finder and loader. It should be compatible - with Python 2.5 and all existing versions of Python3 - """ - - def __init__(self, six_module_name): - self.name = six_module_name - self.known_modules = {} - - def _add_module(self, mod, *fullnames): - for fullname in fullnames: - self.known_modules[self.name + "." + fullname] = mod - - def _get_module(self, fullname): - return self.known_modules[self.name + "." + fullname] - - def find_module(self, fullname, path=None): - if fullname in self.known_modules: - return self - return None - - def __get_module(self, fullname): - try: - return self.known_modules[fullname] - except KeyError: - raise ImportError("This loader does not know module " + fullname) - - def load_module(self, fullname): - try: - # in case of a reload - return sys.modules[fullname] - except KeyError: - pass - mod = self.__get_module(fullname) - if isinstance(mod, MovedModule): - mod = mod._resolve() - else: - mod.__loader__ = self - sys.modules[fullname] = mod - return mod - - def is_package(self, fullname): - """ - Return true, if the named module is a package. - - We need this method to get correct spec objects with - Python 3.4 (see PEP451) - """ - return hasattr(self.__get_module(fullname), "__path__") - - def get_code(self, fullname): - """Return None - - Required, if is_package is implemented""" - self.__get_module(fullname) # eventually raises ImportError - return None - get_source = get_code # same as get_code - -_importer = _SixMetaPathImporter(__name__) - - -class _MovedItems(_LazyModule): - - """Lazy loading of moved objects""" - __path__ = [] # mark as package - - -_moved_attributes = [ - MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), - MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), - MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"), - MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), - MovedAttribute("intern", "__builtin__", "sys"), - MovedAttribute("map", "itertools", "builtins", "imap", "map"), - MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"), - MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"), - MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), - MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"), - MovedAttribute("reduce", "__builtin__", "functools"), - MovedAttribute("shlex_quote", "pipes", "shlex", "quote"), - MovedAttribute("StringIO", "StringIO", "io"), - MovedAttribute("UserDict", "UserDict", "collections"), - MovedAttribute("UserList", "UserList", "collections"), - MovedAttribute("UserString", "UserString", "collections"), - MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), - MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), - MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"), - MovedModule("builtins", "__builtin__"), - MovedModule("configparser", "ConfigParser"), - MovedModule("copyreg", "copy_reg"), - MovedModule("dbm_gnu", "gdbm", "dbm.gnu"), - MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"), - MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), - MovedModule("http_cookies", "Cookie", "http.cookies"), - MovedModule("html_entities", "htmlentitydefs", "html.entities"), - MovedModule("html_parser", "HTMLParser", "html.parser"), - MovedModule("http_client", "httplib", "http.client"), - MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), - MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"), - MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), - MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), - MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), - MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), - MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), - MovedModule("cPickle", "cPickle", "pickle"), - MovedModule("queue", "Queue"), - MovedModule("reprlib", "repr"), - MovedModule("socketserver", "SocketServer"), - MovedModule("_thread", "thread", "_thread"), - MovedModule("tkinter", "Tkinter"), - MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), - MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), - MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), - MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), - MovedModule("tkinter_tix", "Tix", "tkinter.tix"), - MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"), - MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), - MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), - MovedModule("tkinter_colorchooser", "tkColorChooser", - "tkinter.colorchooser"), - MovedModule("tkinter_commondialog", "tkCommonDialog", - "tkinter.commondialog"), - MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), - MovedModule("tkinter_font", "tkFont", "tkinter.font"), - MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), - MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", - "tkinter.simpledialog"), - MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"), - MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"), - MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"), - MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), - MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"), - MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"), -] -# Add windows specific modules. -if sys.platform == "win32": - _moved_attributes += [ - MovedModule("winreg", "_winreg"), - ] - -for attr in _moved_attributes: - setattr(_MovedItems, attr.name, attr) - if isinstance(attr, MovedModule): - _importer._add_module(attr, "moves." + attr.name) -del attr - -_MovedItems._moved_attributes = _moved_attributes - -moves = _MovedItems(__name__ + ".moves") -_importer._add_module(moves, "moves") - - -class Module_six_moves_urllib_parse(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_parse""" - - -_urllib_parse_moved_attributes = [ - MovedAttribute("ParseResult", "urlparse", "urllib.parse"), - MovedAttribute("SplitResult", "urlparse", "urllib.parse"), - MovedAttribute("parse_qs", "urlparse", "urllib.parse"), - MovedAttribute("parse_qsl", "urlparse", "urllib.parse"), - MovedAttribute("urldefrag", "urlparse", "urllib.parse"), - MovedAttribute("urljoin", "urlparse", "urllib.parse"), - MovedAttribute("urlparse", "urlparse", "urllib.parse"), - MovedAttribute("urlsplit", "urlparse", "urllib.parse"), - MovedAttribute("urlunparse", "urlparse", "urllib.parse"), - MovedAttribute("urlunsplit", "urlparse", "urllib.parse"), - MovedAttribute("quote", "urllib", "urllib.parse"), - MovedAttribute("quote_plus", "urllib", "urllib.parse"), - MovedAttribute("unquote", "urllib", "urllib.parse"), - MovedAttribute("unquote_plus", "urllib", "urllib.parse"), - MovedAttribute("urlencode", "urllib", "urllib.parse"), - MovedAttribute("splitquery", "urllib", "urllib.parse"), - MovedAttribute("splittag", "urllib", "urllib.parse"), - MovedAttribute("splituser", "urllib", "urllib.parse"), - MovedAttribute("uses_fragment", "urlparse", "urllib.parse"), - MovedAttribute("uses_netloc", "urlparse", "urllib.parse"), - MovedAttribute("uses_params", "urlparse", "urllib.parse"), - MovedAttribute("uses_query", "urlparse", "urllib.parse"), - MovedAttribute("uses_relative", "urlparse", "urllib.parse"), -] -for attr in _urllib_parse_moved_attributes: - setattr(Module_six_moves_urllib_parse, attr.name, attr) -del attr - -Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes - -_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"), - "moves.urllib_parse", "moves.urllib.parse") - - -class Module_six_moves_urllib_error(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_error""" - - -_urllib_error_moved_attributes = [ - MovedAttribute("URLError", "urllib2", "urllib.error"), - MovedAttribute("HTTPError", "urllib2", "urllib.error"), - MovedAttribute("ContentTooShortError", "urllib", "urllib.error"), -] -for attr in _urllib_error_moved_attributes: - setattr(Module_six_moves_urllib_error, attr.name, attr) -del attr - -Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes - -_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"), - "moves.urllib_error", "moves.urllib.error") - - -class Module_six_moves_urllib_request(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_request""" - - -_urllib_request_moved_attributes = [ - MovedAttribute("urlopen", "urllib2", "urllib.request"), - MovedAttribute("install_opener", "urllib2", "urllib.request"), - MovedAttribute("build_opener", "urllib2", "urllib.request"), - MovedAttribute("pathname2url", "urllib", "urllib.request"), - MovedAttribute("url2pathname", "urllib", "urllib.request"), - MovedAttribute("getproxies", "urllib", "urllib.request"), - MovedAttribute("Request", "urllib2", "urllib.request"), - MovedAttribute("OpenerDirector", "urllib2", "urllib.request"), - MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"), - MovedAttribute("ProxyHandler", "urllib2", "urllib.request"), - MovedAttribute("BaseHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"), - MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"), - MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"), - MovedAttribute("FileHandler", "urllib2", "urllib.request"), - MovedAttribute("FTPHandler", "urllib2", "urllib.request"), - MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"), - MovedAttribute("UnknownHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"), - MovedAttribute("urlretrieve", "urllib", "urllib.request"), - MovedAttribute("urlcleanup", "urllib", "urllib.request"), - MovedAttribute("URLopener", "urllib", "urllib.request"), - MovedAttribute("FancyURLopener", "urllib", "urllib.request"), - MovedAttribute("proxy_bypass", "urllib", "urllib.request"), -] -for attr in _urllib_request_moved_attributes: - setattr(Module_six_moves_urllib_request, attr.name, attr) -del attr - -Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes - -_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"), - "moves.urllib_request", "moves.urllib.request") - - -class Module_six_moves_urllib_response(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_response""" - - -_urllib_response_moved_attributes = [ - MovedAttribute("addbase", "urllib", "urllib.response"), - MovedAttribute("addclosehook", "urllib", "urllib.response"), - MovedAttribute("addinfo", "urllib", "urllib.response"), - MovedAttribute("addinfourl", "urllib", "urllib.response"), -] -for attr in _urllib_response_moved_attributes: - setattr(Module_six_moves_urllib_response, attr.name, attr) -del attr - -Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes - -_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"), - "moves.urllib_response", "moves.urllib.response") - - -class Module_six_moves_urllib_robotparser(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_robotparser""" - - -_urllib_robotparser_moved_attributes = [ - MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"), -] -for attr in _urllib_robotparser_moved_attributes: - setattr(Module_six_moves_urllib_robotparser, attr.name, attr) -del attr - -Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes - -_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"), - "moves.urllib_robotparser", "moves.urllib.robotparser") - - -class Module_six_moves_urllib(types.ModuleType): - - """Create a six.moves.urllib namespace that resembles the Python 3 namespace""" - __path__ = [] # mark as package - parse = _importer._get_module("moves.urllib_parse") - error = _importer._get_module("moves.urllib_error") - request = _importer._get_module("moves.urllib_request") - response = _importer._get_module("moves.urllib_response") - robotparser = _importer._get_module("moves.urllib_robotparser") - - def __dir__(self): - return ['parse', 'error', 'request', 'response', 'robotparser'] - -_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"), - "moves.urllib") - - -def add_move(move): - """Add an item to six.moves.""" - setattr(_MovedItems, move.name, move) - - -def remove_move(name): - """Remove item from six.moves.""" - try: - delattr(_MovedItems, name) - except AttributeError: - try: - del moves.__dict__[name] - except KeyError: - raise AttributeError("no such move, %r" % (name,)) - - -if PY3: - _meth_func = "__func__" - _meth_self = "__self__" - - _func_closure = "__closure__" - _func_code = "__code__" - _func_defaults = "__defaults__" - _func_globals = "__globals__" -else: - _meth_func = "im_func" - _meth_self = "im_self" - - _func_closure = "func_closure" - _func_code = "func_code" - _func_defaults = "func_defaults" - _func_globals = "func_globals" - - -try: - advance_iterator = next -except NameError: - def advance_iterator(it): - return it.next() -next = advance_iterator - - -try: - callable = callable -except NameError: - def callable(obj): - return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) - - -if PY3: - def get_unbound_function(unbound): - return unbound - - create_bound_method = types.MethodType - - def create_unbound_method(func, cls): - return func - - Iterator = object -else: - def get_unbound_function(unbound): - return unbound.im_func - - def create_bound_method(func, obj): - return types.MethodType(func, obj, obj.__class__) - - def create_unbound_method(func, cls): - return types.MethodType(func, None, cls) - - class Iterator(object): - - def next(self): - return type(self).__next__(self) - - callable = callable -_add_doc(get_unbound_function, - """Get the function out of a possibly unbound function""") - - -get_method_function = operator.attrgetter(_meth_func) -get_method_self = operator.attrgetter(_meth_self) -get_function_closure = operator.attrgetter(_func_closure) -get_function_code = operator.attrgetter(_func_code) -get_function_defaults = operator.attrgetter(_func_defaults) -get_function_globals = operator.attrgetter(_func_globals) - - -if PY3: - def iterkeys(d, **kw): - return iter(d.keys(**kw)) - - def itervalues(d, **kw): - return iter(d.values(**kw)) - - def iteritems(d, **kw): - return iter(d.items(**kw)) - - def iterlists(d, **kw): - return iter(d.lists(**kw)) - - viewkeys = operator.methodcaller("keys") - - viewvalues = operator.methodcaller("values") - - viewitems = operator.methodcaller("items") -else: - def iterkeys(d, **kw): - return d.iterkeys(**kw) - - def itervalues(d, **kw): - return d.itervalues(**kw) - - def iteritems(d, **kw): - return d.iteritems(**kw) - - def iterlists(d, **kw): - return d.iterlists(**kw) - - viewkeys = operator.methodcaller("viewkeys") - - viewvalues = operator.methodcaller("viewvalues") - - viewitems = operator.methodcaller("viewitems") - -_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.") -_add_doc(itervalues, "Return an iterator over the values of a dictionary.") -_add_doc(iteritems, - "Return an iterator over the (key, value) pairs of a dictionary.") -_add_doc(iterlists, - "Return an iterator over the (key, [values]) pairs of a dictionary.") - - -if PY3: - def b(s): - return s.encode("latin-1") - - def u(s): - return s - unichr = chr - import struct - int2byte = struct.Struct(">B").pack - del struct - byte2int = operator.itemgetter(0) - indexbytes = operator.getitem - iterbytes = iter - import io - StringIO = io.StringIO - BytesIO = io.BytesIO - _assertCountEqual = "assertCountEqual" - if sys.version_info[1] <= 1: - _assertRaisesRegex = "assertRaisesRegexp" - _assertRegex = "assertRegexpMatches" - else: - _assertRaisesRegex = "assertRaisesRegex" - _assertRegex = "assertRegex" -else: - def b(s): - return s - # Workaround for standalone backslash - - def u(s): - return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape") - unichr = unichr - int2byte = chr - - def byte2int(bs): - return ord(bs[0]) - - def indexbytes(buf, i): - return ord(buf[i]) - iterbytes = functools.partial(itertools.imap, ord) - import StringIO - StringIO = BytesIO = StringIO.StringIO - _assertCountEqual = "assertItemsEqual" - _assertRaisesRegex = "assertRaisesRegexp" - _assertRegex = "assertRegexpMatches" -_add_doc(b, """Byte literal""") -_add_doc(u, """Text literal""") - - -def assertCountEqual(self, *args, **kwargs): - return getattr(self, _assertCountEqual)(*args, **kwargs) - - -def assertRaisesRegex(self, *args, **kwargs): - return getattr(self, _assertRaisesRegex)(*args, **kwargs) - - -def assertRegex(self, *args, **kwargs): - return getattr(self, _assertRegex)(*args, **kwargs) - - -if PY3: - exec_ = getattr(moves.builtins, "exec") - - def reraise(tp, value, tb=None): - if value is None: - value = tp() - if value.__traceback__ is not tb: - raise value.with_traceback(tb) - raise value - -else: - def exec_(_code_, _globs_=None, _locs_=None): - """Execute code in a namespace.""" - if _globs_ is None: - frame = sys._getframe(1) - _globs_ = frame.f_globals - if _locs_ is None: - _locs_ = frame.f_locals - del frame - elif _locs_ is None: - _locs_ = _globs_ - exec("""exec _code_ in _globs_, _locs_""") - - exec_("""def reraise(tp, value, tb=None): - raise tp, value, tb -""") - - -if sys.version_info[:2] == (3, 2): - exec_("""def raise_from(value, from_value): - if from_value is None: - raise value - raise value from from_value -""") -elif sys.version_info[:2] > (3, 2): - exec_("""def raise_from(value, from_value): - raise value from from_value -""") -else: - def raise_from(value, from_value): - raise value - - -print_ = getattr(moves.builtins, "print", None) -if print_ is None: - def print_(*args, **kwargs): - """The new-style print function for Python 2.4 and 2.5.""" - fp = kwargs.pop("file", sys.stdout) - if fp is None: - return - - def write(data): - if not isinstance(data, basestring): - data = str(data) - # If the file has an encoding, encode unicode with it. - if (isinstance(fp, file) and - isinstance(data, unicode) and - fp.encoding is not None): - errors = getattr(fp, "errors", None) - if errors is None: - errors = "strict" - data = data.encode(fp.encoding, errors) - fp.write(data) - want_unicode = False - sep = kwargs.pop("sep", None) - if sep is not None: - if isinstance(sep, unicode): - want_unicode = True - elif not isinstance(sep, str): - raise TypeError("sep must be None or a string") - end = kwargs.pop("end", None) - if end is not None: - if isinstance(end, unicode): - want_unicode = True - elif not isinstance(end, str): - raise TypeError("end must be None or a string") - if kwargs: - raise TypeError("invalid keyword arguments to print()") - if not want_unicode: - for arg in args: - if isinstance(arg, unicode): - want_unicode = True - break - if want_unicode: - newline = unicode("\n") - space = unicode(" ") - else: - newline = "\n" - space = " " - if sep is None: - sep = space - if end is None: - end = newline - for i, arg in enumerate(args): - if i: - write(sep) - write(arg) - write(end) -if sys.version_info[:2] < (3, 3): - _print = print_ - - def print_(*args, **kwargs): - fp = kwargs.get("file", sys.stdout) - flush = kwargs.pop("flush", False) - _print(*args, **kwargs) - if flush and fp is not None: - fp.flush() - -_add_doc(reraise, """Reraise an exception.""") - -if sys.version_info[0:2] < (3, 4): - def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS, - updated=functools.WRAPPER_UPDATES): - def wrapper(f): - f = functools.wraps(wrapped, assigned, updated)(f) - f.__wrapped__ = wrapped - return f - return wrapper -else: - wraps = functools.wraps - - -def with_metaclass(meta, *bases): - """Create a base class with a metaclass.""" - # This requires a bit of explanation: the basic idea is to make a dummy - # metaclass for one level of class instantiation that replaces itself with - # the actual metaclass. - class metaclass(meta): - - def __new__(cls, name, this_bases, d): - return meta(name, bases, d) - return type.__new__(metaclass, 'temporary_class', (), {}) - - -def add_metaclass(metaclass): - """Class decorator for creating a class with a metaclass.""" - def wrapper(cls): - orig_vars = cls.__dict__.copy() - slots = orig_vars.get('__slots__') - if slots is not None: - if isinstance(slots, str): - slots = [slots] - for slots_var in slots: - orig_vars.pop(slots_var) - orig_vars.pop('__dict__', None) - orig_vars.pop('__weakref__', None) - return metaclass(cls.__name__, cls.__bases__, orig_vars) - return wrapper - - -def python_2_unicode_compatible(klass): - """ - A decorator that defines __unicode__ and __str__ methods under Python 2. - Under Python 3 it does nothing. - - To support Python 2 and 3 with a single code base, define a __str__ method - returning text and apply this decorator to the class. - """ - if PY2: - if '__str__' not in klass.__dict__: - raise ValueError("@python_2_unicode_compatible cannot be applied " - "to %s because it doesn't define __str__()." % - klass.__name__) - klass.__unicode__ = klass.__str__ - klass.__str__ = lambda self: self.__unicode__().encode('utf-8') - return klass - - -# Complete the moves implementation. -# This code is at the end of this module to speed up module loading. -# Turn this module into a package. -__path__ = [] # required for PEP 302 and PEP 451 -__package__ = __name__ # see PEP 366 @ReservedAssignment -if globals().get("__spec__") is not None: - __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable -# Remove other six meta path importers, since they cause problems. This can -# happen if six is removed from sys.modules and then reloaded. (Setuptools does -# this for some reason.) -if sys.meta_path: - for i, importer in enumerate(sys.meta_path): - # Here's some real nastiness: Another "instance" of the six module might - # be floating around. Therefore, we can't use isinstance() to check for - # the six meta path importer, since the other six instance will have - # inserted an importer with different class. - if (type(importer).__name__ == "_SixMetaPathImporter" and - importer.name == __name__): - del sys.meta_path[i] - break - del i, importer -# Finally, add the importer to the meta path import hook. -sys.meta_path.append(_importer) diff --git a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/six.pyc b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/six.pyc deleted file mode 100644 index b0c198faa3e8b6b6c7342d672276119e583bed2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36102 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 HX#f8Kz;E-2 diff --git a/venv/lib/python2.7/site-packages/pkg_resources/extern/__init__.py b/venv/lib/python2.7/site-packages/pkg_resources/extern/__init__.py deleted file mode 100644 index c1eb9e9..0000000 --- a/venv/lib/python2.7/site-packages/pkg_resources/extern/__init__.py +++ /dev/null @@ -1,73 +0,0 @@ -import sys - - -class VendorImporter: - """ - A PEP 302 meta path importer for finding optionally-vendored - or otherwise naturally-installed packages from root_name. - """ - - def __init__(self, root_name, vendored_names=(), vendor_pkg=None): - self.root_name = root_name - self.vendored_names = set(vendored_names) - self.vendor_pkg = vendor_pkg or root_name.replace('extern', '_vendor') - - @property - def search_path(self): - """ - Search first the vendor package then as a natural package. - """ - yield self.vendor_pkg + '.' - yield '' - - def find_module(self, fullname, path=None): - """ - Return self when fullname starts with root_name and the - target module is one vendored through this importer. - """ - root, base, target = fullname.partition(self.root_name + '.') - if root: - return - if not any(map(target.startswith, self.vendored_names)): - return - return self - - def load_module(self, fullname): - """ - Iterate over the search path to locate and load fullname. - """ - root, base, target = fullname.partition(self.root_name + '.') - for prefix in self.search_path: - try: - extant = prefix + target - __import__(extant) - mod = sys.modules[extant] - sys.modules[fullname] = mod - # mysterious hack: - # Remove the reference to the extant package/module - # on later Python versions to cause relative imports - # in the vendor package to resolve the same modules - # as those going through this importer. - if prefix and sys.version_info > (3, 3): - del sys.modules[extant] - return mod - except ImportError: - pass - else: - raise ImportError( - "The '{target}' package is required; " - "normally this is bundled with this package so if you get " - "this warning, consult the packager of your " - "distribution.".format(**locals()) - ) - - def install(self): - """ - Install this importer into sys.meta_path if not already present. - """ - if self not in sys.meta_path: - sys.meta_path.append(self) - - -names = 'packaging', 'pyparsing', 'six', 'appdirs' -VendorImporter(__name__, names).install() diff --git a/venv/lib/python2.7/site-packages/pkg_resources/extern/__init__.pyc b/venv/lib/python2.7/site-packages/pkg_resources/extern/__init__.pyc deleted file mode 100644 index cfe94fd679cce6627aa47e270ef28e582331dc63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3353 zcmd5;TW=dh6rQoy&V{4_l@btw4%fPf#4SYyL_vkN66In=>#8jg)oSA%JDaR`wlm`- zF3tmO#T$=(;ji$s_yO>pGqyvKcqW_7@tK{=p83vq&YAk3tIHq!a^^u#OrHq9*U{WH zhz$Qy6hdr6sflb+WOeaWh$lk)xGhDtB(`fpOQGvR*Tj>W*o$aPVo|rXj1BU?@O1nc zsCRXl8GCzJ8SAy3f3J?AuhHDM5E@^?wvhN(Q)CPD`KL9p9SPka3+UTYY=<G30v&TA zdcO_h8mugdxZ7H!J@HyBD?DGRty^2_%B7FgQ2SI>soz!k)D+b>R`v5T%gcc>mCsF? z7R7kufDP6eZ-6Pr?`nIPJFUvpk1Ws0OXs2J3|sd0(}8xXZ_Q9yV|-GkL%qqXdl3ww zMyI`j=01U#NHGy25yC?Oe4$$tle(xjXmqbm=f|;uEX|Avnr@3W>G&q3J_3}bUx1nf zb6XAQehFf3f~WaTd-lTYP;8vzl~z|p+S8u=6^4^)f6yXxJqf3aeoTABw0BG&YoP_< z4xzOxn;)cJw+~X=?wcah*0moUwZ~WNPI<V0`Rc>+(pCHM)!wJ>=(FsRy@Y2_wePg6 zyxN#TxZyAVFi5uAFmzOTV+z-X6^Yf(jBHQ4b~tN0N%AuHNwQguJ^6UnC+i(yBIJ@> zlRZfqS`Dp-=FUL?#670;`dtZFA?m=B5BWWY*;hoDu1;-l7o@PxE4W<+TxL$DSEWjw zN@rA<jRbeo7VxPMn;t@RTBHZySR=bn34|}e6vwAcC@9vbOL&OJitLfo2~v7-1I-ag z#LIvrs42xdX!}!L9OFL{#|<K{y-1wx`kDasCJjmo1bl;NjM?rR9>%LcW%ny~okJhP z|F%>_I(0}e_eVuRk)#l5);o2WBX;NHR%w}$JLc;#X`sCtnru{Pl{;n1nfnl>e%G4O zU>Cm_nI(V|r^UpgPK(aWF;wA;IVA+<KL=7;j`??(Rva<GDl&@0gV)C7U}opccn%~2 zm=&^~m7NrH=dZEVr-&1j50e1mIu7GjAVlN5Y|2Q!j@F~NqGOWv%#A;w{0BE`Q+gad zV<ObV%?FmaGQLmrm_%azxXD~;5<euM0a+$Z@!Ii%m@H5hqP`T@Fxx)nJ}N*%>_@XM zPyeEX1q-5k@8LxeA+_x<3;Vl}Qlft!?H=AC;P)2Exle@njf=@+&^Q7W=^*Yqh&h#R zBe^20DRZDLaSWv7w7}KF8&#Md4HE+klV)?K{)<mJg^_y(aR+-`_&G52_`)n_5J|0m zILfWgK3Ao&Ln<v(iaND3Dl;lD%zNhTwA3hPRNhx(Gg8EO9y&~Ii8A(~>Y37wijcgf z^HITgwpCf~yv=t;#O%#Zi(JV@vf#QMui{-u`s8_LIx;O+%p?gFWgN;!Ac^xd4?sEW zi4@&8o>EIF_qVJ?(I<dWYKN(3mC!33*J+NI_$7?TXGy$Fg7P&_tgP<mN35a-q@@q> zXR=ciF694dxV!_q-J1|1Ixk<8b-9ecRk_+c2f0YCR+r8Ca|Mb6=zT0fQbftvlVX2C z*te(p9#?;g3=kYCx62-LG3K9eHC#lVPi!hLK~pz&n{?~p1W$}9jaO-5b()P8z;(Lx zCzS2*^&);1n{x`BuVe?LRfStosAm-Yr^E$xCz;+Ou0stKELxLnUWXYyy(~~A0f8yc zCsT)^%NM95Gd<{3>^dkKF<qi~Rb@@3tslok@%R-IZ;^Nx;sgNJ{?F?W@qtS<C+lX^ ztgSWH7FSl5-k8=hx}YLCgx(mn%~6lD6XJ_7fO|9CdBULx2uC1<{DHZlH(TkZE8Ra= n@)eQD!`67}667v^kKUa!#MrynLIV4eZf1OeT&bVE*_3|+GTKFN diff --git a/venv/lib/python2.7/site-packages/pkg_resources/py31compat.py b/venv/lib/python2.7/site-packages/pkg_resources/py31compat.py deleted file mode 100644 index a381c42..0000000 --- a/venv/lib/python2.7/site-packages/pkg_resources/py31compat.py +++ /dev/null @@ -1,23 +0,0 @@ -import os -import errno -import sys - -from .extern import six - - -def _makedirs_31(path, exist_ok=False): - try: - os.makedirs(path) - except OSError as exc: - if not exist_ok or exc.errno != errno.EEXIST: - raise - - -# rely on compatibility behavior until mode considerations -# and exists_ok considerations are disentangled. -# See https://github.com/pypa/setuptools/pull/1083#issuecomment-315168663 -needs_makedirs = ( - six.PY2 or - (3, 4) <= sys.version_info < (3, 4, 1) -) -makedirs = _makedirs_31 if needs_makedirs else os.makedirs diff --git a/venv/lib/python2.7/site-packages/pkg_resources/py31compat.pyc b/venv/lib/python2.7/site-packages/pkg_resources/py31compat.pyc deleted file mode 100644 index e8cb18d7d48547d1edaf7091b3c95a84a2675802..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 866 zcmc&xU2oGc6g^I|eo+Q{<cZe^X=Gi|G^7b3p;iKkF}0HzkxueeF=%yvsUm4^ZU zm>&Sw87uq)ocQ|M_g?#)bN!$9drxk5KW6wd0$N|vG&f{&`WZ?f-uetNyF2#~d&uec zQTkW}hyyUbgFL_w%4>lKn72`J<ZW;d^9};PU{D$I4hlee@L1dh??PMf79`aG^B&@! zdwCjm35EDY<5VzmLuaf{#)vxeXm$P$%~$U14Vm>GEM38{0lqV^_wo>d^-%PnM_^w) zunj}soM1zUe0SSCK;c7=@eQ~dLo!?t^J(+gY3OdJdO#W5p=FU4JQv#7Hf`QbM_Maw zT@u$?D%&D&G`e^_Jr5l=>jbS*`?;y*wJ<hOMMHttSx7-N#%S`QN{dx$d9+G(bg9am zYZG19(R!#q$uGs==t>?O>1RjTv8kWu*ZP3QtcuQ~N>uwo8k?5oz8$=sC1;W0c3D}a zN)uJZEYaMkrOr6**26)j7KG_(wYGhFHo2pe3<r*(>5&2R*&chq9x>r~2*)FIGW@e` z0^8_qhwf3z#I<SSDsFqVHjOO2wp_~z9itI!oR)@9T#K8uvk!+2oE5PaN+v>HD!WTj p$$4(JASVvQU*Z0%dQPpAh02#Df8jVA2e;4Y^B(&BewRJ=egir6y5#@> diff --git a/venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/INSTALLER b/venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/LICENSE b/venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/LICENSE deleted file mode 100644 index 6e0693b..0000000 --- a/venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (C) 2016 Jason R Coombs <jaraco@jaraco.com> - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/METADATA b/venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/METADATA deleted file mode 100644 index 571a5cb..0000000 --- a/venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/METADATA +++ /dev/null @@ -1,77 +0,0 @@ -Metadata-Version: 2.1 -Name: setuptools -Version: 41.0.1 -Summary: Easily download, build, install, upgrade, and uninstall Python packages -Home-page: https://github.com/pypa/setuptools -Author: Python Packaging Authority -Author-email: distutils-sig@python.org -License: UNKNOWN -Project-URL: Documentation, https://setuptools.readthedocs.io/ -Keywords: CPAN PyPI distutils eggs package management -Platform: UNKNOWN -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: MIT License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python :: 2 -Classifier: Programming Language :: Python :: 2.7 -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.4 -Classifier: Programming Language :: Python :: 3.5 -Classifier: Programming Language :: Python :: 3.6 -Classifier: Programming Language :: Python :: 3.7 -Classifier: Topic :: Software Development :: Libraries :: Python Modules -Classifier: Topic :: System :: Archiving :: Packaging -Classifier: Topic :: System :: Systems Administration -Classifier: Topic :: Utilities -Requires-Python: >=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.* -Description-Content-Type: text/x-rst; charset=UTF-8 -Provides-Extra: certs -Requires-Dist: certifi (==2016.9.26) ; extra == 'certs' -Provides-Extra: ssl -Requires-Dist: wincertstore (==0.2) ; (sys_platform=='win32') and extra == 'ssl' - -.. image:: https://img.shields.io/pypi/v/setuptools.svg - :target: https://pypi.org/project/setuptools - -.. image:: https://img.shields.io/readthedocs/setuptools/latest.svg - :target: https://setuptools.readthedocs.io - -.. image:: https://img.shields.io/travis/pypa/setuptools/master.svg?label=Linux%20CI&logo=travis&logoColor=white - :target: https://travis-ci.org/pypa/setuptools - -.. image:: https://img.shields.io/appveyor/ci/pypa/setuptools/master.svg?label=Windows%20CI&logo=appveyor&logoColor=white - :target: https://ci.appveyor.com/project/pypa/setuptools/branch/master - -.. image:: https://img.shields.io/codecov/c/github/pypa/setuptools/master.svg?logo=codecov&logoColor=white - :target: https://codecov.io/gh/pypa/setuptools - -.. image:: https://tidelift.com/badges/github/pypa/setuptools?style=flat - :target: https://tidelift.com/subscription/pkg/pypi-setuptools?utm_source=pypi-setuptools&utm_medium=readme - -.. image:: https://img.shields.io/pypi/pyversions/setuptools.svg - -See the `Installation Instructions -<https://packaging.python.org/installing/>`_ in the Python Packaging -User's Guide for instructions on installing, upgrading, and uninstalling -Setuptools. - -Questions and comments should be directed to the `distutils-sig -mailing list <http://mail.python.org/pipermail/distutils-sig/>`_. -Bug reports and especially tested patches may be -submitted directly to the `bug tracker -<https://github.com/pypa/setuptools/issues>`_. - -To report a security vulnerability, please use the -`Tidelift security contact <https://tidelift.com/security>`_. -Tidelift will coordinate the fix and disclosure. - - -Code of Conduct ---------------- - -Everyone interacting in the setuptools project's codebases, issue trackers, -chat rooms, and mailing lists is expected to follow the -`PyPA Code of Conduct <https://www.pypa.io/en/latest/code-of-conduct/>`_. - - diff --git a/venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/RECORD b/venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/RECORD deleted file mode 100644 index cdb946f..0000000 --- a/venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/RECORD +++ /dev/null @@ -1,186 +0,0 @@ -../../../bin/easy_install,sha256=wN155DmA-hpUFASGCYeX4i008fjY6hbzyYaMEzR999Y,299 -../../../bin/easy_install-2.7,sha256=wN155DmA-hpUFASGCYeX4i008fjY6hbzyYaMEzR999Y,299 -easy_install.py,sha256=MDC9vt5AxDsXX5qcKlBz2TnW6Tpuv_AobnfhCJ9X3PM,126 -easy_install.pyc,, -pkg_resources/__init__.py,sha256=pp8b7Asoaheso-q8lIMS1tpQp88xjAkYgCIRX-JsPlE,107982 -pkg_resources/__init__.pyc,, -pkg_resources/_vendor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pkg_resources/_vendor/__init__.pyc,, -pkg_resources/_vendor/appdirs.py,sha256=MievUEuv3l_mQISH5SF0shDk_BNhHHzYiAPrT3ITN4I,24701 -pkg_resources/_vendor/appdirs.pyc,, -pkg_resources/_vendor/packaging/__about__.py,sha256=zkcCPTN_6TcLW0Nrlg0176-R1QQ_WVPTm8sz1R4-HjM,720 -pkg_resources/_vendor/packaging/__about__.pyc,, -pkg_resources/_vendor/packaging/__init__.py,sha256=_vNac5TrzwsrzbOFIbF-5cHqc_Y2aPT2D7zrIR06BOo,513 -pkg_resources/_vendor/packaging/__init__.pyc,, -pkg_resources/_vendor/packaging/_compat.py,sha256=Vi_A0rAQeHbU-a9X0tt1yQm9RqkgQbDSxzRw8WlU9kA,860 -pkg_resources/_vendor/packaging/_compat.pyc,, -pkg_resources/_vendor/packaging/_structures.py,sha256=RImECJ4c_wTlaTYYwZYLHEiebDMaAJmK1oPARhw1T5o,1416 -pkg_resources/_vendor/packaging/_structures.pyc,, -pkg_resources/_vendor/packaging/markers.py,sha256=uEcBBtGvzqltgnArqb9c4RrcInXezDLos14zbBHhWJo,8248 -pkg_resources/_vendor/packaging/markers.pyc,, -pkg_resources/_vendor/packaging/requirements.py,sha256=SikL2UynbsT0qtY9ltqngndha_sfo0w6XGFhAhoSoaQ,4355 -pkg_resources/_vendor/packaging/requirements.pyc,, -pkg_resources/_vendor/packaging/specifiers.py,sha256=SAMRerzO3fK2IkFZCaZkuwZaL_EGqHNOz4pni4vhnN0,28025 -pkg_resources/_vendor/packaging/specifiers.pyc,, -pkg_resources/_vendor/packaging/utils.py,sha256=3m6WvPm6NNxE8rkTGmn0r75B_GZSGg7ikafxHsBN1WA,421 -pkg_resources/_vendor/packaging/utils.pyc,, -pkg_resources/_vendor/packaging/version.py,sha256=OwGnxYfr2ghNzYx59qWIBkrK3SnB6n-Zfd1XaLpnnM0,11556 -pkg_resources/_vendor/packaging/version.pyc,, -pkg_resources/_vendor/pyparsing.py,sha256=tmrp-lu-qO1i75ZzIN5A12nKRRD1Cm4Vpk-5LR9rims,232055 -pkg_resources/_vendor/pyparsing.pyc,, -pkg_resources/_vendor/six.py,sha256=A6hdJZVjI3t_geebZ9BzUvwRrIXo0lfwzQlM2LcKyas,30098 -pkg_resources/_vendor/six.pyc,, -pkg_resources/extern/__init__.py,sha256=cHiEfHuLmm6rs5Ve_ztBfMI7Lr31vss-D4wkqF5xzlI,2498 -pkg_resources/extern/__init__.pyc,, -pkg_resources/py31compat.py,sha256=-WQ0e4c3RG_acdhwC3gLiXhP_lg4G5q7XYkZkQg0gxU,558 -pkg_resources/py31compat.pyc,, -setuptools-41.0.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -setuptools-41.0.1.dist-info/LICENSE,sha256=wyo6w5WvYyHv0ovnPQagDw22q4h9HCHU_sRhKNIFbVo,1078 -setuptools-41.0.1.dist-info/METADATA,sha256=_i0otxacylu95CLISnMjTjG7DZ2vYZOvwedcoJ06JNE,3303 -setuptools-41.0.1.dist-info/RECORD,, -setuptools-41.0.1.dist-info/WHEEL,sha256=HX-v9-noUkyUoxyZ1PMSuS7auUxDAR4VBdoYLqD0xws,110 -setuptools-41.0.1.dist-info/dependency_links.txt,sha256=HlkCFkoK5TbZ5EMLbLKYhLcY_E31kBWD8TqW2EgmatQ,239 -setuptools-41.0.1.dist-info/entry_points.txt,sha256=jBqCYDlVjl__sjYFGXo1JQGIMAYFJE-prYWUtnMZEew,2990 -setuptools-41.0.1.dist-info/top_level.txt,sha256=2HUXVVwA4Pff1xgTFr3GsTXXKaPaO6vlG6oNJ_4u4Tg,38 -setuptools-41.0.1.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1 -setuptools/__init__.py,sha256=WBpCcn2lvdckotabeae1TTYonPOcgCIF3raD2zRWzBc,7283 -setuptools/__init__.pyc,, -setuptools/_deprecation_warning.py,sha256=jU9-dtfv6cKmtQJOXN8nP1mm7gONw5kKEtiPtbwnZyI,218 -setuptools/_deprecation_warning.pyc,, -setuptools/_vendor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -setuptools/_vendor/__init__.pyc,, -setuptools/_vendor/packaging/__about__.py,sha256=zkcCPTN_6TcLW0Nrlg0176-R1QQ_WVPTm8sz1R4-HjM,720 -setuptools/_vendor/packaging/__about__.pyc,, -setuptools/_vendor/packaging/__init__.py,sha256=_vNac5TrzwsrzbOFIbF-5cHqc_Y2aPT2D7zrIR06BOo,513 -setuptools/_vendor/packaging/__init__.pyc,, -setuptools/_vendor/packaging/_compat.py,sha256=Vi_A0rAQeHbU-a9X0tt1yQm9RqkgQbDSxzRw8WlU9kA,860 -setuptools/_vendor/packaging/_compat.pyc,, -setuptools/_vendor/packaging/_structures.py,sha256=RImECJ4c_wTlaTYYwZYLHEiebDMaAJmK1oPARhw1T5o,1416 -setuptools/_vendor/packaging/_structures.pyc,, -setuptools/_vendor/packaging/markers.py,sha256=Gvpk9EY20yKaMTiKgQZ8yFEEpodqVgVYtfekoic1Yts,8239 -setuptools/_vendor/packaging/markers.pyc,, -setuptools/_vendor/packaging/requirements.py,sha256=t44M2HVWtr8phIz2OhnILzuGT3rTATaovctV1dpnVIg,4343 -setuptools/_vendor/packaging/requirements.pyc,, -setuptools/_vendor/packaging/specifiers.py,sha256=SAMRerzO3fK2IkFZCaZkuwZaL_EGqHNOz4pni4vhnN0,28025 -setuptools/_vendor/packaging/specifiers.pyc,, -setuptools/_vendor/packaging/utils.py,sha256=3m6WvPm6NNxE8rkTGmn0r75B_GZSGg7ikafxHsBN1WA,421 -setuptools/_vendor/packaging/utils.pyc,, -setuptools/_vendor/packaging/version.py,sha256=OwGnxYfr2ghNzYx59qWIBkrK3SnB6n-Zfd1XaLpnnM0,11556 -setuptools/_vendor/packaging/version.pyc,, -setuptools/_vendor/pyparsing.py,sha256=tmrp-lu-qO1i75ZzIN5A12nKRRD1Cm4Vpk-5LR9rims,232055 -setuptools/_vendor/pyparsing.pyc,, -setuptools/_vendor/six.py,sha256=A6hdJZVjI3t_geebZ9BzUvwRrIXo0lfwzQlM2LcKyas,30098 -setuptools/_vendor/six.pyc,, -setuptools/archive_util.py,sha256=kw8Ib_lKjCcnPKNbS7h8HztRVK0d5RacU3r_KRdVnmM,6592 -setuptools/archive_util.pyc,, -setuptools/build_meta.py,sha256=ioZE7tGSWY6vy7KLune0Iq334ugXuO39imcKC8prjBY,9387 -setuptools/build_meta.pyc,, -setuptools/cli-32.exe,sha256=dfEuovMNnA2HLa3jRfMPVi5tk4R7alCbpTvuxtCyw0Y,65536 -setuptools/cli-64.exe,sha256=KLABu5pyrnokJCv6skjXZ6GsXeyYHGcqOUT3oHI3Xpo,74752 -setuptools/cli.exe,sha256=dfEuovMNnA2HLa3jRfMPVi5tk4R7alCbpTvuxtCyw0Y,65536 -setuptools/command/__init__.py,sha256=NWzJ0A1BEengZpVeqUyWLNm2bk4P3F4iL5QUErHy7kA,594 -setuptools/command/__init__.pyc,, -setuptools/command/alias.py,sha256=KjpE0sz_SDIHv3fpZcIQK-sCkJz-SrC6Gmug6b9Nkc8,2426 -setuptools/command/alias.pyc,, -setuptools/command/bdist_egg.py,sha256=be-IBpr1zhS9i6GjKANJgzkbH3ChImdWY7S-j0r2BK8,18167 -setuptools/command/bdist_egg.pyc,, -setuptools/command/bdist_rpm.py,sha256=B7l0TnzCGb-0nLlm6rS00jWLkojASwVmdhW2w5Qz_Ak,1508 -setuptools/command/bdist_rpm.pyc,, -setuptools/command/bdist_wininst.py,sha256=_6dz3lpB1tY200LxKPLM7qgwTCceOMgaWFF-jW2-pm0,637 -setuptools/command/bdist_wininst.pyc,, -setuptools/command/build_clib.py,sha256=bQ9aBr-5ZSO-9fGsGsDLz0mnnFteHUZnftVLkhvHDq0,4484 -setuptools/command/build_clib.pyc,, -setuptools/command/build_ext.py,sha256=81CTgsqjBjNl_HOgCJ1lQ5vv1NIM3RBpcoVGpqT4N1M,12897 -setuptools/command/build_ext.pyc,, -setuptools/command/build_py.py,sha256=yWyYaaS9F3o9JbIczn064A5g1C5_UiKRDxGaTqYbtLE,9596 -setuptools/command/build_py.pyc,, -setuptools/command/develop.py,sha256=MQlnGS6uP19erK2JCNOyQYoYyquk3PADrqrrinqqLtA,8184 -setuptools/command/develop.pyc,, -setuptools/command/dist_info.py,sha256=5t6kOfrdgALT-P3ogss6PF9k-Leyesueycuk3dUyZnI,960 -setuptools/command/dist_info.pyc,, -setuptools/command/easy_install.py,sha256=telww7CuPsoTtvlpY-ktnZGT85cZ6xGCGZa0vHvFJ-Q,87273 -setuptools/command/easy_install.pyc,, -setuptools/command/egg_info.py,sha256=w73EdxYSOk2gsaAiHGL2dZrCldoPiuRr2eTfqcFvCds,25570 -setuptools/command/egg_info.pyc,, -setuptools/command/install.py,sha256=a0EZpL_A866KEdhicTGbuyD_TYl1sykfzdrri-zazT4,4683 -setuptools/command/install.pyc,, -setuptools/command/install_egg_info.py,sha256=bMgeIeRiXzQ4DAGPV1328kcjwQjHjOWU4FngAWLV78Q,2203 -setuptools/command/install_egg_info.pyc,, -setuptools/command/install_lib.py,sha256=11mxf0Ch12NsuYwS8PHwXBRvyh671QAM4cTRh7epzG0,3840 -setuptools/command/install_lib.pyc,, -setuptools/command/install_scripts.py,sha256=UD0rEZ6861mTYhIdzcsqKnUl8PozocXWl9VBQ1VTWnc,2439 -setuptools/command/install_scripts.pyc,, -setuptools/command/launcher manifest.xml,sha256=xlLbjWrB01tKC0-hlVkOKkiSPbzMml2eOPtJ_ucCnbE,628 -setuptools/command/py36compat.py,sha256=SzjZcOxF7zdFUT47Zv2n7AM3H8koDys_0OpS-n9gIfc,4986 -setuptools/command/py36compat.pyc,, -setuptools/command/register.py,sha256=LO3MvYKPE8dN1m-KkrBRHC68ZFoPvA_vI8Xgp7vv6zI,534 -setuptools/command/register.pyc,, -setuptools/command/rotate.py,sha256=co5C1EkI7P0GGT6Tqz-T2SIj2LBJTZXYELpmao6d4KQ,2164 -setuptools/command/rotate.pyc,, -setuptools/command/saveopts.py,sha256=za7QCBcQimKKriWcoCcbhxPjUz30gSB74zuTL47xpP4,658 -setuptools/command/saveopts.pyc,, -setuptools/command/sdist.py,sha256=gr5hFrDzUtGfp_0tu0sllzIyr3jMQegIkFmlDauQJxw,7388 -setuptools/command/sdist.pyc,, -setuptools/command/setopt.py,sha256=NTWDyx-gjDF-txf4dO577s7LOzHVoKR0Mq33rFxaRr8,5085 -setuptools/command/setopt.pyc,, -setuptools/command/test.py,sha256=oePJ49u17ENKtrM-rOrrLlRhtNnrzcSr0IW-gE9XVq0,9285 -setuptools/command/test.pyc,, -setuptools/command/upload.py,sha256=GxtNkIl7SA0r8mACkbDcSCN1m2_WPppK9gZXJmQSiow,6811 -setuptools/command/upload.pyc,, -setuptools/command/upload_docs.py,sha256=oXiGplM_cUKLwE4CWWw98RzCufAu8tBhMC97GegFcms,7311 -setuptools/command/upload_docs.pyc,, -setuptools/config.py,sha256=lz19l1AtoHctpp1_tbYZv176nrEj4Gpf7ykNIYTIkAQ,20425 -setuptools/config.pyc,, -setuptools/dep_util.py,sha256=fgixvC1R7sH3r13ktyf7N0FALoqEXL1cBarmNpSEoWg,935 -setuptools/dep_util.pyc,, -setuptools/depends.py,sha256=hC8QIDcM3VDpRXvRVA6OfL9AaQfxvhxHcN_w6sAyNq8,5837 -setuptools/depends.pyc,, -setuptools/dist.py,sha256=qYPmmVlLPWCLHrILR0J74bqoYgTSZh5ocLeyRKqnVyU,49913 -setuptools/dist.pyc,, -setuptools/extension.py,sha256=uc6nHI-MxwmNCNPbUiBnybSyqhpJqjbhvOQ-emdvt_E,1729 -setuptools/extension.pyc,, -setuptools/extern/__init__.py,sha256=TxeNKFMSfBMzBpBDiHx8Dh3RzsdVmvWaXhtZ03DZMs0,2499 -setuptools/extern/__init__.pyc,, -setuptools/glibc.py,sha256=X64VvGPL2AbURKwYRsWJOXXGAYOiF_v2qixeTkAULuU,3146 -setuptools/glibc.pyc,, -setuptools/glob.py,sha256=o75cHrOxYsvn854thSxE0x9k8JrKDuhP_rRXlVB00Q4,5084 -setuptools/glob.pyc,, -setuptools/gui-32.exe,sha256=XBr0bHMA6Hpz2s9s9Bzjl-PwXfa9nH4ie0rFn4V2kWA,65536 -setuptools/gui-64.exe,sha256=aYKMhX1IJLn4ULHgWX0sE0yREUt6B3TEHf_jOw6yNyE,75264 -setuptools/gui.exe,sha256=XBr0bHMA6Hpz2s9s9Bzjl-PwXfa9nH4ie0rFn4V2kWA,65536 -setuptools/launch.py,sha256=sd7ejwhBocCDx_wG9rIs0OaZ8HtmmFU8ZC6IR_S0Lvg,787 -setuptools/launch.pyc,, -setuptools/lib2to3_ex.py,sha256=t5e12hbR2pi9V4ezWDTB4JM-AISUnGOkmcnYHek3xjg,2013 -setuptools/lib2to3_ex.pyc,, -setuptools/monkey.py,sha256=FGc9fffh7gAxMLFmJs2DW_OYWpBjkdbNS2n14UAK4NA,5264 -setuptools/monkey.pyc,, -setuptools/msvc.py,sha256=uuRFaZzjJt5Fv3ZmyKUUuLtjx12_8G9RILigGec4irI,40838 -setuptools/msvc.pyc,, -setuptools/namespaces.py,sha256=F0Nrbv8KCT2OrO7rwa03om4N4GZKAlnce-rr-cgDQa8,3199 -setuptools/namespaces.pyc,, -setuptools/package_index.py,sha256=F9LBC-hQ5fkjeEVflxif0mo_DzRMrepahdFTPenOtGM,40587 -setuptools/package_index.pyc,, -setuptools/pep425tags.py,sha256=o_D_WVeWcXZiI2xjPSg7pouGOvaWRgGRxEDK9DzAXIA,10861 -setuptools/pep425tags.pyc,, -setuptools/py27compat.py,sha256=3mwxRMDk5Q5O1rSXOERbQDXhFqwDJhhUitfMW_qpUCo,536 -setuptools/py27compat.pyc,, -setuptools/py31compat.py,sha256=h2rtZghOfwoGYd8sQ0-auaKiF3TcL3qX0bX3VessqcE,838 -setuptools/py31compat.pyc,, -setuptools/py33compat.py,sha256=OubjldHJH1KGE1CKt1kRU-Q55keftHT3ea1YoL0ZSco,1195 -setuptools/py33compat.pyc,, -setuptools/sandbox.py,sha256=9UbwfEL5QY436oMI1LtFWohhoZ-UzwHvGyZjUH_qhkw,14276 -setuptools/sandbox.pyc,, -setuptools/script (dev).tmpl,sha256=RUzQzCQUaXtwdLtYHWYbIQmOaES5Brqq1FvUA_tu-5I,218 -setuptools/script.tmpl,sha256=WGTt5piezO27c-Dbx6l5Q4T3Ff20A5z7872hv3aAhYY,138 -setuptools/site-patch.py,sha256=OumkIHMuoSenRSW1382kKWI1VAwxNE86E5W8iDd34FY,2302 -setuptools/site-patch.pyc,, -setuptools/ssl_support.py,sha256=nLjPUBBw7RTTx6O4RJZ5eAMGgjJG8beiDbkFXDZpLuM,8493 -setuptools/ssl_support.pyc,, -setuptools/unicode_utils.py,sha256=NOiZ_5hD72A6w-4wVj8awHFM3n51Kmw1Ic_vx15XFqw,996 -setuptools/unicode_utils.pyc,, -setuptools/version.py,sha256=og_cuZQb0QI6ukKZFfZWPlr1HgJBPPn2vO2m_bI9ZTE,144 -setuptools/version.pyc,, -setuptools/wheel.py,sha256=94uqXsOaKt91d9hW5z6ZppZmNSs_nO66R4uiwhcr4V0,8094 -setuptools/wheel.pyc,, -setuptools/windows_support.py,sha256=5GrfqSP2-dLGJoZTq2g6dCKkyQxxa2n5IQiXlJCoYEE,714 -setuptools/windows_support.pyc,, diff --git a/venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/WHEEL b/venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/WHEEL deleted file mode 100644 index c8240f0..0000000 --- a/venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/WHEEL +++ /dev/null @@ -1,6 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.33.1) -Root-Is-Purelib: true -Tag: py2-none-any -Tag: py3-none-any - diff --git a/venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/dependency_links.txt b/venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/dependency_links.txt deleted file mode 100644 index e87d021..0000000 --- a/venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/dependency_links.txt +++ /dev/null @@ -1,2 +0,0 @@ -https://files.pythonhosted.org/packages/source/c/certifi/certifi-2016.9.26.tar.gz#md5=baa81e951a29958563689d868ef1064d -https://files.pythonhosted.org/packages/source/w/wincertstore/wincertstore-0.2.zip#md5=ae728f2f007185648d0c7a8679b361e2 diff --git a/venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/entry_points.txt b/venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/entry_points.txt deleted file mode 100644 index 4159fd0..0000000 --- a/venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/entry_points.txt +++ /dev/null @@ -1,65 +0,0 @@ -[console_scripts] -easy_install = setuptools.command.easy_install:main -easy_install-3.6 = setuptools.command.easy_install:main - -[distutils.commands] -alias = setuptools.command.alias:alias -bdist_egg = setuptools.command.bdist_egg:bdist_egg -bdist_rpm = setuptools.command.bdist_rpm:bdist_rpm -bdist_wininst = setuptools.command.bdist_wininst:bdist_wininst -build_clib = setuptools.command.build_clib:build_clib -build_ext = setuptools.command.build_ext:build_ext -build_py = setuptools.command.build_py:build_py -develop = setuptools.command.develop:develop -dist_info = setuptools.command.dist_info:dist_info -easy_install = setuptools.command.easy_install:easy_install -egg_info = setuptools.command.egg_info:egg_info -install = setuptools.command.install:install -install_egg_info = setuptools.command.install_egg_info:install_egg_info -install_lib = setuptools.command.install_lib:install_lib -install_scripts = setuptools.command.install_scripts:install_scripts -register = setuptools.command.register:register -rotate = setuptools.command.rotate:rotate -saveopts = setuptools.command.saveopts:saveopts -sdist = setuptools.command.sdist:sdist -setopt = setuptools.command.setopt:setopt -test = setuptools.command.test:test -upload = setuptools.command.upload:upload -upload_docs = setuptools.command.upload_docs:upload_docs - -[distutils.setup_keywords] -convert_2to3_doctests = setuptools.dist:assert_string_list -dependency_links = setuptools.dist:assert_string_list -eager_resources = setuptools.dist:assert_string_list -entry_points = setuptools.dist:check_entry_points -exclude_package_data = setuptools.dist:check_package_data -extras_require = setuptools.dist:check_extras -include_package_data = setuptools.dist:assert_bool -install_requires = setuptools.dist:check_requirements -namespace_packages = setuptools.dist:check_nsp -package_data = setuptools.dist:check_package_data -packages = setuptools.dist:check_packages -python_requires = setuptools.dist:check_specifier -setup_requires = setuptools.dist:check_requirements -test_loader = setuptools.dist:check_importable -test_runner = setuptools.dist:check_importable -test_suite = setuptools.dist:check_test_suite -tests_require = setuptools.dist:check_requirements -use_2to3 = setuptools.dist:assert_bool -use_2to3_exclude_fixers = setuptools.dist:assert_string_list -use_2to3_fixers = setuptools.dist:assert_string_list -zip_safe = setuptools.dist:assert_bool - -[egg_info.writers] -PKG-INFO = setuptools.command.egg_info:write_pkg_info -dependency_links.txt = setuptools.command.egg_info:overwrite_arg -depends.txt = setuptools.command.egg_info:warn_depends_obsolete -eager_resources.txt = setuptools.command.egg_info:overwrite_arg -entry_points.txt = setuptools.command.egg_info:write_entries -namespace_packages.txt = setuptools.command.egg_info:overwrite_arg -requires.txt = setuptools.command.egg_info:write_requirements -top_level.txt = setuptools.command.egg_info:write_toplevel_names - -[setuptools.installation] -eggsecutable = setuptools.command.easy_install:bootstrap - diff --git a/venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/top_level.txt b/venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/top_level.txt deleted file mode 100644 index 4577c6a..0000000 --- a/venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/top_level.txt +++ /dev/null @@ -1,3 +0,0 @@ -easy_install -pkg_resources -setuptools diff --git a/venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/zip-safe b/venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/zip-safe deleted file mode 100644 index 8b13789..0000000 --- a/venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/zip-safe +++ /dev/null @@ -1 +0,0 @@ - diff --git a/venv/lib/python2.7/site-packages/setuptools/__init__.py b/venv/lib/python2.7/site-packages/setuptools/__init__.py deleted file mode 100644 index a71b2bb..0000000 --- a/venv/lib/python2.7/site-packages/setuptools/__init__.py +++ /dev/null @@ -1,228 +0,0 @@ -"""Extensions to the 'distutils' for large or complex distributions""" - -import os -import sys -import functools -import distutils.core -import distutils.filelist -import re -from distutils.errors import DistutilsOptionError -from distutils.util import convert_path -from fnmatch import fnmatchcase - -from ._deprecation_warning import SetuptoolsDeprecationWarning - -from setuptools.extern.six import PY3, string_types -from setuptools.extern.six.moves import filter, map - -import setuptools.version -from setuptools.extension import Extension -from setuptools.dist import Distribution, Feature -from setuptools.depends import Require -from . import monkey - -__metaclass__ = type - - -__all__ = [ - 'setup', 'Distribution', 'Feature', 'Command', 'Extension', 'Require', - 'SetuptoolsDeprecationWarning', - 'find_packages' -] - -if PY3: - __all__.append('find_namespace_packages') - -__version__ = setuptools.version.__version__ - -bootstrap_install_from = None - -# If we run 2to3 on .py files, should we also convert docstrings? -# Default: yes; assume that we can detect doctests reliably -run_2to3_on_doctests = True -# Standard package names for fixer packages -lib2to3_fixer_packages = ['lib2to3.fixes'] - - -class PackageFinder: - """ - Generate a list of all Python packages found within a directory - """ - - @classmethod - def find(cls, where='.', exclude=(), include=('*',)): - """Return a list all Python packages found within directory 'where' - - 'where' is the root directory which will be searched for packages. It - should be supplied as a "cross-platform" (i.e. URL-style) path; it will - be converted to the appropriate local path syntax. - - 'exclude' is a sequence of package names to exclude; '*' can be used - as a wildcard in the names, such that 'foo.*' will exclude all - subpackages of 'foo' (but not 'foo' itself). - - 'include' is a sequence of package names to include. If it's - specified, only the named packages will be included. If it's not - specified, all found packages will be included. 'include' can contain - shell style wildcard patterns just like 'exclude'. - """ - - return list(cls._find_packages_iter( - convert_path(where), - cls._build_filter('ez_setup', '*__pycache__', *exclude), - cls._build_filter(*include))) - - @classmethod - def _find_packages_iter(cls, where, exclude, include): - """ - All the packages found in 'where' that pass the 'include' filter, but - not the 'exclude' filter. - """ - for root, dirs, files in os.walk(where, followlinks=True): - # Copy dirs to iterate over it, then empty dirs. - all_dirs = dirs[:] - dirs[:] = [] - - for dir in all_dirs: - full_path = os.path.join(root, dir) - rel_path = os.path.relpath(full_path, where) - package = rel_path.replace(os.path.sep, '.') - - # Skip directory trees that are not valid packages - if ('.' in dir or not cls._looks_like_package(full_path)): - continue - - # Should this package be included? - if include(package) and not exclude(package): - yield package - - # Keep searching subdirectories, as there may be more packages - # down there, even if the parent was excluded. - dirs.append(dir) - - @staticmethod - def _looks_like_package(path): - """Does a directory look like a package?""" - return os.path.isfile(os.path.join(path, '__init__.py')) - - @staticmethod - def _build_filter(*patterns): - """ - Given a list of patterns, return a callable that will be true only if - the input matches at least one of the patterns. - """ - return lambda name: any(fnmatchcase(name, pat=pat) for pat in patterns) - - -class PEP420PackageFinder(PackageFinder): - @staticmethod - def _looks_like_package(path): - return True - - -find_packages = PackageFinder.find - -if PY3: - find_namespace_packages = PEP420PackageFinder.find - - -def _install_setup_requires(attrs): - # Note: do not use `setuptools.Distribution` directly, as - # our PEP 517 backend patch `distutils.core.Distribution`. - dist = distutils.core.Distribution(dict( - (k, v) for k, v in attrs.items() - if k in ('dependency_links', 'setup_requires') - )) - # Honor setup.cfg's options. - dist.parse_config_files(ignore_option_errors=True) - if dist.setup_requires: - dist.fetch_build_eggs(dist.setup_requires) - - -def setup(**attrs): - # Make sure we have any requirements needed to interpret 'attrs'. - _install_setup_requires(attrs) - return distutils.core.setup(**attrs) - -setup.__doc__ = distutils.core.setup.__doc__ - - -_Command = monkey.get_unpatched(distutils.core.Command) - - -class Command(_Command): - __doc__ = _Command.__doc__ - - command_consumes_arguments = False - - def __init__(self, dist, **kw): - """ - Construct the command for dist, updating - vars(self) with any keyword parameters. - """ - _Command.__init__(self, dist) - vars(self).update(kw) - - def _ensure_stringlike(self, option, what, default=None): - val = getattr(self, option) - if val is None: - setattr(self, option, default) - return default - elif not isinstance(val, string_types): - raise DistutilsOptionError("'%s' must be a %s (got `%s`)" - % (option, what, val)) - return val - - def ensure_string_list(self, option): - r"""Ensure that 'option' is a list of strings. If 'option' is - currently a string, we split it either on /,\s*/ or /\s+/, so - "foo bar baz", "foo,bar,baz", and "foo, bar baz" all become - ["foo", "bar", "baz"]. - """ - val = getattr(self, option) - if val is None: - return - elif isinstance(val, string_types): - setattr(self, option, re.split(r',\s*|\s+', val)) - else: - if isinstance(val, list): - ok = all(isinstance(v, string_types) for v in val) - else: - ok = False - if not ok: - raise DistutilsOptionError( - "'%s' must be a list of strings (got %r)" - % (option, val)) - - def reinitialize_command(self, command, reinit_subcommands=0, **kw): - cmd = _Command.reinitialize_command(self, command, reinit_subcommands) - vars(cmd).update(kw) - return cmd - - -def _find_all_simple(path): - """ - Find all files under 'path' - """ - results = ( - os.path.join(base, file) - for base, dirs, files in os.walk(path, followlinks=True) - for file in files - ) - return filter(os.path.isfile, results) - - -def findall(dir=os.curdir): - """ - Find all files under 'dir' and return the list of full filenames. - Unless dir is '.', return full filenames with dir prepended. - """ - files = _find_all_simple(dir) - if dir == os.curdir: - make_rel = functools.partial(os.path.relpath, start=dir) - files = map(make_rel, files) - return list(files) - - -# Apply monkey patches -monkey.patch_all() diff --git a/venv/lib/python2.7/site-packages/setuptools/__init__.pyc b/venv/lib/python2.7/site-packages/setuptools/__init__.pyc deleted file mode 100644 index bdae605909ef9750cff451cdddf69b745168c38d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10555 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 L7jDkX9Xt9zYsLkf diff --git a/venv/lib/python2.7/site-packages/setuptools/_deprecation_warning.py b/venv/lib/python2.7/site-packages/setuptools/_deprecation_warning.py deleted file mode 100644 index 086b64d..0000000 --- a/venv/lib/python2.7/site-packages/setuptools/_deprecation_warning.py +++ /dev/null @@ -1,7 +0,0 @@ -class SetuptoolsDeprecationWarning(Warning): - """ - Base class for warning deprecations in ``setuptools`` - - This class is not derived from ``DeprecationWarning``, and as such is - visible by default. - """ diff --git a/venv/lib/python2.7/site-packages/setuptools/_deprecation_warning.pyc b/venv/lib/python2.7/site-packages/setuptools/_deprecation_warning.pyc deleted file mode 100644 index f7ed7567c41f3934941a13b269369a93d9d40e6c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 690 zcmc&x-AcnS6wWr7qu?GuyvSt{w>p%eAR@zCMYe$`NSd|j7VMImll^peqEF&0`U0M2 zWgYkc9>|yTHRpW!deZng^iDq7uMsJuf%`2kI6{aC5riZ)64%HVA)kaizaXiTkzdr= zV}y~gi_B`B!kx&Bh`5znJ#nL?n(kC<SUA81Z3L7oR1oWAIP!}#_(t$3#(;yMQOW^m zq77Ybg=k!91C@$~A?)rAL(jF2XA;U*Oq90RW#m%CG%<RPEq@J$;VI=RrW`0Nq8XLo zl$H|YBo%a$qeQ|NsqMP&+rMt1SH={d3&yPH$Xv&Zw4eu$#yVom$COk6Inp3QL)?mB z$xV>x6b(YKSqJ&KnW)uUum7&j`sSh^UBdb*-k39tX%>uwOlBRa!16Th*xvn=JqFbP x_EWYuDOOIeo8`m8jGJ^FlV<b5FLr0Qd@EN`*>&0fdbTaJc)cC%jq{G2`~nUXz$pL# diff --git a/venv/lib/python2.7/site-packages/setuptools/_vendor/__init__.py b/venv/lib/python2.7/site-packages/setuptools/_vendor/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python2.7/site-packages/setuptools/_vendor/__init__.pyc b/venv/lib/python2.7/site-packages/setuptools/_vendor/__init__.pyc deleted file mode 100644 index 227b64caa142afbc09505c8bded550df4cd971fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 204 zcmZSn%*&<K$QPT;00oRd+5w1*S%5?e14FO|NW@PANHCxg#ic+o{eq&*vc!^9{j$U& z{j~g?l+>bP{i+K6O5>uWyz*>Av%)+Bvmz6-WQ*bo%ap1j10YB*&=1is$Sly!%quQQ z%*oL$G4xH356~}8Eh#N1$<NOzMrOvBrRJsN7wN~xXXa&=#K-FuRF-f6ZMMnHPbtkw LwF9}Y7>F4F(!(_S diff --git a/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/__about__.py b/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/__about__.py deleted file mode 100644 index 95d330e..0000000 --- a/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/__about__.py +++ /dev/null @@ -1,21 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. -from __future__ import absolute_import, division, print_function - -__all__ = [ - "__title__", "__summary__", "__uri__", "__version__", "__author__", - "__email__", "__license__", "__copyright__", -] - -__title__ = "packaging" -__summary__ = "Core utilities for Python packages" -__uri__ = "https://github.com/pypa/packaging" - -__version__ = "16.8" - -__author__ = "Donald Stufft and individual contributors" -__email__ = "donald@stufft.io" - -__license__ = "BSD or Apache License, Version 2.0" -__copyright__ = "Copyright 2014-2016 %s" % __author__ diff --git a/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/__about__.pyc b/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/__about__.pyc deleted file mode 100644 index 7babad6569afcdde3fee1f92ebcbf442a6a82ab3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 843 zcmYjPTW`}a6h3KoX}e3uMSJ4GAR!e*>vl}lKnM-CM?h1Cc!-388@s8s#16icbx-h{ z`2!rMWt*LR_BrRv@j0Ip|K01p{ImZ(hxKUVdio;*YjDHyiJ%0iB1j{sT9CG&iXn|5 z;w|7Y@D1Rbz_);J18)QGK+%R2on1)LzXK_Tb|J;+9;8UvhqME{2Wc1h0i-*?AAsn< zVY&<aAzbz!;juE*(vJ~b4}ndsF1-_(tZHqX3ng;7kXCBt_R*+~R4$u&mAl~TpexIq zbfv&$r?ITBDrS~wZ#T9#@;0^*CZs~U+r*f6b8XOEB@z{r<t@3CxllGF-fPIYu9rp@ zbGPQ#EWcufRE2$p@iT1%@lKY~Nny!M8*;J4?24>-!rG@un>$zAx0Dvr&HZ$k>x$OP zn$f#t8^{_@h9~v~ZqBu0B`258&t{G=#felw5bjw?a#X;`sdw5~dw^`-uupBn9!lL5 z_VMzZU@;%?gt;J}R!zMk-&RtPqv6ON;<so2yCX-V@$mp*LY~_%{m}bbt(kY;pdJaj zAc+FBLUg4wD^a>6TxAkkNHzm(1qksZTxAkuPJ;A(eD8t%jV8s*T`(u;f*Cr~CC3Ws z%{5)VHdFQMYCQR=MiX;9$xrO{8-8O(IEtEnrM0XFQdx%;4BYs0kzG(LoUfhMrM<t+ u7D91t?!=~9#-`fijSlN&^S8aLH20-=A6l@F5uU`os26WVI9oUaM*jdYj@3y3 diff --git a/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/__init__.py b/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/__init__.py deleted file mode 100644 index 5ee6220..0000000 --- a/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/__init__.py +++ /dev/null @@ -1,14 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. -from __future__ import absolute_import, division, print_function - -from .__about__ import ( - __author__, __copyright__, __email__, __license__, __summary__, __title__, - __uri__, __version__ -) - -__all__ = [ - "__title__", "__summary__", "__uri__", "__version__", "__author__", - "__email__", "__license__", "__copyright__", -] diff --git a/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/__init__.pyc b/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/__init__.pyc deleted file mode 100644 index 636f9146d4642fd6251ddbe3c7c6d542230939be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 665 zcmYjO(QeZ)6g^4Xv`yRX2l#*pX?PQ;0)!Ah078K$OUR^gnpunEU^`j67qoBQ4{)7T zWma_JdwuRb=h~B}P5S!r;#Y~&TG0Q??+ETd8%bY;2G9|B1RaCN&=c?pA{j$Y&`hCc z;4|n1Jb|8r&!HFK3+N^I5;_G>p;zE5=r#D7DyNV$$OLi@xqw_krjRStRJMU!<43k3 zaTOe869RupQ0$y(dS3~pJ7c{MMx`2*Q>OJ76m(X#UhMm}^psK&rLsWsDS;40?{AG2 z!iU~Ml%_jcRo{BbEXPcx3)N7x8ly&)RqLvA?0T&Wdpxtf@=Z9MkL=#6GjphH@FYYY z)bl{dgF+sB<YAtC79a^QCHR&F`zM?G-uIRo=afPohREY^`s}gTnVuX!cL}vGT8%=Z z<XP?Hu4rhkjM(@O?k|Om?rbQ0#fHMNy=f#_XAcK<d~0{@{oT#>PkX(!@3!T8claP5 z>@}^rV?SA^x+~Q>Po1y)&DUCdXRh*n=Z$IH%dHryRvOE?qP#0=)z(Z1)he3dO?MpM W@RK&OZ>rB>8W-;5Rs1ozjQ#<VrIUaF diff --git a/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/_compat.py b/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/_compat.py deleted file mode 100644 index 210bb80..0000000 --- a/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/_compat.py +++ /dev/null @@ -1,30 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. -from __future__ import absolute_import, division, print_function - -import sys - - -PY2 = sys.version_info[0] == 2 -PY3 = sys.version_info[0] == 3 - -# flake8: noqa - -if PY3: - string_types = str, -else: - string_types = basestring, - - -def with_metaclass(meta, *bases): - """ - Create a base class with a metaclass. - """ - # This requires a bit of explanation: the basic idea is to make a dummy - # metaclass for one level of class instantiation that replaces itself with - # the actual metaclass. - class metaclass(meta): - def __new__(cls, name, this_bases, d): - return meta(name, bases, d) - return type.__new__(metaclass, 'temporary_class', (), {}) diff --git a/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/_compat.pyc b/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/_compat.pyc deleted file mode 100644 index 2ea0844ba98d82292768032ed8d29b762e137493..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1460 zcmd5++invv5S_g=X+kMT;RUEf9#=^1wiF_e5JKXas@n3>NXT_|oz%_VuqSC#6(m$d z`Cop38E<I%3AJ{|<MG&g&iHtPzYn`Fe{OzFVcC4@Kc0AC=j3Gcc#s1W9t=Gwd>Hyr z1TYN1<2fJl5QZVB5YE;(`)L-yl(JfPL!k?`LAAl0fLez!?bd;^1FF09vo-hyFnqvU z9z`wsv}Qa}Kn5R?kt18>GgLwsb!8CODVFKEwz?{DlLocXC5rK^Op!tdnt5nmo_b{1 zS);ej%-)bgwElSf@f&~}a(w>sZ-8rn<L^Eoz?lbE6b&E?8O(J^z<3KAlj-)UeKJa- z>dXE}TGdZ;X>I>p<0(Z7h0+CfTqbsC&222DfoqJ>XGG7)QN;f)9AG$9?&K(925Cs< z|J&n5k10SLu80Z1RRGrkA>`D9hzvxWi~*T6x5$H15`->CPqh^c+9Ky?5d%Rc*91A4 z(Yk%?4;sZ(-Z_zt=hDRED$kU$@#RIl*f*o{e7ZOIR_+eW>p}X~UcAdL%`UY`9e;^y zU2p5sqRjJc-1|Hchp|;StFfwbd)F0nRc4imYne{vM3<9Tq*YN%+^HAXCI~{5>RgB| zaxLQpuTcjpf#!&t5RRP?MU~BR8YWD(DF&}dI5pv;xG%&KKAz|FIz}zeNgWkST$+V& z3R>ZJhlq<>HN1GOW7F{B;VO5<^*)>*Ur@do;`R<aVbZKKXuk-e4eFO?H=g0l@Y(TP z!tzX<I+>nbSme|>sgEwX(B-&t3O_u4we0s@Z_&6!>Pbn0Yi8a4jlMaU@L#2=7diJv d5$?zKz7g;Tu8-x~ZTTBP&+COPZ^Q2d{{TrtUlITS diff --git a/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.py b/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.py deleted file mode 100644 index ccc2786..0000000 --- a/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.py +++ /dev/null @@ -1,68 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. -from __future__ import absolute_import, division, print_function - - -class Infinity(object): - - def __repr__(self): - return "Infinity" - - def __hash__(self): - return hash(repr(self)) - - def __lt__(self, other): - return False - - def __le__(self, other): - return False - - def __eq__(self, other): - return isinstance(other, self.__class__) - - def __ne__(self, other): - return not isinstance(other, self.__class__) - - def __gt__(self, other): - return True - - def __ge__(self, other): - return True - - def __neg__(self): - return NegativeInfinity - -Infinity = Infinity() - - -class NegativeInfinity(object): - - def __repr__(self): - return "-Infinity" - - def __hash__(self): - return hash(repr(self)) - - def __lt__(self, other): - return True - - def __le__(self, other): - return True - - def __eq__(self, other): - return isinstance(other, self.__class__) - - def __ne__(self, other): - return not isinstance(other, self.__class__) - - def __gt__(self, other): - return False - - def __ge__(self, other): - return False - - def __neg__(self): - return Infinity - -NegativeInfinity = NegativeInfinity() diff --git a/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyc b/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyc deleted file mode 100644 index 3ac58a758ace051f3ed6161bb0a5602800c9f8c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5307 zcmds5Sx?(Q5FRHa90hvQN<E}LHLXewJrGqZ)I+M&hoWlXg-Gqz*qdN*Y~$UefOzTg zkNXEY-zE-e1d(`i2;OBpYh~x#xxTpkcW&nK&-t%D^*&|(|Mt5>`Wp)YUk*h?Er;q3 zwMtYkQL9Y#GC4ts)C4sg3d;0{=r_?;y+W!2iG^SyU#|3*tE8%Sxk^EmHfoc+MTmWC z*wtL-$=lXR)HX_ntu)DunPOcKc0wH{v6<(aGz()R8|~OPP+|R3+z8{)9QrKVkHhnO zVAx_ou{mrc!3wsX@jxgO+Ye!)XMfjZXxKPwa(xn3LNi6dq!p$qn6knQiH+Jcf4h&p z^6>$CPOySE*{GFRSQkK6<3Tk%Ww5GM)aa_9*S~mj8CJ(L%I$cW+eo57W!gPDa1Wnn z+wqUR<(2(-X(fBH;;-t1SHV%X#GhvBZn|lhE{3r-UKA~w<<Cv|#nsBRQ<Ef-9u#Fq z#X*v}sps!`%`k4dQk$&pn|7x3)AZ1uq?DOTGbw>g!+vu500G1TyuyOv%b{a-yMt@P zf?KzcEyNv9?^prfXBP#K7Zo+km2#FX%uxe82AtM+E2GYlT4z>x@uL@MWr16S2D-%T zsH}Kct8AK-k&zOab{?bx0dWFS%;1(scPdH*_wXqxud!*v_=e;6*v9WJ$8V|cRe0P0 z9M>BpRqQJR=u-NTr?r%0at3N&%A2Fk;3|L;4W7Yl9@;nrF^38Dc1#e*?DgAh?y%QK z<}XUpX4W1^-$F-rlQZ|uIWY=&dQ5!SWFOuizz5&u<IEb2ZnUnNo(VfDCjv!oIN&@| z#;PghgA=T^ODy+VaO}1CAZ!_uvXunwh;Ie@ikQNLM+JJ7Kp7V}0D*!hu46*lpOj`R z6{J2}Dg^i%)>cc?<^TW04OSPC!)dgD#eQ({O_$6SlhW8odBis6r7%yS;RbjXffMMX z0*)$h9@$iQGJq0Y3j=7+Di&i=3~he97ZMqY*0WQP4M*l6Eg4T%VoUSOQBW@q1G61y z^%SflQ*j)AQP{Tn`a&WDS6CZBmN$u!K0}@sxhH`8ygLD9NtIY&g}8<30#GPWq=!Iw zI)z%duhe?fvC+o69j1=_JP9~fpg|h6_hfrl`NlFbOS_867%d@w)1|;`_RSdx@ZIvl Iy=fl*0MES|FaQ7m diff --git a/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.py b/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.py deleted file mode 100644 index 031332a..0000000 --- a/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.py +++ /dev/null @@ -1,301 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. -from __future__ import absolute_import, division, print_function - -import operator -import os -import platform -import sys - -from setuptools.extern.pyparsing import ParseException, ParseResults, stringStart, stringEnd -from setuptools.extern.pyparsing import ZeroOrMore, Group, Forward, QuotedString -from setuptools.extern.pyparsing import Literal as L # noqa - -from ._compat import string_types -from .specifiers import Specifier, InvalidSpecifier - - -__all__ = [ - "InvalidMarker", "UndefinedComparison", "UndefinedEnvironmentName", - "Marker", "default_environment", -] - - -class InvalidMarker(ValueError): - """ - An invalid marker was found, users should refer to PEP 508. - """ - - -class UndefinedComparison(ValueError): - """ - An invalid operation was attempted on a value that doesn't support it. - """ - - -class UndefinedEnvironmentName(ValueError): - """ - A name was attempted to be used that does not exist inside of the - environment. - """ - - -class Node(object): - - def __init__(self, value): - self.value = value - - def __str__(self): - return str(self.value) - - def __repr__(self): - return "<{0}({1!r})>".format(self.__class__.__name__, str(self)) - - def serialize(self): - raise NotImplementedError - - -class Variable(Node): - - def serialize(self): - return str(self) - - -class Value(Node): - - def serialize(self): - return '"{0}"'.format(self) - - -class Op(Node): - - def serialize(self): - return str(self) - - -VARIABLE = ( - L("implementation_version") | - L("platform_python_implementation") | - L("implementation_name") | - L("python_full_version") | - L("platform_release") | - L("platform_version") | - L("platform_machine") | - L("platform_system") | - L("python_version") | - L("sys_platform") | - L("os_name") | - L("os.name") | # PEP-345 - L("sys.platform") | # PEP-345 - L("platform.version") | # PEP-345 - L("platform.machine") | # PEP-345 - L("platform.python_implementation") | # PEP-345 - L("python_implementation") | # undocumented setuptools legacy - L("extra") -) -ALIASES = { - 'os.name': 'os_name', - 'sys.platform': 'sys_platform', - 'platform.version': 'platform_version', - 'platform.machine': 'platform_machine', - 'platform.python_implementation': 'platform_python_implementation', - 'python_implementation': 'platform_python_implementation' -} -VARIABLE.setParseAction(lambda s, l, t: Variable(ALIASES.get(t[0], t[0]))) - -VERSION_CMP = ( - L("===") | - L("==") | - L(">=") | - L("<=") | - L("!=") | - L("~=") | - L(">") | - L("<") -) - -MARKER_OP = VERSION_CMP | L("not in") | L("in") -MARKER_OP.setParseAction(lambda s, l, t: Op(t[0])) - -MARKER_VALUE = QuotedString("'") | QuotedString('"') -MARKER_VALUE.setParseAction(lambda s, l, t: Value(t[0])) - -BOOLOP = L("and") | L("or") - -MARKER_VAR = VARIABLE | MARKER_VALUE - -MARKER_ITEM = Group(MARKER_VAR + MARKER_OP + MARKER_VAR) -MARKER_ITEM.setParseAction(lambda s, l, t: tuple(t[0])) - -LPAREN = L("(").suppress() -RPAREN = L(")").suppress() - -MARKER_EXPR = Forward() -MARKER_ATOM = MARKER_ITEM | Group(LPAREN + MARKER_EXPR + RPAREN) -MARKER_EXPR << MARKER_ATOM + ZeroOrMore(BOOLOP + MARKER_EXPR) - -MARKER = stringStart + MARKER_EXPR + stringEnd - - -def _coerce_parse_result(results): - if isinstance(results, ParseResults): - return [_coerce_parse_result(i) for i in results] - else: - return results - - -def _format_marker(marker, first=True): - assert isinstance(marker, (list, tuple, string_types)) - - # Sometimes we have a structure like [[...]] which is a single item list - # where the single item is itself it's own list. In that case we want skip - # the rest of this function so that we don't get extraneous () on the - # outside. - if (isinstance(marker, list) and len(marker) == 1 and - isinstance(marker[0], (list, tuple))): - return _format_marker(marker[0]) - - if isinstance(marker, list): - inner = (_format_marker(m, first=False) for m in marker) - if first: - return " ".join(inner) - else: - return "(" + " ".join(inner) + ")" - elif isinstance(marker, tuple): - return " ".join([m.serialize() for m in marker]) - else: - return marker - - -_operators = { - "in": lambda lhs, rhs: lhs in rhs, - "not in": lambda lhs, rhs: lhs not in rhs, - "<": operator.lt, - "<=": operator.le, - "==": operator.eq, - "!=": operator.ne, - ">=": operator.ge, - ">": operator.gt, -} - - -def _eval_op(lhs, op, rhs): - try: - spec = Specifier("".join([op.serialize(), rhs])) - except InvalidSpecifier: - pass - else: - return spec.contains(lhs) - - oper = _operators.get(op.serialize()) - if oper is None: - raise UndefinedComparison( - "Undefined {0!r} on {1!r} and {2!r}.".format(op, lhs, rhs) - ) - - return oper(lhs, rhs) - - -_undefined = object() - - -def _get_env(environment, name): - value = environment.get(name, _undefined) - - if value is _undefined: - raise UndefinedEnvironmentName( - "{0!r} does not exist in evaluation environment.".format(name) - ) - - return value - - -def _evaluate_markers(markers, environment): - groups = [[]] - - for marker in markers: - assert isinstance(marker, (list, tuple, string_types)) - - if isinstance(marker, list): - groups[-1].append(_evaluate_markers(marker, environment)) - elif isinstance(marker, tuple): - lhs, op, rhs = marker - - if isinstance(lhs, Variable): - lhs_value = _get_env(environment, lhs.value) - rhs_value = rhs.value - else: - lhs_value = lhs.value - rhs_value = _get_env(environment, rhs.value) - - groups[-1].append(_eval_op(lhs_value, op, rhs_value)) - else: - assert marker in ["and", "or"] - if marker == "or": - groups.append([]) - - return any(all(item) for item in groups) - - -def format_full_version(info): - version = '{0.major}.{0.minor}.{0.micro}'.format(info) - kind = info.releaselevel - if kind != 'final': - version += kind[0] + str(info.serial) - return version - - -def default_environment(): - if hasattr(sys, 'implementation'): - iver = format_full_version(sys.implementation.version) - implementation_name = sys.implementation.name - else: - iver = '0' - implementation_name = '' - - return { - "implementation_name": implementation_name, - "implementation_version": iver, - "os_name": os.name, - "platform_machine": platform.machine(), - "platform_release": platform.release(), - "platform_system": platform.system(), - "platform_version": platform.version(), - "python_full_version": platform.python_version(), - "platform_python_implementation": platform.python_implementation(), - "python_version": platform.python_version()[:3], - "sys_platform": sys.platform, - } - - -class Marker(object): - - def __init__(self, marker): - try: - self._markers = _coerce_parse_result(MARKER.parseString(marker)) - except ParseException as e: - err_str = "Invalid marker: {0!r}, parse error at {1!r}".format( - marker, marker[e.loc:e.loc + 8]) - raise InvalidMarker(err_str) - - def __str__(self): - return _format_marker(self._markers) - - def __repr__(self): - return "<Marker({0!r})>".format(str(self)) - - def evaluate(self, environment=None): - """Evaluate a marker. - - Return the boolean from evaluating the given marker against the - environment. environment is an optional argument to override all or - part of the determined environment. - - The environment is determined from the current Python process. - """ - current_environment = default_environment() - if environment is not None: - current_environment.update(environment) - - return _evaluate_markers(self._markers, current_environment) diff --git a/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyc b/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyc deleted file mode 100644 index eabc13d9265c0a1702a84fc09b9f9082a24595c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13854 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 diff --git a/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/requirements.py b/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/requirements.py deleted file mode 100644 index 5b49341..0000000 --- a/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/requirements.py +++ /dev/null @@ -1,127 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. -from __future__ import absolute_import, division, print_function - -import string -import re - -from setuptools.extern.pyparsing import stringStart, stringEnd, originalTextFor, ParseException -from setuptools.extern.pyparsing import ZeroOrMore, Word, Optional, Regex, Combine -from setuptools.extern.pyparsing import Literal as L # noqa -from setuptools.extern.six.moves.urllib import parse as urlparse - -from .markers import MARKER_EXPR, Marker -from .specifiers import LegacySpecifier, Specifier, SpecifierSet - - -class InvalidRequirement(ValueError): - """ - An invalid requirement was found, users should refer to PEP 508. - """ - - -ALPHANUM = Word(string.ascii_letters + string.digits) - -LBRACKET = L("[").suppress() -RBRACKET = L("]").suppress() -LPAREN = L("(").suppress() -RPAREN = L(")").suppress() -COMMA = L(",").suppress() -SEMICOLON = L(";").suppress() -AT = L("@").suppress() - -PUNCTUATION = Word("-_.") -IDENTIFIER_END = ALPHANUM | (ZeroOrMore(PUNCTUATION) + ALPHANUM) -IDENTIFIER = Combine(ALPHANUM + ZeroOrMore(IDENTIFIER_END)) - -NAME = IDENTIFIER("name") -EXTRA = IDENTIFIER - -URI = Regex(r'[^ ]+')("url") -URL = (AT + URI) - -EXTRAS_LIST = EXTRA + ZeroOrMore(COMMA + EXTRA) -EXTRAS = (LBRACKET + Optional(EXTRAS_LIST) + RBRACKET)("extras") - -VERSION_PEP440 = Regex(Specifier._regex_str, re.VERBOSE | re.IGNORECASE) -VERSION_LEGACY = Regex(LegacySpecifier._regex_str, re.VERBOSE | re.IGNORECASE) - -VERSION_ONE = VERSION_PEP440 ^ VERSION_LEGACY -VERSION_MANY = Combine(VERSION_ONE + ZeroOrMore(COMMA + VERSION_ONE), - joinString=",", adjacent=False)("_raw_spec") -_VERSION_SPEC = Optional(((LPAREN + VERSION_MANY + RPAREN) | VERSION_MANY)) -_VERSION_SPEC.setParseAction(lambda s, l, t: t._raw_spec or '') - -VERSION_SPEC = originalTextFor(_VERSION_SPEC)("specifier") -VERSION_SPEC.setParseAction(lambda s, l, t: t[1]) - -MARKER_EXPR = originalTextFor(MARKER_EXPR())("marker") -MARKER_EXPR.setParseAction( - lambda s, l, t: Marker(s[t._original_start:t._original_end]) -) -MARKER_SEPERATOR = SEMICOLON -MARKER = MARKER_SEPERATOR + MARKER_EXPR - -VERSION_AND_MARKER = VERSION_SPEC + Optional(MARKER) -URL_AND_MARKER = URL + Optional(MARKER) - -NAMED_REQUIREMENT = \ - NAME + Optional(EXTRAS) + (URL_AND_MARKER | VERSION_AND_MARKER) - -REQUIREMENT = stringStart + NAMED_REQUIREMENT + stringEnd - - -class Requirement(object): - """Parse a requirement. - - Parse a given requirement string into its parts, such as name, specifier, - URL, and extras. Raises InvalidRequirement on a badly-formed requirement - string. - """ - - # TODO: Can we test whether something is contained within a requirement? - # If so how do we do that? Do we need to test against the _name_ of - # the thing as well as the version? What about the markers? - # TODO: Can we normalize the name and extra name? - - def __init__(self, requirement_string): - try: - req = REQUIREMENT.parseString(requirement_string) - except ParseException as e: - raise InvalidRequirement( - "Invalid requirement, parse error at \"{0!r}\"".format( - requirement_string[e.loc:e.loc + 8])) - - self.name = req.name - if req.url: - parsed_url = urlparse.urlparse(req.url) - if not (parsed_url.scheme and parsed_url.netloc) or ( - not parsed_url.scheme and not parsed_url.netloc): - raise InvalidRequirement("Invalid URL given") - self.url = req.url - else: - self.url = None - self.extras = set(req.extras.asList() if req.extras else []) - self.specifier = SpecifierSet(req.specifier) - self.marker = req.marker if req.marker else None - - def __str__(self): - parts = [self.name] - - if self.extras: - parts.append("[{0}]".format(",".join(sorted(self.extras)))) - - if self.specifier: - parts.append(str(self.specifier)) - - if self.url: - parts.append("@ {0}".format(self.url)) - - if self.marker: - parts.append("; {0}".format(self.marker)) - - return "".join(parts) - - def __repr__(self): - return "<Requirement({0!r})>".format(str(self)) diff --git a/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/requirements.pyc b/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/requirements.pyc deleted file mode 100644 index 0494575a4593bcafe96afaf8b2eeb4fa3f7f776f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5650 zcmdT|dv_DZ6~8OlvL*cFVexRn;)Ec;FA_o^5Q1!!)Ww$Fkx5{4=yt6gJ1h2~?5+qT z&~qBn(@)WF&@a%_zxqk~A^HXSyLTj8X?yy&D{HQ2?%cU^=gxhNivOIfT>Hb+vo`fV zCH#NzJBzZXMIs+xi$bEvBFCbrKu&?8A~{8}c&<R<2stA{hyExzqtY)@SfXf*oH2^V z$r-1pOir1i3ON<CazrRjkaL2f334VVnj~kEqA7BwD4Hf`+R%*(-3&RiW?Z81Bt@sl zIgRlc`QsFxp=gerIf|;}R1LOF;aQ5#k#mls^W>bT=mI$xFjpZxPx}`6C+KIQw?t2! zcSui=9-+>=0xweaEe>mwo+W>R(C=JgLT5oRlS7#I1T!^+d0#NoLzv5gnHj=-Aeh-9 z%oV|$9KzICCjS&;oU5cE%n8z0d5C^>&ACQ;dVs#hXp#9k>Fea5mQ{<~ca}&`k$;9U z{+!^KNrU+^Rh<>mm<C@6v?L6w&MIjfbCUF`FxBr-)vwCB8_Y?cr_P6@N2&9Xz?-!8 z7AEnr%$@tMbGJxi`WDrlPef)wv*jmdOaCnSGvuEmeH;4}{PVKg9T5WByhBxe8SM^s zf-XKK{V8?sl7B(2&mv2g8O7(DmzDQO-xG>=hAD7%+%|~b6{0!Pb3%0Skmw3IpOMCQ z4yw7&Ojr%~nY`+JP8!-e8b2Tn{bGDW<~7Ej(^}Q3lO7{ohrHuhwMITJZe7gn(xJIM zWUpz}7T{(9yIc)!M)@>=x0fYhFV}7mb(1vD$AR;M7eN*zaXy7XHx1(4-S5Ti9H?e( zgjb#b$a2gav~mxt%7^1d><ix{4Gx0X3wQO){0lH<Ry$sr>Bh^p?lP;|D08X+I66(X z)2$@cIdlIyNqv!HTj;znXG*0Hz-kP=^(5L0VqLS)7sO_e>(mPkf@!<FQNZ)H0u!;g zTXprQq1?uk9hGyq+49ooIz3Xvrati6uUcK*4)z0`%8`yn6IgLLYUw;b3B*SH!V3dm z>F;_$sv{leZD8fYd#`ao<8x~q5oQ2bAk`8vvtI*WvGJ+Lc3}9}=@BFQdoQ#1lV0pE z+PzGtnVo%`^g<sr`#QDr#NKJ_*dMRnUKS?i7<_lG8+(y<T~Vy-Mv31GdB}=$T|a5N zZVg>J0vW87R&dQPyj-um@Y0q2B=oW6$`3DBUVW7A#os@_aqGKy^;UZGR{M7L@{a#Q zx{A+1cV%~_8+4a~ILo~-T*_~39k@Fyna+FNJW0ZAxa+>qv7e+XU9bJzgJ~SB3>`OH z?!Ho|AP1{8<2x%AbJpQE0-p)23A`$BQQ%#H4>GpqC3jh@hmW7J5q$Go``PuJr+R59 zR}TA0y-YOINrJc~1}v85`5mu~`;%LDQ}25>gCVqeF*lZEoo{mzo!15Gz{C(LEw~iR z+ROn+?p3|VJzgWCWdcKi`SDY^oc&(tMSH$?{}zPK(8zf6z!46Wz$X<Yu$e&#IR3f* z`HidbS~<G9jGp>{!4<}#8E|Y&jYYbHX3opuAd+x!cvy}@a@Z<5xZc<1-YvQP0$oCc zHjdmhC+1KpanBtDJ{LZL$jBCRgo6wGA8F__$Zj;m0rY={xvL-;4s$S$pAqkhoOif` zYON@pQI3GD-R$oGk`ZigIPxu5B%%#w4g$oD;d$HS9Ry7T!646U1p7Q&w6k9OTN^=> z{U4)&`7R2#$7*xY_F~^QAz;~7UXba`{?7<*Co$yN^ZfAD(teUgnnUhkd>3X$026rI z>=hhs*oMSl<`FDjono8mz*;QM)o%*)b$o|L@&Y}tP}(Hx4N6&rCTOWM!bGo&)EVtV zXspWih3`)m#TGr`h*M${bOF&Hqx5eC-|dX|hr9>)pqwmI@<-`ZXd?S_A2pHwWq?DE z_bm>%8?zo0=3^9>IZN?IW0X$_^GQno(eHFnbP~lyI*_u4$tKz8StO}788aipSxToZ z#?LZ+pC?LNBvHBiW_BI=>T7>k!HayInYMMBCaLY^_QH>=m(n*20SBFIc4!f<)E48Y zan6twuNuF3yrCLfjpnY5g_Vi&itk4<jAR17SudC55GHN)E>B)$HoOheg{&0Hto<!A zyL4lngIJPGGr@qPJaV0~c_H)nvdtjN70aX8A=EVhQ|5@p>u_J{h9QGOl;A2#cmXYm zLQ94c5quZI9KZM}YI5Bm4szFhf<tBt0Av-dQ`R(K$+}dSu*%j+j86kIT_{^uFluum z9e9j*%U^+j*&v}Fz=q)n;x_36c8ZSVn2y8{xCyF2Gi!XqKr1%uOO)>Q*Pzs4x)Pf> zz5|MJO8+$A3U4b4(fGd+m5E)&Yz=QRMCBnOAI}i+Sa5FD_|luE*!Xev%`<fYV;MfM zF_zw4?y2`NQL6wLQ?t=C7Srt_C8$*%vx#t7V$2RDv-ZV`jGg7F7^pERR-wAhi#YVa zQu6E=8i^@6Vc;l3A!c?OfUF7F!gaKBX!FwAY!%$tp~Naqp~JBe2NaVqH`y;XgwMU9 zY*dpFarM5`Vxmh`2Ln@&v6haZZaB`kZmPRb&hOEenwKoGD8-6WXBf;e;54k(89W3y zI*jy=O-Z!`*&d-~e6&)jG*&)So~<=7=s!jFdwDO#Q$ztpitk&o9UF5uQIN-Y1d1CS zJ|dQpvvnHdg}@;Z!BVlED0Uac=5Inf8=K;-6~9H5_?lEL{Bo19x|uJad-OON@Xdmk z%Te+|XUmASVX&vTWK$pVGG=ND!%Xo*PDz=^ybtS(OwI5FXC?{!a@eoDu%{cG!c59x zj$YOd0yo6d5l<^Qw2v2Zo=GgNZ|?l6-h8|zgRIx>raCh-n`^4R{;07lGios4z_Yni zSB<7{Ql`t=Sl`~-s+-4aV{2o5dvm*qvV*8@QsU0z=KAjA`tAnMe4>qqNR}I4Z1Bst z`A~#ELYY)o-)cyhX*}6gbqPj~)kgpSrsP?fX}Oyltz8kvjLo&D{A}keC(8V)q1Lur z4YSXe&280KuVcuPV5$YFT)b;<-dz0!YP0cWef_CyHK5vV8lk@MLfk0d@nB}F-h67R z?g6H?(^waNpxoi=qAovW{9={R@J;rACTKNw8mhj#-T$pXemjudJz!dIK6DMOutqiF z4x!i_no!(Bcc>;&%fO0)lD&>@=ZanCn7Xr=+dcE^!F_hM%mJ83R-Y&=ST$?Lnkmd# z^ToN+T;U`#`{5rbPFr(;CEzQC)7JUIJmP%Cs#<5PvsiT!?F=e}N`V{r6wel>ivI#V C#t#hu diff --git a/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.py b/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.py deleted file mode 100644 index 7f5a76c..0000000 --- a/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.py +++ /dev/null @@ -1,774 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. -from __future__ import absolute_import, division, print_function - -import abc -import functools -import itertools -import re - -from ._compat import string_types, with_metaclass -from .version import Version, LegacyVersion, parse - - -class InvalidSpecifier(ValueError): - """ - An invalid specifier was found, users should refer to PEP 440. - """ - - -class BaseSpecifier(with_metaclass(abc.ABCMeta, object)): - - @abc.abstractmethod - def __str__(self): - """ - Returns the str representation of this Specifier like object. This - should be representative of the Specifier itself. - """ - - @abc.abstractmethod - def __hash__(self): - """ - Returns a hash value for this Specifier like object. - """ - - @abc.abstractmethod - def __eq__(self, other): - """ - Returns a boolean representing whether or not the two Specifier like - objects are equal. - """ - - @abc.abstractmethod - def __ne__(self, other): - """ - Returns a boolean representing whether or not the two Specifier like - objects are not equal. - """ - - @abc.abstractproperty - def prereleases(self): - """ - Returns whether or not pre-releases as a whole are allowed by this - specifier. - """ - - @prereleases.setter - def prereleases(self, value): - """ - Sets whether or not pre-releases as a whole are allowed by this - specifier. - """ - - @abc.abstractmethod - def contains(self, item, prereleases=None): - """ - Determines if the given item is contained within this specifier. - """ - - @abc.abstractmethod - def filter(self, iterable, prereleases=None): - """ - Takes an iterable of items and filters them so that only items which - are contained within this specifier are allowed in it. - """ - - -class _IndividualSpecifier(BaseSpecifier): - - _operators = {} - - def __init__(self, spec="", prereleases=None): - match = self._regex.search(spec) - if not match: - raise InvalidSpecifier("Invalid specifier: '{0}'".format(spec)) - - self._spec = ( - match.group("operator").strip(), - match.group("version").strip(), - ) - - # Store whether or not this Specifier should accept prereleases - self._prereleases = prereleases - - def __repr__(self): - pre = ( - ", prereleases={0!r}".format(self.prereleases) - if self._prereleases is not None - else "" - ) - - return "<{0}({1!r}{2})>".format( - self.__class__.__name__, - str(self), - pre, - ) - - def __str__(self): - return "{0}{1}".format(*self._spec) - - def __hash__(self): - return hash(self._spec) - - def __eq__(self, other): - if isinstance(other, string_types): - try: - other = self.__class__(other) - except InvalidSpecifier: - return NotImplemented - elif not isinstance(other, self.__class__): - return NotImplemented - - return self._spec == other._spec - - def __ne__(self, other): - if isinstance(other, string_types): - try: - other = self.__class__(other) - except InvalidSpecifier: - return NotImplemented - elif not isinstance(other, self.__class__): - return NotImplemented - - return self._spec != other._spec - - def _get_operator(self, op): - return getattr(self, "_compare_{0}".format(self._operators[op])) - - def _coerce_version(self, version): - if not isinstance(version, (LegacyVersion, Version)): - version = parse(version) - return version - - @property - def operator(self): - return self._spec[0] - - @property - def version(self): - return self._spec[1] - - @property - def prereleases(self): - return self._prereleases - - @prereleases.setter - def prereleases(self, value): - self._prereleases = value - - def __contains__(self, item): - return self.contains(item) - - def contains(self, item, prereleases=None): - # Determine if prereleases are to be allowed or not. - if prereleases is None: - prereleases = self.prereleases - - # Normalize item to a Version or LegacyVersion, this allows us to have - # a shortcut for ``"2.0" in Specifier(">=2") - item = self._coerce_version(item) - - # Determine if we should be supporting prereleases in this specifier - # or not, if we do not support prereleases than we can short circuit - # logic if this version is a prereleases. - if item.is_prerelease and not prereleases: - return False - - # Actually do the comparison to determine if this item is contained - # within this Specifier or not. - return self._get_operator(self.operator)(item, self.version) - - def filter(self, iterable, prereleases=None): - yielded = False - found_prereleases = [] - - kw = {"prereleases": prereleases if prereleases is not None else True} - - # Attempt to iterate over all the values in the iterable and if any of - # them match, yield them. - for version in iterable: - parsed_version = self._coerce_version(version) - - if self.contains(parsed_version, **kw): - # If our version is a prerelease, and we were not set to allow - # prereleases, then we'll store it for later incase nothing - # else matches this specifier. - if (parsed_version.is_prerelease and not - (prereleases or self.prereleases)): - found_prereleases.append(version) - # Either this is not a prerelease, or we should have been - # accepting prereleases from the begining. - else: - yielded = True - yield version - - # Now that we've iterated over everything, determine if we've yielded - # any values, and if we have not and we have any prereleases stored up - # then we will go ahead and yield the prereleases. - if not yielded and found_prereleases: - for version in found_prereleases: - yield version - - -class LegacySpecifier(_IndividualSpecifier): - - _regex_str = ( - r""" - (?P<operator>(==|!=|<=|>=|<|>)) - \s* - (?P<version> - [^,;\s)]* # Since this is a "legacy" specifier, and the version - # string can be just about anything, we match everything - # except for whitespace, a semi-colon for marker support, - # a closing paren since versions can be enclosed in - # them, and a comma since it's a version separator. - ) - """ - ) - - _regex = re.compile( - r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE) - - _operators = { - "==": "equal", - "!=": "not_equal", - "<=": "less_than_equal", - ">=": "greater_than_equal", - "<": "less_than", - ">": "greater_than", - } - - def _coerce_version(self, version): - if not isinstance(version, LegacyVersion): - version = LegacyVersion(str(version)) - return version - - def _compare_equal(self, prospective, spec): - return prospective == self._coerce_version(spec) - - def _compare_not_equal(self, prospective, spec): - return prospective != self._coerce_version(spec) - - def _compare_less_than_equal(self, prospective, spec): - return prospective <= self._coerce_version(spec) - - def _compare_greater_than_equal(self, prospective, spec): - return prospective >= self._coerce_version(spec) - - def _compare_less_than(self, prospective, spec): - return prospective < self._coerce_version(spec) - - def _compare_greater_than(self, prospective, spec): - return prospective > self._coerce_version(spec) - - -def _require_version_compare(fn): - @functools.wraps(fn) - def wrapped(self, prospective, spec): - if not isinstance(prospective, Version): - return False - return fn(self, prospective, spec) - return wrapped - - -class Specifier(_IndividualSpecifier): - - _regex_str = ( - r""" - (?P<operator>(~=|==|!=|<=|>=|<|>|===)) - (?P<version> - (?: - # The identity operators allow for an escape hatch that will - # do an exact string match of the version you wish to install. - # This will not be parsed by PEP 440 and we cannot determine - # any semantic meaning from it. This operator is discouraged - # but included entirely as an escape hatch. - (?<====) # Only match for the identity operator - \s* - [^\s]* # We just match everything, except for whitespace - # since we are only testing for strict identity. - ) - | - (?: - # The (non)equality operators allow for wild card and local - # versions to be specified so we have to define these two - # operators separately to enable that. - (?<===|!=) # Only match for equals and not equals - - \s* - v? - (?:[0-9]+!)? # epoch - [0-9]+(?:\.[0-9]+)* # release - (?: # pre release - [-_\.]? - (a|b|c|rc|alpha|beta|pre|preview) - [-_\.]? - [0-9]* - )? - (?: # post release - (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) - )? - - # You cannot use a wild card and a dev or local version - # together so group them with a | and make them optional. - (?: - (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release - (?:\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*)? # local - | - \.\* # Wild card syntax of .* - )? - ) - | - (?: - # The compatible operator requires at least two digits in the - # release segment. - (?<=~=) # Only match for the compatible operator - - \s* - v? - (?:[0-9]+!)? # epoch - [0-9]+(?:\.[0-9]+)+ # release (We have a + instead of a *) - (?: # pre release - [-_\.]? - (a|b|c|rc|alpha|beta|pre|preview) - [-_\.]? - [0-9]* - )? - (?: # post release - (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) - )? - (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release - ) - | - (?: - # All other operators only allow a sub set of what the - # (non)equality operators do. Specifically they do not allow - # local versions to be specified nor do they allow the prefix - # matching wild cards. - (?<!==|!=|~=) # We have special cases for these - # operators so we want to make sure they - # don't match here. - - \s* - v? - (?:[0-9]+!)? # epoch - [0-9]+(?:\.[0-9]+)* # release - (?: # pre release - [-_\.]? - (a|b|c|rc|alpha|beta|pre|preview) - [-_\.]? - [0-9]* - )? - (?: # post release - (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) - )? - (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release - ) - ) - """ - ) - - _regex = re.compile( - r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE) - - _operators = { - "~=": "compatible", - "==": "equal", - "!=": "not_equal", - "<=": "less_than_equal", - ">=": "greater_than_equal", - "<": "less_than", - ">": "greater_than", - "===": "arbitrary", - } - - @_require_version_compare - def _compare_compatible(self, prospective, spec): - # Compatible releases have an equivalent combination of >= and ==. That - # is that ~=2.2 is equivalent to >=2.2,==2.*. This allows us to - # implement this in terms of the other specifiers instead of - # implementing it ourselves. The only thing we need to do is construct - # the other specifiers. - - # We want everything but the last item in the version, but we want to - # ignore post and dev releases and we want to treat the pre-release as - # it's own separate segment. - prefix = ".".join( - list( - itertools.takewhile( - lambda x: (not x.startswith("post") and not - x.startswith("dev")), - _version_split(spec), - ) - )[:-1] - ) - - # Add the prefix notation to the end of our string - prefix += ".*" - - return (self._get_operator(">=")(prospective, spec) and - self._get_operator("==")(prospective, prefix)) - - @_require_version_compare - def _compare_equal(self, prospective, spec): - # We need special logic to handle prefix matching - if spec.endswith(".*"): - # In the case of prefix matching we want to ignore local segment. - prospective = Version(prospective.public) - # Split the spec out by dots, and pretend that there is an implicit - # dot in between a release segment and a pre-release segment. - spec = _version_split(spec[:-2]) # Remove the trailing .* - - # Split the prospective version out by dots, and pretend that there - # is an implicit dot in between a release segment and a pre-release - # segment. - prospective = _version_split(str(prospective)) - - # Shorten the prospective version to be the same length as the spec - # so that we can determine if the specifier is a prefix of the - # prospective version or not. - prospective = prospective[:len(spec)] - - # Pad out our two sides with zeros so that they both equal the same - # length. - spec, prospective = _pad_version(spec, prospective) - else: - # Convert our spec string into a Version - spec = Version(spec) - - # If the specifier does not have a local segment, then we want to - # act as if the prospective version also does not have a local - # segment. - if not spec.local: - prospective = Version(prospective.public) - - return prospective == spec - - @_require_version_compare - def _compare_not_equal(self, prospective, spec): - return not self._compare_equal(prospective, spec) - - @_require_version_compare - def _compare_less_than_equal(self, prospective, spec): - return prospective <= Version(spec) - - @_require_version_compare - def _compare_greater_than_equal(self, prospective, spec): - return prospective >= Version(spec) - - @_require_version_compare - def _compare_less_than(self, prospective, spec): - # Convert our spec to a Version instance, since we'll want to work with - # it as a version. - spec = Version(spec) - - # Check to see if the prospective version is less than the spec - # version. If it's not we can short circuit and just return False now - # instead of doing extra unneeded work. - if not prospective < spec: - return False - - # This special case is here so that, unless the specifier itself - # includes is a pre-release version, that we do not accept pre-release - # versions for the version mentioned in the specifier (e.g. <3.1 should - # not match 3.1.dev0, but should match 3.0.dev0). - if not spec.is_prerelease and prospective.is_prerelease: - if Version(prospective.base_version) == Version(spec.base_version): - return False - - # If we've gotten to here, it means that prospective version is both - # less than the spec version *and* it's not a pre-release of the same - # version in the spec. - return True - - @_require_version_compare - def _compare_greater_than(self, prospective, spec): - # Convert our spec to a Version instance, since we'll want to work with - # it as a version. - spec = Version(spec) - - # Check to see if the prospective version is greater than the spec - # version. If it's not we can short circuit and just return False now - # instead of doing extra unneeded work. - if not prospective > spec: - return False - - # This special case is here so that, unless the specifier itself - # includes is a post-release version, that we do not accept - # post-release versions for the version mentioned in the specifier - # (e.g. >3.1 should not match 3.0.post0, but should match 3.2.post0). - if not spec.is_postrelease and prospective.is_postrelease: - if Version(prospective.base_version) == Version(spec.base_version): - return False - - # Ensure that we do not allow a local version of the version mentioned - # in the specifier, which is techincally greater than, to match. - if prospective.local is not None: - if Version(prospective.base_version) == Version(spec.base_version): - return False - - # If we've gotten to here, it means that prospective version is both - # greater than the spec version *and* it's not a pre-release of the - # same version in the spec. - return True - - def _compare_arbitrary(self, prospective, spec): - return str(prospective).lower() == str(spec).lower() - - @property - def prereleases(self): - # If there is an explicit prereleases set for this, then we'll just - # blindly use that. - if self._prereleases is not None: - return self._prereleases - - # Look at all of our specifiers and determine if they are inclusive - # operators, and if they are if they are including an explicit - # prerelease. - operator, version = self._spec - if operator in ["==", ">=", "<=", "~=", "==="]: - # The == specifier can include a trailing .*, if it does we - # want to remove before parsing. - if operator == "==" and version.endswith(".*"): - version = version[:-2] - - # Parse the version, and if it is a pre-release than this - # specifier allows pre-releases. - if parse(version).is_prerelease: - return True - - return False - - @prereleases.setter - def prereleases(self, value): - self._prereleases = value - - -_prefix_regex = re.compile(r"^([0-9]+)((?:a|b|c|rc)[0-9]+)$") - - -def _version_split(version): - result = [] - for item in version.split("."): - match = _prefix_regex.search(item) - if match: - result.extend(match.groups()) - else: - result.append(item) - return result - - -def _pad_version(left, right): - left_split, right_split = [], [] - - # Get the release segment of our versions - left_split.append(list(itertools.takewhile(lambda x: x.isdigit(), left))) - right_split.append(list(itertools.takewhile(lambda x: x.isdigit(), right))) - - # Get the rest of our versions - left_split.append(left[len(left_split[0]):]) - right_split.append(right[len(right_split[0]):]) - - # Insert our padding - left_split.insert( - 1, - ["0"] * max(0, len(right_split[0]) - len(left_split[0])), - ) - right_split.insert( - 1, - ["0"] * max(0, len(left_split[0]) - len(right_split[0])), - ) - - return ( - list(itertools.chain(*left_split)), - list(itertools.chain(*right_split)), - ) - - -class SpecifierSet(BaseSpecifier): - - def __init__(self, specifiers="", prereleases=None): - # Split on , to break each indidivual specifier into it's own item, and - # strip each item to remove leading/trailing whitespace. - specifiers = [s.strip() for s in specifiers.split(",") if s.strip()] - - # Parsed each individual specifier, attempting first to make it a - # Specifier and falling back to a LegacySpecifier. - parsed = set() - for specifier in specifiers: - try: - parsed.add(Specifier(specifier)) - except InvalidSpecifier: - parsed.add(LegacySpecifier(specifier)) - - # Turn our parsed specifiers into a frozen set and save them for later. - self._specs = frozenset(parsed) - - # Store our prereleases value so we can use it later to determine if - # we accept prereleases or not. - self._prereleases = prereleases - - def __repr__(self): - pre = ( - ", prereleases={0!r}".format(self.prereleases) - if self._prereleases is not None - else "" - ) - - return "<SpecifierSet({0!r}{1})>".format(str(self), pre) - - def __str__(self): - return ",".join(sorted(str(s) for s in self._specs)) - - def __hash__(self): - return hash(self._specs) - - def __and__(self, other): - if isinstance(other, string_types): - other = SpecifierSet(other) - elif not isinstance(other, SpecifierSet): - return NotImplemented - - specifier = SpecifierSet() - specifier._specs = frozenset(self._specs | other._specs) - - if self._prereleases is None and other._prereleases is not None: - specifier._prereleases = other._prereleases - elif self._prereleases is not None and other._prereleases is None: - specifier._prereleases = self._prereleases - elif self._prereleases == other._prereleases: - specifier._prereleases = self._prereleases - else: - raise ValueError( - "Cannot combine SpecifierSets with True and False prerelease " - "overrides." - ) - - return specifier - - def __eq__(self, other): - if isinstance(other, string_types): - other = SpecifierSet(other) - elif isinstance(other, _IndividualSpecifier): - other = SpecifierSet(str(other)) - elif not isinstance(other, SpecifierSet): - return NotImplemented - - return self._specs == other._specs - - def __ne__(self, other): - if isinstance(other, string_types): - other = SpecifierSet(other) - elif isinstance(other, _IndividualSpecifier): - other = SpecifierSet(str(other)) - elif not isinstance(other, SpecifierSet): - return NotImplemented - - return self._specs != other._specs - - def __len__(self): - return len(self._specs) - - def __iter__(self): - return iter(self._specs) - - @property - def prereleases(self): - # If we have been given an explicit prerelease modifier, then we'll - # pass that through here. - if self._prereleases is not None: - return self._prereleases - - # If we don't have any specifiers, and we don't have a forced value, - # then we'll just return None since we don't know if this should have - # pre-releases or not. - if not self._specs: - return None - - # Otherwise we'll see if any of the given specifiers accept - # prereleases, if any of them do we'll return True, otherwise False. - return any(s.prereleases for s in self._specs) - - @prereleases.setter - def prereleases(self, value): - self._prereleases = value - - def __contains__(self, item): - return self.contains(item) - - def contains(self, item, prereleases=None): - # Ensure that our item is a Version or LegacyVersion instance. - if not isinstance(item, (LegacyVersion, Version)): - item = parse(item) - - # Determine if we're forcing a prerelease or not, if we're not forcing - # one for this particular filter call, then we'll use whatever the - # SpecifierSet thinks for whether or not we should support prereleases. - if prereleases is None: - prereleases = self.prereleases - - # We can determine if we're going to allow pre-releases by looking to - # see if any of the underlying items supports them. If none of them do - # and this item is a pre-release then we do not allow it and we can - # short circuit that here. - # Note: This means that 1.0.dev1 would not be contained in something - # like >=1.0.devabc however it would be in >=1.0.debabc,>0.0.dev0 - if not prereleases and item.is_prerelease: - return False - - # We simply dispatch to the underlying specs here to make sure that the - # given version is contained within all of them. - # Note: This use of all() here means that an empty set of specifiers - # will always return True, this is an explicit design decision. - return all( - s.contains(item, prereleases=prereleases) - for s in self._specs - ) - - def filter(self, iterable, prereleases=None): - # Determine if we're forcing a prerelease or not, if we're not forcing - # one for this particular filter call, then we'll use whatever the - # SpecifierSet thinks for whether or not we should support prereleases. - if prereleases is None: - prereleases = self.prereleases - - # If we have any specifiers, then we want to wrap our iterable in the - # filter method for each one, this will act as a logical AND amongst - # each specifier. - if self._specs: - for spec in self._specs: - iterable = spec.filter(iterable, prereleases=bool(prereleases)) - return iterable - # If we do not have any specifiers, then we need to have a rough filter - # which will filter out any pre-releases, unless there are no final - # releases, and which will filter out LegacyVersion in general. - else: - filtered = [] - found_prereleases = [] - - for item in iterable: - # Ensure that we some kind of Version class for this item. - if not isinstance(item, (LegacyVersion, Version)): - parsed_version = parse(item) - else: - parsed_version = item - - # Filter out any item which is parsed as a LegacyVersion - if isinstance(parsed_version, LegacyVersion): - continue - - # Store any item which is a pre-release for later unless we've - # already found a final version or we are accepting prereleases - if parsed_version.is_prerelease and not prereleases: - if not filtered: - found_prereleases.append(item) - else: - filtered.append(item) - - # If we've found no items except for pre-releases, then we'll go - # ahead and use the pre-releases - if not filtered and found_prereleases and prereleases is None: - return found_prereleases - - return filtered diff --git a/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyc b/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyc deleted file mode 100644 index ddc9065f56aeac660a0b473dc47ce75c442c7786..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29161 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 HwH^L%w3@pP diff --git a/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/utils.py b/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/utils.py deleted file mode 100644 index 942387c..0000000 --- a/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/utils.py +++ /dev/null @@ -1,14 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. -from __future__ import absolute_import, division, print_function - -import re - - -_canonicalize_regex = re.compile(r"[-_.]+") - - -def canonicalize_name(name): - # This is taken from PEP 503. - return _canonicalize_regex.sub("-", name).lower() diff --git a/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/utils.pyc b/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/utils.pyc deleted file mode 100644 index ff9838de9474c30c19d677fe5c6ed79f11dfa6cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 702 zcmd5)T}vG?5S{%{i&&);eCiKaTCPzl7YkAf?Q5lM`?N)3?rvOi%_cFKy<RWAl-qyY zKhPO1RR4it_srSJWagZ(#h;hkZ-4EcxA1S}6hB>LkiHP<=*hqW3>h>T3^_D83<Wd= zWW1MyEukqvmoVReu7EYwZ9-SVZ-8ct3%*wy)W~r6svy8U0yRtCj;N&>f{%zVDA$>V zNya<erH>GeLwPy67AbX>HYxXWA`i~rwHZ-<x!GqHx=#cF<{4|f16b!U&tVNTn$4Uc zS5F>>za}bM<-9YkvSy`a)V*FJH%sFTS*!IoI#zrLO9H0`T~UO4NHhQh$y+GYVxgkA z^tRJ6iPcivzK=6^b9FSmc8Ak=JZ(?X@<X?ZhqU@2eu!Yg#JGgY+6f+g?d3O-G>!qi zx9KsJ3+*}|MNsXP>W%Bgh{mRaaEq@<z!L{7aEFqK-9ldRW#Tr0qzl9`YAI{pso7G^ rMaU2}Zc%9c5RBC|Tdn!%f3MHPFpD}Jd^cMCkyYOR3~%zCVz2lMdugn& diff --git a/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.py b/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.py deleted file mode 100644 index 83b5ee8..0000000 --- a/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.py +++ /dev/null @@ -1,393 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. -from __future__ import absolute_import, division, print_function - -import collections -import itertools -import re - -from ._structures import Infinity - - -__all__ = [ - "parse", "Version", "LegacyVersion", "InvalidVersion", "VERSION_PATTERN" -] - - -_Version = collections.namedtuple( - "_Version", - ["epoch", "release", "dev", "pre", "post", "local"], -) - - -def parse(version): - """ - Parse the given version string and return either a :class:`Version` object - or a :class:`LegacyVersion` object depending on if the given version is - a valid PEP 440 version or a legacy version. - """ - try: - return Version(version) - except InvalidVersion: - return LegacyVersion(version) - - -class InvalidVersion(ValueError): - """ - An invalid version was found, users should refer to PEP 440. - """ - - -class _BaseVersion(object): - - def __hash__(self): - return hash(self._key) - - def __lt__(self, other): - return self._compare(other, lambda s, o: s < o) - - def __le__(self, other): - return self._compare(other, lambda s, o: s <= o) - - def __eq__(self, other): - return self._compare(other, lambda s, o: s == o) - - def __ge__(self, other): - return self._compare(other, lambda s, o: s >= o) - - def __gt__(self, other): - return self._compare(other, lambda s, o: s > o) - - def __ne__(self, other): - return self._compare(other, lambda s, o: s != o) - - def _compare(self, other, method): - if not isinstance(other, _BaseVersion): - return NotImplemented - - return method(self._key, other._key) - - -class LegacyVersion(_BaseVersion): - - def __init__(self, version): - self._version = str(version) - self._key = _legacy_cmpkey(self._version) - - def __str__(self): - return self._version - - def __repr__(self): - return "<LegacyVersion({0})>".format(repr(str(self))) - - @property - def public(self): - return self._version - - @property - def base_version(self): - return self._version - - @property - def local(self): - return None - - @property - def is_prerelease(self): - return False - - @property - def is_postrelease(self): - return False - - -_legacy_version_component_re = re.compile( - r"(\d+ | [a-z]+ | \.| -)", re.VERBOSE, -) - -_legacy_version_replacement_map = { - "pre": "c", "preview": "c", "-": "final-", "rc": "c", "dev": "@", -} - - -def _parse_version_parts(s): - for part in _legacy_version_component_re.split(s): - part = _legacy_version_replacement_map.get(part, part) - - if not part or part == ".": - continue - - if part[:1] in "0123456789": - # pad for numeric comparison - yield part.zfill(8) - else: - yield "*" + part - - # ensure that alpha/beta/candidate are before final - yield "*final" - - -def _legacy_cmpkey(version): - # We hardcode an epoch of -1 here. A PEP 440 version can only have a epoch - # greater than or equal to 0. This will effectively put the LegacyVersion, - # which uses the defacto standard originally implemented by setuptools, - # as before all PEP 440 versions. - epoch = -1 - - # This scheme is taken from pkg_resources.parse_version setuptools prior to - # it's adoption of the packaging library. - parts = [] - for part in _parse_version_parts(version.lower()): - if part.startswith("*"): - # remove "-" before a prerelease tag - if part < "*final": - while parts and parts[-1] == "*final-": - parts.pop() - - # remove trailing zeros from each series of numeric parts - while parts and parts[-1] == "00000000": - parts.pop() - - parts.append(part) - parts = tuple(parts) - - return epoch, parts - -# Deliberately not anchored to the start and end of the string, to make it -# easier for 3rd party code to reuse -VERSION_PATTERN = r""" - v? - (?: - (?:(?P<epoch>[0-9]+)!)? # epoch - (?P<release>[0-9]+(?:\.[0-9]+)*) # release segment - (?P<pre> # pre-release - [-_\.]? - (?P<pre_l>(a|b|c|rc|alpha|beta|pre|preview)) - [-_\.]? - (?P<pre_n>[0-9]+)? - )? - (?P<post> # post release - (?:-(?P<post_n1>[0-9]+)) - | - (?: - [-_\.]? - (?P<post_l>post|rev|r) - [-_\.]? - (?P<post_n2>[0-9]+)? - ) - )? - (?P<dev> # dev release - [-_\.]? - (?P<dev_l>dev) - [-_\.]? - (?P<dev_n>[0-9]+)? - )? - ) - (?:\+(?P<local>[a-z0-9]+(?:[-_\.][a-z0-9]+)*))? # local version -""" - - -class Version(_BaseVersion): - - _regex = re.compile( - r"^\s*" + VERSION_PATTERN + r"\s*$", - re.VERBOSE | re.IGNORECASE, - ) - - def __init__(self, version): - # Validate the version and parse it into pieces - match = self._regex.search(version) - if not match: - raise InvalidVersion("Invalid version: '{0}'".format(version)) - - # Store the parsed out pieces of the version - self._version = _Version( - epoch=int(match.group("epoch")) if match.group("epoch") else 0, - release=tuple(int(i) for i in match.group("release").split(".")), - pre=_parse_letter_version( - match.group("pre_l"), - match.group("pre_n"), - ), - post=_parse_letter_version( - match.group("post_l"), - match.group("post_n1") or match.group("post_n2"), - ), - dev=_parse_letter_version( - match.group("dev_l"), - match.group("dev_n"), - ), - local=_parse_local_version(match.group("local")), - ) - - # Generate a key which will be used for sorting - self._key = _cmpkey( - self._version.epoch, - self._version.release, - self._version.pre, - self._version.post, - self._version.dev, - self._version.local, - ) - - def __repr__(self): - return "<Version({0})>".format(repr(str(self))) - - def __str__(self): - parts = [] - - # Epoch - if self._version.epoch != 0: - parts.append("{0}!".format(self._version.epoch)) - - # Release segment - parts.append(".".join(str(x) for x in self._version.release)) - - # Pre-release - if self._version.pre is not None: - parts.append("".join(str(x) for x in self._version.pre)) - - # Post-release - if self._version.post is not None: - parts.append(".post{0}".format(self._version.post[1])) - - # Development release - if self._version.dev is not None: - parts.append(".dev{0}".format(self._version.dev[1])) - - # Local version segment - if self._version.local is not None: - parts.append( - "+{0}".format(".".join(str(x) for x in self._version.local)) - ) - - return "".join(parts) - - @property - def public(self): - return str(self).split("+", 1)[0] - - @property - def base_version(self): - parts = [] - - # Epoch - if self._version.epoch != 0: - parts.append("{0}!".format(self._version.epoch)) - - # Release segment - parts.append(".".join(str(x) for x in self._version.release)) - - return "".join(parts) - - @property - def local(self): - version_string = str(self) - if "+" in version_string: - return version_string.split("+", 1)[1] - - @property - def is_prerelease(self): - return bool(self._version.dev or self._version.pre) - - @property - def is_postrelease(self): - return bool(self._version.post) - - -def _parse_letter_version(letter, number): - if letter: - # We consider there to be an implicit 0 in a pre-release if there is - # not a numeral associated with it. - if number is None: - number = 0 - - # We normalize any letters to their lower case form - letter = letter.lower() - - # We consider some words to be alternate spellings of other words and - # in those cases we want to normalize the spellings to our preferred - # spelling. - if letter == "alpha": - letter = "a" - elif letter == "beta": - letter = "b" - elif letter in ["c", "pre", "preview"]: - letter = "rc" - elif letter in ["rev", "r"]: - letter = "post" - - return letter, int(number) - if not letter and number: - # We assume if we are given a number, but we are not given a letter - # then this is using the implicit post release syntax (e.g. 1.0-1) - letter = "post" - - return letter, int(number) - - -_local_version_seperators = re.compile(r"[\._-]") - - -def _parse_local_version(local): - """ - Takes a string like abc.1.twelve and turns it into ("abc", 1, "twelve"). - """ - if local is not None: - return tuple( - part.lower() if not part.isdigit() else int(part) - for part in _local_version_seperators.split(local) - ) - - -def _cmpkey(epoch, release, pre, post, dev, local): - # When we compare a release version, we want to compare it with all of the - # trailing zeros removed. So we'll use a reverse the list, drop all the now - # leading zeros until we come to something non zero, then take the rest - # re-reverse it back into the correct order and make it a tuple and use - # that for our sorting key. - release = tuple( - reversed(list( - itertools.dropwhile( - lambda x: x == 0, - reversed(release), - ) - )) - ) - - # We need to "trick" the sorting algorithm to put 1.0.dev0 before 1.0a0. - # We'll do this by abusing the pre segment, but we _only_ want to do this - # if there is not a pre or a post segment. If we have one of those then - # the normal sorting rules will handle this case correctly. - if pre is None and post is None and dev is not None: - pre = -Infinity - # Versions without a pre-release (except as noted above) should sort after - # those with one. - elif pre is None: - pre = Infinity - - # Versions without a post segment should sort before those with one. - if post is None: - post = -Infinity - - # Versions without a development segment should sort after those with one. - if dev is None: - dev = Infinity - - if local is None: - # Versions without a local segment should sort before those with one. - local = -Infinity - else: - # Versions with a local segment need that segment parsed to implement - # the sorting rules in PEP440. - # - Alpha numeric segments sort before numeric segments - # - Alpha numeric segments sort lexicographically - # - Numeric segments sort numerically - # - Shorter versions sort before longer versions when the prefixes - # match exactly - local = tuple( - (i, "") if isinstance(i, int) else (-Infinity, i) - for i in local - ) - - return epoch, release, pre, post, dev, local diff --git a/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyc b/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyc deleted file mode 100644 index 958841e1bd20c3bdd3b32ee90b3afe864e127234..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17101 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 diff --git a/venv/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.py b/venv/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.py deleted file mode 100644 index cf75e1e..0000000 --- a/venv/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.py +++ /dev/null @@ -1,5742 +0,0 @@ -# module pyparsing.py -# -# Copyright (c) 2003-2018 Paul T. McGuire -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be -# included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__doc__ = \ -""" -pyparsing module - Classes and methods to define and execute parsing grammars -============================================================================= - -The pyparsing module is an alternative approach to creating and executing simple grammars, -vs. the traditional lex/yacc approach, or the use of regular expressions. With pyparsing, you -don't need to learn a new syntax for defining grammars or matching expressions - the parsing module -provides a library of classes that you use to construct the grammar directly in Python. - -Here is a program to parse "Hello, World!" (or any greeting of the form -C{"<salutation>, <addressee>!"}), built up using L{Word}, L{Literal}, and L{And} elements -(L{'+'<ParserElement.__add__>} operator gives L{And} expressions, strings are auto-converted to -L{Literal} expressions):: - - from pyparsing import Word, alphas - - # define grammar of a greeting - greet = Word(alphas) + "," + Word(alphas) + "!" - - hello = "Hello, World!" - print (hello, "->", greet.parseString(hello)) - -The program outputs the following:: - - Hello, World! -> ['Hello', ',', 'World', '!'] - -The Python representation of the grammar is quite readable, owing to the self-explanatory -class names, and the use of '+', '|' and '^' operators. - -The L{ParseResults} object returned from L{ParserElement.parseString<ParserElement.parseString>} can be accessed as a nested list, a dictionary, or an -object with named attributes. - -The pyparsing module handles some of the problems that are typically vexing when writing text parsers: - - extra or missing whitespace (the above program will also handle "Hello,World!", "Hello , World !", etc.) - - quoted strings - - embedded comments - - -Getting Started - ------------------ -Visit the classes L{ParserElement} and L{ParseResults} to see the base classes that most other pyparsing -classes inherit from. Use the docstrings for examples of how to: - - construct literal match expressions from L{Literal} and L{CaselessLiteral} classes - - construct character word-group expressions using the L{Word} class - - see how to create repetitive expressions using L{ZeroOrMore} and L{OneOrMore} classes - - use L{'+'<And>}, L{'|'<MatchFirst>}, L{'^'<Or>}, and L{'&'<Each>} operators to combine simple expressions into more complex ones - - associate names with your parsed results using L{ParserElement.setResultsName} - - find some helpful expression short-cuts like L{delimitedList} and L{oneOf} - - find more useful common expressions in the L{pyparsing_common} namespace class -""" - -__version__ = "2.2.1" -__versionTime__ = "18 Sep 2018 00:49 UTC" -__author__ = "Paul McGuire <ptmcg@users.sourceforge.net>" - -import string -from weakref import ref as wkref -import copy -import sys -import warnings -import re -import sre_constants -import collections -import pprint -import traceback -import types -from datetime import datetime - -try: - from _thread import RLock -except ImportError: - from threading import RLock - -try: - # Python 3 - from collections.abc import Iterable - from collections.abc import MutableMapping -except ImportError: - # Python 2.7 - from collections import Iterable - from collections import MutableMapping - -try: - from collections import OrderedDict as _OrderedDict -except ImportError: - try: - from ordereddict import OrderedDict as _OrderedDict - except ImportError: - _OrderedDict = None - -#~ sys.stderr.write( "testing pyparsing module, version %s, %s\n" % (__version__,__versionTime__ ) ) - -__all__ = [ -'And', 'CaselessKeyword', 'CaselessLiteral', 'CharsNotIn', 'Combine', 'Dict', 'Each', 'Empty', -'FollowedBy', 'Forward', 'GoToColumn', 'Group', 'Keyword', 'LineEnd', 'LineStart', 'Literal', -'MatchFirst', 'NoMatch', 'NotAny', 'OneOrMore', 'OnlyOnce', 'Optional', 'Or', -'ParseBaseException', 'ParseElementEnhance', 'ParseException', 'ParseExpression', 'ParseFatalException', -'ParseResults', 'ParseSyntaxException', 'ParserElement', 'QuotedString', 'RecursiveGrammarException', -'Regex', 'SkipTo', 'StringEnd', 'StringStart', 'Suppress', 'Token', 'TokenConverter', -'White', 'Word', 'WordEnd', 'WordStart', 'ZeroOrMore', -'alphanums', 'alphas', 'alphas8bit', 'anyCloseTag', 'anyOpenTag', 'cStyleComment', 'col', -'commaSeparatedList', 'commonHTMLEntity', 'countedArray', 'cppStyleComment', 'dblQuotedString', -'dblSlashComment', 'delimitedList', 'dictOf', 'downcaseTokens', 'empty', 'hexnums', -'htmlComment', 'javaStyleComment', 'line', 'lineEnd', 'lineStart', 'lineno', -'makeHTMLTags', 'makeXMLTags', 'matchOnlyAtCol', 'matchPreviousExpr', 'matchPreviousLiteral', -'nestedExpr', 'nullDebugAction', 'nums', 'oneOf', 'opAssoc', 'operatorPrecedence', 'printables', -'punc8bit', 'pythonStyleComment', 'quotedString', 'removeQuotes', 'replaceHTMLEntity', -'replaceWith', 'restOfLine', 'sglQuotedString', 'srange', 'stringEnd', -'stringStart', 'traceParseAction', 'unicodeString', 'upcaseTokens', 'withAttribute', -'indentedBlock', 'originalTextFor', 'ungroup', 'infixNotation','locatedExpr', 'withClass', -'CloseMatch', 'tokenMap', 'pyparsing_common', -] - -system_version = tuple(sys.version_info)[:3] -PY_3 = system_version[0] == 3 -if PY_3: - _MAX_INT = sys.maxsize - basestring = str - unichr = chr - _ustr = str - - # build list of single arg builtins, that can be used as parse actions - singleArgBuiltins = [sum, len, sorted, reversed, list, tuple, set, any, all, min, max] - -else: - _MAX_INT = sys.maxint - range = xrange - - def _ustr(obj): - """Drop-in replacement for str(obj) that tries to be Unicode friendly. It first tries - str(obj). If that fails with a UnicodeEncodeError, then it tries unicode(obj). It - then < returns the unicode object | encodes it with the default encoding | ... >. - """ - if isinstance(obj,unicode): - return obj - - try: - # If this works, then _ustr(obj) has the same behaviour as str(obj), so - # it won't break any existing code. - return str(obj) - - except UnicodeEncodeError: - # Else encode it - ret = unicode(obj).encode(sys.getdefaultencoding(), 'xmlcharrefreplace') - xmlcharref = Regex(r'&#\d+;') - xmlcharref.setParseAction(lambda t: '\\u' + hex(int(t[0][2:-1]))[2:]) - return xmlcharref.transformString(ret) - - # build list of single arg builtins, tolerant of Python version, that can be used as parse actions - singleArgBuiltins = [] - import __builtin__ - for fname in "sum len sorted reversed list tuple set any all min max".split(): - try: - singleArgBuiltins.append(getattr(__builtin__,fname)) - except AttributeError: - continue - -_generatorType = type((y for y in range(1))) - -def _xml_escape(data): - """Escape &, <, >, ", ', etc. in a string of data.""" - - # ampersand must be replaced first - from_symbols = '&><"\'' - to_symbols = ('&'+s+';' for s in "amp gt lt quot apos".split()) - for from_,to_ in zip(from_symbols, to_symbols): - data = data.replace(from_, to_) - return data - -class _Constants(object): - pass - -alphas = string.ascii_uppercase + string.ascii_lowercase -nums = "0123456789" -hexnums = nums + "ABCDEFabcdef" -alphanums = alphas + nums -_bslash = chr(92) -printables = "".join(c for c in string.printable if c not in string.whitespace) - -class ParseBaseException(Exception): - """base exception class for all parsing runtime exceptions""" - # Performance tuning: we construct a *lot* of these, so keep this - # constructor as small and fast as possible - def __init__( self, pstr, loc=0, msg=None, elem=None ): - self.loc = loc - if msg is None: - self.msg = pstr - self.pstr = "" - else: - self.msg = msg - self.pstr = pstr - self.parserElement = elem - self.args = (pstr, loc, msg) - - @classmethod - def _from_exception(cls, pe): - """ - internal factory method to simplify creating one type of ParseException - from another - avoids having __init__ signature conflicts among subclasses - """ - return cls(pe.pstr, pe.loc, pe.msg, pe.parserElement) - - def __getattr__( self, aname ): - """supported attributes by name are: - - lineno - returns the line number of the exception text - - col - returns the column number of the exception text - - line - returns the line containing the exception text - """ - if( aname == "lineno" ): - return lineno( self.loc, self.pstr ) - elif( aname in ("col", "column") ): - return col( self.loc, self.pstr ) - elif( aname == "line" ): - return line( self.loc, self.pstr ) - else: - raise AttributeError(aname) - - def __str__( self ): - return "%s (at char %d), (line:%d, col:%d)" % \ - ( self.msg, self.loc, self.lineno, self.column ) - def __repr__( self ): - return _ustr(self) - def markInputline( self, markerString = ">!<" ): - """Extracts the exception line from the input string, and marks - the location of the exception with a special symbol. - """ - line_str = self.line - line_column = self.column - 1 - if markerString: - line_str = "".join((line_str[:line_column], - markerString, line_str[line_column:])) - return line_str.strip() - def __dir__(self): - return "lineno col line".split() + dir(type(self)) - -class ParseException(ParseBaseException): - """ - Exception thrown when parse expressions don't match class; - supported attributes by name are: - - lineno - returns the line number of the exception text - - col - returns the column number of the exception text - - line - returns the line containing the exception text - - Example:: - try: - Word(nums).setName("integer").parseString("ABC") - except ParseException as pe: - print(pe) - print("column: {}".format(pe.col)) - - prints:: - Expected integer (at char 0), (line:1, col:1) - column: 1 - """ - pass - -class ParseFatalException(ParseBaseException): - """user-throwable exception thrown when inconsistent parse content - is found; stops all parsing immediately""" - pass - -class ParseSyntaxException(ParseFatalException): - """just like L{ParseFatalException}, but thrown internally when an - L{ErrorStop<And._ErrorStop>} ('-' operator) indicates that parsing is to stop - immediately because an unbacktrackable syntax error has been found""" - pass - -#~ class ReparseException(ParseBaseException): - #~ """Experimental class - parse actions can raise this exception to cause - #~ pyparsing to reparse the input string: - #~ - with a modified input string, and/or - #~ - with a modified start location - #~ Set the values of the ReparseException in the constructor, and raise the - #~ exception in a parse action to cause pyparsing to use the new string/location. - #~ Setting the values as None causes no change to be made. - #~ """ - #~ def __init_( self, newstring, restartLoc ): - #~ self.newParseText = newstring - #~ self.reparseLoc = restartLoc - -class RecursiveGrammarException(Exception): - """exception thrown by L{ParserElement.validate} if the grammar could be improperly recursive""" - def __init__( self, parseElementList ): - self.parseElementTrace = parseElementList - - def __str__( self ): - return "RecursiveGrammarException: %s" % self.parseElementTrace - -class _ParseResultsWithOffset(object): - def __init__(self,p1,p2): - self.tup = (p1,p2) - def __getitem__(self,i): - return self.tup[i] - def __repr__(self): - return repr(self.tup[0]) - def setOffset(self,i): - self.tup = (self.tup[0],i) - -class ParseResults(object): - """ - Structured parse results, to provide multiple means of access to the parsed data: - - as a list (C{len(results)}) - - by list index (C{results[0], results[1]}, etc.) - - by attribute (C{results.<resultsName>} - see L{ParserElement.setResultsName}) - - Example:: - integer = Word(nums) - date_str = (integer.setResultsName("year") + '/' - + integer.setResultsName("month") + '/' - + integer.setResultsName("day")) - # equivalent form: - # date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - - # parseString returns a ParseResults object - result = date_str.parseString("1999/12/31") - - def test(s, fn=repr): - print("%s -> %s" % (s, fn(eval(s)))) - test("list(result)") - test("result[0]") - test("result['month']") - test("result.day") - test("'month' in result") - test("'minutes' in result") - test("result.dump()", str) - prints:: - list(result) -> ['1999', '/', '12', '/', '31'] - result[0] -> '1999' - result['month'] -> '12' - result.day -> '31' - 'month' in result -> True - 'minutes' in result -> False - result.dump() -> ['1999', '/', '12', '/', '31'] - - day: 31 - - month: 12 - - year: 1999 - """ - def __new__(cls, toklist=None, name=None, asList=True, modal=True ): - if isinstance(toklist, cls): - return toklist - retobj = object.__new__(cls) - retobj.__doinit = True - return retobj - - # Performance tuning: we construct a *lot* of these, so keep this - # constructor as small and fast as possible - def __init__( self, toklist=None, name=None, asList=True, modal=True, isinstance=isinstance ): - if self.__doinit: - self.__doinit = False - self.__name = None - self.__parent = None - self.__accumNames = {} - self.__asList = asList - self.__modal = modal - if toklist is None: - toklist = [] - if isinstance(toklist, list): - self.__toklist = toklist[:] - elif isinstance(toklist, _generatorType): - self.__toklist = list(toklist) - else: - self.__toklist = [toklist] - self.__tokdict = dict() - - if name is not None and name: - if not modal: - self.__accumNames[name] = 0 - if isinstance(name,int): - name = _ustr(name) # will always return a str, but use _ustr for consistency - self.__name = name - if not (isinstance(toklist, (type(None), basestring, list)) and toklist in (None,'',[])): - if isinstance(toklist,basestring): - toklist = [ toklist ] - if asList: - if isinstance(toklist,ParseResults): - self[name] = _ParseResultsWithOffset(toklist.copy(),0) - else: - self[name] = _ParseResultsWithOffset(ParseResults(toklist[0]),0) - self[name].__name = name - else: - try: - self[name] = toklist[0] - except (KeyError,TypeError,IndexError): - self[name] = toklist - - def __getitem__( self, i ): - if isinstance( i, (int,slice) ): - return self.__toklist[i] - else: - if i not in self.__accumNames: - return self.__tokdict[i][-1][0] - else: - return ParseResults([ v[0] for v in self.__tokdict[i] ]) - - def __setitem__( self, k, v, isinstance=isinstance ): - if isinstance(v,_ParseResultsWithOffset): - self.__tokdict[k] = self.__tokdict.get(k,list()) + [v] - sub = v[0] - elif isinstance(k,(int,slice)): - self.__toklist[k] = v - sub = v - else: - self.__tokdict[k] = self.__tokdict.get(k,list()) + [_ParseResultsWithOffset(v,0)] - sub = v - if isinstance(sub,ParseResults): - sub.__parent = wkref(self) - - def __delitem__( self, i ): - if isinstance(i,(int,slice)): - mylen = len( self.__toklist ) - del self.__toklist[i] - - # convert int to slice - if isinstance(i, int): - if i < 0: - i += mylen - i = slice(i, i+1) - # get removed indices - removed = list(range(*i.indices(mylen))) - removed.reverse() - # fixup indices in token dictionary - for name,occurrences in self.__tokdict.items(): - for j in removed: - for k, (value, position) in enumerate(occurrences): - occurrences[k] = _ParseResultsWithOffset(value, position - (position > j)) - else: - del self.__tokdict[i] - - def __contains__( self, k ): - return k in self.__tokdict - - def __len__( self ): return len( self.__toklist ) - def __bool__(self): return ( not not self.__toklist ) - __nonzero__ = __bool__ - def __iter__( self ): return iter( self.__toklist ) - def __reversed__( self ): return iter( self.__toklist[::-1] ) - def _iterkeys( self ): - if hasattr(self.__tokdict, "iterkeys"): - return self.__tokdict.iterkeys() - else: - return iter(self.__tokdict) - - def _itervalues( self ): - return (self[k] for k in self._iterkeys()) - - def _iteritems( self ): - return ((k, self[k]) for k in self._iterkeys()) - - if PY_3: - keys = _iterkeys - """Returns an iterator of all named result keys (Python 3.x only).""" - - values = _itervalues - """Returns an iterator of all named result values (Python 3.x only).""" - - items = _iteritems - """Returns an iterator of all named result key-value tuples (Python 3.x only).""" - - else: - iterkeys = _iterkeys - """Returns an iterator of all named result keys (Python 2.x only).""" - - itervalues = _itervalues - """Returns an iterator of all named result values (Python 2.x only).""" - - iteritems = _iteritems - """Returns an iterator of all named result key-value tuples (Python 2.x only).""" - - def keys( self ): - """Returns all named result keys (as a list in Python 2.x, as an iterator in Python 3.x).""" - return list(self.iterkeys()) - - def values( self ): - """Returns all named result values (as a list in Python 2.x, as an iterator in Python 3.x).""" - return list(self.itervalues()) - - def items( self ): - """Returns all named result key-values (as a list of tuples in Python 2.x, as an iterator in Python 3.x).""" - return list(self.iteritems()) - - def haskeys( self ): - """Since keys() returns an iterator, this method is helpful in bypassing - code that looks for the existence of any defined results names.""" - return bool(self.__tokdict) - - def pop( self, *args, **kwargs): - """ - Removes and returns item at specified index (default=C{last}). - Supports both C{list} and C{dict} semantics for C{pop()}. If passed no - argument or an integer argument, it will use C{list} semantics - and pop tokens from the list of parsed tokens. If passed a - non-integer argument (most likely a string), it will use C{dict} - semantics and pop the corresponding value from any defined - results names. A second default return value argument is - supported, just as in C{dict.pop()}. - - Example:: - def remove_first(tokens): - tokens.pop(0) - print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] - print(OneOrMore(Word(nums)).addParseAction(remove_first).parseString("0 123 321")) # -> ['123', '321'] - - label = Word(alphas) - patt = label("LABEL") + OneOrMore(Word(nums)) - print(patt.parseString("AAB 123 321").dump()) - - # Use pop() in a parse action to remove named result (note that corresponding value is not - # removed from list form of results) - def remove_LABEL(tokens): - tokens.pop("LABEL") - return tokens - patt.addParseAction(remove_LABEL) - print(patt.parseString("AAB 123 321").dump()) - prints:: - ['AAB', '123', '321'] - - LABEL: AAB - - ['AAB', '123', '321'] - """ - if not args: - args = [-1] - for k,v in kwargs.items(): - if k == 'default': - args = (args[0], v) - else: - raise TypeError("pop() got an unexpected keyword argument '%s'" % k) - if (isinstance(args[0], int) or - len(args) == 1 or - args[0] in self): - index = args[0] - ret = self[index] - del self[index] - return ret - else: - defaultvalue = args[1] - return defaultvalue - - def get(self, key, defaultValue=None): - """ - Returns named result matching the given key, or if there is no - such name, then returns the given C{defaultValue} or C{None} if no - C{defaultValue} is specified. - - Similar to C{dict.get()}. - - Example:: - integer = Word(nums) - date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - - result = date_str.parseString("1999/12/31") - print(result.get("year")) # -> '1999' - print(result.get("hour", "not specified")) # -> 'not specified' - print(result.get("hour")) # -> None - """ - if key in self: - return self[key] - else: - return defaultValue - - def insert( self, index, insStr ): - """ - Inserts new element at location index in the list of parsed tokens. - - Similar to C{list.insert()}. - - Example:: - print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] - - # use a parse action to insert the parse location in the front of the parsed results - def insert_locn(locn, tokens): - tokens.insert(0, locn) - print(OneOrMore(Word(nums)).addParseAction(insert_locn).parseString("0 123 321")) # -> [0, '0', '123', '321'] - """ - self.__toklist.insert(index, insStr) - # fixup indices in token dictionary - for name,occurrences in self.__tokdict.items(): - for k, (value, position) in enumerate(occurrences): - occurrences[k] = _ParseResultsWithOffset(value, position + (position > index)) - - def append( self, item ): - """ - Add single element to end of ParseResults list of elements. - - Example:: - print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] - - # use a parse action to compute the sum of the parsed integers, and add it to the end - def append_sum(tokens): - tokens.append(sum(map(int, tokens))) - print(OneOrMore(Word(nums)).addParseAction(append_sum).parseString("0 123 321")) # -> ['0', '123', '321', 444] - """ - self.__toklist.append(item) - - def extend( self, itemseq ): - """ - Add sequence of elements to end of ParseResults list of elements. - - Example:: - patt = OneOrMore(Word(alphas)) - - # use a parse action to append the reverse of the matched strings, to make a palindrome - def make_palindrome(tokens): - tokens.extend(reversed([t[::-1] for t in tokens])) - return ''.join(tokens) - print(patt.addParseAction(make_palindrome).parseString("lskdj sdlkjf lksd")) # -> 'lskdjsdlkjflksddsklfjkldsjdksl' - """ - if isinstance(itemseq, ParseResults): - self += itemseq - else: - self.__toklist.extend(itemseq) - - def clear( self ): - """ - Clear all elements and results names. - """ - del self.__toklist[:] - self.__tokdict.clear() - - def __getattr__( self, name ): - try: - return self[name] - except KeyError: - return "" - - if name in self.__tokdict: - if name not in self.__accumNames: - return self.__tokdict[name][-1][0] - else: - return ParseResults([ v[0] for v in self.__tokdict[name] ]) - else: - return "" - - def __add__( self, other ): - ret = self.copy() - ret += other - return ret - - def __iadd__( self, other ): - if other.__tokdict: - offset = len(self.__toklist) - addoffset = lambda a: offset if a<0 else a+offset - otheritems = other.__tokdict.items() - otherdictitems = [(k, _ParseResultsWithOffset(v[0],addoffset(v[1])) ) - for (k,vlist) in otheritems for v in vlist] - for k,v in otherdictitems: - self[k] = v - if isinstance(v[0],ParseResults): - v[0].__parent = wkref(self) - - self.__toklist += other.__toklist - self.__accumNames.update( other.__accumNames ) - return self - - def __radd__(self, other): - if isinstance(other,int) and other == 0: - # useful for merging many ParseResults using sum() builtin - return self.copy() - else: - # this may raise a TypeError - so be it - return other + self - - def __repr__( self ): - return "(%s, %s)" % ( repr( self.__toklist ), repr( self.__tokdict ) ) - - def __str__( self ): - return '[' + ', '.join(_ustr(i) if isinstance(i, ParseResults) else repr(i) for i in self.__toklist) + ']' - - def _asStringList( self, sep='' ): - out = [] - for item in self.__toklist: - if out and sep: - out.append(sep) - if isinstance( item, ParseResults ): - out += item._asStringList() - else: - out.append( _ustr(item) ) - return out - - def asList( self ): - """ - Returns the parse results as a nested list of matching tokens, all converted to strings. - - Example:: - patt = OneOrMore(Word(alphas)) - result = patt.parseString("sldkj lsdkj sldkj") - # even though the result prints in string-like form, it is actually a pyparsing ParseResults - print(type(result), result) # -> <class 'pyparsing.ParseResults'> ['sldkj', 'lsdkj', 'sldkj'] - - # Use asList() to create an actual list - result_list = result.asList() - print(type(result_list), result_list) # -> <class 'list'> ['sldkj', 'lsdkj', 'sldkj'] - """ - return [res.asList() if isinstance(res,ParseResults) else res for res in self.__toklist] - - def asDict( self ): - """ - Returns the named parse results as a nested dictionary. - - Example:: - integer = Word(nums) - date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - - result = date_str.parseString('12/31/1999') - print(type(result), repr(result)) # -> <class 'pyparsing.ParseResults'> (['12', '/', '31', '/', '1999'], {'day': [('1999', 4)], 'year': [('12', 0)], 'month': [('31', 2)]}) - - result_dict = result.asDict() - print(type(result_dict), repr(result_dict)) # -> <class 'dict'> {'day': '1999', 'year': '12', 'month': '31'} - - # even though a ParseResults supports dict-like access, sometime you just need to have a dict - import json - print(json.dumps(result)) # -> Exception: TypeError: ... is not JSON serializable - print(json.dumps(result.asDict())) # -> {"month": "31", "day": "1999", "year": "12"} - """ - if PY_3: - item_fn = self.items - else: - item_fn = self.iteritems - - def toItem(obj): - if isinstance(obj, ParseResults): - if obj.haskeys(): - return obj.asDict() - else: - return [toItem(v) for v in obj] - else: - return obj - - return dict((k,toItem(v)) for k,v in item_fn()) - - def copy( self ): - """ - Returns a new copy of a C{ParseResults} object. - """ - ret = ParseResults( self.__toklist ) - ret.__tokdict = self.__tokdict.copy() - ret.__parent = self.__parent - ret.__accumNames.update( self.__accumNames ) - ret.__name = self.__name - return ret - - def asXML( self, doctag=None, namedItemsOnly=False, indent="", formatted=True ): - """ - (Deprecated) Returns the parse results as XML. Tags are created for tokens and lists that have defined results names. - """ - nl = "\n" - out = [] - namedItems = dict((v[1],k) for (k,vlist) in self.__tokdict.items() - for v in vlist) - nextLevelIndent = indent + " " - - # collapse out indents if formatting is not desired - if not formatted: - indent = "" - nextLevelIndent = "" - nl = "" - - selfTag = None - if doctag is not None: - selfTag = doctag - else: - if self.__name: - selfTag = self.__name - - if not selfTag: - if namedItemsOnly: - return "" - else: - selfTag = "ITEM" - - out += [ nl, indent, "<", selfTag, ">" ] - - for i,res in enumerate(self.__toklist): - if isinstance(res,ParseResults): - if i in namedItems: - out += [ res.asXML(namedItems[i], - namedItemsOnly and doctag is None, - nextLevelIndent, - formatted)] - else: - out += [ res.asXML(None, - namedItemsOnly and doctag is None, - nextLevelIndent, - formatted)] - else: - # individual token, see if there is a name for it - resTag = None - if i in namedItems: - resTag = namedItems[i] - if not resTag: - if namedItemsOnly: - continue - else: - resTag = "ITEM" - xmlBodyText = _xml_escape(_ustr(res)) - out += [ nl, nextLevelIndent, "<", resTag, ">", - xmlBodyText, - "</", resTag, ">" ] - - out += [ nl, indent, "</", selfTag, ">" ] - return "".join(out) - - def __lookup(self,sub): - for k,vlist in self.__tokdict.items(): - for v,loc in vlist: - if sub is v: - return k - return None - - def getName(self): - r""" - Returns the results name for this token expression. Useful when several - different expressions might match at a particular location. - - Example:: - integer = Word(nums) - ssn_expr = Regex(r"\d\d\d-\d\d-\d\d\d\d") - house_number_expr = Suppress('#') + Word(nums, alphanums) - user_data = (Group(house_number_expr)("house_number") - | Group(ssn_expr)("ssn") - | Group(integer)("age")) - user_info = OneOrMore(user_data) - - result = user_info.parseString("22 111-22-3333 #221B") - for item in result: - print(item.getName(), ':', item[0]) - prints:: - age : 22 - ssn : 111-22-3333 - house_number : 221B - """ - if self.__name: - return self.__name - elif self.__parent: - par = self.__parent() - if par: - return par.__lookup(self) - else: - return None - elif (len(self) == 1 and - len(self.__tokdict) == 1 and - next(iter(self.__tokdict.values()))[0][1] in (0,-1)): - return next(iter(self.__tokdict.keys())) - else: - return None - - def dump(self, indent='', depth=0, full=True): - """ - Diagnostic method for listing out the contents of a C{ParseResults}. - Accepts an optional C{indent} argument so that this string can be embedded - in a nested display of other data. - - Example:: - integer = Word(nums) - date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - - result = date_str.parseString('12/31/1999') - print(result.dump()) - prints:: - ['12', '/', '31', '/', '1999'] - - day: 1999 - - month: 31 - - year: 12 - """ - out = [] - NL = '\n' - out.append( indent+_ustr(self.asList()) ) - if full: - if self.haskeys(): - items = sorted((str(k), v) for k,v in self.items()) - for k,v in items: - if out: - out.append(NL) - out.append( "%s%s- %s: " % (indent,(' '*depth), k) ) - if isinstance(v,ParseResults): - if v: - out.append( v.dump(indent,depth+1) ) - else: - out.append(_ustr(v)) - else: - out.append(repr(v)) - elif any(isinstance(vv,ParseResults) for vv in self): - v = self - for i,vv in enumerate(v): - if isinstance(vv,ParseResults): - out.append("\n%s%s[%d]:\n%s%s%s" % (indent,(' '*(depth)),i,indent,(' '*(depth+1)),vv.dump(indent,depth+1) )) - else: - out.append("\n%s%s[%d]:\n%s%s%s" % (indent,(' '*(depth)),i,indent,(' '*(depth+1)),_ustr(vv))) - - return "".join(out) - - def pprint(self, *args, **kwargs): - """ - Pretty-printer for parsed results as a list, using the C{pprint} module. - Accepts additional positional or keyword args as defined for the - C{pprint.pprint} method. (U{http://docs.python.org/3/library/pprint.html#pprint.pprint}) - - Example:: - ident = Word(alphas, alphanums) - num = Word(nums) - func = Forward() - term = ident | num | Group('(' + func + ')') - func <<= ident + Group(Optional(delimitedList(term))) - result = func.parseString("fna a,b,(fnb c,d,200),100") - result.pprint(width=40) - prints:: - ['fna', - ['a', - 'b', - ['(', 'fnb', ['c', 'd', '200'], ')'], - '100']] - """ - pprint.pprint(self.asList(), *args, **kwargs) - - # add support for pickle protocol - def __getstate__(self): - return ( self.__toklist, - ( self.__tokdict.copy(), - self.__parent is not None and self.__parent() or None, - self.__accumNames, - self.__name ) ) - - def __setstate__(self,state): - self.__toklist = state[0] - (self.__tokdict, - par, - inAccumNames, - self.__name) = state[1] - self.__accumNames = {} - self.__accumNames.update(inAccumNames) - if par is not None: - self.__parent = wkref(par) - else: - self.__parent = None - - def __getnewargs__(self): - return self.__toklist, self.__name, self.__asList, self.__modal - - def __dir__(self): - return (dir(type(self)) + list(self.keys())) - -MutableMapping.register(ParseResults) - -def col (loc,strg): - """Returns current column within a string, counting newlines as line separators. - The first column is number 1. - - Note: the default parsing behavior is to expand tabs in the input string - before starting the parsing process. See L{I{ParserElement.parseString}<ParserElement.parseString>} for more information - on parsing strings containing C{<TAB>}s, and suggested methods to maintain a - consistent view of the parsed string, the parse location, and line and column - positions within the parsed string. - """ - s = strg - return 1 if 0<loc<len(s) and s[loc-1] == '\n' else loc - s.rfind("\n", 0, loc) - -def lineno(loc,strg): - """Returns current line number within a string, counting newlines as line separators. - The first line is number 1. - - Note: the default parsing behavior is to expand tabs in the input string - before starting the parsing process. See L{I{ParserElement.parseString}<ParserElement.parseString>} for more information - on parsing strings containing C{<TAB>}s, and suggested methods to maintain a - consistent view of the parsed string, the parse location, and line and column - positions within the parsed string. - """ - return strg.count("\n",0,loc) + 1 - -def line( loc, strg ): - """Returns the line of text containing loc within a string, counting newlines as line separators. - """ - lastCR = strg.rfind("\n", 0, loc) - nextCR = strg.find("\n", loc) - if nextCR >= 0: - return strg[lastCR+1:nextCR] - else: - return strg[lastCR+1:] - -def _defaultStartDebugAction( instring, loc, expr ): - print (("Match " + _ustr(expr) + " at loc " + _ustr(loc) + "(%d,%d)" % ( lineno(loc,instring), col(loc,instring) ))) - -def _defaultSuccessDebugAction( instring, startloc, endloc, expr, toks ): - print ("Matched " + _ustr(expr) + " -> " + str(toks.asList())) - -def _defaultExceptionDebugAction( instring, loc, expr, exc ): - print ("Exception raised:" + _ustr(exc)) - -def nullDebugAction(*args): - """'Do-nothing' debug action, to suppress debugging output during parsing.""" - pass - -# Only works on Python 3.x - nonlocal is toxic to Python 2 installs -#~ 'decorator to trim function calls to match the arity of the target' -#~ def _trim_arity(func, maxargs=3): - #~ if func in singleArgBuiltins: - #~ return lambda s,l,t: func(t) - #~ limit = 0 - #~ foundArity = False - #~ def wrapper(*args): - #~ nonlocal limit,foundArity - #~ while 1: - #~ try: - #~ ret = func(*args[limit:]) - #~ foundArity = True - #~ return ret - #~ except TypeError: - #~ if limit == maxargs or foundArity: - #~ raise - #~ limit += 1 - #~ continue - #~ return wrapper - -# this version is Python 2.x-3.x cross-compatible -'decorator to trim function calls to match the arity of the target' -def _trim_arity(func, maxargs=2): - if func in singleArgBuiltins: - return lambda s,l,t: func(t) - limit = [0] - foundArity = [False] - - # traceback return data structure changed in Py3.5 - normalize back to plain tuples - if system_version[:2] >= (3,5): - def extract_stack(limit=0): - # special handling for Python 3.5.0 - extra deep call stack by 1 - offset = -3 if system_version == (3,5,0) else -2 - frame_summary = traceback.extract_stack(limit=-offset+limit-1)[offset] - return [frame_summary[:2]] - def extract_tb(tb, limit=0): - frames = traceback.extract_tb(tb, limit=limit) - frame_summary = frames[-1] - return [frame_summary[:2]] - else: - extract_stack = traceback.extract_stack - extract_tb = traceback.extract_tb - - # synthesize what would be returned by traceback.extract_stack at the call to - # user's parse action 'func', so that we don't incur call penalty at parse time - - LINE_DIFF = 6 - # IF ANY CODE CHANGES, EVEN JUST COMMENTS OR BLANK LINES, BETWEEN THE NEXT LINE AND - # THE CALL TO FUNC INSIDE WRAPPER, LINE_DIFF MUST BE MODIFIED!!!! - this_line = extract_stack(limit=2)[-1] - pa_call_line_synth = (this_line[0], this_line[1]+LINE_DIFF) - - def wrapper(*args): - while 1: - try: - ret = func(*args[limit[0]:]) - foundArity[0] = True - return ret - except TypeError: - # re-raise TypeErrors if they did not come from our arity testing - if foundArity[0]: - raise - else: - try: - tb = sys.exc_info()[-1] - if not extract_tb(tb, limit=2)[-1][:2] == pa_call_line_synth: - raise - finally: - del tb - - if limit[0] <= maxargs: - limit[0] += 1 - continue - raise - - # copy func name to wrapper for sensible debug output - func_name = "<parse action>" - try: - func_name = getattr(func, '__name__', - getattr(func, '__class__').__name__) - except Exception: - func_name = str(func) - wrapper.__name__ = func_name - - return wrapper - -class ParserElement(object): - """Abstract base level parser element class.""" - DEFAULT_WHITE_CHARS = " \n\t\r" - verbose_stacktrace = False - - @staticmethod - def setDefaultWhitespaceChars( chars ): - r""" - Overrides the default whitespace chars - - Example:: - # default whitespace chars are space, <TAB> and newline - OneOrMore(Word(alphas)).parseString("abc def\nghi jkl") # -> ['abc', 'def', 'ghi', 'jkl'] - - # change to just treat newline as significant - ParserElement.setDefaultWhitespaceChars(" \t") - OneOrMore(Word(alphas)).parseString("abc def\nghi jkl") # -> ['abc', 'def'] - """ - ParserElement.DEFAULT_WHITE_CHARS = chars - - @staticmethod - def inlineLiteralsUsing(cls): - """ - Set class to be used for inclusion of string literals into a parser. - - Example:: - # default literal class used is Literal - integer = Word(nums) - date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - - date_str.parseString("1999/12/31") # -> ['1999', '/', '12', '/', '31'] - - - # change to Suppress - ParserElement.inlineLiteralsUsing(Suppress) - date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - - date_str.parseString("1999/12/31") # -> ['1999', '12', '31'] - """ - ParserElement._literalStringClass = cls - - def __init__( self, savelist=False ): - self.parseAction = list() - self.failAction = None - #~ self.name = "<unknown>" # don't define self.name, let subclasses try/except upcall - self.strRepr = None - self.resultsName = None - self.saveAsList = savelist - self.skipWhitespace = True - self.whiteChars = ParserElement.DEFAULT_WHITE_CHARS - self.copyDefaultWhiteChars = True - self.mayReturnEmpty = False # used when checking for left-recursion - self.keepTabs = False - self.ignoreExprs = list() - self.debug = False - self.streamlined = False - self.mayIndexError = True # used to optimize exception handling for subclasses that don't advance parse index - self.errmsg = "" - self.modalResults = True # used to mark results names as modal (report only last) or cumulative (list all) - self.debugActions = ( None, None, None ) #custom debug actions - self.re = None - self.callPreparse = True # used to avoid redundant calls to preParse - self.callDuringTry = False - - def copy( self ): - """ - Make a copy of this C{ParserElement}. Useful for defining different parse actions - for the same parsing pattern, using copies of the original parse element. - - Example:: - integer = Word(nums).setParseAction(lambda toks: int(toks[0])) - integerK = integer.copy().addParseAction(lambda toks: toks[0]*1024) + Suppress("K") - integerM = integer.copy().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M") - - print(OneOrMore(integerK | integerM | integer).parseString("5K 100 640K 256M")) - prints:: - [5120, 100, 655360, 268435456] - Equivalent form of C{expr.copy()} is just C{expr()}:: - integerM = integer().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M") - """ - cpy = copy.copy( self ) - cpy.parseAction = self.parseAction[:] - cpy.ignoreExprs = self.ignoreExprs[:] - if self.copyDefaultWhiteChars: - cpy.whiteChars = ParserElement.DEFAULT_WHITE_CHARS - return cpy - - def setName( self, name ): - """ - Define name for this expression, makes debugging and exception messages clearer. - - Example:: - Word(nums).parseString("ABC") # -> Exception: Expected W:(0123...) (at char 0), (line:1, col:1) - Word(nums).setName("integer").parseString("ABC") # -> Exception: Expected integer (at char 0), (line:1, col:1) - """ - self.name = name - self.errmsg = "Expected " + self.name - if hasattr(self,"exception"): - self.exception.msg = self.errmsg - return self - - def setResultsName( self, name, listAllMatches=False ): - """ - Define name for referencing matching tokens as a nested attribute - of the returned parse results. - NOTE: this returns a *copy* of the original C{ParserElement} object; - this is so that the client can define a basic element, such as an - integer, and reference it in multiple places with different names. - - You can also set results names using the abbreviated syntax, - C{expr("name")} in place of C{expr.setResultsName("name")} - - see L{I{__call__}<__call__>}. - - Example:: - date_str = (integer.setResultsName("year") + '/' - + integer.setResultsName("month") + '/' - + integer.setResultsName("day")) - - # equivalent form: - date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - """ - newself = self.copy() - if name.endswith("*"): - name = name[:-1] - listAllMatches=True - newself.resultsName = name - newself.modalResults = not listAllMatches - return newself - - def setBreak(self,breakFlag = True): - """Method to invoke the Python pdb debugger when this element is - about to be parsed. Set C{breakFlag} to True to enable, False to - disable. - """ - if breakFlag: - _parseMethod = self._parse - def breaker(instring, loc, doActions=True, callPreParse=True): - import pdb - pdb.set_trace() - return _parseMethod( instring, loc, doActions, callPreParse ) - breaker._originalParseMethod = _parseMethod - self._parse = breaker - else: - if hasattr(self._parse,"_originalParseMethod"): - self._parse = self._parse._originalParseMethod - return self - - def setParseAction( self, *fns, **kwargs ): - """ - Define one or more actions to perform when successfully matching parse element definition. - Parse action fn is a callable method with 0-3 arguments, called as C{fn(s,loc,toks)}, - C{fn(loc,toks)}, C{fn(toks)}, or just C{fn()}, where: - - s = the original string being parsed (see note below) - - loc = the location of the matching substring - - toks = a list of the matched tokens, packaged as a C{L{ParseResults}} object - If the functions in fns modify the tokens, they can return them as the return - value from fn, and the modified list of tokens will replace the original. - Otherwise, fn does not need to return any value. - - Optional keyword arguments: - - callDuringTry = (default=C{False}) indicate if parse action should be run during lookaheads and alternate testing - - Note: the default parsing behavior is to expand tabs in the input string - before starting the parsing process. See L{I{parseString}<parseString>} for more information - on parsing strings containing C{<TAB>}s, and suggested methods to maintain a - consistent view of the parsed string, the parse location, and line and column - positions within the parsed string. - - Example:: - integer = Word(nums) - date_str = integer + '/' + integer + '/' + integer - - date_str.parseString("1999/12/31") # -> ['1999', '/', '12', '/', '31'] - - # use parse action to convert to ints at parse time - integer = Word(nums).setParseAction(lambda toks: int(toks[0])) - date_str = integer + '/' + integer + '/' + integer - - # note that integer fields are now ints, not strings - date_str.parseString("1999/12/31") # -> [1999, '/', 12, '/', 31] - """ - self.parseAction = list(map(_trim_arity, list(fns))) - self.callDuringTry = kwargs.get("callDuringTry", False) - return self - - def addParseAction( self, *fns, **kwargs ): - """ - Add one or more parse actions to expression's list of parse actions. See L{I{setParseAction}<setParseAction>}. - - See examples in L{I{copy}<copy>}. - """ - self.parseAction += list(map(_trim_arity, list(fns))) - self.callDuringTry = self.callDuringTry or kwargs.get("callDuringTry", False) - return self - - def addCondition(self, *fns, **kwargs): - """Add a boolean predicate function to expression's list of parse actions. See - L{I{setParseAction}<setParseAction>} for function call signatures. Unlike C{setParseAction}, - functions passed to C{addCondition} need to return boolean success/fail of the condition. - - Optional keyword arguments: - - message = define a custom message to be used in the raised exception - - fatal = if True, will raise ParseFatalException to stop parsing immediately; otherwise will raise ParseException - - Example:: - integer = Word(nums).setParseAction(lambda toks: int(toks[0])) - year_int = integer.copy() - year_int.addCondition(lambda toks: toks[0] >= 2000, message="Only support years 2000 and later") - date_str = year_int + '/' + integer + '/' + integer - - result = date_str.parseString("1999/12/31") # -> Exception: Only support years 2000 and later (at char 0), (line:1, col:1) - """ - msg = kwargs.get("message", "failed user-defined condition") - exc_type = ParseFatalException if kwargs.get("fatal", False) else ParseException - for fn in fns: - def pa(s,l,t): - if not bool(_trim_arity(fn)(s,l,t)): - raise exc_type(s,l,msg) - self.parseAction.append(pa) - self.callDuringTry = self.callDuringTry or kwargs.get("callDuringTry", False) - return self - - def setFailAction( self, fn ): - """Define action to perform if parsing fails at this expression. - Fail acton fn is a callable function that takes the arguments - C{fn(s,loc,expr,err)} where: - - s = string being parsed - - loc = location where expression match was attempted and failed - - expr = the parse expression that failed - - err = the exception thrown - The function returns no value. It may throw C{L{ParseFatalException}} - if it is desired to stop parsing immediately.""" - self.failAction = fn - return self - - def _skipIgnorables( self, instring, loc ): - exprsFound = True - while exprsFound: - exprsFound = False - for e in self.ignoreExprs: - try: - while 1: - loc,dummy = e._parse( instring, loc ) - exprsFound = True - except ParseException: - pass - return loc - - def preParse( self, instring, loc ): - if self.ignoreExprs: - loc = self._skipIgnorables( instring, loc ) - - if self.skipWhitespace: - wt = self.whiteChars - instrlen = len(instring) - while loc < instrlen and instring[loc] in wt: - loc += 1 - - return loc - - def parseImpl( self, instring, loc, doActions=True ): - return loc, [] - - def postParse( self, instring, loc, tokenlist ): - return tokenlist - - #~ @profile - def _parseNoCache( self, instring, loc, doActions=True, callPreParse=True ): - debugging = ( self.debug ) #and doActions ) - - if debugging or self.failAction: - #~ print ("Match",self,"at loc",loc,"(%d,%d)" % ( lineno(loc,instring), col(loc,instring) )) - if (self.debugActions[0] ): - self.debugActions[0]( instring, loc, self ) - if callPreParse and self.callPreparse: - preloc = self.preParse( instring, loc ) - else: - preloc = loc - tokensStart = preloc - try: - try: - loc,tokens = self.parseImpl( instring, preloc, doActions ) - except IndexError: - raise ParseException( instring, len(instring), self.errmsg, self ) - except ParseBaseException as err: - #~ print ("Exception raised:", err) - if self.debugActions[2]: - self.debugActions[2]( instring, tokensStart, self, err ) - if self.failAction: - self.failAction( instring, tokensStart, self, err ) - raise - else: - if callPreParse and self.callPreparse: - preloc = self.preParse( instring, loc ) - else: - preloc = loc - tokensStart = preloc - if self.mayIndexError or preloc >= len(instring): - try: - loc,tokens = self.parseImpl( instring, preloc, doActions ) - except IndexError: - raise ParseException( instring, len(instring), self.errmsg, self ) - else: - loc,tokens = self.parseImpl( instring, preloc, doActions ) - - tokens = self.postParse( instring, loc, tokens ) - - retTokens = ParseResults( tokens, self.resultsName, asList=self.saveAsList, modal=self.modalResults ) - if self.parseAction and (doActions or self.callDuringTry): - if debugging: - try: - for fn in self.parseAction: - tokens = fn( instring, tokensStart, retTokens ) - if tokens is not None: - retTokens = ParseResults( tokens, - self.resultsName, - asList=self.saveAsList and isinstance(tokens,(ParseResults,list)), - modal=self.modalResults ) - except ParseBaseException as err: - #~ print "Exception raised in user parse action:", err - if (self.debugActions[2] ): - self.debugActions[2]( instring, tokensStart, self, err ) - raise - else: - for fn in self.parseAction: - tokens = fn( instring, tokensStart, retTokens ) - if tokens is not None: - retTokens = ParseResults( tokens, - self.resultsName, - asList=self.saveAsList and isinstance(tokens,(ParseResults,list)), - modal=self.modalResults ) - if debugging: - #~ print ("Matched",self,"->",retTokens.asList()) - if (self.debugActions[1] ): - self.debugActions[1]( instring, tokensStart, loc, self, retTokens ) - - return loc, retTokens - - def tryParse( self, instring, loc ): - try: - return self._parse( instring, loc, doActions=False )[0] - except ParseFatalException: - raise ParseException( instring, loc, self.errmsg, self) - - def canParseNext(self, instring, loc): - try: - self.tryParse(instring, loc) - except (ParseException, IndexError): - return False - else: - return True - - class _UnboundedCache(object): - def __init__(self): - cache = {} - self.not_in_cache = not_in_cache = object() - - def get(self, key): - return cache.get(key, not_in_cache) - - def set(self, key, value): - cache[key] = value - - def clear(self): - cache.clear() - - def cache_len(self): - return len(cache) - - self.get = types.MethodType(get, self) - self.set = types.MethodType(set, self) - self.clear = types.MethodType(clear, self) - self.__len__ = types.MethodType(cache_len, self) - - if _OrderedDict is not None: - class _FifoCache(object): - def __init__(self, size): - self.not_in_cache = not_in_cache = object() - - cache = _OrderedDict() - - def get(self, key): - return cache.get(key, not_in_cache) - - def set(self, key, value): - cache[key] = value - while len(cache) > size: - try: - cache.popitem(False) - except KeyError: - pass - - def clear(self): - cache.clear() - - def cache_len(self): - return len(cache) - - self.get = types.MethodType(get, self) - self.set = types.MethodType(set, self) - self.clear = types.MethodType(clear, self) - self.__len__ = types.MethodType(cache_len, self) - - else: - class _FifoCache(object): - def __init__(self, size): - self.not_in_cache = not_in_cache = object() - - cache = {} - key_fifo = collections.deque([], size) - - def get(self, key): - return cache.get(key, not_in_cache) - - def set(self, key, value): - cache[key] = value - while len(key_fifo) > size: - cache.pop(key_fifo.popleft(), None) - key_fifo.append(key) - - def clear(self): - cache.clear() - key_fifo.clear() - - def cache_len(self): - return len(cache) - - self.get = types.MethodType(get, self) - self.set = types.MethodType(set, self) - self.clear = types.MethodType(clear, self) - self.__len__ = types.MethodType(cache_len, self) - - # argument cache for optimizing repeated calls when backtracking through recursive expressions - packrat_cache = {} # this is set later by enabledPackrat(); this is here so that resetCache() doesn't fail - packrat_cache_lock = RLock() - packrat_cache_stats = [0, 0] - - # this method gets repeatedly called during backtracking with the same arguments - - # we can cache these arguments and save ourselves the trouble of re-parsing the contained expression - def _parseCache( self, instring, loc, doActions=True, callPreParse=True ): - HIT, MISS = 0, 1 - lookup = (self, instring, loc, callPreParse, doActions) - with ParserElement.packrat_cache_lock: - cache = ParserElement.packrat_cache - value = cache.get(lookup) - if value is cache.not_in_cache: - ParserElement.packrat_cache_stats[MISS] += 1 - try: - value = self._parseNoCache(instring, loc, doActions, callPreParse) - except ParseBaseException as pe: - # cache a copy of the exception, without the traceback - cache.set(lookup, pe.__class__(*pe.args)) - raise - else: - cache.set(lookup, (value[0], value[1].copy())) - return value - else: - ParserElement.packrat_cache_stats[HIT] += 1 - if isinstance(value, Exception): - raise value - return (value[0], value[1].copy()) - - _parse = _parseNoCache - - @staticmethod - def resetCache(): - ParserElement.packrat_cache.clear() - ParserElement.packrat_cache_stats[:] = [0] * len(ParserElement.packrat_cache_stats) - - _packratEnabled = False - @staticmethod - def enablePackrat(cache_size_limit=128): - """Enables "packrat" parsing, which adds memoizing to the parsing logic. - Repeated parse attempts at the same string location (which happens - often in many complex grammars) can immediately return a cached value, - instead of re-executing parsing/validating code. Memoizing is done of - both valid results and parsing exceptions. - - Parameters: - - cache_size_limit - (default=C{128}) - if an integer value is provided - will limit the size of the packrat cache; if None is passed, then - the cache size will be unbounded; if 0 is passed, the cache will - be effectively disabled. - - This speedup may break existing programs that use parse actions that - have side-effects. For this reason, packrat parsing is disabled when - you first import pyparsing. To activate the packrat feature, your - program must call the class method C{ParserElement.enablePackrat()}. If - your program uses C{psyco} to "compile as you go", you must call - C{enablePackrat} before calling C{psyco.full()}. If you do not do this, - Python will crash. For best results, call C{enablePackrat()} immediately - after importing pyparsing. - - Example:: - import pyparsing - pyparsing.ParserElement.enablePackrat() - """ - if not ParserElement._packratEnabled: - ParserElement._packratEnabled = True - if cache_size_limit is None: - ParserElement.packrat_cache = ParserElement._UnboundedCache() - else: - ParserElement.packrat_cache = ParserElement._FifoCache(cache_size_limit) - ParserElement._parse = ParserElement._parseCache - - def parseString( self, instring, parseAll=False ): - """ - Execute the parse expression with the given string. - This is the main interface to the client code, once the complete - expression has been built. - - If you want the grammar to require that the entire input string be - successfully parsed, then set C{parseAll} to True (equivalent to ending - the grammar with C{L{StringEnd()}}). - - Note: C{parseString} implicitly calls C{expandtabs()} on the input string, - in order to report proper column numbers in parse actions. - If the input string contains tabs and - the grammar uses parse actions that use the C{loc} argument to index into the - string being parsed, you can ensure you have a consistent view of the input - string by: - - calling C{parseWithTabs} on your grammar before calling C{parseString} - (see L{I{parseWithTabs}<parseWithTabs>}) - - define your parse action using the full C{(s,loc,toks)} signature, and - reference the input string using the parse action's C{s} argument - - explictly expand the tabs in your input string before calling - C{parseString} - - Example:: - Word('a').parseString('aaaaabaaa') # -> ['aaaaa'] - Word('a').parseString('aaaaabaaa', parseAll=True) # -> Exception: Expected end of text - """ - ParserElement.resetCache() - if not self.streamlined: - self.streamline() - #~ self.saveAsList = True - for e in self.ignoreExprs: - e.streamline() - if not self.keepTabs: - instring = instring.expandtabs() - try: - loc, tokens = self._parse( instring, 0 ) - if parseAll: - loc = self.preParse( instring, loc ) - se = Empty() + StringEnd() - se._parse( instring, loc ) - except ParseBaseException as exc: - if ParserElement.verbose_stacktrace: - raise - else: - # catch and re-raise exception from here, clears out pyparsing internal stack trace - raise exc - else: - return tokens - - def scanString( self, instring, maxMatches=_MAX_INT, overlap=False ): - """ - Scan the input string for expression matches. Each match will return the - matching tokens, start location, and end location. May be called with optional - C{maxMatches} argument, to clip scanning after 'n' matches are found. If - C{overlap} is specified, then overlapping matches will be reported. - - Note that the start and end locations are reported relative to the string - being parsed. See L{I{parseString}<parseString>} for more information on parsing - strings with embedded tabs. - - Example:: - source = "sldjf123lsdjjkf345sldkjf879lkjsfd987" - print(source) - for tokens,start,end in Word(alphas).scanString(source): - print(' '*start + '^'*(end-start)) - print(' '*start + tokens[0]) - - prints:: - - sldjf123lsdjjkf345sldkjf879lkjsfd987 - ^^^^^ - sldjf - ^^^^^^^ - lsdjjkf - ^^^^^^ - sldkjf - ^^^^^^ - lkjsfd - """ - if not self.streamlined: - self.streamline() - for e in self.ignoreExprs: - e.streamline() - - if not self.keepTabs: - instring = _ustr(instring).expandtabs() - instrlen = len(instring) - loc = 0 - preparseFn = self.preParse - parseFn = self._parse - ParserElement.resetCache() - matches = 0 - try: - while loc <= instrlen and matches < maxMatches: - try: - preloc = preparseFn( instring, loc ) - nextLoc,tokens = parseFn( instring, preloc, callPreParse=False ) - except ParseException: - loc = preloc+1 - else: - if nextLoc > loc: - matches += 1 - yield tokens, preloc, nextLoc - if overlap: - nextloc = preparseFn( instring, loc ) - if nextloc > loc: - loc = nextLoc - else: - loc += 1 - else: - loc = nextLoc - else: - loc = preloc+1 - except ParseBaseException as exc: - if ParserElement.verbose_stacktrace: - raise - else: - # catch and re-raise exception from here, clears out pyparsing internal stack trace - raise exc - - def transformString( self, instring ): - """ - Extension to C{L{scanString}}, to modify matching text with modified tokens that may - be returned from a parse action. To use C{transformString}, define a grammar and - attach a parse action to it that modifies the returned token list. - Invoking C{transformString()} on a target string will then scan for matches, - and replace the matched text patterns according to the logic in the parse - action. C{transformString()} returns the resulting transformed string. - - Example:: - wd = Word(alphas) - wd.setParseAction(lambda toks: toks[0].title()) - - print(wd.transformString("now is the winter of our discontent made glorious summer by this sun of york.")) - Prints:: - Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York. - """ - out = [] - lastE = 0 - # force preservation of <TAB>s, to minimize unwanted transformation of string, and to - # keep string locs straight between transformString and scanString - self.keepTabs = True - try: - for t,s,e in self.scanString( instring ): - out.append( instring[lastE:s] ) - if t: - if isinstance(t,ParseResults): - out += t.asList() - elif isinstance(t,list): - out += t - else: - out.append(t) - lastE = e - out.append(instring[lastE:]) - out = [o for o in out if o] - return "".join(map(_ustr,_flatten(out))) - except ParseBaseException as exc: - if ParserElement.verbose_stacktrace: - raise - else: - # catch and re-raise exception from here, clears out pyparsing internal stack trace - raise exc - - def searchString( self, instring, maxMatches=_MAX_INT ): - """ - Another extension to C{L{scanString}}, simplifying the access to the tokens found - to match the given parse expression. May be called with optional - C{maxMatches} argument, to clip searching after 'n' matches are found. - - Example:: - # a capitalized word starts with an uppercase letter, followed by zero or more lowercase letters - cap_word = Word(alphas.upper(), alphas.lower()) - - print(cap_word.searchString("More than Iron, more than Lead, more than Gold I need Electricity")) - - # the sum() builtin can be used to merge results into a single ParseResults object - print(sum(cap_word.searchString("More than Iron, more than Lead, more than Gold I need Electricity"))) - prints:: - [['More'], ['Iron'], ['Lead'], ['Gold'], ['I'], ['Electricity']] - ['More', 'Iron', 'Lead', 'Gold', 'I', 'Electricity'] - """ - try: - return ParseResults([ t for t,s,e in self.scanString( instring, maxMatches ) ]) - except ParseBaseException as exc: - if ParserElement.verbose_stacktrace: - raise - else: - # catch and re-raise exception from here, clears out pyparsing internal stack trace - raise exc - - def split(self, instring, maxsplit=_MAX_INT, includeSeparators=False): - """ - Generator method to split a string using the given expression as a separator. - May be called with optional C{maxsplit} argument, to limit the number of splits; - and the optional C{includeSeparators} argument (default=C{False}), if the separating - matching text should be included in the split results. - - Example:: - punc = oneOf(list(".,;:/-!?")) - print(list(punc.split("This, this?, this sentence, is badly punctuated!"))) - prints:: - ['This', ' this', '', ' this sentence', ' is badly punctuated', ''] - """ - splits = 0 - last = 0 - for t,s,e in self.scanString(instring, maxMatches=maxsplit): - yield instring[last:s] - if includeSeparators: - yield t[0] - last = e - yield instring[last:] - - def __add__(self, other ): - """ - Implementation of + operator - returns C{L{And}}. Adding strings to a ParserElement - converts them to L{Literal}s by default. - - Example:: - greet = Word(alphas) + "," + Word(alphas) + "!" - hello = "Hello, World!" - print (hello, "->", greet.parseString(hello)) - Prints:: - Hello, World! -> ['Hello', ',', 'World', '!'] - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return And( [ self, other ] ) - - def __radd__(self, other ): - """ - Implementation of + operator when left operand is not a C{L{ParserElement}} - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return other + self - - def __sub__(self, other): - """ - Implementation of - operator, returns C{L{And}} with error stop - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return self + And._ErrorStop() + other - - def __rsub__(self, other ): - """ - Implementation of - operator when left operand is not a C{L{ParserElement}} - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return other - self - - def __mul__(self,other): - """ - Implementation of * operator, allows use of C{expr * 3} in place of - C{expr + expr + expr}. Expressions may also me multiplied by a 2-integer - tuple, similar to C{{min,max}} multipliers in regular expressions. Tuples - may also include C{None} as in: - - C{expr*(n,None)} or C{expr*(n,)} is equivalent - to C{expr*n + L{ZeroOrMore}(expr)} - (read as "at least n instances of C{expr}") - - C{expr*(None,n)} is equivalent to C{expr*(0,n)} - (read as "0 to n instances of C{expr}") - - C{expr*(None,None)} is equivalent to C{L{ZeroOrMore}(expr)} - - C{expr*(1,None)} is equivalent to C{L{OneOrMore}(expr)} - - Note that C{expr*(None,n)} does not raise an exception if - more than n exprs exist in the input stream; that is, - C{expr*(None,n)} does not enforce a maximum number of expr - occurrences. If this behavior is desired, then write - C{expr*(None,n) + ~expr} - """ - if isinstance(other,int): - minElements, optElements = other,0 - elif isinstance(other,tuple): - other = (other + (None, None))[:2] - if other[0] is None: - other = (0, other[1]) - if isinstance(other[0],int) and other[1] is None: - if other[0] == 0: - return ZeroOrMore(self) - if other[0] == 1: - return OneOrMore(self) - else: - return self*other[0] + ZeroOrMore(self) - elif isinstance(other[0],int) and isinstance(other[1],int): - minElements, optElements = other - optElements -= minElements - else: - raise TypeError("cannot multiply 'ParserElement' and ('%s','%s') objects", type(other[0]),type(other[1])) - else: - raise TypeError("cannot multiply 'ParserElement' and '%s' objects", type(other)) - - if minElements < 0: - raise ValueError("cannot multiply ParserElement by negative value") - if optElements < 0: - raise ValueError("second tuple value must be greater or equal to first tuple value") - if minElements == optElements == 0: - raise ValueError("cannot multiply ParserElement by 0 or (0,0)") - - if (optElements): - def makeOptionalList(n): - if n>1: - return Optional(self + makeOptionalList(n-1)) - else: - return Optional(self) - if minElements: - if minElements == 1: - ret = self + makeOptionalList(optElements) - else: - ret = And([self]*minElements) + makeOptionalList(optElements) - else: - ret = makeOptionalList(optElements) - else: - if minElements == 1: - ret = self - else: - ret = And([self]*minElements) - return ret - - def __rmul__(self, other): - return self.__mul__(other) - - def __or__(self, other ): - """ - Implementation of | operator - returns C{L{MatchFirst}} - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return MatchFirst( [ self, other ] ) - - def __ror__(self, other ): - """ - Implementation of | operator when left operand is not a C{L{ParserElement}} - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return other | self - - def __xor__(self, other ): - """ - Implementation of ^ operator - returns C{L{Or}} - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return Or( [ self, other ] ) - - def __rxor__(self, other ): - """ - Implementation of ^ operator when left operand is not a C{L{ParserElement}} - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return other ^ self - - def __and__(self, other ): - """ - Implementation of & operator - returns C{L{Each}} - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return Each( [ self, other ] ) - - def __rand__(self, other ): - """ - Implementation of & operator when left operand is not a C{L{ParserElement}} - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return other & self - - def __invert__( self ): - """ - Implementation of ~ operator - returns C{L{NotAny}} - """ - return NotAny( self ) - - def __call__(self, name=None): - """ - Shortcut for C{L{setResultsName}}, with C{listAllMatches=False}. - - If C{name} is given with a trailing C{'*'} character, then C{listAllMatches} will be - passed as C{True}. - - If C{name} is omitted, same as calling C{L{copy}}. - - Example:: - # these are equivalent - userdata = Word(alphas).setResultsName("name") + Word(nums+"-").setResultsName("socsecno") - userdata = Word(alphas)("name") + Word(nums+"-")("socsecno") - """ - if name is not None: - return self.setResultsName(name) - else: - return self.copy() - - def suppress( self ): - """ - Suppresses the output of this C{ParserElement}; useful to keep punctuation from - cluttering up returned output. - """ - return Suppress( self ) - - def leaveWhitespace( self ): - """ - Disables the skipping of whitespace before matching the characters in the - C{ParserElement}'s defined pattern. This is normally only used internally by - the pyparsing module, but may be needed in some whitespace-sensitive grammars. - """ - self.skipWhitespace = False - return self - - def setWhitespaceChars( self, chars ): - """ - Overrides the default whitespace chars - """ - self.skipWhitespace = True - self.whiteChars = chars - self.copyDefaultWhiteChars = False - return self - - def parseWithTabs( self ): - """ - Overrides default behavior to expand C{<TAB>}s to spaces before parsing the input string. - Must be called before C{parseString} when the input grammar contains elements that - match C{<TAB>} characters. - """ - self.keepTabs = True - return self - - def ignore( self, other ): - """ - Define expression to be ignored (e.g., comments) while doing pattern - matching; may be called repeatedly, to define multiple comment or other - ignorable patterns. - - Example:: - patt = OneOrMore(Word(alphas)) - patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj'] - - patt.ignore(cStyleComment) - patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj', 'lskjd'] - """ - if isinstance(other, basestring): - other = Suppress(other) - - if isinstance( other, Suppress ): - if other not in self.ignoreExprs: - self.ignoreExprs.append(other) - else: - self.ignoreExprs.append( Suppress( other.copy() ) ) - return self - - def setDebugActions( self, startAction, successAction, exceptionAction ): - """ - Enable display of debugging messages while doing pattern matching. - """ - self.debugActions = (startAction or _defaultStartDebugAction, - successAction or _defaultSuccessDebugAction, - exceptionAction or _defaultExceptionDebugAction) - self.debug = True - return self - - def setDebug( self, flag=True ): - """ - Enable display of debugging messages while doing pattern matching. - Set C{flag} to True to enable, False to disable. - - Example:: - wd = Word(alphas).setName("alphaword") - integer = Word(nums).setName("numword") - term = wd | integer - - # turn on debugging for wd - wd.setDebug() - - OneOrMore(term).parseString("abc 123 xyz 890") - - prints:: - Match alphaword at loc 0(1,1) - Matched alphaword -> ['abc'] - Match alphaword at loc 3(1,4) - Exception raised:Expected alphaword (at char 4), (line:1, col:5) - Match alphaword at loc 7(1,8) - Matched alphaword -> ['xyz'] - Match alphaword at loc 11(1,12) - Exception raised:Expected alphaword (at char 12), (line:1, col:13) - Match alphaword at loc 15(1,16) - Exception raised:Expected alphaword (at char 15), (line:1, col:16) - - The output shown is that produced by the default debug actions - custom debug actions can be - specified using L{setDebugActions}. Prior to attempting - to match the C{wd} expression, the debugging message C{"Match <exprname> at loc <n>(<line>,<col>)"} - is shown. Then if the parse succeeds, a C{"Matched"} message is shown, or an C{"Exception raised"} - message is shown. Also note the use of L{setName} to assign a human-readable name to the expression, - which makes debugging and exception messages easier to understand - for instance, the default - name created for the C{Word} expression without calling C{setName} is C{"W:(ABCD...)"}. - """ - if flag: - self.setDebugActions( _defaultStartDebugAction, _defaultSuccessDebugAction, _defaultExceptionDebugAction ) - else: - self.debug = False - return self - - def __str__( self ): - return self.name - - def __repr__( self ): - return _ustr(self) - - def streamline( self ): - self.streamlined = True - self.strRepr = None - return self - - def checkRecursion( self, parseElementList ): - pass - - def validate( self, validateTrace=[] ): - """ - Check defined expressions for valid structure, check for infinite recursive definitions. - """ - self.checkRecursion( [] ) - - def parseFile( self, file_or_filename, parseAll=False ): - """ - Execute the parse expression on the given file or filename. - If a filename is specified (instead of a file object), - the entire file is opened, read, and closed before parsing. - """ - try: - file_contents = file_or_filename.read() - except AttributeError: - with open(file_or_filename, "r") as f: - file_contents = f.read() - try: - return self.parseString(file_contents, parseAll) - except ParseBaseException as exc: - if ParserElement.verbose_stacktrace: - raise - else: - # catch and re-raise exception from here, clears out pyparsing internal stack trace - raise exc - - def __eq__(self,other): - if isinstance(other, ParserElement): - return self is other or vars(self) == vars(other) - elif isinstance(other, basestring): - return self.matches(other) - else: - return super(ParserElement,self)==other - - def __ne__(self,other): - return not (self == other) - - def __hash__(self): - return hash(id(self)) - - def __req__(self,other): - return self == other - - def __rne__(self,other): - return not (self == other) - - def matches(self, testString, parseAll=True): - """ - Method for quick testing of a parser against a test string. Good for simple - inline microtests of sub expressions while building up larger parser. - - Parameters: - - testString - to test against this expression for a match - - parseAll - (default=C{True}) - flag to pass to C{L{parseString}} when running tests - - Example:: - expr = Word(nums) - assert expr.matches("100") - """ - try: - self.parseString(_ustr(testString), parseAll=parseAll) - return True - except ParseBaseException: - return False - - def runTests(self, tests, parseAll=True, comment='#', fullDump=True, printResults=True, failureTests=False): - """ - Execute the parse expression on a series of test strings, showing each - test, the parsed results or where the parse failed. Quick and easy way to - run a parse expression against a list of sample strings. - - Parameters: - - tests - a list of separate test strings, or a multiline string of test strings - - parseAll - (default=C{True}) - flag to pass to C{L{parseString}} when running tests - - comment - (default=C{'#'}) - expression for indicating embedded comments in the test - string; pass None to disable comment filtering - - fullDump - (default=C{True}) - dump results as list followed by results names in nested outline; - if False, only dump nested list - - printResults - (default=C{True}) prints test output to stdout - - failureTests - (default=C{False}) indicates if these tests are expected to fail parsing - - Returns: a (success, results) tuple, where success indicates that all tests succeeded - (or failed if C{failureTests} is True), and the results contain a list of lines of each - test's output - - Example:: - number_expr = pyparsing_common.number.copy() - - result = number_expr.runTests(''' - # unsigned integer - 100 - # negative integer - -100 - # float with scientific notation - 6.02e23 - # integer with scientific notation - 1e-12 - ''') - print("Success" if result[0] else "Failed!") - - result = number_expr.runTests(''' - # stray character - 100Z - # missing leading digit before '.' - -.100 - # too many '.' - 3.14.159 - ''', failureTests=True) - print("Success" if result[0] else "Failed!") - prints:: - # unsigned integer - 100 - [100] - - # negative integer - -100 - [-100] - - # float with scientific notation - 6.02e23 - [6.02e+23] - - # integer with scientific notation - 1e-12 - [1e-12] - - Success - - # stray character - 100Z - ^ - FAIL: Expected end of text (at char 3), (line:1, col:4) - - # missing leading digit before '.' - -.100 - ^ - FAIL: Expected {real number with scientific notation | real number | signed integer} (at char 0), (line:1, col:1) - - # too many '.' - 3.14.159 - ^ - FAIL: Expected end of text (at char 4), (line:1, col:5) - - Success - - Each test string must be on a single line. If you want to test a string that spans multiple - lines, create a test like this:: - - expr.runTest(r"this is a test\\n of strings that spans \\n 3 lines") - - (Note that this is a raw string literal, you must include the leading 'r'.) - """ - if isinstance(tests, basestring): - tests = list(map(str.strip, tests.rstrip().splitlines())) - if isinstance(comment, basestring): - comment = Literal(comment) - allResults = [] - comments = [] - success = True - for t in tests: - if comment is not None and comment.matches(t, False) or comments and not t: - comments.append(t) - continue - if not t: - continue - out = ['\n'.join(comments), t] - comments = [] - try: - t = t.replace(r'\n','\n') - result = self.parseString(t, parseAll=parseAll) - out.append(result.dump(full=fullDump)) - success = success and not failureTests - except ParseBaseException as pe: - fatal = "(FATAL)" if isinstance(pe, ParseFatalException) else "" - if '\n' in t: - out.append(line(pe.loc, t)) - out.append(' '*(col(pe.loc,t)-1) + '^' + fatal) - else: - out.append(' '*pe.loc + '^' + fatal) - out.append("FAIL: " + str(pe)) - success = success and failureTests - result = pe - except Exception as exc: - out.append("FAIL-EXCEPTION: " + str(exc)) - success = success and failureTests - result = exc - - if printResults: - if fullDump: - out.append('') - print('\n'.join(out)) - - allResults.append((t, result)) - - return success, allResults - - -class Token(ParserElement): - """ - Abstract C{ParserElement} subclass, for defining atomic matching patterns. - """ - def __init__( self ): - super(Token,self).__init__( savelist=False ) - - -class Empty(Token): - """ - An empty token, will always match. - """ - def __init__( self ): - super(Empty,self).__init__() - self.name = "Empty" - self.mayReturnEmpty = True - self.mayIndexError = False - - -class NoMatch(Token): - """ - A token that will never match. - """ - def __init__( self ): - super(NoMatch,self).__init__() - self.name = "NoMatch" - self.mayReturnEmpty = True - self.mayIndexError = False - self.errmsg = "Unmatchable token" - - def parseImpl( self, instring, loc, doActions=True ): - raise ParseException(instring, loc, self.errmsg, self) - - -class Literal(Token): - """ - Token to exactly match a specified string. - - Example:: - Literal('blah').parseString('blah') # -> ['blah'] - Literal('blah').parseString('blahfooblah') # -> ['blah'] - Literal('blah').parseString('bla') # -> Exception: Expected "blah" - - For case-insensitive matching, use L{CaselessLiteral}. - - For keyword matching (force word break before and after the matched string), - use L{Keyword} or L{CaselessKeyword}. - """ - def __init__( self, matchString ): - super(Literal,self).__init__() - self.match = matchString - self.matchLen = len(matchString) - try: - self.firstMatchChar = matchString[0] - except IndexError: - warnings.warn("null string passed to Literal; use Empty() instead", - SyntaxWarning, stacklevel=2) - self.__class__ = Empty - self.name = '"%s"' % _ustr(self.match) - self.errmsg = "Expected " + self.name - self.mayReturnEmpty = False - self.mayIndexError = False - - # Performance tuning: this routine gets called a *lot* - # if this is a single character match string and the first character matches, - # short-circuit as quickly as possible, and avoid calling startswith - #~ @profile - def parseImpl( self, instring, loc, doActions=True ): - if (instring[loc] == self.firstMatchChar and - (self.matchLen==1 or instring.startswith(self.match,loc)) ): - return loc+self.matchLen, self.match - raise ParseException(instring, loc, self.errmsg, self) -_L = Literal -ParserElement._literalStringClass = Literal - -class Keyword(Token): - """ - Token to exactly match a specified string as a keyword, that is, it must be - immediately followed by a non-keyword character. Compare with C{L{Literal}}: - - C{Literal("if")} will match the leading C{'if'} in C{'ifAndOnlyIf'}. - - C{Keyword("if")} will not; it will only match the leading C{'if'} in C{'if x=1'}, or C{'if(y==2)'} - Accepts two optional constructor arguments in addition to the keyword string: - - C{identChars} is a string of characters that would be valid identifier characters, - defaulting to all alphanumerics + "_" and "$" - - C{caseless} allows case-insensitive matching, default is C{False}. - - Example:: - Keyword("start").parseString("start") # -> ['start'] - Keyword("start").parseString("starting") # -> Exception - - For case-insensitive matching, use L{CaselessKeyword}. - """ - DEFAULT_KEYWORD_CHARS = alphanums+"_$" - - def __init__( self, matchString, identChars=None, caseless=False ): - super(Keyword,self).__init__() - if identChars is None: - identChars = Keyword.DEFAULT_KEYWORD_CHARS - self.match = matchString - self.matchLen = len(matchString) - try: - self.firstMatchChar = matchString[0] - except IndexError: - warnings.warn("null string passed to Keyword; use Empty() instead", - SyntaxWarning, stacklevel=2) - self.name = '"%s"' % self.match - self.errmsg = "Expected " + self.name - self.mayReturnEmpty = False - self.mayIndexError = False - self.caseless = caseless - if caseless: - self.caselessmatch = matchString.upper() - identChars = identChars.upper() - self.identChars = set(identChars) - - def parseImpl( self, instring, loc, doActions=True ): - if self.caseless: - if ( (instring[ loc:loc+self.matchLen ].upper() == self.caselessmatch) and - (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen].upper() not in self.identChars) and - (loc == 0 or instring[loc-1].upper() not in self.identChars) ): - return loc+self.matchLen, self.match - else: - if (instring[loc] == self.firstMatchChar and - (self.matchLen==1 or instring.startswith(self.match,loc)) and - (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen] not in self.identChars) and - (loc == 0 or instring[loc-1] not in self.identChars) ): - return loc+self.matchLen, self.match - raise ParseException(instring, loc, self.errmsg, self) - - def copy(self): - c = super(Keyword,self).copy() - c.identChars = Keyword.DEFAULT_KEYWORD_CHARS - return c - - @staticmethod - def setDefaultKeywordChars( chars ): - """Overrides the default Keyword chars - """ - Keyword.DEFAULT_KEYWORD_CHARS = chars - -class CaselessLiteral(Literal): - """ - Token to match a specified string, ignoring case of letters. - Note: the matched results will always be in the case of the given - match string, NOT the case of the input text. - - Example:: - OneOrMore(CaselessLiteral("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD', 'CMD'] - - (Contrast with example for L{CaselessKeyword}.) - """ - def __init__( self, matchString ): - super(CaselessLiteral,self).__init__( matchString.upper() ) - # Preserve the defining literal. - self.returnString = matchString - self.name = "'%s'" % self.returnString - self.errmsg = "Expected " + self.name - - def parseImpl( self, instring, loc, doActions=True ): - if instring[ loc:loc+self.matchLen ].upper() == self.match: - return loc+self.matchLen, self.returnString - raise ParseException(instring, loc, self.errmsg, self) - -class CaselessKeyword(Keyword): - """ - Caseless version of L{Keyword}. - - Example:: - OneOrMore(CaselessKeyword("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD'] - - (Contrast with example for L{CaselessLiteral}.) - """ - def __init__( self, matchString, identChars=None ): - super(CaselessKeyword,self).__init__( matchString, identChars, caseless=True ) - - def parseImpl( self, instring, loc, doActions=True ): - if ( (instring[ loc:loc+self.matchLen ].upper() == self.caselessmatch) and - (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen].upper() not in self.identChars) ): - return loc+self.matchLen, self.match - raise ParseException(instring, loc, self.errmsg, self) - -class CloseMatch(Token): - """ - A variation on L{Literal} which matches "close" matches, that is, - strings with at most 'n' mismatching characters. C{CloseMatch} takes parameters: - - C{match_string} - string to be matched - - C{maxMismatches} - (C{default=1}) maximum number of mismatches allowed to count as a match - - The results from a successful parse will contain the matched text from the input string and the following named results: - - C{mismatches} - a list of the positions within the match_string where mismatches were found - - C{original} - the original match_string used to compare against the input string - - If C{mismatches} is an empty list, then the match was an exact match. - - Example:: - patt = CloseMatch("ATCATCGAATGGA") - patt.parseString("ATCATCGAAXGGA") # -> (['ATCATCGAAXGGA'], {'mismatches': [[9]], 'original': ['ATCATCGAATGGA']}) - patt.parseString("ATCAXCGAAXGGA") # -> Exception: Expected 'ATCATCGAATGGA' (with up to 1 mismatches) (at char 0), (line:1, col:1) - - # exact match - patt.parseString("ATCATCGAATGGA") # -> (['ATCATCGAATGGA'], {'mismatches': [[]], 'original': ['ATCATCGAATGGA']}) - - # close match allowing up to 2 mismatches - patt = CloseMatch("ATCATCGAATGGA", maxMismatches=2) - patt.parseString("ATCAXCGAAXGGA") # -> (['ATCAXCGAAXGGA'], {'mismatches': [[4, 9]], 'original': ['ATCATCGAATGGA']}) - """ - def __init__(self, match_string, maxMismatches=1): - super(CloseMatch,self).__init__() - self.name = match_string - self.match_string = match_string - self.maxMismatches = maxMismatches - self.errmsg = "Expected %r (with up to %d mismatches)" % (self.match_string, self.maxMismatches) - self.mayIndexError = False - self.mayReturnEmpty = False - - def parseImpl( self, instring, loc, doActions=True ): - start = loc - instrlen = len(instring) - maxloc = start + len(self.match_string) - - if maxloc <= instrlen: - match_string = self.match_string - match_stringloc = 0 - mismatches = [] - maxMismatches = self.maxMismatches - - for match_stringloc,s_m in enumerate(zip(instring[loc:maxloc], self.match_string)): - src,mat = s_m - if src != mat: - mismatches.append(match_stringloc) - if len(mismatches) > maxMismatches: - break - else: - loc = match_stringloc + 1 - results = ParseResults([instring[start:loc]]) - results['original'] = self.match_string - results['mismatches'] = mismatches - return loc, results - - raise ParseException(instring, loc, self.errmsg, self) - - -class Word(Token): - """ - Token for matching words composed of allowed character sets. - Defined with string containing all allowed initial characters, - an optional string containing allowed body characters (if omitted, - defaults to the initial character set), and an optional minimum, - maximum, and/or exact length. The default value for C{min} is 1 (a - minimum value < 1 is not valid); the default values for C{max} and C{exact} - are 0, meaning no maximum or exact length restriction. An optional - C{excludeChars} parameter can list characters that might be found in - the input C{bodyChars} string; useful to define a word of all printables - except for one or two characters, for instance. - - L{srange} is useful for defining custom character set strings for defining - C{Word} expressions, using range notation from regular expression character sets. - - A common mistake is to use C{Word} to match a specific literal string, as in - C{Word("Address")}. Remember that C{Word} uses the string argument to define - I{sets} of matchable characters. This expression would match "Add", "AAA", - "dAred", or any other word made up of the characters 'A', 'd', 'r', 'e', and 's'. - To match an exact literal string, use L{Literal} or L{Keyword}. - - pyparsing includes helper strings for building Words: - - L{alphas} - - L{nums} - - L{alphanums} - - L{hexnums} - - L{alphas8bit} (alphabetic characters in ASCII range 128-255 - accented, tilded, umlauted, etc.) - - L{punc8bit} (non-alphabetic characters in ASCII range 128-255 - currency, symbols, superscripts, diacriticals, etc.) - - L{printables} (any non-whitespace character) - - Example:: - # a word composed of digits - integer = Word(nums) # equivalent to Word("0123456789") or Word(srange("0-9")) - - # a word with a leading capital, and zero or more lowercase - capital_word = Word(alphas.upper(), alphas.lower()) - - # hostnames are alphanumeric, with leading alpha, and '-' - hostname = Word(alphas, alphanums+'-') - - # roman numeral (not a strict parser, accepts invalid mix of characters) - roman = Word("IVXLCDM") - - # any string of non-whitespace characters, except for ',' - csv_value = Word(printables, excludeChars=",") - """ - def __init__( self, initChars, bodyChars=None, min=1, max=0, exact=0, asKeyword=False, excludeChars=None ): - super(Word,self).__init__() - if excludeChars: - initChars = ''.join(c for c in initChars if c not in excludeChars) - if bodyChars: - bodyChars = ''.join(c for c in bodyChars if c not in excludeChars) - self.initCharsOrig = initChars - self.initChars = set(initChars) - if bodyChars : - self.bodyCharsOrig = bodyChars - self.bodyChars = set(bodyChars) - else: - self.bodyCharsOrig = initChars - self.bodyChars = set(initChars) - - self.maxSpecified = max > 0 - - if min < 1: - raise ValueError("cannot specify a minimum length < 1; use Optional(Word()) if zero-length word is permitted") - - self.minLen = min - - if max > 0: - self.maxLen = max - else: - self.maxLen = _MAX_INT - - if exact > 0: - self.maxLen = exact - self.minLen = exact - - self.name = _ustr(self) - self.errmsg = "Expected " + self.name - self.mayIndexError = False - self.asKeyword = asKeyword - - if ' ' not in self.initCharsOrig+self.bodyCharsOrig and (min==1 and max==0 and exact==0): - if self.bodyCharsOrig == self.initCharsOrig: - self.reString = "[%s]+" % _escapeRegexRangeChars(self.initCharsOrig) - elif len(self.initCharsOrig) == 1: - self.reString = "%s[%s]*" % \ - (re.escape(self.initCharsOrig), - _escapeRegexRangeChars(self.bodyCharsOrig),) - else: - self.reString = "[%s][%s]*" % \ - (_escapeRegexRangeChars(self.initCharsOrig), - _escapeRegexRangeChars(self.bodyCharsOrig),) - if self.asKeyword: - self.reString = r"\b"+self.reString+r"\b" - try: - self.re = re.compile( self.reString ) - except Exception: - self.re = None - - def parseImpl( self, instring, loc, doActions=True ): - if self.re: - result = self.re.match(instring,loc) - if not result: - raise ParseException(instring, loc, self.errmsg, self) - - loc = result.end() - return loc, result.group() - - if not(instring[ loc ] in self.initChars): - raise ParseException(instring, loc, self.errmsg, self) - - start = loc - loc += 1 - instrlen = len(instring) - bodychars = self.bodyChars - maxloc = start + self.maxLen - maxloc = min( maxloc, instrlen ) - while loc < maxloc and instring[loc] in bodychars: - loc += 1 - - throwException = False - if loc - start < self.minLen: - throwException = True - if self.maxSpecified and loc < instrlen and instring[loc] in bodychars: - throwException = True - if self.asKeyword: - if (start>0 and instring[start-1] in bodychars) or (loc<instrlen and instring[loc] in bodychars): - throwException = True - - if throwException: - raise ParseException(instring, loc, self.errmsg, self) - - return loc, instring[start:loc] - - def __str__( self ): - try: - return super(Word,self).__str__() - except Exception: - pass - - - if self.strRepr is None: - - def charsAsStr(s): - if len(s)>4: - return s[:4]+"..." - else: - return s - - if ( self.initCharsOrig != self.bodyCharsOrig ): - self.strRepr = "W:(%s,%s)" % ( charsAsStr(self.initCharsOrig), charsAsStr(self.bodyCharsOrig) ) - else: - self.strRepr = "W:(%s)" % charsAsStr(self.initCharsOrig) - - return self.strRepr - - -class Regex(Token): - r""" - Token for matching strings that match a given regular expression. - Defined with string specifying the regular expression in a form recognized by the inbuilt Python re module. - If the given regex contains named groups (defined using C{(?P<name>...)}), these will be preserved as - named parse results. - - Example:: - realnum = Regex(r"[+-]?\d+\.\d*") - date = Regex(r'(?P<year>\d{4})-(?P<month>\d\d?)-(?P<day>\d\d?)') - # ref: http://stackoverflow.com/questions/267399/how-do-you-match-only-valid-roman-numerals-with-a-regular-expression - roman = Regex(r"M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})") - """ - compiledREtype = type(re.compile("[A-Z]")) - def __init__( self, pattern, flags=0): - """The parameters C{pattern} and C{flags} are passed to the C{re.compile()} function as-is. See the Python C{re} module for an explanation of the acceptable patterns and flags.""" - super(Regex,self).__init__() - - if isinstance(pattern, basestring): - if not pattern: - warnings.warn("null string passed to Regex; use Empty() instead", - SyntaxWarning, stacklevel=2) - - self.pattern = pattern - self.flags = flags - - try: - self.re = re.compile(self.pattern, self.flags) - self.reString = self.pattern - except sre_constants.error: - warnings.warn("invalid pattern (%s) passed to Regex" % pattern, - SyntaxWarning, stacklevel=2) - raise - - elif isinstance(pattern, Regex.compiledREtype): - self.re = pattern - self.pattern = \ - self.reString = str(pattern) - self.flags = flags - - else: - raise ValueError("Regex may only be constructed with a string or a compiled RE object") - - self.name = _ustr(self) - self.errmsg = "Expected " + self.name - self.mayIndexError = False - self.mayReturnEmpty = True - - def parseImpl( self, instring, loc, doActions=True ): - result = self.re.match(instring,loc) - if not result: - raise ParseException(instring, loc, self.errmsg, self) - - loc = result.end() - d = result.groupdict() - ret = ParseResults(result.group()) - if d: - for k in d: - ret[k] = d[k] - return loc,ret - - def __str__( self ): - try: - return super(Regex,self).__str__() - except Exception: - pass - - if self.strRepr is None: - self.strRepr = "Re:(%s)" % repr(self.pattern) - - return self.strRepr - - -class QuotedString(Token): - r""" - Token for matching strings that are delimited by quoting characters. - - Defined with the following parameters: - - quoteChar - string of one or more characters defining the quote delimiting string - - escChar - character to escape quotes, typically backslash (default=C{None}) - - escQuote - special quote sequence to escape an embedded quote string (such as SQL's "" to escape an embedded ") (default=C{None}) - - multiline - boolean indicating whether quotes can span multiple lines (default=C{False}) - - unquoteResults - boolean indicating whether the matched text should be unquoted (default=C{True}) - - endQuoteChar - string of one or more characters defining the end of the quote delimited string (default=C{None} => same as quoteChar) - - convertWhitespaceEscapes - convert escaped whitespace (C{'\t'}, C{'\n'}, etc.) to actual whitespace (default=C{True}) - - Example:: - qs = QuotedString('"') - print(qs.searchString('lsjdf "This is the quote" sldjf')) - complex_qs = QuotedString('{{', endQuoteChar='}}') - print(complex_qs.searchString('lsjdf {{This is the "quote"}} sldjf')) - sql_qs = QuotedString('"', escQuote='""') - print(sql_qs.searchString('lsjdf "This is the quote with ""embedded"" quotes" sldjf')) - prints:: - [['This is the quote']] - [['This is the "quote"']] - [['This is the quote with "embedded" quotes']] - """ - def __init__( self, quoteChar, escChar=None, escQuote=None, multiline=False, unquoteResults=True, endQuoteChar=None, convertWhitespaceEscapes=True): - super(QuotedString,self).__init__() - - # remove white space from quote chars - wont work anyway - quoteChar = quoteChar.strip() - if not quoteChar: - warnings.warn("quoteChar cannot be the empty string",SyntaxWarning,stacklevel=2) - raise SyntaxError() - - if endQuoteChar is None: - endQuoteChar = quoteChar - else: - endQuoteChar = endQuoteChar.strip() - if not endQuoteChar: - warnings.warn("endQuoteChar cannot be the empty string",SyntaxWarning,stacklevel=2) - raise SyntaxError() - - self.quoteChar = quoteChar - self.quoteCharLen = len(quoteChar) - self.firstQuoteChar = quoteChar[0] - self.endQuoteChar = endQuoteChar - self.endQuoteCharLen = len(endQuoteChar) - self.escChar = escChar - self.escQuote = escQuote - self.unquoteResults = unquoteResults - self.convertWhitespaceEscapes = convertWhitespaceEscapes - - if multiline: - self.flags = re.MULTILINE | re.DOTALL - self.pattern = r'%s(?:[^%s%s]' % \ - ( re.escape(self.quoteChar), - _escapeRegexRangeChars(self.endQuoteChar[0]), - (escChar is not None and _escapeRegexRangeChars(escChar) or '') ) - else: - self.flags = 0 - self.pattern = r'%s(?:[^%s\n\r%s]' % \ - ( re.escape(self.quoteChar), - _escapeRegexRangeChars(self.endQuoteChar[0]), - (escChar is not None and _escapeRegexRangeChars(escChar) or '') ) - if len(self.endQuoteChar) > 1: - self.pattern += ( - '|(?:' + ')|(?:'.join("%s[^%s]" % (re.escape(self.endQuoteChar[:i]), - _escapeRegexRangeChars(self.endQuoteChar[i])) - for i in range(len(self.endQuoteChar)-1,0,-1)) + ')' - ) - if escQuote: - self.pattern += (r'|(?:%s)' % re.escape(escQuote)) - if escChar: - self.pattern += (r'|(?:%s.)' % re.escape(escChar)) - self.escCharReplacePattern = re.escape(self.escChar)+"(.)" - self.pattern += (r')*%s' % re.escape(self.endQuoteChar)) - - try: - self.re = re.compile(self.pattern, self.flags) - self.reString = self.pattern - except sre_constants.error: - warnings.warn("invalid pattern (%s) passed to Regex" % self.pattern, - SyntaxWarning, stacklevel=2) - raise - - self.name = _ustr(self) - self.errmsg = "Expected " + self.name - self.mayIndexError = False - self.mayReturnEmpty = True - - def parseImpl( self, instring, loc, doActions=True ): - result = instring[loc] == self.firstQuoteChar and self.re.match(instring,loc) or None - if not result: - raise ParseException(instring, loc, self.errmsg, self) - - loc = result.end() - ret = result.group() - - if self.unquoteResults: - - # strip off quotes - ret = ret[self.quoteCharLen:-self.endQuoteCharLen] - - if isinstance(ret,basestring): - # replace escaped whitespace - if '\\' in ret and self.convertWhitespaceEscapes: - ws_map = { - r'\t' : '\t', - r'\n' : '\n', - r'\f' : '\f', - r'\r' : '\r', - } - for wslit,wschar in ws_map.items(): - ret = ret.replace(wslit, wschar) - - # replace escaped characters - if self.escChar: - ret = re.sub(self.escCharReplacePattern, r"\g<1>", ret) - - # replace escaped quotes - if self.escQuote: - ret = ret.replace(self.escQuote, self.endQuoteChar) - - return loc, ret - - def __str__( self ): - try: - return super(QuotedString,self).__str__() - except Exception: - pass - - if self.strRepr is None: - self.strRepr = "quoted string, starting with %s ending with %s" % (self.quoteChar, self.endQuoteChar) - - return self.strRepr - - -class CharsNotIn(Token): - """ - Token for matching words composed of characters I{not} in a given set (will - include whitespace in matched characters if not listed in the provided exclusion set - see example). - Defined with string containing all disallowed characters, and an optional - minimum, maximum, and/or exact length. The default value for C{min} is 1 (a - minimum value < 1 is not valid); the default values for C{max} and C{exact} - are 0, meaning no maximum or exact length restriction. - - Example:: - # define a comma-separated-value as anything that is not a ',' - csv_value = CharsNotIn(',') - print(delimitedList(csv_value).parseString("dkls,lsdkjf,s12 34,@!#,213")) - prints:: - ['dkls', 'lsdkjf', 's12 34', '@!#', '213'] - """ - def __init__( self, notChars, min=1, max=0, exact=0 ): - super(CharsNotIn,self).__init__() - self.skipWhitespace = False - self.notChars = notChars - - if min < 1: - raise ValueError("cannot specify a minimum length < 1; use Optional(CharsNotIn()) if zero-length char group is permitted") - - self.minLen = min - - if max > 0: - self.maxLen = max - else: - self.maxLen = _MAX_INT - - if exact > 0: - self.maxLen = exact - self.minLen = exact - - self.name = _ustr(self) - self.errmsg = "Expected " + self.name - self.mayReturnEmpty = ( self.minLen == 0 ) - self.mayIndexError = False - - def parseImpl( self, instring, loc, doActions=True ): - if instring[loc] in self.notChars: - raise ParseException(instring, loc, self.errmsg, self) - - start = loc - loc += 1 - notchars = self.notChars - maxlen = min( start+self.maxLen, len(instring) ) - while loc < maxlen and \ - (instring[loc] not in notchars): - loc += 1 - - if loc - start < self.minLen: - raise ParseException(instring, loc, self.errmsg, self) - - return loc, instring[start:loc] - - def __str__( self ): - try: - return super(CharsNotIn, self).__str__() - except Exception: - pass - - if self.strRepr is None: - if len(self.notChars) > 4: - self.strRepr = "!W:(%s...)" % self.notChars[:4] - else: - self.strRepr = "!W:(%s)" % self.notChars - - return self.strRepr - -class White(Token): - """ - Special matching class for matching whitespace. Normally, whitespace is ignored - by pyparsing grammars. This class is included when some whitespace structures - are significant. Define with a string containing the whitespace characters to be - matched; default is C{" \\t\\r\\n"}. Also takes optional C{min}, C{max}, and C{exact} arguments, - as defined for the C{L{Word}} class. - """ - whiteStrs = { - " " : "<SPC>", - "\t": "<TAB>", - "\n": "<LF>", - "\r": "<CR>", - "\f": "<FF>", - } - def __init__(self, ws=" \t\r\n", min=1, max=0, exact=0): - super(White,self).__init__() - self.matchWhite = ws - self.setWhitespaceChars( "".join(c for c in self.whiteChars if c not in self.matchWhite) ) - #~ self.leaveWhitespace() - self.name = ("".join(White.whiteStrs[c] for c in self.matchWhite)) - self.mayReturnEmpty = True - self.errmsg = "Expected " + self.name - - self.minLen = min - - if max > 0: - self.maxLen = max - else: - self.maxLen = _MAX_INT - - if exact > 0: - self.maxLen = exact - self.minLen = exact - - def parseImpl( self, instring, loc, doActions=True ): - if not(instring[ loc ] in self.matchWhite): - raise ParseException(instring, loc, self.errmsg, self) - start = loc - loc += 1 - maxloc = start + self.maxLen - maxloc = min( maxloc, len(instring) ) - while loc < maxloc and instring[loc] in self.matchWhite: - loc += 1 - - if loc - start < self.minLen: - raise ParseException(instring, loc, self.errmsg, self) - - return loc, instring[start:loc] - - -class _PositionToken(Token): - def __init__( self ): - super(_PositionToken,self).__init__() - self.name=self.__class__.__name__ - self.mayReturnEmpty = True - self.mayIndexError = False - -class GoToColumn(_PositionToken): - """ - Token to advance to a specific column of input text; useful for tabular report scraping. - """ - def __init__( self, colno ): - super(GoToColumn,self).__init__() - self.col = colno - - def preParse( self, instring, loc ): - if col(loc,instring) != self.col: - instrlen = len(instring) - if self.ignoreExprs: - loc = self._skipIgnorables( instring, loc ) - while loc < instrlen and instring[loc].isspace() and col( loc, instring ) != self.col : - loc += 1 - return loc - - def parseImpl( self, instring, loc, doActions=True ): - thiscol = col( loc, instring ) - if thiscol > self.col: - raise ParseException( instring, loc, "Text not in expected column", self ) - newloc = loc + self.col - thiscol - ret = instring[ loc: newloc ] - return newloc, ret - - -class LineStart(_PositionToken): - """ - Matches if current position is at the beginning of a line within the parse string - - Example:: - - test = '''\ - AAA this line - AAA and this line - AAA but not this one - B AAA and definitely not this one - ''' - - for t in (LineStart() + 'AAA' + restOfLine).searchString(test): - print(t) - - Prints:: - ['AAA', ' this line'] - ['AAA', ' and this line'] - - """ - def __init__( self ): - super(LineStart,self).__init__() - self.errmsg = "Expected start of line" - - def parseImpl( self, instring, loc, doActions=True ): - if col(loc, instring) == 1: - return loc, [] - raise ParseException(instring, loc, self.errmsg, self) - -class LineEnd(_PositionToken): - """ - Matches if current position is at the end of a line within the parse string - """ - def __init__( self ): - super(LineEnd,self).__init__() - self.setWhitespaceChars( ParserElement.DEFAULT_WHITE_CHARS.replace("\n","") ) - self.errmsg = "Expected end of line" - - def parseImpl( self, instring, loc, doActions=True ): - if loc<len(instring): - if instring[loc] == "\n": - return loc+1, "\n" - else: - raise ParseException(instring, loc, self.errmsg, self) - elif loc == len(instring): - return loc+1, [] - else: - raise ParseException(instring, loc, self.errmsg, self) - -class StringStart(_PositionToken): - """ - Matches if current position is at the beginning of the parse string - """ - def __init__( self ): - super(StringStart,self).__init__() - self.errmsg = "Expected start of text" - - def parseImpl( self, instring, loc, doActions=True ): - if loc != 0: - # see if entire string up to here is just whitespace and ignoreables - if loc != self.preParse( instring, 0 ): - raise ParseException(instring, loc, self.errmsg, self) - return loc, [] - -class StringEnd(_PositionToken): - """ - Matches if current position is at the end of the parse string - """ - def __init__( self ): - super(StringEnd,self).__init__() - self.errmsg = "Expected end of text" - - def parseImpl( self, instring, loc, doActions=True ): - if loc < len(instring): - raise ParseException(instring, loc, self.errmsg, self) - elif loc == len(instring): - return loc+1, [] - elif loc > len(instring): - return loc, [] - else: - raise ParseException(instring, loc, self.errmsg, self) - -class WordStart(_PositionToken): - """ - Matches if the current position is at the beginning of a Word, and - is not preceded by any character in a given set of C{wordChars} - (default=C{printables}). To emulate the C{\b} behavior of regular expressions, - use C{WordStart(alphanums)}. C{WordStart} will also match at the beginning of - the string being parsed, or at the beginning of a line. - """ - def __init__(self, wordChars = printables): - super(WordStart,self).__init__() - self.wordChars = set(wordChars) - self.errmsg = "Not at the start of a word" - - def parseImpl(self, instring, loc, doActions=True ): - if loc != 0: - if (instring[loc-1] in self.wordChars or - instring[loc] not in self.wordChars): - raise ParseException(instring, loc, self.errmsg, self) - return loc, [] - -class WordEnd(_PositionToken): - """ - Matches if the current position is at the end of a Word, and - is not followed by any character in a given set of C{wordChars} - (default=C{printables}). To emulate the C{\b} behavior of regular expressions, - use C{WordEnd(alphanums)}. C{WordEnd} will also match at the end of - the string being parsed, or at the end of a line. - """ - def __init__(self, wordChars = printables): - super(WordEnd,self).__init__() - self.wordChars = set(wordChars) - self.skipWhitespace = False - self.errmsg = "Not at the end of a word" - - def parseImpl(self, instring, loc, doActions=True ): - instrlen = len(instring) - if instrlen>0 and loc<instrlen: - if (instring[loc] in self.wordChars or - instring[loc-1] not in self.wordChars): - raise ParseException(instring, loc, self.errmsg, self) - return loc, [] - - -class ParseExpression(ParserElement): - """ - Abstract subclass of ParserElement, for combining and post-processing parsed tokens. - """ - def __init__( self, exprs, savelist = False ): - super(ParseExpression,self).__init__(savelist) - if isinstance( exprs, _generatorType ): - exprs = list(exprs) - - if isinstance( exprs, basestring ): - self.exprs = [ ParserElement._literalStringClass( exprs ) ] - elif isinstance( exprs, Iterable ): - exprs = list(exprs) - # if sequence of strings provided, wrap with Literal - if all(isinstance(expr, basestring) for expr in exprs): - exprs = map(ParserElement._literalStringClass, exprs) - self.exprs = list(exprs) - else: - try: - self.exprs = list( exprs ) - except TypeError: - self.exprs = [ exprs ] - self.callPreparse = False - - def __getitem__( self, i ): - return self.exprs[i] - - def append( self, other ): - self.exprs.append( other ) - self.strRepr = None - return self - - def leaveWhitespace( self ): - """Extends C{leaveWhitespace} defined in base class, and also invokes C{leaveWhitespace} on - all contained expressions.""" - self.skipWhitespace = False - self.exprs = [ e.copy() for e in self.exprs ] - for e in self.exprs: - e.leaveWhitespace() - return self - - def ignore( self, other ): - if isinstance( other, Suppress ): - if other not in self.ignoreExprs: - super( ParseExpression, self).ignore( other ) - for e in self.exprs: - e.ignore( self.ignoreExprs[-1] ) - else: - super( ParseExpression, self).ignore( other ) - for e in self.exprs: - e.ignore( self.ignoreExprs[-1] ) - return self - - def __str__( self ): - try: - return super(ParseExpression,self).__str__() - except Exception: - pass - - if self.strRepr is None: - self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.exprs) ) - return self.strRepr - - def streamline( self ): - super(ParseExpression,self).streamline() - - for e in self.exprs: - e.streamline() - - # collapse nested And's of the form And( And( And( a,b), c), d) to And( a,b,c,d ) - # but only if there are no parse actions or resultsNames on the nested And's - # (likewise for Or's and MatchFirst's) - if ( len(self.exprs) == 2 ): - other = self.exprs[0] - if ( isinstance( other, self.__class__ ) and - not(other.parseAction) and - other.resultsName is None and - not other.debug ): - self.exprs = other.exprs[:] + [ self.exprs[1] ] - self.strRepr = None - self.mayReturnEmpty |= other.mayReturnEmpty - self.mayIndexError |= other.mayIndexError - - other = self.exprs[-1] - if ( isinstance( other, self.__class__ ) and - not(other.parseAction) and - other.resultsName is None and - not other.debug ): - self.exprs = self.exprs[:-1] + other.exprs[:] - self.strRepr = None - self.mayReturnEmpty |= other.mayReturnEmpty - self.mayIndexError |= other.mayIndexError - - self.errmsg = "Expected " + _ustr(self) - - return self - - def setResultsName( self, name, listAllMatches=False ): - ret = super(ParseExpression,self).setResultsName(name,listAllMatches) - return ret - - def validate( self, validateTrace=[] ): - tmp = validateTrace[:]+[self] - for e in self.exprs: - e.validate(tmp) - self.checkRecursion( [] ) - - def copy(self): - ret = super(ParseExpression,self).copy() - ret.exprs = [e.copy() for e in self.exprs] - return ret - -class And(ParseExpression): - """ - Requires all given C{ParseExpression}s to be found in the given order. - Expressions may be separated by whitespace. - May be constructed using the C{'+'} operator. - May also be constructed using the C{'-'} operator, which will suppress backtracking. - - Example:: - integer = Word(nums) - name_expr = OneOrMore(Word(alphas)) - - expr = And([integer("id"),name_expr("name"),integer("age")]) - # more easily written as: - expr = integer("id") + name_expr("name") + integer("age") - """ - - class _ErrorStop(Empty): - def __init__(self, *args, **kwargs): - super(And._ErrorStop,self).__init__(*args, **kwargs) - self.name = '-' - self.leaveWhitespace() - - def __init__( self, exprs, savelist = True ): - super(And,self).__init__(exprs, savelist) - self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) - self.setWhitespaceChars( self.exprs[0].whiteChars ) - self.skipWhitespace = self.exprs[0].skipWhitespace - self.callPreparse = True - - def parseImpl( self, instring, loc, doActions=True ): - # pass False as last arg to _parse for first element, since we already - # pre-parsed the string as part of our And pre-parsing - loc, resultlist = self.exprs[0]._parse( instring, loc, doActions, callPreParse=False ) - errorStop = False - for e in self.exprs[1:]: - if isinstance(e, And._ErrorStop): - errorStop = True - continue - if errorStop: - try: - loc, exprtokens = e._parse( instring, loc, doActions ) - except ParseSyntaxException: - raise - except ParseBaseException as pe: - pe.__traceback__ = None - raise ParseSyntaxException._from_exception(pe) - except IndexError: - raise ParseSyntaxException(instring, len(instring), self.errmsg, self) - else: - loc, exprtokens = e._parse( instring, loc, doActions ) - if exprtokens or exprtokens.haskeys(): - resultlist += exprtokens - return loc, resultlist - - def __iadd__(self, other ): - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - return self.append( other ) #And( [ self, other ] ) - - def checkRecursion( self, parseElementList ): - subRecCheckList = parseElementList[:] + [ self ] - for e in self.exprs: - e.checkRecursion( subRecCheckList ) - if not e.mayReturnEmpty: - break - - def __str__( self ): - if hasattr(self,"name"): - return self.name - - if self.strRepr is None: - self.strRepr = "{" + " ".join(_ustr(e) for e in self.exprs) + "}" - - return self.strRepr - - -class Or(ParseExpression): - """ - Requires that at least one C{ParseExpression} is found. - If two expressions match, the expression that matches the longest string will be used. - May be constructed using the C{'^'} operator. - - Example:: - # construct Or using '^' operator - - number = Word(nums) ^ Combine(Word(nums) + '.' + Word(nums)) - print(number.searchString("123 3.1416 789")) - prints:: - [['123'], ['3.1416'], ['789']] - """ - def __init__( self, exprs, savelist = False ): - super(Or,self).__init__(exprs, savelist) - if self.exprs: - self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs) - else: - self.mayReturnEmpty = True - - def parseImpl( self, instring, loc, doActions=True ): - maxExcLoc = -1 - maxException = None - matches = [] - for e in self.exprs: - try: - loc2 = e.tryParse( instring, loc ) - except ParseException as err: - err.__traceback__ = None - if err.loc > maxExcLoc: - maxException = err - maxExcLoc = err.loc - except IndexError: - if len(instring) > maxExcLoc: - maxException = ParseException(instring,len(instring),e.errmsg,self) - maxExcLoc = len(instring) - else: - # save match among all matches, to retry longest to shortest - matches.append((loc2, e)) - - if matches: - matches.sort(key=lambda x: -x[0]) - for _,e in matches: - try: - return e._parse( instring, loc, doActions ) - except ParseException as err: - err.__traceback__ = None - if err.loc > maxExcLoc: - maxException = err - maxExcLoc = err.loc - - if maxException is not None: - maxException.msg = self.errmsg - raise maxException - else: - raise ParseException(instring, loc, "no defined alternatives to match", self) - - - def __ixor__(self, other ): - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - return self.append( other ) #Or( [ self, other ] ) - - def __str__( self ): - if hasattr(self,"name"): - return self.name - - if self.strRepr is None: - self.strRepr = "{" + " ^ ".join(_ustr(e) for e in self.exprs) + "}" - - return self.strRepr - - def checkRecursion( self, parseElementList ): - subRecCheckList = parseElementList[:] + [ self ] - for e in self.exprs: - e.checkRecursion( subRecCheckList ) - - -class MatchFirst(ParseExpression): - """ - Requires that at least one C{ParseExpression} is found. - If two expressions match, the first one listed is the one that will match. - May be constructed using the C{'|'} operator. - - Example:: - # construct MatchFirst using '|' operator - - # watch the order of expressions to match - number = Word(nums) | Combine(Word(nums) + '.' + Word(nums)) - print(number.searchString("123 3.1416 789")) # Fail! -> [['123'], ['3'], ['1416'], ['789']] - - # put more selective expression first - number = Combine(Word(nums) + '.' + Word(nums)) | Word(nums) - print(number.searchString("123 3.1416 789")) # Better -> [['123'], ['3.1416'], ['789']] - """ - def __init__( self, exprs, savelist = False ): - super(MatchFirst,self).__init__(exprs, savelist) - if self.exprs: - self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs) - else: - self.mayReturnEmpty = True - - def parseImpl( self, instring, loc, doActions=True ): - maxExcLoc = -1 - maxException = None - for e in self.exprs: - try: - ret = e._parse( instring, loc, doActions ) - return ret - except ParseException as err: - if err.loc > maxExcLoc: - maxException = err - maxExcLoc = err.loc - except IndexError: - if len(instring) > maxExcLoc: - maxException = ParseException(instring,len(instring),e.errmsg,self) - maxExcLoc = len(instring) - - # only got here if no expression matched, raise exception for match that made it the furthest - else: - if maxException is not None: - maxException.msg = self.errmsg - raise maxException - else: - raise ParseException(instring, loc, "no defined alternatives to match", self) - - def __ior__(self, other ): - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - return self.append( other ) #MatchFirst( [ self, other ] ) - - def __str__( self ): - if hasattr(self,"name"): - return self.name - - if self.strRepr is None: - self.strRepr = "{" + " | ".join(_ustr(e) for e in self.exprs) + "}" - - return self.strRepr - - def checkRecursion( self, parseElementList ): - subRecCheckList = parseElementList[:] + [ self ] - for e in self.exprs: - e.checkRecursion( subRecCheckList ) - - -class Each(ParseExpression): - """ - Requires all given C{ParseExpression}s to be found, but in any order. - Expressions may be separated by whitespace. - May be constructed using the C{'&'} operator. - - Example:: - color = oneOf("RED ORANGE YELLOW GREEN BLUE PURPLE BLACK WHITE BROWN") - shape_type = oneOf("SQUARE CIRCLE TRIANGLE STAR HEXAGON OCTAGON") - integer = Word(nums) - shape_attr = "shape:" + shape_type("shape") - posn_attr = "posn:" + Group(integer("x") + ',' + integer("y"))("posn") - color_attr = "color:" + color("color") - size_attr = "size:" + integer("size") - - # use Each (using operator '&') to accept attributes in any order - # (shape and posn are required, color and size are optional) - shape_spec = shape_attr & posn_attr & Optional(color_attr) & Optional(size_attr) - - shape_spec.runTests(''' - shape: SQUARE color: BLACK posn: 100, 120 - shape: CIRCLE size: 50 color: BLUE posn: 50,80 - color:GREEN size:20 shape:TRIANGLE posn:20,40 - ''' - ) - prints:: - shape: SQUARE color: BLACK posn: 100, 120 - ['shape:', 'SQUARE', 'color:', 'BLACK', 'posn:', ['100', ',', '120']] - - color: BLACK - - posn: ['100', ',', '120'] - - x: 100 - - y: 120 - - shape: SQUARE - - - shape: CIRCLE size: 50 color: BLUE posn: 50,80 - ['shape:', 'CIRCLE', 'size:', '50', 'color:', 'BLUE', 'posn:', ['50', ',', '80']] - - color: BLUE - - posn: ['50', ',', '80'] - - x: 50 - - y: 80 - - shape: CIRCLE - - size: 50 - - - color: GREEN size: 20 shape: TRIANGLE posn: 20,40 - ['color:', 'GREEN', 'size:', '20', 'shape:', 'TRIANGLE', 'posn:', ['20', ',', '40']] - - color: GREEN - - posn: ['20', ',', '40'] - - x: 20 - - y: 40 - - shape: TRIANGLE - - size: 20 - """ - def __init__( self, exprs, savelist = True ): - super(Each,self).__init__(exprs, savelist) - self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) - self.skipWhitespace = True - self.initExprGroups = True - - def parseImpl( self, instring, loc, doActions=True ): - if self.initExprGroups: - self.opt1map = dict((id(e.expr),e) for e in self.exprs if isinstance(e,Optional)) - opt1 = [ e.expr for e in self.exprs if isinstance(e,Optional) ] - opt2 = [ e for e in self.exprs if e.mayReturnEmpty and not isinstance(e,Optional)] - self.optionals = opt1 + opt2 - self.multioptionals = [ e.expr for e in self.exprs if isinstance(e,ZeroOrMore) ] - self.multirequired = [ e.expr for e in self.exprs if isinstance(e,OneOrMore) ] - self.required = [ e for e in self.exprs if not isinstance(e,(Optional,ZeroOrMore,OneOrMore)) ] - self.required += self.multirequired - self.initExprGroups = False - tmpLoc = loc - tmpReqd = self.required[:] - tmpOpt = self.optionals[:] - matchOrder = [] - - keepMatching = True - while keepMatching: - tmpExprs = tmpReqd + tmpOpt + self.multioptionals + self.multirequired - failed = [] - for e in tmpExprs: - try: - tmpLoc = e.tryParse( instring, tmpLoc ) - except ParseException: - failed.append(e) - else: - matchOrder.append(self.opt1map.get(id(e),e)) - if e in tmpReqd: - tmpReqd.remove(e) - elif e in tmpOpt: - tmpOpt.remove(e) - if len(failed) == len(tmpExprs): - keepMatching = False - - if tmpReqd: - missing = ", ".join(_ustr(e) for e in tmpReqd) - raise ParseException(instring,loc,"Missing one or more required elements (%s)" % missing ) - - # add any unmatched Optionals, in case they have default values defined - matchOrder += [e for e in self.exprs if isinstance(e,Optional) and e.expr in tmpOpt] - - resultlist = [] - for e in matchOrder: - loc,results = e._parse(instring,loc,doActions) - resultlist.append(results) - - finalResults = sum(resultlist, ParseResults([])) - return loc, finalResults - - def __str__( self ): - if hasattr(self,"name"): - return self.name - - if self.strRepr is None: - self.strRepr = "{" + " & ".join(_ustr(e) for e in self.exprs) + "}" - - return self.strRepr - - def checkRecursion( self, parseElementList ): - subRecCheckList = parseElementList[:] + [ self ] - for e in self.exprs: - e.checkRecursion( subRecCheckList ) - - -class ParseElementEnhance(ParserElement): - """ - Abstract subclass of C{ParserElement}, for combining and post-processing parsed tokens. - """ - def __init__( self, expr, savelist=False ): - super(ParseElementEnhance,self).__init__(savelist) - if isinstance( expr, basestring ): - if issubclass(ParserElement._literalStringClass, Token): - expr = ParserElement._literalStringClass(expr) - else: - expr = ParserElement._literalStringClass(Literal(expr)) - self.expr = expr - self.strRepr = None - if expr is not None: - self.mayIndexError = expr.mayIndexError - self.mayReturnEmpty = expr.mayReturnEmpty - self.setWhitespaceChars( expr.whiteChars ) - self.skipWhitespace = expr.skipWhitespace - self.saveAsList = expr.saveAsList - self.callPreparse = expr.callPreparse - self.ignoreExprs.extend(expr.ignoreExprs) - - def parseImpl( self, instring, loc, doActions=True ): - if self.expr is not None: - return self.expr._parse( instring, loc, doActions, callPreParse=False ) - else: - raise ParseException("",loc,self.errmsg,self) - - def leaveWhitespace( self ): - self.skipWhitespace = False - self.expr = self.expr.copy() - if self.expr is not None: - self.expr.leaveWhitespace() - return self - - def ignore( self, other ): - if isinstance( other, Suppress ): - if other not in self.ignoreExprs: - super( ParseElementEnhance, self).ignore( other ) - if self.expr is not None: - self.expr.ignore( self.ignoreExprs[-1] ) - else: - super( ParseElementEnhance, self).ignore( other ) - if self.expr is not None: - self.expr.ignore( self.ignoreExprs[-1] ) - return self - - def streamline( self ): - super(ParseElementEnhance,self).streamline() - if self.expr is not None: - self.expr.streamline() - return self - - def checkRecursion( self, parseElementList ): - if self in parseElementList: - raise RecursiveGrammarException( parseElementList+[self] ) - subRecCheckList = parseElementList[:] + [ self ] - if self.expr is not None: - self.expr.checkRecursion( subRecCheckList ) - - def validate( self, validateTrace=[] ): - tmp = validateTrace[:]+[self] - if self.expr is not None: - self.expr.validate(tmp) - self.checkRecursion( [] ) - - def __str__( self ): - try: - return super(ParseElementEnhance,self).__str__() - except Exception: - pass - - if self.strRepr is None and self.expr is not None: - self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.expr) ) - return self.strRepr - - -class FollowedBy(ParseElementEnhance): - """ - Lookahead matching of the given parse expression. C{FollowedBy} - does I{not} advance the parsing position within the input string, it only - verifies that the specified parse expression matches at the current - position. C{FollowedBy} always returns a null token list. - - Example:: - # use FollowedBy to match a label only if it is followed by a ':' - data_word = Word(alphas) - label = data_word + FollowedBy(':') - attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) - - OneOrMore(attr_expr).parseString("shape: SQUARE color: BLACK posn: upper left").pprint() - prints:: - [['shape', 'SQUARE'], ['color', 'BLACK'], ['posn', 'upper left']] - """ - def __init__( self, expr ): - super(FollowedBy,self).__init__(expr) - self.mayReturnEmpty = True - - def parseImpl( self, instring, loc, doActions=True ): - self.expr.tryParse( instring, loc ) - return loc, [] - - -class NotAny(ParseElementEnhance): - """ - Lookahead to disallow matching with the given parse expression. C{NotAny} - does I{not} advance the parsing position within the input string, it only - verifies that the specified parse expression does I{not} match at the current - position. Also, C{NotAny} does I{not} skip over leading whitespace. C{NotAny} - always returns a null token list. May be constructed using the '~' operator. - - Example:: - - """ - def __init__( self, expr ): - super(NotAny,self).__init__(expr) - #~ self.leaveWhitespace() - self.skipWhitespace = False # do NOT use self.leaveWhitespace(), don't want to propagate to exprs - self.mayReturnEmpty = True - self.errmsg = "Found unwanted token, "+_ustr(self.expr) - - def parseImpl( self, instring, loc, doActions=True ): - if self.expr.canParseNext(instring, loc): - raise ParseException(instring, loc, self.errmsg, self) - return loc, [] - - def __str__( self ): - if hasattr(self,"name"): - return self.name - - if self.strRepr is None: - self.strRepr = "~{" + _ustr(self.expr) + "}" - - return self.strRepr - -class _MultipleMatch(ParseElementEnhance): - def __init__( self, expr, stopOn=None): - super(_MultipleMatch, self).__init__(expr) - self.saveAsList = True - ender = stopOn - if isinstance(ender, basestring): - ender = ParserElement._literalStringClass(ender) - self.not_ender = ~ender if ender is not None else None - - def parseImpl( self, instring, loc, doActions=True ): - self_expr_parse = self.expr._parse - self_skip_ignorables = self._skipIgnorables - check_ender = self.not_ender is not None - if check_ender: - try_not_ender = self.not_ender.tryParse - - # must be at least one (but first see if we are the stopOn sentinel; - # if so, fail) - if check_ender: - try_not_ender(instring, loc) - loc, tokens = self_expr_parse( instring, loc, doActions, callPreParse=False ) - try: - hasIgnoreExprs = (not not self.ignoreExprs) - while 1: - if check_ender: - try_not_ender(instring, loc) - if hasIgnoreExprs: - preloc = self_skip_ignorables( instring, loc ) - else: - preloc = loc - loc, tmptokens = self_expr_parse( instring, preloc, doActions ) - if tmptokens or tmptokens.haskeys(): - tokens += tmptokens - except (ParseException,IndexError): - pass - - return loc, tokens - -class OneOrMore(_MultipleMatch): - """ - Repetition of one or more of the given expression. - - Parameters: - - expr - expression that must match one or more times - - stopOn - (default=C{None}) - expression for a terminating sentinel - (only required if the sentinel would ordinarily match the repetition - expression) - - Example:: - data_word = Word(alphas) - label = data_word + FollowedBy(':') - attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join)) - - text = "shape: SQUARE posn: upper left color: BLACK" - OneOrMore(attr_expr).parseString(text).pprint() # Fail! read 'color' as data instead of next label -> [['shape', 'SQUARE color']] - - # use stopOn attribute for OneOrMore to avoid reading label string as part of the data - attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) - OneOrMore(attr_expr).parseString(text).pprint() # Better -> [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'BLACK']] - - # could also be written as - (attr_expr * (1,)).parseString(text).pprint() - """ - - def __str__( self ): - if hasattr(self,"name"): - return self.name - - if self.strRepr is None: - self.strRepr = "{" + _ustr(self.expr) + "}..." - - return self.strRepr - -class ZeroOrMore(_MultipleMatch): - """ - Optional repetition of zero or more of the given expression. - - Parameters: - - expr - expression that must match zero or more times - - stopOn - (default=C{None}) - expression for a terminating sentinel - (only required if the sentinel would ordinarily match the repetition - expression) - - Example: similar to L{OneOrMore} - """ - def __init__( self, expr, stopOn=None): - super(ZeroOrMore,self).__init__(expr, stopOn=stopOn) - self.mayReturnEmpty = True - - def parseImpl( self, instring, loc, doActions=True ): - try: - return super(ZeroOrMore, self).parseImpl(instring, loc, doActions) - except (ParseException,IndexError): - return loc, [] - - def __str__( self ): - if hasattr(self,"name"): - return self.name - - if self.strRepr is None: - self.strRepr = "[" + _ustr(self.expr) + "]..." - - return self.strRepr - -class _NullToken(object): - def __bool__(self): - return False - __nonzero__ = __bool__ - def __str__(self): - return "" - -_optionalNotMatched = _NullToken() -class Optional(ParseElementEnhance): - """ - Optional matching of the given expression. - - Parameters: - - expr - expression that must match zero or more times - - default (optional) - value to be returned if the optional expression is not found. - - Example:: - # US postal code can be a 5-digit zip, plus optional 4-digit qualifier - zip = Combine(Word(nums, exact=5) + Optional('-' + Word(nums, exact=4))) - zip.runTests(''' - # traditional ZIP code - 12345 - - # ZIP+4 form - 12101-0001 - - # invalid ZIP - 98765- - ''') - prints:: - # traditional ZIP code - 12345 - ['12345'] - - # ZIP+4 form - 12101-0001 - ['12101-0001'] - - # invalid ZIP - 98765- - ^ - FAIL: Expected end of text (at char 5), (line:1, col:6) - """ - def __init__( self, expr, default=_optionalNotMatched ): - super(Optional,self).__init__( expr, savelist=False ) - self.saveAsList = self.expr.saveAsList - self.defaultValue = default - self.mayReturnEmpty = True - - def parseImpl( self, instring, loc, doActions=True ): - try: - loc, tokens = self.expr._parse( instring, loc, doActions, callPreParse=False ) - except (ParseException,IndexError): - if self.defaultValue is not _optionalNotMatched: - if self.expr.resultsName: - tokens = ParseResults([ self.defaultValue ]) - tokens[self.expr.resultsName] = self.defaultValue - else: - tokens = [ self.defaultValue ] - else: - tokens = [] - return loc, tokens - - def __str__( self ): - if hasattr(self,"name"): - return self.name - - if self.strRepr is None: - self.strRepr = "[" + _ustr(self.expr) + "]" - - return self.strRepr - -class SkipTo(ParseElementEnhance): - """ - Token for skipping over all undefined text until the matched expression is found. - - Parameters: - - expr - target expression marking the end of the data to be skipped - - include - (default=C{False}) if True, the target expression is also parsed - (the skipped text and target expression are returned as a 2-element list). - - ignore - (default=C{None}) used to define grammars (typically quoted strings and - comments) that might contain false matches to the target expression - - failOn - (default=C{None}) define expressions that are not allowed to be - included in the skipped test; if found before the target expression is found, - the SkipTo is not a match - - Example:: - report = ''' - Outstanding Issues Report - 1 Jan 2000 - - # | Severity | Description | Days Open - -----+----------+-------------------------------------------+----------- - 101 | Critical | Intermittent system crash | 6 - 94 | Cosmetic | Spelling error on Login ('log|n') | 14 - 79 | Minor | System slow when running too many reports | 47 - ''' - integer = Word(nums) - SEP = Suppress('|') - # use SkipTo to simply match everything up until the next SEP - # - ignore quoted strings, so that a '|' character inside a quoted string does not match - # - parse action will call token.strip() for each matched token, i.e., the description body - string_data = SkipTo(SEP, ignore=quotedString) - string_data.setParseAction(tokenMap(str.strip)) - ticket_expr = (integer("issue_num") + SEP - + string_data("sev") + SEP - + string_data("desc") + SEP - + integer("days_open")) - - for tkt in ticket_expr.searchString(report): - print tkt.dump() - prints:: - ['101', 'Critical', 'Intermittent system crash', '6'] - - days_open: 6 - - desc: Intermittent system crash - - issue_num: 101 - - sev: Critical - ['94', 'Cosmetic', "Spelling error on Login ('log|n')", '14'] - - days_open: 14 - - desc: Spelling error on Login ('log|n') - - issue_num: 94 - - sev: Cosmetic - ['79', 'Minor', 'System slow when running too many reports', '47'] - - days_open: 47 - - desc: System slow when running too many reports - - issue_num: 79 - - sev: Minor - """ - def __init__( self, other, include=False, ignore=None, failOn=None ): - super( SkipTo, self ).__init__( other ) - self.ignoreExpr = ignore - self.mayReturnEmpty = True - self.mayIndexError = False - self.includeMatch = include - self.asList = False - if isinstance(failOn, basestring): - self.failOn = ParserElement._literalStringClass(failOn) - else: - self.failOn = failOn - self.errmsg = "No match found for "+_ustr(self.expr) - - def parseImpl( self, instring, loc, doActions=True ): - startloc = loc - instrlen = len(instring) - expr = self.expr - expr_parse = self.expr._parse - self_failOn_canParseNext = self.failOn.canParseNext if self.failOn is not None else None - self_ignoreExpr_tryParse = self.ignoreExpr.tryParse if self.ignoreExpr is not None else None - - tmploc = loc - while tmploc <= instrlen: - if self_failOn_canParseNext is not None: - # break if failOn expression matches - if self_failOn_canParseNext(instring, tmploc): - break - - if self_ignoreExpr_tryParse is not None: - # advance past ignore expressions - while 1: - try: - tmploc = self_ignoreExpr_tryParse(instring, tmploc) - except ParseBaseException: - break - - try: - expr_parse(instring, tmploc, doActions=False, callPreParse=False) - except (ParseException, IndexError): - # no match, advance loc in string - tmploc += 1 - else: - # matched skipto expr, done - break - - else: - # ran off the end of the input string without matching skipto expr, fail - raise ParseException(instring, loc, self.errmsg, self) - - # build up return values - loc = tmploc - skiptext = instring[startloc:loc] - skipresult = ParseResults(skiptext) - - if self.includeMatch: - loc, mat = expr_parse(instring,loc,doActions,callPreParse=False) - skipresult += mat - - return loc, skipresult - -class Forward(ParseElementEnhance): - """ - Forward declaration of an expression to be defined later - - used for recursive grammars, such as algebraic infix notation. - When the expression is known, it is assigned to the C{Forward} variable using the '<<' operator. - - Note: take care when assigning to C{Forward} not to overlook precedence of operators. - Specifically, '|' has a lower precedence than '<<', so that:: - fwdExpr << a | b | c - will actually be evaluated as:: - (fwdExpr << a) | b | c - thereby leaving b and c out as parseable alternatives. It is recommended that you - explicitly group the values inserted into the C{Forward}:: - fwdExpr << (a | b | c) - Converting to use the '<<=' operator instead will avoid this problem. - - See L{ParseResults.pprint} for an example of a recursive parser created using - C{Forward}. - """ - def __init__( self, other=None ): - super(Forward,self).__init__( other, savelist=False ) - - def __lshift__( self, other ): - if isinstance( other, basestring ): - other = ParserElement._literalStringClass(other) - self.expr = other - self.strRepr = None - self.mayIndexError = self.expr.mayIndexError - self.mayReturnEmpty = self.expr.mayReturnEmpty - self.setWhitespaceChars( self.expr.whiteChars ) - self.skipWhitespace = self.expr.skipWhitespace - self.saveAsList = self.expr.saveAsList - self.ignoreExprs.extend(self.expr.ignoreExprs) - return self - - def __ilshift__(self, other): - return self << other - - def leaveWhitespace( self ): - self.skipWhitespace = False - return self - - def streamline( self ): - if not self.streamlined: - self.streamlined = True - if self.expr is not None: - self.expr.streamline() - return self - - def validate( self, validateTrace=[] ): - if self not in validateTrace: - tmp = validateTrace[:]+[self] - if self.expr is not None: - self.expr.validate(tmp) - self.checkRecursion([]) - - def __str__( self ): - if hasattr(self,"name"): - return self.name - return self.__class__.__name__ + ": ..." - - # stubbed out for now - creates awful memory and perf issues - self._revertClass = self.__class__ - self.__class__ = _ForwardNoRecurse - try: - if self.expr is not None: - retString = _ustr(self.expr) - else: - retString = "None" - finally: - self.__class__ = self._revertClass - return self.__class__.__name__ + ": " + retString - - def copy(self): - if self.expr is not None: - return super(Forward,self).copy() - else: - ret = Forward() - ret <<= self - return ret - -class _ForwardNoRecurse(Forward): - def __str__( self ): - return "..." - -class TokenConverter(ParseElementEnhance): - """ - Abstract subclass of C{ParseExpression}, for converting parsed results. - """ - def __init__( self, expr, savelist=False ): - super(TokenConverter,self).__init__( expr )#, savelist ) - self.saveAsList = False - -class Combine(TokenConverter): - """ - Converter to concatenate all matching tokens to a single string. - By default, the matching patterns must also be contiguous in the input string; - this can be disabled by specifying C{'adjacent=False'} in the constructor. - - Example:: - real = Word(nums) + '.' + Word(nums) - print(real.parseString('3.1416')) # -> ['3', '.', '1416'] - # will also erroneously match the following - print(real.parseString('3. 1416')) # -> ['3', '.', '1416'] - - real = Combine(Word(nums) + '.' + Word(nums)) - print(real.parseString('3.1416')) # -> ['3.1416'] - # no match when there are internal spaces - print(real.parseString('3. 1416')) # -> Exception: Expected W:(0123...) - """ - def __init__( self, expr, joinString="", adjacent=True ): - super(Combine,self).__init__( expr ) - # suppress whitespace-stripping in contained parse expressions, but re-enable it on the Combine itself - if adjacent: - self.leaveWhitespace() - self.adjacent = adjacent - self.skipWhitespace = True - self.joinString = joinString - self.callPreparse = True - - def ignore( self, other ): - if self.adjacent: - ParserElement.ignore(self, other) - else: - super( Combine, self).ignore( other ) - return self - - def postParse( self, instring, loc, tokenlist ): - retToks = tokenlist.copy() - del retToks[:] - retToks += ParseResults([ "".join(tokenlist._asStringList(self.joinString)) ], modal=self.modalResults) - - if self.resultsName and retToks.haskeys(): - return [ retToks ] - else: - return retToks - -class Group(TokenConverter): - """ - Converter to return the matched tokens as a list - useful for returning tokens of C{L{ZeroOrMore}} and C{L{OneOrMore}} expressions. - - Example:: - ident = Word(alphas) - num = Word(nums) - term = ident | num - func = ident + Optional(delimitedList(term)) - print(func.parseString("fn a,b,100")) # -> ['fn', 'a', 'b', '100'] - - func = ident + Group(Optional(delimitedList(term))) - print(func.parseString("fn a,b,100")) # -> ['fn', ['a', 'b', '100']] - """ - def __init__( self, expr ): - super(Group,self).__init__( expr ) - self.saveAsList = True - - def postParse( self, instring, loc, tokenlist ): - return [ tokenlist ] - -class Dict(TokenConverter): - """ - Converter to return a repetitive expression as a list, but also as a dictionary. - Each element can also be referenced using the first token in the expression as its key. - Useful for tabular report scraping when the first column can be used as a item key. - - Example:: - data_word = Word(alphas) - label = data_word + FollowedBy(':') - attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join)) - - text = "shape: SQUARE posn: upper left color: light blue texture: burlap" - attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) - - # print attributes as plain groups - print(OneOrMore(attr_expr).parseString(text).dump()) - - # instead of OneOrMore(expr), parse using Dict(OneOrMore(Group(expr))) - Dict will auto-assign names - result = Dict(OneOrMore(Group(attr_expr))).parseString(text) - print(result.dump()) - - # access named fields as dict entries, or output as dict - print(result['shape']) - print(result.asDict()) - prints:: - ['shape', 'SQUARE', 'posn', 'upper left', 'color', 'light blue', 'texture', 'burlap'] - - [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']] - - color: light blue - - posn: upper left - - shape: SQUARE - - texture: burlap - SQUARE - {'color': 'light blue', 'posn': 'upper left', 'texture': 'burlap', 'shape': 'SQUARE'} - See more examples at L{ParseResults} of accessing fields by results name. - """ - def __init__( self, expr ): - super(Dict,self).__init__( expr ) - self.saveAsList = True - - def postParse( self, instring, loc, tokenlist ): - for i,tok in enumerate(tokenlist): - if len(tok) == 0: - continue - ikey = tok[0] - if isinstance(ikey,int): - ikey = _ustr(tok[0]).strip() - if len(tok)==1: - tokenlist[ikey] = _ParseResultsWithOffset("",i) - elif len(tok)==2 and not isinstance(tok[1],ParseResults): - tokenlist[ikey] = _ParseResultsWithOffset(tok[1],i) - else: - dictvalue = tok.copy() #ParseResults(i) - del dictvalue[0] - if len(dictvalue)!= 1 or (isinstance(dictvalue,ParseResults) and dictvalue.haskeys()): - tokenlist[ikey] = _ParseResultsWithOffset(dictvalue,i) - else: - tokenlist[ikey] = _ParseResultsWithOffset(dictvalue[0],i) - - if self.resultsName: - return [ tokenlist ] - else: - return tokenlist - - -class Suppress(TokenConverter): - """ - Converter for ignoring the results of a parsed expression. - - Example:: - source = "a, b, c,d" - wd = Word(alphas) - wd_list1 = wd + ZeroOrMore(',' + wd) - print(wd_list1.parseString(source)) - - # often, delimiters that are useful during parsing are just in the - # way afterward - use Suppress to keep them out of the parsed output - wd_list2 = wd + ZeroOrMore(Suppress(',') + wd) - print(wd_list2.parseString(source)) - prints:: - ['a', ',', 'b', ',', 'c', ',', 'd'] - ['a', 'b', 'c', 'd'] - (See also L{delimitedList}.) - """ - def postParse( self, instring, loc, tokenlist ): - return [] - - def suppress( self ): - return self - - -class OnlyOnce(object): - """ - Wrapper for parse actions, to ensure they are only called once. - """ - def __init__(self, methodCall): - self.callable = _trim_arity(methodCall) - self.called = False - def __call__(self,s,l,t): - if not self.called: - results = self.callable(s,l,t) - self.called = True - return results - raise ParseException(s,l,"") - def reset(self): - self.called = False - -def traceParseAction(f): - """ - Decorator for debugging parse actions. - - When the parse action is called, this decorator will print C{">> entering I{method-name}(line:I{current_source_line}, I{parse_location}, I{matched_tokens})".} - When the parse action completes, the decorator will print C{"<<"} followed by the returned value, or any exception that the parse action raised. - - Example:: - wd = Word(alphas) - - @traceParseAction - def remove_duplicate_chars(tokens): - return ''.join(sorted(set(''.join(tokens)))) - - wds = OneOrMore(wd).setParseAction(remove_duplicate_chars) - print(wds.parseString("slkdjs sld sldd sdlf sdljf")) - prints:: - >>entering remove_duplicate_chars(line: 'slkdjs sld sldd sdlf sdljf', 0, (['slkdjs', 'sld', 'sldd', 'sdlf', 'sdljf'], {})) - <<leaving remove_duplicate_chars (ret: 'dfjkls') - ['dfjkls'] - """ - f = _trim_arity(f) - def z(*paArgs): - thisFunc = f.__name__ - s,l,t = paArgs[-3:] - if len(paArgs)>3: - thisFunc = paArgs[0].__class__.__name__ + '.' + thisFunc - sys.stderr.write( ">>entering %s(line: '%s', %d, %r)\n" % (thisFunc,line(l,s),l,t) ) - try: - ret = f(*paArgs) - except Exception as exc: - sys.stderr.write( "<<leaving %s (exception: %s)\n" % (thisFunc,exc) ) - raise - sys.stderr.write( "<<leaving %s (ret: %r)\n" % (thisFunc,ret) ) - return ret - try: - z.__name__ = f.__name__ - except AttributeError: - pass - return z - -# -# global helpers -# -def delimitedList( expr, delim=",", combine=False ): - """ - Helper to define a delimited list of expressions - the delimiter defaults to ','. - By default, the list elements and delimiters can have intervening whitespace, and - comments, but this can be overridden by passing C{combine=True} in the constructor. - If C{combine} is set to C{True}, the matching tokens are returned as a single token - string, with the delimiters included; otherwise, the matching tokens are returned - as a list of tokens, with the delimiters suppressed. - - Example:: - delimitedList(Word(alphas)).parseString("aa,bb,cc") # -> ['aa', 'bb', 'cc'] - delimitedList(Word(hexnums), delim=':', combine=True).parseString("AA:BB:CC:DD:EE") # -> ['AA:BB:CC:DD:EE'] - """ - dlName = _ustr(expr)+" ["+_ustr(delim)+" "+_ustr(expr)+"]..." - if combine: - return Combine( expr + ZeroOrMore( delim + expr ) ).setName(dlName) - else: - return ( expr + ZeroOrMore( Suppress( delim ) + expr ) ).setName(dlName) - -def countedArray( expr, intExpr=None ): - """ - Helper to define a counted list of expressions. - This helper defines a pattern of the form:: - integer expr expr expr... - where the leading integer tells how many expr expressions follow. - The matched tokens returns the array of expr tokens as a list - the leading count token is suppressed. - - If C{intExpr} is specified, it should be a pyparsing expression that produces an integer value. - - Example:: - countedArray(Word(alphas)).parseString('2 ab cd ef') # -> ['ab', 'cd'] - - # in this parser, the leading integer value is given in binary, - # '10' indicating that 2 values are in the array - binaryConstant = Word('01').setParseAction(lambda t: int(t[0], 2)) - countedArray(Word(alphas), intExpr=binaryConstant).parseString('10 ab cd ef') # -> ['ab', 'cd'] - """ - arrayExpr = Forward() - def countFieldParseAction(s,l,t): - n = t[0] - arrayExpr << (n and Group(And([expr]*n)) or Group(empty)) - return [] - if intExpr is None: - intExpr = Word(nums).setParseAction(lambda t:int(t[0])) - else: - intExpr = intExpr.copy() - intExpr.setName("arrayLen") - intExpr.addParseAction(countFieldParseAction, callDuringTry=True) - return ( intExpr + arrayExpr ).setName('(len) ' + _ustr(expr) + '...') - -def _flatten(L): - ret = [] - for i in L: - if isinstance(i,list): - ret.extend(_flatten(i)) - else: - ret.append(i) - return ret - -def matchPreviousLiteral(expr): - """ - Helper to define an expression that is indirectly defined from - the tokens matched in a previous expression, that is, it looks - for a 'repeat' of a previous expression. For example:: - first = Word(nums) - second = matchPreviousLiteral(first) - matchExpr = first + ":" + second - will match C{"1:1"}, but not C{"1:2"}. Because this matches a - previous literal, will also match the leading C{"1:1"} in C{"1:10"}. - If this is not desired, use C{matchPreviousExpr}. - Do I{not} use with packrat parsing enabled. - """ - rep = Forward() - def copyTokenToRepeater(s,l,t): - if t: - if len(t) == 1: - rep << t[0] - else: - # flatten t tokens - tflat = _flatten(t.asList()) - rep << And(Literal(tt) for tt in tflat) - else: - rep << Empty() - expr.addParseAction(copyTokenToRepeater, callDuringTry=True) - rep.setName('(prev) ' + _ustr(expr)) - return rep - -def matchPreviousExpr(expr): - """ - Helper to define an expression that is indirectly defined from - the tokens matched in a previous expression, that is, it looks - for a 'repeat' of a previous expression. For example:: - first = Word(nums) - second = matchPreviousExpr(first) - matchExpr = first + ":" + second - will match C{"1:1"}, but not C{"1:2"}. Because this matches by - expressions, will I{not} match the leading C{"1:1"} in C{"1:10"}; - the expressions are evaluated first, and then compared, so - C{"1"} is compared with C{"10"}. - Do I{not} use with packrat parsing enabled. - """ - rep = Forward() - e2 = expr.copy() - rep <<= e2 - def copyTokenToRepeater(s,l,t): - matchTokens = _flatten(t.asList()) - def mustMatchTheseTokens(s,l,t): - theseTokens = _flatten(t.asList()) - if theseTokens != matchTokens: - raise ParseException("",0,"") - rep.setParseAction( mustMatchTheseTokens, callDuringTry=True ) - expr.addParseAction(copyTokenToRepeater, callDuringTry=True) - rep.setName('(prev) ' + _ustr(expr)) - return rep - -def _escapeRegexRangeChars(s): - #~ escape these chars: ^-] - for c in r"\^-]": - s = s.replace(c,_bslash+c) - s = s.replace("\n",r"\n") - s = s.replace("\t",r"\t") - return _ustr(s) - -def oneOf( strs, caseless=False, useRegex=True ): - """ - Helper to quickly define a set of alternative Literals, and makes sure to do - longest-first testing when there is a conflict, regardless of the input order, - but returns a C{L{MatchFirst}} for best performance. - - Parameters: - - strs - a string of space-delimited literals, or a collection of string literals - - caseless - (default=C{False}) - treat all literals as caseless - - useRegex - (default=C{True}) - as an optimization, will generate a Regex - object; otherwise, will generate a C{MatchFirst} object (if C{caseless=True}, or - if creating a C{Regex} raises an exception) - - Example:: - comp_oper = oneOf("< = > <= >= !=") - var = Word(alphas) - number = Word(nums) - term = var | number - comparison_expr = term + comp_oper + term - print(comparison_expr.searchString("B = 12 AA=23 B<=AA AA>12")) - prints:: - [['B', '=', '12'], ['AA', '=', '23'], ['B', '<=', 'AA'], ['AA', '>', '12']] - """ - if caseless: - isequal = ( lambda a,b: a.upper() == b.upper() ) - masks = ( lambda a,b: b.upper().startswith(a.upper()) ) - parseElementClass = CaselessLiteral - else: - isequal = ( lambda a,b: a == b ) - masks = ( lambda a,b: b.startswith(a) ) - parseElementClass = Literal - - symbols = [] - if isinstance(strs,basestring): - symbols = strs.split() - elif isinstance(strs, Iterable): - symbols = list(strs) - else: - warnings.warn("Invalid argument to oneOf, expected string or iterable", - SyntaxWarning, stacklevel=2) - if not symbols: - return NoMatch() - - i = 0 - while i < len(symbols)-1: - cur = symbols[i] - for j,other in enumerate(symbols[i+1:]): - if ( isequal(other, cur) ): - del symbols[i+j+1] - break - elif ( masks(cur, other) ): - del symbols[i+j+1] - symbols.insert(i,other) - cur = other - break - else: - i += 1 - - if not caseless and useRegex: - #~ print (strs,"->", "|".join( [ _escapeRegexChars(sym) for sym in symbols] )) - try: - if len(symbols)==len("".join(symbols)): - return Regex( "[%s]" % "".join(_escapeRegexRangeChars(sym) for sym in symbols) ).setName(' | '.join(symbols)) - else: - return Regex( "|".join(re.escape(sym) for sym in symbols) ).setName(' | '.join(symbols)) - except Exception: - warnings.warn("Exception creating Regex for oneOf, building MatchFirst", - SyntaxWarning, stacklevel=2) - - - # last resort, just use MatchFirst - return MatchFirst(parseElementClass(sym) for sym in symbols).setName(' | '.join(symbols)) - -def dictOf( key, value ): - """ - Helper to easily and clearly define a dictionary by specifying the respective patterns - for the key and value. Takes care of defining the C{L{Dict}}, C{L{ZeroOrMore}}, and C{L{Group}} tokens - in the proper order. The key pattern can include delimiting markers or punctuation, - as long as they are suppressed, thereby leaving the significant key text. The value - pattern can include named results, so that the C{Dict} results can include named token - fields. - - Example:: - text = "shape: SQUARE posn: upper left color: light blue texture: burlap" - attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) - print(OneOrMore(attr_expr).parseString(text).dump()) - - attr_label = label - attr_value = Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join) - - # similar to Dict, but simpler call format - result = dictOf(attr_label, attr_value).parseString(text) - print(result.dump()) - print(result['shape']) - print(result.shape) # object attribute access works too - print(result.asDict()) - prints:: - [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']] - - color: light blue - - posn: upper left - - shape: SQUARE - - texture: burlap - SQUARE - SQUARE - {'color': 'light blue', 'shape': 'SQUARE', 'posn': 'upper left', 'texture': 'burlap'} - """ - return Dict( ZeroOrMore( Group ( key + value ) ) ) - -def originalTextFor(expr, asString=True): - """ - Helper to return the original, untokenized text for a given expression. Useful to - restore the parsed fields of an HTML start tag into the raw tag text itself, or to - revert separate tokens with intervening whitespace back to the original matching - input text. By default, returns astring containing the original parsed text. - - If the optional C{asString} argument is passed as C{False}, then the return value is a - C{L{ParseResults}} containing any results names that were originally matched, and a - single token containing the original matched text from the input string. So if - the expression passed to C{L{originalTextFor}} contains expressions with defined - results names, you must set C{asString} to C{False} if you want to preserve those - results name values. - - Example:: - src = "this is test <b> bold <i>text</i> </b> normal text " - for tag in ("b","i"): - opener,closer = makeHTMLTags(tag) - patt = originalTextFor(opener + SkipTo(closer) + closer) - print(patt.searchString(src)[0]) - prints:: - ['<b> bold <i>text</i> </b>'] - ['<i>text</i>'] - """ - locMarker = Empty().setParseAction(lambda s,loc,t: loc) - endlocMarker = locMarker.copy() - endlocMarker.callPreparse = False - matchExpr = locMarker("_original_start") + expr + endlocMarker("_original_end") - if asString: - extractText = lambda s,l,t: s[t._original_start:t._original_end] - else: - def extractText(s,l,t): - t[:] = [s[t.pop('_original_start'):t.pop('_original_end')]] - matchExpr.setParseAction(extractText) - matchExpr.ignoreExprs = expr.ignoreExprs - return matchExpr - -def ungroup(expr): - """ - Helper to undo pyparsing's default grouping of And expressions, even - if all but one are non-empty. - """ - return TokenConverter(expr).setParseAction(lambda t:t[0]) - -def locatedExpr(expr): - """ - Helper to decorate a returned token with its starting and ending locations in the input string. - This helper adds the following results names: - - locn_start = location where matched expression begins - - locn_end = location where matched expression ends - - value = the actual parsed results - - Be careful if the input text contains C{<TAB>} characters, you may want to call - C{L{ParserElement.parseWithTabs}} - - Example:: - wd = Word(alphas) - for match in locatedExpr(wd).searchString("ljsdf123lksdjjf123lkkjj1222"): - print(match) - prints:: - [[0, 'ljsdf', 5]] - [[8, 'lksdjjf', 15]] - [[18, 'lkkjj', 23]] - """ - locator = Empty().setParseAction(lambda s,l,t: l) - return Group(locator("locn_start") + expr("value") + locator.copy().leaveWhitespace()("locn_end")) - - -# convenience constants for positional expressions -empty = Empty().setName("empty") -lineStart = LineStart().setName("lineStart") -lineEnd = LineEnd().setName("lineEnd") -stringStart = StringStart().setName("stringStart") -stringEnd = StringEnd().setName("stringEnd") - -_escapedPunc = Word( _bslash, r"\[]-*.$+^?()~ ", exact=2 ).setParseAction(lambda s,l,t:t[0][1]) -_escapedHexChar = Regex(r"\\0?[xX][0-9a-fA-F]+").setParseAction(lambda s,l,t:unichr(int(t[0].lstrip(r'\0x'),16))) -_escapedOctChar = Regex(r"\\0[0-7]+").setParseAction(lambda s,l,t:unichr(int(t[0][1:],8))) -_singleChar = _escapedPunc | _escapedHexChar | _escapedOctChar | CharsNotIn(r'\]', exact=1) -_charRange = Group(_singleChar + Suppress("-") + _singleChar) -_reBracketExpr = Literal("[") + Optional("^").setResultsName("negate") + Group( OneOrMore( _charRange | _singleChar ) ).setResultsName("body") + "]" - -def srange(s): - r""" - Helper to easily define string ranges for use in Word construction. Borrows - syntax from regexp '[]' string range definitions:: - srange("[0-9]") -> "0123456789" - srange("[a-z]") -> "abcdefghijklmnopqrstuvwxyz" - srange("[a-z$_]") -> "abcdefghijklmnopqrstuvwxyz$_" - The input string must be enclosed in []'s, and the returned string is the expanded - character set joined into a single string. - The values enclosed in the []'s may be: - - a single character - - an escaped character with a leading backslash (such as C{\-} or C{\]}) - - an escaped hex character with a leading C{'\x'} (C{\x21}, which is a C{'!'} character) - (C{\0x##} is also supported for backwards compatibility) - - an escaped octal character with a leading C{'\0'} (C{\041}, which is a C{'!'} character) - - a range of any of the above, separated by a dash (C{'a-z'}, etc.) - - any combination of the above (C{'aeiouy'}, C{'a-zA-Z0-9_$'}, etc.) - """ - _expanded = lambda p: p if not isinstance(p,ParseResults) else ''.join(unichr(c) for c in range(ord(p[0]),ord(p[1])+1)) - try: - return "".join(_expanded(part) for part in _reBracketExpr.parseString(s).body) - except Exception: - return "" - -def matchOnlyAtCol(n): - """ - Helper method for defining parse actions that require matching at a specific - column in the input text. - """ - def verifyCol(strg,locn,toks): - if col(locn,strg) != n: - raise ParseException(strg,locn,"matched token not at column %d" % n) - return verifyCol - -def replaceWith(replStr): - """ - Helper method for common parse actions that simply return a literal value. Especially - useful when used with C{L{transformString<ParserElement.transformString>}()}. - - Example:: - num = Word(nums).setParseAction(lambda toks: int(toks[0])) - na = oneOf("N/A NA").setParseAction(replaceWith(math.nan)) - term = na | num - - OneOrMore(term).parseString("324 234 N/A 234") # -> [324, 234, nan, 234] - """ - return lambda s,l,t: [replStr] - -def removeQuotes(s,l,t): - """ - Helper parse action for removing quotation marks from parsed quoted strings. - - Example:: - # by default, quotation marks are included in parsed results - quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["'Now is the Winter of our Discontent'"] - - # use removeQuotes to strip quotation marks from parsed results - quotedString.setParseAction(removeQuotes) - quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["Now is the Winter of our Discontent"] - """ - return t[0][1:-1] - -def tokenMap(func, *args): - """ - Helper to define a parse action by mapping a function to all elements of a ParseResults list.If any additional - args are passed, they are forwarded to the given function as additional arguments after - the token, as in C{hex_integer = Word(hexnums).setParseAction(tokenMap(int, 16))}, which will convert the - parsed data to an integer using base 16. - - Example (compare the last to example in L{ParserElement.transformString}:: - hex_ints = OneOrMore(Word(hexnums)).setParseAction(tokenMap(int, 16)) - hex_ints.runTests(''' - 00 11 22 aa FF 0a 0d 1a - ''') - - upperword = Word(alphas).setParseAction(tokenMap(str.upper)) - OneOrMore(upperword).runTests(''' - my kingdom for a horse - ''') - - wd = Word(alphas).setParseAction(tokenMap(str.title)) - OneOrMore(wd).setParseAction(' '.join).runTests(''' - now is the winter of our discontent made glorious summer by this sun of york - ''') - prints:: - 00 11 22 aa FF 0a 0d 1a - [0, 17, 34, 170, 255, 10, 13, 26] - - my kingdom for a horse - ['MY', 'KINGDOM', 'FOR', 'A', 'HORSE'] - - now is the winter of our discontent made glorious summer by this sun of york - ['Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York'] - """ - def pa(s,l,t): - return [func(tokn, *args) for tokn in t] - - try: - func_name = getattr(func, '__name__', - getattr(func, '__class__').__name__) - except Exception: - func_name = str(func) - pa.__name__ = func_name - - return pa - -upcaseTokens = tokenMap(lambda t: _ustr(t).upper()) -"""(Deprecated) Helper parse action to convert tokens to upper case. Deprecated in favor of L{pyparsing_common.upcaseTokens}""" - -downcaseTokens = tokenMap(lambda t: _ustr(t).lower()) -"""(Deprecated) Helper parse action to convert tokens to lower case. Deprecated in favor of L{pyparsing_common.downcaseTokens}""" - -def _makeTags(tagStr, xml): - """Internal helper to construct opening and closing tag expressions, given a tag name""" - if isinstance(tagStr,basestring): - resname = tagStr - tagStr = Keyword(tagStr, caseless=not xml) - else: - resname = tagStr.name - - tagAttrName = Word(alphas,alphanums+"_-:") - if (xml): - tagAttrValue = dblQuotedString.copy().setParseAction( removeQuotes ) - openTag = Suppress("<") + tagStr("tag") + \ - Dict(ZeroOrMore(Group( tagAttrName + Suppress("=") + tagAttrValue ))) + \ - Optional("/",default=[False]).setResultsName("empty").setParseAction(lambda s,l,t:t[0]=='/') + Suppress(">") - else: - printablesLessRAbrack = "".join(c for c in printables if c not in ">") - tagAttrValue = quotedString.copy().setParseAction( removeQuotes ) | Word(printablesLessRAbrack) - openTag = Suppress("<") + tagStr("tag") + \ - Dict(ZeroOrMore(Group( tagAttrName.setParseAction(downcaseTokens) + \ - Optional( Suppress("=") + tagAttrValue ) ))) + \ - Optional("/",default=[False]).setResultsName("empty").setParseAction(lambda s,l,t:t[0]=='/') + Suppress(">") - closeTag = Combine(_L("</") + tagStr + ">") - - openTag = openTag.setResultsName("start"+"".join(resname.replace(":"," ").title().split())).setName("<%s>" % resname) - closeTag = closeTag.setResultsName("end"+"".join(resname.replace(":"," ").title().split())).setName("</%s>" % resname) - openTag.tag = resname - closeTag.tag = resname - return openTag, closeTag - -def makeHTMLTags(tagStr): - """ - Helper to construct opening and closing tag expressions for HTML, given a tag name. Matches - tags in either upper or lower case, attributes with namespaces and with quoted or unquoted values. - - Example:: - text = '<td>More info at the <a href="http://pyparsing.wikispaces.com">pyparsing</a> wiki page</td>' - # makeHTMLTags returns pyparsing expressions for the opening and closing tags as a 2-tuple - a,a_end = makeHTMLTags("A") - link_expr = a + SkipTo(a_end)("link_text") + a_end - - for link in link_expr.searchString(text): - # attributes in the <A> tag (like "href" shown here) are also accessible as named results - print(link.link_text, '->', link.href) - prints:: - pyparsing -> http://pyparsing.wikispaces.com - """ - return _makeTags( tagStr, False ) - -def makeXMLTags(tagStr): - """ - Helper to construct opening and closing tag expressions for XML, given a tag name. Matches - tags only in the given upper/lower case. - - Example: similar to L{makeHTMLTags} - """ - return _makeTags( tagStr, True ) - -def withAttribute(*args,**attrDict): - """ - Helper to create a validating parse action to be used with start tags created - with C{L{makeXMLTags}} or C{L{makeHTMLTags}}. Use C{withAttribute} to qualify a starting tag - with a required attribute value, to avoid false matches on common tags such as - C{<TD>} or C{<DIV>}. - - Call C{withAttribute} with a series of attribute names and values. Specify the list - of filter attributes names and values as: - - keyword arguments, as in C{(align="right")}, or - - as an explicit dict with C{**} operator, when an attribute name is also a Python - reserved word, as in C{**{"class":"Customer", "align":"right"}} - - a list of name-value tuples, as in ( ("ns1:class", "Customer"), ("ns2:align","right") ) - For attribute names with a namespace prefix, you must use the second form. Attribute - names are matched insensitive to upper/lower case. - - If just testing for C{class} (with or without a namespace), use C{L{withClass}}. - - To verify that the attribute exists, but without specifying a value, pass - C{withAttribute.ANY_VALUE} as the value. - - Example:: - html = ''' - <div> - Some text - <div type="grid">1 4 0 1 0</div> - <div type="graph">1,3 2,3 1,1</div> - <div>this has no type</div> - </div> - - ''' - div,div_end = makeHTMLTags("div") - - # only match div tag having a type attribute with value "grid" - div_grid = div().setParseAction(withAttribute(type="grid")) - grid_expr = div_grid + SkipTo(div | div_end)("body") - for grid_header in grid_expr.searchString(html): - print(grid_header.body) - - # construct a match with any div tag having a type attribute, regardless of the value - div_any_type = div().setParseAction(withAttribute(type=withAttribute.ANY_VALUE)) - div_expr = div_any_type + SkipTo(div | div_end)("body") - for div_header in div_expr.searchString(html): - print(div_header.body) - prints:: - 1 4 0 1 0 - - 1 4 0 1 0 - 1,3 2,3 1,1 - """ - if args: - attrs = args[:] - else: - attrs = attrDict.items() - attrs = [(k,v) for k,v in attrs] - def pa(s,l,tokens): - for attrName,attrValue in attrs: - if attrName not in tokens: - raise ParseException(s,l,"no matching attribute " + attrName) - if attrValue != withAttribute.ANY_VALUE and tokens[attrName] != attrValue: - raise ParseException(s,l,"attribute '%s' has value '%s', must be '%s'" % - (attrName, tokens[attrName], attrValue)) - return pa -withAttribute.ANY_VALUE = object() - -def withClass(classname, namespace=''): - """ - Simplified version of C{L{withAttribute}} when matching on a div class - made - difficult because C{class} is a reserved word in Python. - - Example:: - html = ''' - <div> - Some text - <div class="grid">1 4 0 1 0</div> - <div class="graph">1,3 2,3 1,1</div> - <div>this <div> has no class</div> - </div> - - ''' - div,div_end = makeHTMLTags("div") - div_grid = div().setParseAction(withClass("grid")) - - grid_expr = div_grid + SkipTo(div | div_end)("body") - for grid_header in grid_expr.searchString(html): - print(grid_header.body) - - div_any_type = div().setParseAction(withClass(withAttribute.ANY_VALUE)) - div_expr = div_any_type + SkipTo(div | div_end)("body") - for div_header in div_expr.searchString(html): - print(div_header.body) - prints:: - 1 4 0 1 0 - - 1 4 0 1 0 - 1,3 2,3 1,1 - """ - classattr = "%s:class" % namespace if namespace else "class" - return withAttribute(**{classattr : classname}) - -opAssoc = _Constants() -opAssoc.LEFT = object() -opAssoc.RIGHT = object() - -def infixNotation( baseExpr, opList, lpar=Suppress('('), rpar=Suppress(')') ): - """ - Helper method for constructing grammars of expressions made up of - operators working in a precedence hierarchy. Operators may be unary or - binary, left- or right-associative. Parse actions can also be attached - to operator expressions. The generated parser will also recognize the use - of parentheses to override operator precedences (see example below). - - Note: if you define a deep operator list, you may see performance issues - when using infixNotation. See L{ParserElement.enablePackrat} for a - mechanism to potentially improve your parser performance. - - Parameters: - - baseExpr - expression representing the most basic element for the nested - - opList - list of tuples, one for each operator precedence level in the - expression grammar; each tuple is of the form - (opExpr, numTerms, rightLeftAssoc, parseAction), where: - - opExpr is the pyparsing expression for the operator; - may also be a string, which will be converted to a Literal; - if numTerms is 3, opExpr is a tuple of two expressions, for the - two operators separating the 3 terms - - numTerms is the number of terms for this operator (must - be 1, 2, or 3) - - rightLeftAssoc is the indicator whether the operator is - right or left associative, using the pyparsing-defined - constants C{opAssoc.RIGHT} and C{opAssoc.LEFT}. - - parseAction is the parse action to be associated with - expressions matching this operator expression (the - parse action tuple member may be omitted); if the parse action - is passed a tuple or list of functions, this is equivalent to - calling C{setParseAction(*fn)} (L{ParserElement.setParseAction}) - - lpar - expression for matching left-parentheses (default=C{Suppress('(')}) - - rpar - expression for matching right-parentheses (default=C{Suppress(')')}) - - Example:: - # simple example of four-function arithmetic with ints and variable names - integer = pyparsing_common.signed_integer - varname = pyparsing_common.identifier - - arith_expr = infixNotation(integer | varname, - [ - ('-', 1, opAssoc.RIGHT), - (oneOf('* /'), 2, opAssoc.LEFT), - (oneOf('+ -'), 2, opAssoc.LEFT), - ]) - - arith_expr.runTests(''' - 5+3*6 - (5+3)*6 - -2--11 - ''', fullDump=False) - prints:: - 5+3*6 - [[5, '+', [3, '*', 6]]] - - (5+3)*6 - [[[5, '+', 3], '*', 6]] - - -2--11 - [[['-', 2], '-', ['-', 11]]] - """ - ret = Forward() - lastExpr = baseExpr | ( lpar + ret + rpar ) - for i,operDef in enumerate(opList): - opExpr,arity,rightLeftAssoc,pa = (operDef + (None,))[:4] - termName = "%s term" % opExpr if arity < 3 else "%s%s term" % opExpr - if arity == 3: - if opExpr is None or len(opExpr) != 2: - raise ValueError("if numterms=3, opExpr must be a tuple or list of two expressions") - opExpr1, opExpr2 = opExpr - thisExpr = Forward().setName(termName) - if rightLeftAssoc == opAssoc.LEFT: - if arity == 1: - matchExpr = FollowedBy(lastExpr + opExpr) + Group( lastExpr + OneOrMore( opExpr ) ) - elif arity == 2: - if opExpr is not None: - matchExpr = FollowedBy(lastExpr + opExpr + lastExpr) + Group( lastExpr + OneOrMore( opExpr + lastExpr ) ) - else: - matchExpr = FollowedBy(lastExpr+lastExpr) + Group( lastExpr + OneOrMore(lastExpr) ) - elif arity == 3: - matchExpr = FollowedBy(lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr) + \ - Group( lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr ) - else: - raise ValueError("operator must be unary (1), binary (2), or ternary (3)") - elif rightLeftAssoc == opAssoc.RIGHT: - if arity == 1: - # try to avoid LR with this extra test - if not isinstance(opExpr, Optional): - opExpr = Optional(opExpr) - matchExpr = FollowedBy(opExpr.expr + thisExpr) + Group( opExpr + thisExpr ) - elif arity == 2: - if opExpr is not None: - matchExpr = FollowedBy(lastExpr + opExpr + thisExpr) + Group( lastExpr + OneOrMore( opExpr + thisExpr ) ) - else: - matchExpr = FollowedBy(lastExpr + thisExpr) + Group( lastExpr + OneOrMore( thisExpr ) ) - elif arity == 3: - matchExpr = FollowedBy(lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr) + \ - Group( lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr ) - else: - raise ValueError("operator must be unary (1), binary (2), or ternary (3)") - else: - raise ValueError("operator must indicate right or left associativity") - if pa: - if isinstance(pa, (tuple, list)): - matchExpr.setParseAction(*pa) - else: - matchExpr.setParseAction(pa) - thisExpr <<= ( matchExpr.setName(termName) | lastExpr ) - lastExpr = thisExpr - ret <<= lastExpr - return ret - -operatorPrecedence = infixNotation -"""(Deprecated) Former name of C{L{infixNotation}}, will be dropped in a future release.""" - -dblQuotedString = Combine(Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*')+'"').setName("string enclosed in double quotes") -sglQuotedString = Combine(Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*")+"'").setName("string enclosed in single quotes") -quotedString = Combine(Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*')+'"'| - Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*")+"'").setName("quotedString using single or double quotes") -unicodeString = Combine(_L('u') + quotedString.copy()).setName("unicode string literal") - -def nestedExpr(opener="(", closer=")", content=None, ignoreExpr=quotedString.copy()): - """ - Helper method for defining nested lists enclosed in opening and closing - delimiters ("(" and ")" are the default). - - Parameters: - - opener - opening character for a nested list (default=C{"("}); can also be a pyparsing expression - - closer - closing character for a nested list (default=C{")"}); can also be a pyparsing expression - - content - expression for items within the nested lists (default=C{None}) - - ignoreExpr - expression for ignoring opening and closing delimiters (default=C{quotedString}) - - If an expression is not provided for the content argument, the nested - expression will capture all whitespace-delimited content between delimiters - as a list of separate values. - - Use the C{ignoreExpr} argument to define expressions that may contain - opening or closing characters that should not be treated as opening - or closing characters for nesting, such as quotedString or a comment - expression. Specify multiple expressions using an C{L{Or}} or C{L{MatchFirst}}. - The default is L{quotedString}, but if no expressions are to be ignored, - then pass C{None} for this argument. - - Example:: - data_type = oneOf("void int short long char float double") - decl_data_type = Combine(data_type + Optional(Word('*'))) - ident = Word(alphas+'_', alphanums+'_') - number = pyparsing_common.number - arg = Group(decl_data_type + ident) - LPAR,RPAR = map(Suppress, "()") - - code_body = nestedExpr('{', '}', ignoreExpr=(quotedString | cStyleComment)) - - c_function = (decl_data_type("type") - + ident("name") - + LPAR + Optional(delimitedList(arg), [])("args") + RPAR - + code_body("body")) - c_function.ignore(cStyleComment) - - source_code = ''' - int is_odd(int x) { - return (x%2); - } - - int dec_to_hex(char hchar) { - if (hchar >= '0' && hchar <= '9') { - return (ord(hchar)-ord('0')); - } else { - return (10+ord(hchar)-ord('A')); - } - } - ''' - for func in c_function.searchString(source_code): - print("%(name)s (%(type)s) args: %(args)s" % func) - - prints:: - is_odd (int) args: [['int', 'x']] - dec_to_hex (int) args: [['char', 'hchar']] - """ - if opener == closer: - raise ValueError("opening and closing strings cannot be the same") - if content is None: - if isinstance(opener,basestring) and isinstance(closer,basestring): - if len(opener) == 1 and len(closer)==1: - if ignoreExpr is not None: - content = (Combine(OneOrMore(~ignoreExpr + - CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS,exact=1)) - ).setParseAction(lambda t:t[0].strip())) - else: - content = (empty.copy()+CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS - ).setParseAction(lambda t:t[0].strip())) - else: - if ignoreExpr is not None: - content = (Combine(OneOrMore(~ignoreExpr + - ~Literal(opener) + ~Literal(closer) + - CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1)) - ).setParseAction(lambda t:t[0].strip())) - else: - content = (Combine(OneOrMore(~Literal(opener) + ~Literal(closer) + - CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1)) - ).setParseAction(lambda t:t[0].strip())) - else: - raise ValueError("opening and closing arguments must be strings if no content expression is given") - ret = Forward() - if ignoreExpr is not None: - ret <<= Group( Suppress(opener) + ZeroOrMore( ignoreExpr | ret | content ) + Suppress(closer) ) - else: - ret <<= Group( Suppress(opener) + ZeroOrMore( ret | content ) + Suppress(closer) ) - ret.setName('nested %s%s expression' % (opener,closer)) - return ret - -def indentedBlock(blockStatementExpr, indentStack, indent=True): - """ - Helper method for defining space-delimited indentation blocks, such as - those used to define block statements in Python source code. - - Parameters: - - blockStatementExpr - expression defining syntax of statement that - is repeated within the indented block - - indentStack - list created by caller to manage indentation stack - (multiple statementWithIndentedBlock expressions within a single grammar - should share a common indentStack) - - indent - boolean indicating whether block must be indented beyond the - the current level; set to False for block of left-most statements - (default=C{True}) - - A valid block must contain at least one C{blockStatement}. - - Example:: - data = ''' - def A(z): - A1 - B = 100 - G = A2 - A2 - A3 - B - def BB(a,b,c): - BB1 - def BBA(): - bba1 - bba2 - bba3 - C - D - def spam(x,y): - def eggs(z): - pass - ''' - - - indentStack = [1] - stmt = Forward() - - identifier = Word(alphas, alphanums) - funcDecl = ("def" + identifier + Group( "(" + Optional( delimitedList(identifier) ) + ")" ) + ":") - func_body = indentedBlock(stmt, indentStack) - funcDef = Group( funcDecl + func_body ) - - rvalue = Forward() - funcCall = Group(identifier + "(" + Optional(delimitedList(rvalue)) + ")") - rvalue << (funcCall | identifier | Word(nums)) - assignment = Group(identifier + "=" + rvalue) - stmt << ( funcDef | assignment | identifier ) - - module_body = OneOrMore(stmt) - - parseTree = module_body.parseString(data) - parseTree.pprint() - prints:: - [['def', - 'A', - ['(', 'z', ')'], - ':', - [['A1'], [['B', '=', '100']], [['G', '=', 'A2']], ['A2'], ['A3']]], - 'B', - ['def', - 'BB', - ['(', 'a', 'b', 'c', ')'], - ':', - [['BB1'], [['def', 'BBA', ['(', ')'], ':', [['bba1'], ['bba2'], ['bba3']]]]]], - 'C', - 'D', - ['def', - 'spam', - ['(', 'x', 'y', ')'], - ':', - [[['def', 'eggs', ['(', 'z', ')'], ':', [['pass']]]]]]] - """ - def checkPeerIndent(s,l,t): - if l >= len(s): return - curCol = col(l,s) - if curCol != indentStack[-1]: - if curCol > indentStack[-1]: - raise ParseFatalException(s,l,"illegal nesting") - raise ParseException(s,l,"not a peer entry") - - def checkSubIndent(s,l,t): - curCol = col(l,s) - if curCol > indentStack[-1]: - indentStack.append( curCol ) - else: - raise ParseException(s,l,"not a subentry") - - def checkUnindent(s,l,t): - if l >= len(s): return - curCol = col(l,s) - if not(indentStack and curCol < indentStack[-1] and curCol <= indentStack[-2]): - raise ParseException(s,l,"not an unindent") - indentStack.pop() - - NL = OneOrMore(LineEnd().setWhitespaceChars("\t ").suppress()) - INDENT = (Empty() + Empty().setParseAction(checkSubIndent)).setName('INDENT') - PEER = Empty().setParseAction(checkPeerIndent).setName('') - UNDENT = Empty().setParseAction(checkUnindent).setName('UNINDENT') - if indent: - smExpr = Group( Optional(NL) + - #~ FollowedBy(blockStatementExpr) + - INDENT + (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) + UNDENT) - else: - smExpr = Group( Optional(NL) + - (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) ) - blockStatementExpr.ignore(_bslash + LineEnd()) - return smExpr.setName('indented block') - -alphas8bit = srange(r"[\0xc0-\0xd6\0xd8-\0xf6\0xf8-\0xff]") -punc8bit = srange(r"[\0xa1-\0xbf\0xd7\0xf7]") - -anyOpenTag,anyCloseTag = makeHTMLTags(Word(alphas,alphanums+"_:").setName('any tag')) -_htmlEntityMap = dict(zip("gt lt amp nbsp quot apos".split(),'><& "\'')) -commonHTMLEntity = Regex('&(?P<entity>' + '|'.join(_htmlEntityMap.keys()) +");").setName("common HTML entity") -def replaceHTMLEntity(t): - """Helper parser action to replace common HTML entities with their special characters""" - return _htmlEntityMap.get(t.entity) - -# it's easy to get these comment structures wrong - they're very common, so may as well make them available -cStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/').setName("C style comment") -"Comment of the form C{/* ... */}" - -htmlComment = Regex(r"<!--[\s\S]*?-->").setName("HTML comment") -"Comment of the form C{<!-- ... -->}" - -restOfLine = Regex(r".*").leaveWhitespace().setName("rest of line") -dblSlashComment = Regex(r"//(?:\\\n|[^\n])*").setName("// comment") -"Comment of the form C{// ... (to end of line)}" - -cppStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/'| dblSlashComment).setName("C++ style comment") -"Comment of either form C{L{cStyleComment}} or C{L{dblSlashComment}}" - -javaStyleComment = cppStyleComment -"Same as C{L{cppStyleComment}}" - -pythonStyleComment = Regex(r"#.*").setName("Python style comment") -"Comment of the form C{# ... (to end of line)}" - -_commasepitem = Combine(OneOrMore(Word(printables, excludeChars=',') + - Optional( Word(" \t") + - ~Literal(",") + ~LineEnd() ) ) ).streamline().setName("commaItem") -commaSeparatedList = delimitedList( Optional( quotedString.copy() | _commasepitem, default="") ).setName("commaSeparatedList") -"""(Deprecated) Predefined expression of 1 or more printable words or quoted strings, separated by commas. - This expression is deprecated in favor of L{pyparsing_common.comma_separated_list}.""" - -# some other useful expressions - using lower-case class name since we are really using this as a namespace -class pyparsing_common: - """ - Here are some common low-level expressions that may be useful in jump-starting parser development: - - numeric forms (L{integers<integer>}, L{reals<real>}, L{scientific notation<sci_real>}) - - common L{programming identifiers<identifier>} - - network addresses (L{MAC<mac_address>}, L{IPv4<ipv4_address>}, L{IPv6<ipv6_address>}) - - ISO8601 L{dates<iso8601_date>} and L{datetime<iso8601_datetime>} - - L{UUID<uuid>} - - L{comma-separated list<comma_separated_list>} - Parse actions: - - C{L{convertToInteger}} - - C{L{convertToFloat}} - - C{L{convertToDate}} - - C{L{convertToDatetime}} - - C{L{stripHTMLTags}} - - C{L{upcaseTokens}} - - C{L{downcaseTokens}} - - Example:: - pyparsing_common.number.runTests(''' - # any int or real number, returned as the appropriate type - 100 - -100 - +100 - 3.14159 - 6.02e23 - 1e-12 - ''') - - pyparsing_common.fnumber.runTests(''' - # any int or real number, returned as float - 100 - -100 - +100 - 3.14159 - 6.02e23 - 1e-12 - ''') - - pyparsing_common.hex_integer.runTests(''' - # hex numbers - 100 - FF - ''') - - pyparsing_common.fraction.runTests(''' - # fractions - 1/2 - -3/4 - ''') - - pyparsing_common.mixed_integer.runTests(''' - # mixed fractions - 1 - 1/2 - -3/4 - 1-3/4 - ''') - - import uuid - pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID)) - pyparsing_common.uuid.runTests(''' - # uuid - 12345678-1234-5678-1234-567812345678 - ''') - prints:: - # any int or real number, returned as the appropriate type - 100 - [100] - - -100 - [-100] - - +100 - [100] - - 3.14159 - [3.14159] - - 6.02e23 - [6.02e+23] - - 1e-12 - [1e-12] - - # any int or real number, returned as float - 100 - [100.0] - - -100 - [-100.0] - - +100 - [100.0] - - 3.14159 - [3.14159] - - 6.02e23 - [6.02e+23] - - 1e-12 - [1e-12] - - # hex numbers - 100 - [256] - - FF - [255] - - # fractions - 1/2 - [0.5] - - -3/4 - [-0.75] - - # mixed fractions - 1 - [1] - - 1/2 - [0.5] - - -3/4 - [-0.75] - - 1-3/4 - [1.75] - - # uuid - 12345678-1234-5678-1234-567812345678 - [UUID('12345678-1234-5678-1234-567812345678')] - """ - - convertToInteger = tokenMap(int) - """ - Parse action for converting parsed integers to Python int - """ - - convertToFloat = tokenMap(float) - """ - Parse action for converting parsed numbers to Python float - """ - - integer = Word(nums).setName("integer").setParseAction(convertToInteger) - """expression that parses an unsigned integer, returns an int""" - - hex_integer = Word(hexnums).setName("hex integer").setParseAction(tokenMap(int,16)) - """expression that parses a hexadecimal integer, returns an int""" - - signed_integer = Regex(r'[+-]?\d+').setName("signed integer").setParseAction(convertToInteger) - """expression that parses an integer with optional leading sign, returns an int""" - - fraction = (signed_integer().setParseAction(convertToFloat) + '/' + signed_integer().setParseAction(convertToFloat)).setName("fraction") - """fractional expression of an integer divided by an integer, returns a float""" - fraction.addParseAction(lambda t: t[0]/t[-1]) - - mixed_integer = (fraction | signed_integer + Optional(Optional('-').suppress() + fraction)).setName("fraction or mixed integer-fraction") - """mixed integer of the form 'integer - fraction', with optional leading integer, returns float""" - mixed_integer.addParseAction(sum) - - real = Regex(r'[+-]?\d+\.\d*').setName("real number").setParseAction(convertToFloat) - """expression that parses a floating point number and returns a float""" - - sci_real = Regex(r'[+-]?\d+([eE][+-]?\d+|\.\d*([eE][+-]?\d+)?)').setName("real number with scientific notation").setParseAction(convertToFloat) - """expression that parses a floating point number with optional scientific notation and returns a float""" - - # streamlining this expression makes the docs nicer-looking - number = (sci_real | real | signed_integer).streamline() - """any numeric expression, returns the corresponding Python type""" - - fnumber = Regex(r'[+-]?\d+\.?\d*([eE][+-]?\d+)?').setName("fnumber").setParseAction(convertToFloat) - """any int or real number, returned as float""" - - identifier = Word(alphas+'_', alphanums+'_').setName("identifier") - """typical code identifier (leading alpha or '_', followed by 0 or more alphas, nums, or '_')""" - - ipv4_address = Regex(r'(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})(\.(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})){3}').setName("IPv4 address") - "IPv4 address (C{0.0.0.0 - 255.255.255.255})" - - _ipv6_part = Regex(r'[0-9a-fA-F]{1,4}').setName("hex_integer") - _full_ipv6_address = (_ipv6_part + (':' + _ipv6_part)*7).setName("full IPv6 address") - _short_ipv6_address = (Optional(_ipv6_part + (':' + _ipv6_part)*(0,6)) + "::" + Optional(_ipv6_part + (':' + _ipv6_part)*(0,6))).setName("short IPv6 address") - _short_ipv6_address.addCondition(lambda t: sum(1 for tt in t if pyparsing_common._ipv6_part.matches(tt)) < 8) - _mixed_ipv6_address = ("::ffff:" + ipv4_address).setName("mixed IPv6 address") - ipv6_address = Combine((_full_ipv6_address | _mixed_ipv6_address | _short_ipv6_address).setName("IPv6 address")).setName("IPv6 address") - "IPv6 address (long, short, or mixed form)" - - mac_address = Regex(r'[0-9a-fA-F]{2}([:.-])[0-9a-fA-F]{2}(?:\1[0-9a-fA-F]{2}){4}').setName("MAC address") - "MAC address xx:xx:xx:xx:xx (may also have '-' or '.' delimiters)" - - @staticmethod - def convertToDate(fmt="%Y-%m-%d"): - """ - Helper to create a parse action for converting parsed date string to Python datetime.date - - Params - - - fmt - format to be passed to datetime.strptime (default=C{"%Y-%m-%d"}) - - Example:: - date_expr = pyparsing_common.iso8601_date.copy() - date_expr.setParseAction(pyparsing_common.convertToDate()) - print(date_expr.parseString("1999-12-31")) - prints:: - [datetime.date(1999, 12, 31)] - """ - def cvt_fn(s,l,t): - try: - return datetime.strptime(t[0], fmt).date() - except ValueError as ve: - raise ParseException(s, l, str(ve)) - return cvt_fn - - @staticmethod - def convertToDatetime(fmt="%Y-%m-%dT%H:%M:%S.%f"): - """ - Helper to create a parse action for converting parsed datetime string to Python datetime.datetime - - Params - - - fmt - format to be passed to datetime.strptime (default=C{"%Y-%m-%dT%H:%M:%S.%f"}) - - Example:: - dt_expr = pyparsing_common.iso8601_datetime.copy() - dt_expr.setParseAction(pyparsing_common.convertToDatetime()) - print(dt_expr.parseString("1999-12-31T23:59:59.999")) - prints:: - [datetime.datetime(1999, 12, 31, 23, 59, 59, 999000)] - """ - def cvt_fn(s,l,t): - try: - return datetime.strptime(t[0], fmt) - except ValueError as ve: - raise ParseException(s, l, str(ve)) - return cvt_fn - - iso8601_date = Regex(r'(?P<year>\d{4})(?:-(?P<month>\d\d)(?:-(?P<day>\d\d))?)?').setName("ISO8601 date") - "ISO8601 date (C{yyyy-mm-dd})" - - iso8601_datetime = Regex(r'(?P<year>\d{4})-(?P<month>\d\d)-(?P<day>\d\d)[T ](?P<hour>\d\d):(?P<minute>\d\d)(:(?P<second>\d\d(\.\d*)?)?)?(?P<tz>Z|[+-]\d\d:?\d\d)?').setName("ISO8601 datetime") - "ISO8601 datetime (C{yyyy-mm-ddThh:mm:ss.s(Z|+-00:00)}) - trailing seconds, milliseconds, and timezone optional; accepts separating C{'T'} or C{' '}" - - uuid = Regex(r'[0-9a-fA-F]{8}(-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}').setName("UUID") - "UUID (C{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx})" - - _html_stripper = anyOpenTag.suppress() | anyCloseTag.suppress() - @staticmethod - def stripHTMLTags(s, l, tokens): - """ - Parse action to remove HTML tags from web page HTML source - - Example:: - # strip HTML links from normal text - text = '<td>More info at the <a href="http://pyparsing.wikispaces.com">pyparsing</a> wiki page</td>' - td,td_end = makeHTMLTags("TD") - table_text = td + SkipTo(td_end).setParseAction(pyparsing_common.stripHTMLTags)("body") + td_end - - print(table_text.parseString(text).body) # -> 'More info at the pyparsing wiki page' - """ - return pyparsing_common._html_stripper.transformString(tokens[0]) - - _commasepitem = Combine(OneOrMore(~Literal(",") + ~LineEnd() + Word(printables, excludeChars=',') - + Optional( White(" \t") ) ) ).streamline().setName("commaItem") - comma_separated_list = delimitedList( Optional( quotedString.copy() | _commasepitem, default="") ).setName("comma separated list") - """Predefined expression of 1 or more printable words or quoted strings, separated by commas.""" - - upcaseTokens = staticmethod(tokenMap(lambda t: _ustr(t).upper())) - """Parse action to convert tokens to upper case.""" - - downcaseTokens = staticmethod(tokenMap(lambda t: _ustr(t).lower())) - """Parse action to convert tokens to lower case.""" - - -if __name__ == "__main__": - - selectToken = CaselessLiteral("select") - fromToken = CaselessLiteral("from") - - ident = Word(alphas, alphanums + "_$") - - columnName = delimitedList(ident, ".", combine=True).setParseAction(upcaseTokens) - columnNameList = Group(delimitedList(columnName)).setName("columns") - columnSpec = ('*' | columnNameList) - - tableName = delimitedList(ident, ".", combine=True).setParseAction(upcaseTokens) - tableNameList = Group(delimitedList(tableName)).setName("tables") - - simpleSQL = selectToken("command") + columnSpec("columns") + fromToken + tableNameList("tables") - - # demo runTests method, including embedded comments in test string - simpleSQL.runTests(""" - # '*' as column list and dotted table name - select * from SYS.XYZZY - - # caseless match on "SELECT", and casts back to "select" - SELECT * from XYZZY, ABC - - # list of column names, and mixed case SELECT keyword - Select AA,BB,CC from Sys.dual - - # multiple tables - Select A, B, C from Sys.dual, Table2 - - # invalid SELECT keyword - should fail - Xelect A, B, C from Sys.dual - - # incomplete command - should fail - Select - - # invalid column name - should fail - Select ^^^ frox Sys.dual - - """) - - pyparsing_common.number.runTests(""" - 100 - -100 - +100 - 3.14159 - 6.02e23 - 1e-12 - """) - - # any int or real number, returned as float - pyparsing_common.fnumber.runTests(""" - 100 - -100 - +100 - 3.14159 - 6.02e23 - 1e-12 - """) - - pyparsing_common.hex_integer.runTests(""" - 100 - FF - """) - - import uuid - pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID)) - pyparsing_common.uuid.runTests(""" - 12345678-1234-5678-1234-567812345678 - """) diff --git a/venv/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyc b/venv/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyc deleted file mode 100644 index e9f15fea0d0cbe4a81faa78a464e4279dba328ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 258922 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%0DCz1z<4*3Ov(AniRr#18h=6G6 z8V?pXC-OmcNTRPCoJbe>2#gPrkwoM}WWvTWfW98J7^etf70vXQ1Ipcd@)yJ<%z%O+ z$}@~GT*0yG$6_M(OYjL@&L?!4w4=*3w^;9C$@e?CSGvTNa0Ee%l>eRF)IGdQ@KZR4 zUrIR#u&gZp>>cqo(2>Sb=)RjS!I5`ZEY{?HtnLNz6$A!G7fG6+AY;D=hJgrGXY+ap zyKNK$YyLI9dATZ9WbetcaYM_jpQNsJ4u=oYTkH!^T6pGNVw2F=_vNqC(UE*}M@RBg zWZ~s^tjb0+%Xg(U`Zi<bXz6X1W$88xe7wfkIr}gK4I7c3eh}%WL<FLbT~S?XW5#SJ z^4F;EBm6a9n^&014Ywx|P`Dr13l%lQkA^+DxsdFJfX64aIMo^p>|33PMi(RFN()S~ z-j{_Wf+K@)V^Fr)HvA`a$!*t}r(EfK^|Xmulh_;}#|MbxQ!;Mw`?+$#!zc8@epO<x zepF?}pc5-{-{tbbiLzzf@vF+D(hZlsq|%bESfxZM*-`p&UGd8eFOG5j6m9u7jq5Jj zlnd<J9faeO8I=;4h>4Rj?_N@!tg|#GcUjo~<moyEn<KvR-)7bh(T8LKW0xmt!^5A| zXl7VEO}2hoSB7l=TDX<cx3I`9FA_vZM8iV*hKB#f@hd;8Q5Thgqt^%ddyBFw|5V*@ zNnpaR*v8W0(d5|z+Q|us?q<}+h7z<2hn)2^h$#L#qa>C@p!6#D7MTd(=hF=(5r7Bc z`wlhsJ9YRe9p2F4st(t55L7FDo4WF8U0O#uStOz}(TB>8Zl?F0%h7c%>3%@E&a&F5 zf3*B-&bR$Ml^U}Wb(vptzRfb583QPBCW=a!KJjc~3GHLXtr<6WW4zicH_NLX5)=9C z7%}M+p6!+E@obw4m-K=+QYu>cRHoc#N=#gr%X{VP$>kL`6$;OejE!$B^zAN?eKck6 zoUao@*ude%rfw=s5~j+sEY~aJ#9D(q%5<(^vlUB6_Vva%*1{_p{xw!|GwiE6wx@!A zmK4rSJu@!1p;OW(&(*tqgKeF@I5|yb==#It>q$<BU&cszqV{l%)!sij)2LbdEdd|F z7<>j~V(Dg;Yjt*2hg*(q{gOH)BCLUJZBU>61rM`q>*YU=4C{}Hft`7~shJXn)fqV$ zS-3mcxwVmRopAjYOrum1&U$`MJfzrFyD9$ib2)p30LXBFzhLYt(h-w0$9Dp|8t=nz z^0~;aCii1?FHq&Nlq38DYd>$m5gK0z=U2^ggmk5WBNYAM9N~@ePZ~ZqR<!kC?2v^r zX~jAjpJZ>e;FC(<DpdR-9mEZpk)ClvMLw}OR9U~P6?DIvV?2;Jpf&lW@IF}%XkEuQ zcpbzm#_NdH`4bJ=Vq$e(`P;zi{6z}AZ)H~J&()1@usSulbb_IcNy($j2^;FBSe?Hs z(7G5|9nlp3hb9`+&Rpjm#_FtZ&FVZsiFs92X5{iZW}B^Cbg|Zyw6lHz&}5`&<Z$Fn zbwk#gTMG*5sz@z_ZuvSIYd&xz3=NTu@d18XY}4V>#h%i>y@kW2fua5T3g5i%;K9Sk z3j0g@_6-&G9DMJ-!gKE}J$G;)=L3W9E*yK;fuo$44j&upNp(u~vm=w0;pv&lN?PZU z_q=zYw68FDpft$aM@t8&o|7X-2TFx^?R#Nh|KXv+;lZQ&o2e-nL^kNSBJJ;=Avv^~ z-eXr!^`PcTKVS5_nF{f2t_~-!=)&IEUz@l%S&Y_~m(4(v?1ovB%o!A5#U8zqsm=y2 z)@N5%p`8_b>`$h6eeC^}SXviWIDS`mC>=Yv36`=_*f#>dSab{A#O$`v`#|p&iyB`p zBl;yY&2(*y1%)&^yQB)4s){x&7GYPNAiYq9U_NGKOh_GTsXbI9>|v6nsCizMT95(H zjQ#_17!SkxK;f{7qDRJyR;P7$OCfVR4nn4<UYTm{uU)JjMcrC2DqgX;u;ibWd8!Z= zl2!gxScW!{h3(t6Z7poyv8~lxVcpr77arZ_{nhKNXn*_BZCjsceAPeUOW$7HvCVt^ zR9wFH>W*z&A8CBEx#>QH#;azdBHw(Ej`#XI3YP2xp)+r&&TLoe#2Us4?EAKDy0KLU z1}9O;YE=8uVPG@IVe1Pc(&F7%MlWA}N<-doYld5y2_T=VKtVET%hIJC?%(XRWc%;$ zs#`WWI(gK(njMb!?$iBrG`xfj#uM|6#e4U~KBYs^^kOU#2IA2<<B(ZQaTvVG@m=l< z2CyD8BNG;OX4w_ux=Z1vui3_xcRaHY?DdARVd^zhHXk}m)^Owacqtp7M_P}M)tu>q zx8!(l)0?qG7@*9m&>a>^X3xX{N*Wd4PKGGFK35|1Zt(EDh6LBMgbv07c!s(afw}z! zwPaLZNMvE^i}jqq-2M$QbbdxupZbP4##m^xA`r#o;+Q5IXOnPS7FXWODaiaj%xDa0 z))%*R!PDw!BBqhye_47Bc^`|ZG~LD{NGX_Etek5H^C(IY*}U#|@X$x8&;L9ojKP_B z_vF2@5J1I>WChn&+5bJPb3BdZ2llWeGnvwxEmtd#aVtOB@LD(5yr-8=N+g721$DpK z1TM|iko_JW%zW<$GvDK!1}>ZLh1>0gFJxZeoEN&YFWleIBh<{qR5^`l0j8eBKk+7V z!fO~#2NzogtvmO)Tx{K+bvPHI7fFc4!{xbqF~QK;QqH>cxmnD!SLSAK&t3jExmRw_ z)rQ+-3(;j=#`Zxyr_Ob=*0$N@xy$se8~cavQS)Ts!6@D#u@*uy+9u=h>b*$H?liI2 z?_nFBe`R^@+$t4h;__2h^Dn%z%x+LKhL{9<Ssfm#h?`(=Ml+Nq>~6K^+?vemde&vn zuF7(v;Tg3bo2F6A^(~!r>qP#~7xN4W-JH6Z=l^3=TKnEMEIZDvlR2o?*V1Hh&92DN ze02%K4?eacw-$pAiPk99FsTnV%#l{XkF?P|R$XYJU1~A?NZaF#w8nd7?($=*X79=V zWEHLtA9I0Yu;6D<SK2V$;p6s|wqw&9bZ`1?s)ufAxM?RczB?`ExZ8V_k*=BYNc+kl zrRfTRlv`56RCbkGOFRV=b}|ptM~|_9X*O6@HEv`rg>mUlv6=7U8;jq5bzcfo4YWd2 zCu1WysEy6vI3@V$Os5~Dmxst#q<~S<zrj(ODkxzx3aEq>aH?J?Zmw@B+WdZ0^ZS2k zrX}$;Ngr&-_6sAEnMI)aH*+?#eo5GpdT9smvCS}u!JT0&y}v>C5drx9<nv}SkzBa? z_8MhMsg;iTu>OwjY1u&*fD$SfCSI<%cg1J)L^5fp3g+|Tg;EcHi$W%D;NEDelbYeE zM`n-1$quU)r)Zh)Ea6r8M^~msliP<Ur_*$yhovAiBcJn?%A{!;8C>fKuL%cxChXH_ z>nfvG-36b3628f~($ngOusVrhM#f9#_Tk<WCI(+f>niEX2eo(<KPLxbz9-+Ge-yi) z?fmyR)<4}y#h3A4Cl)|m#0Kf)nQVlX=kILm;prXxR&#$j&o|^ZwD0Eca)JTe*|uh( z?DaDiFc17~*!(l;=D(H2!U7@R5DOC$Fe4U*C}|K2i-c~D0ASGbsvc-FFG^vsVBeBt zdOIIQ7~I*ty_MAqr0e{mU?jjvNbl=-D}-o`Ms_J+Bcfx%5)!Qu?}l#qGKkTtk8m*N zwq;<(;Kh)HW+Wr{R~MU6h-y%u{X-7TT(Z-?K_~378Ars<fQsN$z%ruQ4unhBB;y=6 zMHw%E9kX#q&~m|P&N(IX7>1BnFdj1vmNoI0b*{KP&OvbQF%<2HC#9Y`>8Ug5Ov)Km zELxs(j@<VUYIZ!g+GufZt~QFbin2WoPGXh?#?;<R&z-5I{~nFd5G;5yM8r&k6PC8B z$Qm7t=7{0xEU~Iv)HnJ2PHO4P-`AsYE#)l35nC;bD{kS3wH-7l9=C86u?iJ0rweqd z|AbccpYh2e#-kPfelC~^_+-XeQ<``QMw5FO3YcdW)NAeeBM?078nFw!V}9qarKaLq zmqX?dYuTRMbTS=sQ~bX{nOiFI_xGhRb7lUXHlzMo4#pkXCfv;hi%`qib_xS0R><%8 zK*0j~;67#JMgfn<!0P6;#1mC>;uNg;oZG;CN%w5QS}+EE*r-yY^cI}lQ=5KJ<Fkx* ziQHR-nL{QzrWS;a(T{SXF=8D#(^%HI))1L-ke_@~>r0Xscv2f3o&tc(SAiJ1K6vl5 z7l2Z>?s$`B>4Ev)mz(-zuKLW4RPxFBDoN%7;yMY;XXw%3OH*JzgFY4!C$8>A=_#xx z{;1|h+>B=sl{tQaz<ew7Z%Ya4I8TrHJTXaOCcq}VsEGm!_%!UW5j1~cJxj(-OLNFW zOQsOoVg;pRw8)mPTK7L`cr?)-C_F4)4M-f6=eb}6Sdx+@^@N4Y9mU#Wl?I_sgCVs> zEMm!$jTkr$zamG^3>u@EZ2S&BP<lXzI8<(GtR^@U`qMg-P4(i~_%ek48I7E8{BAh7 z6)dT;Hjf&uzk~eDUzCB%n3!v1BC^?LBV%A79T}A{xvU^S^Dw0&)WJuZhpAon-p^ri z43nDpxpaYPh)86uU7(+A4Q!Aua`INgVd6=~a77qd6;RY2^I1c(;!hb#q;hMyARZ8l zPj@?5f3%NGfD%~DjgDzR?$bPKj*e+l&=?}KxX5<4n*EC!czz6a5*_ni;>Nl=*A1Bc z3%PmNGlODU@*eR_m8a{=&K6SUqIr5veHD<mh-a(1JG+(;?~G$6+L`8h55JpBH~Oc% zW}MBziHY+gXDcJ4?nQ0lK%B3!%6G#U%i@zU3-2%Bz5VRO`1r)7%IKaM&rdWufhog* zE95zvEsTu5JW?&opub`%fK($|$1!=l5kV{_W*)1`{M_BNw-(0a7(PB@O?tUf8#_H_ z{@h6tA50B&i&*!T#V|F&kG|ibWXRHF^(0?yZZg5oE{)98v8R~6SgR7Vtx&y)A&`Yo zA<uAq`Z{jkGVw@zADs!QV|?UPW!ySZ7(1>0m`A&hlO=sB^gflENQ{n5j|?j>M`A1! z0-jmJrS13Xo-U*XAIf~VNL{I=hwMp`IBISj<8MDyI1+-jS$XVZ4#y~KvEHrB!Nla@ z>eKd)@<&fw;JN`E0w$`(UcAxIO^j6u#inNIUpz@`i!IpFZ!>fR1DEQVV9=8o6g1c` z1gizwhk^fi<@9t9ueyK0JoXnjH<&(LD)3-UVP5Q}g4azqr?7icbL&=GePT&rxJ-Md zou7f}O`JdtW{IOfri$A((3-(kg6?h)FBp{ZDdPQXV01y#6q+m~Ah}9Azbrr^dPIC= zStt6%A!rT=FQnZDeHfGB86pV2VTLCphtK$iH44)gN54Ns6aO&n_g%MGs!A=dFR1zA zA7vWZD#f%!AQePbMw1e^11jNlF57bzW9VORw1`BkrD?DKBqL*+I0gQAMURfvv4@<v zlp+E_>o-FM<Qp2OE<75@Vjy!MOY*<XgAfLYf4LP*7MfqkzF$8-Hd#QCB)Bv(D*Tm+ zxtYFWBlxDMq)@nSfX?0zr2c2~q8<CvT)-u)|0aM70iht6rHex2B>K=It(nmRscOWm z2pA4oT-9eSFzLnWrID(<^9&(wEx1FaF@LhFagg_h&P<+h?f)<DO@QmV()-T$0E(MP zQ7uZKww9hiQFtH$kN_!4qCiR@NVVvuAoT^+?B>$Q1KtDqNNju;5D8IicSmh^JBbr# z%FgCVqFFp~+RmgBXK|cL&2)`3<2V^7DR(l?q_exS%~U3-RN`z-&+q?z=WY)GNjd2T z(gBH!d(S=R+_Qe?+dth2_(fmRok0f+=dF63%Gp@3@Ly?DZKZL*!VdA$Qh1nR?#Fnk zvEn~yH~$SDwhjf6IFEX3r^AQFCz~UGJFwJN^WpfT8XYr@v4OD{e?V_HD%kuF3EU}R z<$`Bw+Ha&ydSIL(L5v?LK4<)(PGN&p^r&@GTt(;qh&3iBTAiyn(b9m7ML*BgWbt3T zeGdWEm&j=&Ysb<CVx0XX4J+d`tstQKWXGx@1wT?JZ1d=#+GyURwA24-vQai~=k(dK z;{g-jPrN1h{lZMcB-~Tvvmfnt0i?LXB^*hdM<o-j_<7_Gr5=!UMGMKa12y&Os+#8E z9srG9hU0gEHLf0>;Eg13lqst4R+}+pYkgk#yXNefC5qw|ZAv&aa$Muc+#jU<Ib_ZR z1vI5SAd<UwlxzrEX97FQMk|K}3C@{nfMe9OlA*9X+&DJ4-iY9XTAdQK2@%|8-aBwJ zs98{=P>oT3<45R;Hni<&l(}@z$UBEN8C$8q!8v=y-oiM<6VDbKd=lT5&Q}UKjhjd< z21$e9fywJEU!qd}Z!Il<*=ixK!wz)MZp~ZGKf1CKBpE+#igyW6MssS8c2LQ7>4E7J z+(@dCxFp59=!2#BTe|A-Lrvt1Qt0CGB|d!Pi~4{5{M;TC(@><_E{=+<GPg)Qjo2Zd zqi(X38jebngt*TaJM2vU@salMM_NS2)i*U2J0mUZ%YR@@{Q&sCxT|WY{bVd20Pb(G zF*9w%+=Nk5D8MlvN)uW#(Y!J@-?H$(sQj^q<d)Ibq3O^pww5Q-l^K0q>yb@dx>}3R zs9?jiP@<nyx)w2dDegG5%ES6EPyxc-TA)H}6_GVKnAx-$>BBRydmiLh_nVP}ZAP7h zND^?~Hg$}-Oe*94*d%;JB^iXxx@dRnxe*0ywyU4ocZj*SPVv`%7yyT&d$?H@u?Kik zx)g(VI1V2*78;ArUBNj)UX_c-jE|GCOx(4C;gk^iI84XHK5>BFZ=4=9zO(GqAs2f~ zxJ+=wI{%5q=4>Ojswm@7kDFY$>M?TP=`B_$DS55JS7%XlS`>aAqi9BG)ETeIm<(01 zgHn?hu~gKTBxB{~{L)NamRMBLk}r2}oAR`>0m;>ub*R_sw~Jditn^x+GDp^(J99UF zOxnA}#;wK7s4B6!aaI3}15#kWbf<;y$;46Z8E>Y7Uk3L#(Gt_pjTm}xp>Lcj?3r-v zK{{)1POWlAlsj-}<KB3C#Ft6i;wDsK9i>)MrdE+Q)9k3;n{U>cXs6En8^Pft4FPV# zP4oq$nM|usxl|0+cY#lqHo2O9xX2!B8`-@@e-~}T<^C>KV{FN8sGSLRIqh_MBcGMp zG)d@(Ec!v3C2MG9f2BIu*L%12TB+|IY2f;Lf|z#(1_svl-}EJNY*^yp`&J<i)TMT9 zt)C=q107gT(40f*f%W+2j`YCNS#*-$_#l_UfdvD~5&lgjMO9g$lf^+M{5V#mD_cq^ z)537B&Ex?%yZHS^Yd+OZ{tg{!g>QUMooU#t%{FIhEkVt*w^NAZVw==HOG|K6lhMm% zB?ZPrf&_mEK3wF8Yx2jU|BgR71%V+FbCi^^#XFT|91p{otprKyk8yrPBZv%~@W!9c zctI&Cbeb&7l~qPXbb-+s<8IYrnl6EOcwH`C$bd112#3$rGn!M2-f2!7DI@-kH)N!N z0fP<A8=BH^ZKV^EzgF^sZ_To;qVE)UDCz=M7}9+CzuY6Bsqu6D3U}f6NyrzCXZsnj z3JtT-xI|jP<H>s1{2-(Zakxxjb7BmU>N!OqpCXU_q_j<i$MmT93gQa<jdw_Bp#y`* zP2vy<wxq~~irUK3_5eO5{2Qg4YF*Xtv~RLgb3G}%e@07U4UD=`${47Hj?mqNrSPL^ z%Qsj@ev*d0mvzM9d`4%hpV8~Id84h&Kg__l)NYfW;eVF6OtjU0G$$wdU4gUQ)9XF! zQY$d7b++RyMt+KvT@ynw9OpMgaIcM>)Em<^xUrQgwn~OOiPC<rHnW8Kg@t!>6$g1* zbaE)km#6R1Q-EazkwsLxHAPT+EANg=WWNZ0HZ@;wRHkY~vTjsrl^6T#%`2!oyx&~t zt1Qec#rVJvh}@Cz>c&!SM(P`_l+YkEG}sDPf_=2BHnn*CMTJ~T@WE<Nf59DolIciq zPA7p1*Y-uRw?Y`6y75S8{)IE|SQpa9h!ud_#3L^jQVI`yRqDVIQKGYj7lT8ChX(r( z9Xd2vNG?3=g(_xJpjfG-@aC15Upo3?e<2BH6l>@|+@lx89+)G@BQN$8i0f7QuuA(? zH0e~a{A%4;r3;lWq&<3L<jmP)6}XPLmt+;f47Uv;&H%J#W$G%J>5IL{7-wMr92+#x zCdZEY0IbALN7#F-VyDt#7s3UX8Vg&Od2%%|9l}qSeBuSKuA@WSe=PbEKr3fWZ}yEJ z@y0c^4NWy6K&OD)H}qmPOjce4H^zyhw*UU*C@x{3CkNcd*cZZ?Vzd7v56jhzw_jk% zgX5<x`Ayhr&zo06<aYt9{k?|OGRS6jBCCQQNoqpb`^!nxZp`UT%{#~qm<SgjP;g6W z_{Q(DGM0%PH-4X4KBK-ESnc+;WR?_#%V)`Eq|MYo7;~fvTHMXuL;`n^>6>h-QTKq# z-MsXJYZb)WnB*H{3PlS151PV9X|S;CD%kZd*x-*KsNU7FJwqcne!dHscC<&MucZ_H zOI?0m7p5u5IKHGuP0L0@zJ#;<F^yvp%U%`9{yNYgN39w)rt;Z}u)FodB?X$^Pj>d^ zZZnH}C`D$3j~Fr|nMsOOhY&uX)Q(km$}?I6H4taRY!Qa7lJU0@0~xe7T-`XWk~1wB zDkBvbxkv*sXke5ql@LMhC7AW7OTub5tVeJ?jnm^=j~OPhHo~)5Yh7t9=8MkOT8brW zH76$p9}x>TpflFAM%|B>evZ|tnI&+Mg2dqs_?r?rfbpDbEj2u1(8`a2^%x@*W-+0G zD(Q(;sZ>qSpg~AFT;teUS%bUek_svLU^~|;L;b;M-n2-2UC=`7Ola5E%pe$1Tq1SO z2e@(tc?`pV(LMgyno|t^a^=R-yv|PNZ}S-%lWXnN{H&Sj<6q3=G|eklIalZB7HhZ` zo7Px_Su$tU>e`B)B*Q7g^tb1VqZyhRnwQP99CveoYYc=un&O!E1f($6yf8%|pmR2_ zVFp=9@#3qRBM*i=*#NV0o#7SDOP5q%zGC%coJl%2ulLpl@90`G9mGOJ?Evd+clY)7 z(jsW>oGE&p!OjrHV`OT|+g};1d>?r35cpjtqzK}py|}m@Z%9{pahcmwjd-fnG|V?- zSnJORmC7lpAHTiOn9Ge6ewOrez^?7LS>hUZxnf0p5~p8-G;fq<YCUm#2IVe9Z;E`3 z{`E5Qn%T-!s}^5f(O_Dd{2VQ`v{HHHh$@|rksdauxE)_;%z(pPsaSkU#E_M<^H-Sj zYR}C4l@I1{f0z7Zl@1<htMsK;sOhaHf@)=^Qg2)=rNo<83Dk_YxjBOn^9tgED@LEx zn7ql)k(UaU<|q5E?g__Fzr)(d^rb(@=~ug0Dy%j(D?HVOROF~7uq>_iE0v{%9Bef4 z7qzC%*_%Ov;+94Odp>NZN)P_%g%v{u0eq3BHGyxnA`Eb4MJ;)Qzl9GNIIB?Fwe11k z0wO>dI57hPAq&-BgYpgeDNNwEy+#RtpfTX^vYuPblk;`g%hwP)6q+!Y%y8KTtkO#g zn}We{@7lQOe`hM=xnk`K=JxHkY715Jcnfo69gFLF14SFo7iK5(`6zqf#sog;&G)0` zE**trA^2bXOIlN`#pt6q-usv(G!pkNk~)Q~v$H`&8@Qd!dY`sUlJCXq=14Txvtl4O zU(&r<L~?b+6ysHNpuRNA6k3fdJQT_W;GoprlijZSHMhH75*i?FTt6pmX#BBCw%<u+ z2#&1{HgXlD(;{Dk8AXh0K;yk*DGW*rT<m$}h&4CB5$?P12}rtW_TZ7V+MR<bNyG11 zW7-~0>SSFV1H$Ffz5St?Y5K*UmtIl(4P@!&z5$jpA9-o5PUK)%+KKxGg=ymooq6e% zT)K6}+H8qaA`tbPQWd|2hm~~phceuCi-^RimtcPAyFqqOpzP(;HlfHp#dN8l{LoXv zmY{V-zHQ`Ez+8Q)$U_PW=%gX{Fhfy)5(RIL1x!Kt6FGuC7Kt|&Vs{0sLEFha`j~dI zFm=P_-DN<k@RX77PTVg;vzViufSeey82x#brq}H%f2Ppqs8PFyvj)w@S`Vs9+1rIG z-N5XRKwM;m#Cp;YAJMdbk&%{C{Y(DsDnEu6v~dcgDyB}1@*DqNy2PA9qBAJ437Gz% z|Hq9@F}l%G3UsydL@BU!(k9W=0bT1dc$G_S8K*3Rd8G&$SO%uQck35Td5@?F<x*>J z8Lhjz+a`Zx3VWv7r?vDE;fy~rO+!;*7bD_tmu?*_E#qs#{9K>{NIo<I&)@i?@Gv~` z_+J<I;vEt`$M5+$_#lLIa3w{QLRo%PhPJXi_H~rc&pk&${NLeN&-DSHp>&ywp{V4p z?MAEgxp%mnCsSaeuy%2xk;GIWE2@op1^1()^xT~X<>m^lLk*<m!>LB=cPKV_#)R?j zr%V{~lXE8@++p3Nz8$WKDB^7_`mM}SE>bxY9Ab-S+!C!p*GV)j^q<nBX(w8w@?TJi zRQecMNb+u_{j`>@*28LgiqZG!yZ^l|`jBlm9nnE!QM$vXvFN*I0#-3(VB8pkcw9_h zI=*mP#n4)`47SzKNhA^;b4Deg7os@r1A6dS=+Uqm$9uo5=e`oZ;6G|#4XZimB}!*; zNBOz(a|j$@-E>IAx1*yIX3lOLUg_?W<=q_*bw04^@lLtG+QHs?2DezNivVqUR*?f{ zowvL7904`p=QIK)XgP{z=FTaNg?^YO=S^JVrja*OVyh*}A!14JYBk60A-1qN*ObE^ zteGf?w;uAd5#3wQgW_d~(-VK11I$jeH|AS6YnWEn8&jx0pkfF)f?NhlE+b$AM<HQs z%+!Q$JLzOJxz3hW1M8t!VUZHL98`S?yjj%#%$3Gus|NAYoSSam5(R1>a-#pds1=c@ zxer37UZ0!4IcLVMVn5(~?}{;1g#9Zha%lG*L^!Rclzc;wD!uI)9$sN7GzMef81(#g ziDMw2jYjfnol45rDS83gMRrXy*!+T0Hl`YN<g@txLvIu_%-Z67EB5w-Gs)oA7!aT; z5GAM(S1@wL>bI3I3Kw9`+LjVA$1==y`et4GyD~gX(GMz<{7%^fS)4D36y!qCQE&_z z5?V0@Vx;6MsOD?vEmXmnv>KDkGSPZZot-qs$W&z>qhi+qj2kwD`QV>e0-rI%T>5T& zle%~oVq`4OFImf&ubJjlbCG6Uk(+s&8I!2VS9^?uKT3e@w@+EF(YZEP({4M)J~}_g z@SDmjHOQ7YOzrV(ZuJ>cq4YsAO-IN})EZm!EQ#45q8o2CQ0OtR8C(Sh^VvH_-q~8O z0ZMIlYq_Ot6k-dCzhUETp6adZ+4}P}kQ$untQpk?t8iI~7wYJA`AfY`yrP1x>S8C; zM|u=UGZ9RNIAzdmJpq|o_xi*1Qcw$#z5eJIpyIv%Z@F<)2uYC8kmqC$CMz&Uj@$<< z=RLSB%5NY|+&H3S-h}n&xDt=pAMj{bg%}2PAQ7x3ILF}uvjuY4RqqUAkdrR5;xpGh zaglD`Y$f?hbRul1X=ghgYe%(X0>;A^7QD8TEHhi!N|uc{SB4KvOw7bro70OE6Qi27 zE_y6iIFA@&tGG;(o$Qjib25|qYwLI`H;fqbb|M)ymEMqDm6ZpfW0StVlUt$8j#=fU z{gM||tx!tXGE6$B3{LvUVza7pw)-~5#*;&iadk`JLf)pPR&?xTUTEQy=}0it#|NNN zIua7$NO)wgd`K-fju^t6Z40B-Zc(#SgN7g*X7!7tZL}d#o6c)UT!JN1&0NfAA_b4q z8GpwIhLtRLTd!$JujP}6mo|b78RUon&5hT>7<~`9<@rK3YCFt#5&K`uNh78uVEg|E zx$%9%*(FHcX1&UIfR*kEwyfGt5W%ih&{2BdJ?W+7EI#5LjAPK|z7=`ZDJP5P{S075 zs)`OQ$!x)@_Dxv9VhtO@u)FE2ns=;%Vxs|RJBE%`T=<=dUsL})#=w|piTk`bIs?*& zTXMb<P{^_Q$Z*$24(fl2_Zf&Y`!CdkoKw3oAi+=4!iFX=0p?rE4|R&7>SXyp(y_f` zXEvGI1~!?;x$%|FaElettz+30m6=<I2jjv}up9s^8f5&m-;Glw0g?tFGO%DAB|A&M zSr|79PPj3KOAUK3Tkk*!h{^5cF}E-L5#Ht^AZJwMpJXpYe@Yi~g(O&$IY5f6w-ntV z1h!_NUwwRpo6V0vV0UiYxvg{CChU>7Z2Ls?v-D$1&DD=K`bmCcZG}ccZ+?ZF4iSlZ zot`avu=TTv8^A!&II)oEQZ6QS!yOCSAK$ORpwsl$U6*F_tk>Dfw7d00s5LcTOj^5| z`sI_fH=U)Rv5;^Dm@aiP{tOqRPVVM`S43t5YI=Sy^}(CcSw`;2RxCzQGEldvW?3h- z+alP@4JQJKJ)lHT!#H<3Bpr}ALSFzC1|a$==jtQBpgU=dZET0KKd1@Ol9&B=yEgC7 zs1MeWkGR`FOG(50o0FEy7upmF_M;iJEq{=k{9<BDOPv?y5~}5pV;09lT&7LNKH4mR zAdnw_lXd3wuM_9+H=xbYpqPR_#y+)SDljG~b*2iERMVxXAqSqj0)g!kMkkt2E=!d| zO1UmbP0KA{1K5zaF|(viZ1AM0(Y&%WkJfBZkjT45d)3-y#6LV#@k!*P2PQyW4#i^Q z(JZS`qqlo%^=q{$B>Klq|AjDup+3Gq`<ABQ?X0QX3oBp-@#=ZZX{*RoV`<;^3>1`Z zGhwFt=u(k_tFNBJ9+kVd7Xwk*d-fcbkZV8}k3nvokuZ~}>P=+QHU?4`m}}7gRGu!5 z$h7&Fqi1QEwZB@i+VAq&w2sit6<Wuub@w;Y-w>8O{oY=ff-Yir&YZEVOl3ym;+9O^ z;squx7*Ho--s);&TkPfOTZ$tHyvym<o<CMSgbpxgm$%(~HJeyR+g<x)RLfleb#+LG zY_HX8sFdMK=Cc9jMjrcxn*m@XWlMq&2c24-reisETG1^I7lmVhAeTzX0(JUJgs746 z@-62$s5$0t^QIB~S$1dib6hfLw4P_$M|9-J1&AaXk^dm^@LiIYvKi8$K1vqHOj}Ru zXwjiUijf@UxvrvH<MhBGOW~YR=cDJT%4Ldn>}Ys1R6cr8#|}w;S<ms2XX2mG_-MvO z%kRb~u`NQuTK(E01W?O%4toAWkaFmwO{F1z86&{9hKYB!^n|?|cMXkVV7W$9euT;| z1>IsijaW=B6pN|J@5wq&WscixGRABxME^Utt^+C@H|o~q>$*HnqkW;>*4?}=|3R76 z-gf!dPw>_xz0gkROm2_>E&mg(`e}{3T#Lwa#-{Qhp;fl5?t17O>eolQn6qmY&X$ke zt>+rj;{Gkk8j|C?UE8;9nIh4CXsaLi6>eBZD_!5|%qQKf$Ta=2f&ds$4(xY7;oUUG z81Mx(C<$gNNILKXiozB=`st+^W2t+A91eikWc2pg+ZQlUe!KM+`ipn)eu{Rc5;IHN zJ2@E;_@^~wrN;@>ywJuAXK=eOP|oD!l^xIN3BxI(H(vMy+?Zy@Dbq`Hiu>xXa>g|E z#tat0NHNaR!Ky0ADJuCXtD=Roy?dGfw0)C(#1BQSNe8$c@YCjEv!)Y%(vEpzm*(tE z+FIZa7gD31)!Na1=zgq*T<mFUiEB2k1j~C_6RV$qcgOWbRQj&5{bRU3usJ{oaSpOg zw4VFtBii)y+CK@JpCSR;JEQ!XXJ}xoAf-{oW8QKVSPkB7jD87B{et?XL5KP^==>vU z^6%8eh?kFax540<*3F+%yG=sAv*5^6Gjft&6Rq7JG&@f<YeF*#`rI85LhGFDIR$AR z$lOqGORG0cRkYSxcKYSC)It+2b`c#3rP69lBXC7pT+a!mr<=qybLG;6-Y9;wN&L9$ zjZpWy87y6_O)kkRfh#*!P@S%s$$?3*jRLTm@oKU(JD1oRnq1ym4g8w*de;D_(ofwO z?v=j-4t!=z$A8kSJkgF>YM}%$xzw7eEo5GOQjas70oCu0H|V`cs3C0f(ao8xg&7$l zm@K`W&PmTmOaX%f>(%_txW;RCHl(MY>?%`lLs?~7ftVB;<0q`uQ>^l8mcx%C%g1rn zU(xG8lP)dJ_qzr~We(R^S(BZC#AvQsSJr{mT;`-LPN-P%qJk#xs{N`>K^0=vKnv;> z3}<KRhLvcuVnc~Sb0hAPPZX3L<V2le)~i)NlQ_-3%(?A9t7aRh#n!Qa3|K?+nixqn zob_2G^HrP?@ji7$l&w=?2U6r>sT#Imi#3lctmWH#l`j;1e&@bnFIM?VUc=eib`0cB zRx;W_>0l(W!!v(bxmO;CJ2=+LrH8L2+b@0NLzF(=4r6kx(vy8z17Y1GHT!6Oq<G=m zT8Zurili|7cdT}4fmqm1?53sc!7^EFQwzCcs!z6{gu8~-1pg?oL~WI|X?zH6Hbmh! ziYu98&5x+Xsr?O&EB${faHXv@T)2=8!8y+8Td$PC7{QnzMo(QnP`+e(v8cmBu@VKE zROnVk5*{qw*l9vl7>z_RLQfW16izZFe&Y3%Im7jL6cQ~9{kvHuvYJpgCF^gM9(5fe z*kZl$X=)j!@+{vb%l8-U3sl)rdIGwXuk2`%2B*f;+RKydUNEJ%yG5-$t|}>M6!!Jb zQv6_9jfTZz)wQ0JiYiJfG?jbROv(0ES*p6+{^q=BcHC*6mF~Ea=AD5w7ydTZ<Wg!1 z4KgCVDcsI|YyPUz{*EpTJ-()O`I0U_rOThzrCS#x=0&a>;qC-}o1L#{_UO-&g=ye2 ze;t!%z6xSuQc%H8Q}Nn3c<#T{ntYx{mI#;n2zsU4k$~#1tNcRw$&MZ6E#-c=PfsE6 zgU0_a1rruj_=_nfy!Ss96aFlV#h_qD*Gp^D6pM{ahm)KDIjMg-N|3i!U6UM-=a*V2 zMjo$p*T9%@OVC%(aI2eZ2JN_6pAg?*kb-17P{~*W)t)}_({I+Z^WKqxq)36__Rn(` zr$@+Mpg7`)KBNmyzhfhsT3`kyMSV#@H>{WXD~-@=a@*;WfLv8XKdIEH&b4HX$&p&V zN%*1o#bS)inl>dvCyYD@(j4VTD+|pZTBXOCEnOexe|PEo(CU2`wz3KyVpM*gp%J>+ z-Bfy4&)L-EIRcg=d0Ex5X@t$$+sSwuKjco}ov);r1u$^t^<Nmd{4BI*AeW~EW0T)e z?u|VFa4vMo0P)6gqx5UEr#tJzs(?<^ex!^U^tQY8WWgL@e0QkbM)ISzu&r~7B>T}2 z8_6$Udv_=KIsU%_C(}HpYXQb`tY%y9JoK^x=Lp_8q2nf>kOk~t1e9Rf+O_O+Zp@Xg zbh)7>kZU&Dusxl*wj!S9MtF{K+*ukZ8wnHO#;kjim7=CZ)AYmSI;vMPNfR7{9iU@j zU&`bYCg;IW`09Lplvmk2t>+YdL__y$iqsn^j;2xyCD?F`a6{*jQpB$F1)juzMg(jQ z4KD;1K00JW-XQLwy#@{9HQ@v6+Fcr5mq55|>l-9Q|En(F;EfsI<OB^rptN@w+o+{G z#f0A&<Mpp;Q@_Sb?0HFc9^-e@D!Q5lB~%*$N+KN8IJk0wM!?vP8%GHh?LM&E2C=UW z=fI5?bGui*kCdjti2k?2+^jpykv7c>YW!Aiq$7cr)MkVF8hQ1vliye?n?3$DL~rHN z50y$^#Y3f$FF$DNamx?u)iqn`Z2$9fpTG>x4d715e$Kq~B-&E3@M(ibr?96m`w@dk z^~U7V6|Daq7vZQi9%DREvAhnz5(Ak$^pYnB2Od(M-~j`kP_1bU7&d@-rTfGQu|aUX zz$eb!cF@u<Zpj^YBz5L?2>UbPm=stUZpiz{YoD9Iz|4$wEGbBTCd?2$zSG-1;IwsW z!&7J?b|cW)xUX>ij<s4iJlriqj4b?{P$-um0fdd(Fb<BK7&H=TKAnbqPm!&}j2|l_ zyo9WYtFA;xZG?qBy^i0rsm41pz8kSQNZ+8OLUU%Z2AZfZ$>aq^mkBu@h^syhZ3gH; zTGr#i;Hok1F&gzM`=y#Bg<^8bmVV_Xe5>QRpmU(V?dJchH)18092bzp?s(>U{aRd! z@n_91m-@`KF4v|L!}}Ge<B1dLnpyp$zII@>tXVf`<{_Mw!3?u3!aDhS_~U<Rhdrw) za@l?RPENiyJe-&-t=@tPx*v=1c<R&FuFu3d4-^-Zq#)E{6Pu;3Ak-dy<6q{Yjq5tD zrqTH9CC(@q6@F5&qixH>C%C>zk>Ys-zjy*^JB84SGKFN+V#SL<{Ele}3<Q*(!2uxd zIom7-l5X(OwW-tv_$WKHpr+r(cOL*+90FQwvG5sxqEv>lA@#XX6_wD2%`#uLvcH)a zD!Ba0GPoV=18D|072`(Ek2Qb&+u#0nQ{c<k1@J3MrGdDcYi>^W#mW5bi<yCab$(mD z+hf_eX5+pO*E;EbJ672jlS2bo%we;j(#}r!5i&R{!ql&qc{D^PUL^iY%gzotQ*T6{ zQpQP|XAyra&q8gabtN`TNg(YFWUEozA^$~{8dE8CEZUx&E9;0J*$}^fR>z49c1@E5 z?!!~%UUab^23vX(4#bl|168P?ACo^pRzK*~iRdpRJ;^$@j(v(IY28tE$&_~<+fm-N zQ=Qof8e{$KGrdrue>yF7P{y~o2qX5bgT{V}9`9iz*^|ApxK`{mHc4yTcyyElIka83 zhpnPtskDGON<GEi!i6FO&pcY5ECc&7s3-m(jG@8PHybm;_(AW3Gp1U~3#hxc0)%=d zeT$K6=p;$#+m?z+FVS=tA)8m%S2VSUApe7zj5b4BfzIYR>_Cw$n*Q2*4fDm5#m4JX zers#ul**-zc?Cw9pSGHHv>l|vxFAsrXZYxCN=$M_AD7Fn)pZwjo}H1#MaW7n;6EP3 z7?IK2R?d&)ROQl7B%^@Rlh?$DL2uLETYFuDvkw_i2zZ$5bmGD4)yh2M*}BPDeDCjA zt@bS&P_a<tfd`~vwNJ$G|3N<QcE~3Ua<vW9)C^i8MUh!|4MmN~zA5>v32GWO*NZR} zjj5>|e`J+9uQqO(hDqQv9Vg7Jd~#-U)AqHIkz*%M9vdA!cIwoz)2Fj<7SqEwjT2G1 z80}$68`&i<-XXU9m)K~LNQ-Dl7dAyH5*6(<)0;dRn6)OG`c-I@!PxrD7`R`R>`pAL zCy;raMocDXcxh)JyxZqGObJEjmw=1@#y`vjSn^>h;NV}iNZwG6Lc<MkVCQ~)YYBH6 zz!45f!4K4!O}B}A9n=_urZNP82=^v2;B8qCoTpgFL8L0;Bd#mTLJ;;S4|0obrLP(2 z*@IoZV2_`)@i7{=7PKLHh=qkrR&);5I4n6Ql>MrMDTh%&5caq!K1&KEcm&5{HfJm? zNOA?RrpmGl>%v-rI)L*r(ny?1{zcr4@iB{5YAAFl?q&dSK)sW8B|h*l_O@*pFmbU^ z8^DJa{LlbAlMLD3bugMl0<}T#Oa^~)J68b8T5V8@hMuNR4yBUt)n@u1U$rnS<~(^} zS;U1vU^bdG3Mv3=@A?u_U|_0&TMd$t4QtW?VSYx`o$A^UqGza5o2*R12A`H!wggBx zco2uw`k>B8zD{G9RHJ}e4)&6fNM^zsrLpjM;S>RoqfgS8s|UYSJyeFE#p69$4~M)z z^pH7r9<|R!TF@(kyD$HIsdiisKCV`f5i_;f$$G5<@=Uv`ix&@pdJp9=?==U9De;*) zUi?}S(9wZ=jG6|lfIsZkHh-0icA;c}o!WmO0Ifdld@v4nAObN`9%Tdaf8j-YVaAy! z%EoO5QU)2Bo0R}qN|CW8M!9p~*oIC1BVeWBU?$tL#jS<to?0nXT1V)(_!!@}sdz(5 z4LQQ}YXX_-SP4;Af5uh<9+k%VHJr^cF%70ctlZ$xXBQDx?M}S2jd2{rwB(1?H~t1a zc<s-#jk)OiX{vR(I@6fztt6IbV;*nUOb^XyPnIoFq|0qxzNriSFGWA5%Qy7+B`&@| z-XzV=$FQoSzsxB4P-wWKU*c*@VI5aNG)zmDG$_adOQlD)l^@x(qx=+7&7Da&5ly?! zO0DwvEiUW^j=Wp13s*jM`DLAvS`A#;Iw0LI+xcfFC5gVD%81K#5SsrblJtC@goKYR zEZ>F8zofgZ8qQzQWiuBWP9qD>n#rfhk2l7eQX79%!{^H0GC{!4LB}UD<Jc6<c!Q2H zP9G*{MxNEjNIIVnqyij6I067l*2#%`H^xl3fs%u};QcHg1J5g|k)m@Q9budag8BGb zkvkQ~2vBEg&AXPe&fahwCkoh{0w4?+H8*7ul^uyXd8|S^K;^#16|*G%s8xET^H^KN zg^CGzR~E<Z%NyhjIx;!z!}S;QmQU%~6T^Ch`Z?|fJnw``&qC$5YBN<Um@%oW{erUO z_c{+$x{q}u^z>@1R%2mWPO&ftj}3Oiew;*oOP+ZwWvKfOO+DF|sv*(!lh;RvGt#O^ zhi1mxA#x(Ir1F|IsL2VPd_{+=-yh-wRuL$Q9qdezzK(}SrU{OTzB_u`s!F=7ZiP~( z=HZ}{|BmG|N(TF->o9%|LohUE&g|3tE9rTt^=Rke6gTY8*152ISzUm0>AUpU>Bv!u z9?OaHjR_;7%@C8tOEy0~L4;YIU$Jxa6si0_QJ#BHWud0Yd7@lT7VDU)l^DlpiXD?W za}g+x<y4yuaQPDgD}p3e*JsN&3X(1ri*#l=Q{&6ru~WD#ZU{&aZ=)^4R~opQU1**7 z;{pk4-R5AqV#+fH(EdEBjy6a-vl`l9)YalNZm{eGWt=4sS+H)d<56Lb{io&^md^=q zKZjQX?es?Lr}E(Mk@BuicvBsIqHa+SwNZL2E?2XYG&?I<GU33~Sh;_Mzs{}CsLl9a z<8d839lcG%e!qHXvbLQ#|Jc5}yvM=2CME^%mv~6QyTfz#04tjPz>5BKyL`vQm2iB8 zlG<6B0DUu%WerdV<I@K8#~BWT8vm67eL=wQKE$7Nr_0*ffv648K7io+g!hRJao!xj zNv_Q2njKljz2j7XGY4-4icjZ3JZ}@P(*t=Hr$zG0`B+L%&y@f4(?M>29IFE{VIi{= z+gC6|6c`;V7&x7-U<3Ku7-K6>oR?PCDL$<cV<<be4hy1l22mT=4?88dM+A~p>3WIO z5-{uxpvrINs<2dgZVY7HFsKzfL{*~ASxDq@J%P;PqiPT8VQ<wIr>>sMTKks-c$^Y@ z1Vcgts@}`2=SGNpg9=vbe)Km4O;bSXcfYdEAXO0l7xO*awQ1#XVT83E7vH3BIr=I) zGqlR=%rHElF%)gEqhpNr{TcPsWE>C487ZoxThil$VaTK#@A7c#d9C|Xm!H<Lp(Dgj z4hSF4k3CRUcS@xjTOgb4jW!9aNJ|YVoE&H|TM9$s=f}7OjTti@@1-yFUyijHwi|A8 zY0e(D`NN_Ut(;a)v`$RMxH7ux^sJidqO#x3ogdHKtmmeQK1HMcT6!|$kLXFHVvm#! z?C7u-NvS0gkC2fO#77{b`xVY)gIBtNA#2pw+~Wb2)hlyKp;rd+MC`(&wc!-&7xWk_ zXJ)`qTwcxL1<l{u*tc$*jMnjF-eOvg#x|z;#^{B^3orS@4p_hsl;S@ivwL9cczvrh z&u{$^Q%}dupsTTOD?NT4%x_$I5!OC|miVn7l(%euu5T;td6wO9>hg5y5|d6HcrOH= za&>L-?V%*joA)U9@po=~OCn<_jmx!isl}t!o#x<Cj=>QSTZS@!_^itD|2*l`^Ac^n z@rR6j-_d%kLo~!=9m`*pe`bo)B5vy2OY)0okEDpI_}MZ}#p}td`VJ!<9w-IUp^IF& z8?U=R#iZQ0iaeyM>br{hSI>U_#$z3u@V<2&E%#3_%H=Tl4~xs54L-R($HB7rNTPD{ z3Gw=AZD`CY4Kd&5@!w=YwV_`(mWYdx($tlj$-zYZ&VU=^vqUay1F4G0Nm9I7oWvq7 zGqpe@h<>ck%+FmR4okn2tP05@5-zd96IT{Yfg^uz8U+y?nzR~MaI1@z2{HbhoA2IA z@Eg)-Ilou*tP9&zRF=?ozPurGKFp&<uut-x3ZhI&0&1p>XuX3Oh!BVN$H9RtQ3Dpy za_(36EQW(VY7R5{Q^^&APb0|brLh9A@0o$!5FGx7Vo4tR4E0Ub@J_8xtQt26em@R4 zETm0ZyDY4dQb{e4$`PWATg6&T4k?>52@vo)jF*nt=KH2>6wo)3Yf#J$x@G0PKCzE0 z^OM(Td_mA?^nI?#Xns6H0penqTr_mcWvCjET-D?-kFT0w&5M2dPQ_G<tfi?^L{Q&Z zX`(LFPoXWu<d~mpyggm*9_IE$WthwH%5%rNGlmEbjCqw8LZod$zBp-hWbS6tcg&^i z*;U%C*~yr`bIh|D&(9^{KrHtGLrJ||2M8;ai_ho^_HE^g!8W>2^0~pGN@Zl^_|W0X z$>HN8Bix@D99mP22vfC_((pO1%ixf7d@lBkjHF3Jhds$M4O=eW=5n1#3I<&sopZ_W zxXz9)E`GXxXom<#GB<#;gmG!O)c|FjEwPhl<5W&=j6+fkmVc!~lE0;?q-*+X-Ft!? zjz;g5IFN=~&_lp$(nDpA)Whfim#mx7xAe$MzpN*buHOCYwR<USfS%FO+{9VKt#6vM z4c3`|yLM;9HS#H=OSx&Xg}9+-=-(xsijUHVGa(Kuq34zqH4Xl=gEGaG4KYfSvj#&V z9WByq|GV_lEYpmcm|3eCf_rgae0fR(p?U4(R}16g@E3(s=J<<N#q#WiSmZ?p<5Q2& zG4*nD$%IwFXahSRtnB_X<YK8@el)OGUC_YFY3H!oW`Oc2MP~}b5dAGZQp>t;^x_zN zGB*ZdEu@~fvg6gU0%1CKN{YwdoU!O~87fp5vBT6;Trgj=?Y7Er*?`!XeVJPyB&|Jj z{%TVC)3}IdWt&S_8^3jgk;S2VJ{!8~Znb`^F5<4|!tQ_)6Vg?eU()68X=VI<UH*YC z($sWC%wN^rCZ&B{cRji=Uaox^=>#<~su_9;jg0ykHPgaO@HUr{#tj9hHtzRqExsOG zYP>u<IX@F;CZlMRNB>x#c#u!ns5)2U?@;MFj&C$hoBoy{+*xi)d(ipUKa4`Rl{Z@e z5_v%1#q&<okhYNW1l)k<l!nfut`C#Gwd0|VogJN|AMQ9z&TZvKH>Ibx2-;D8W0@B~ zxU%7$^5i%Wo7n&Ru^oSl+=j1ZjN(QuZbGPt1eroE)yfksvbzOSM^~iHouPzSFg*p3 zMad+t6Rm3PE4{~f*J^d0m`dfG5jaz3?lkSfM&Y{3Dk?<I4elUsYj@b>)R9unDFh^n zizMw^K`8}Q9AUji<shGfS7u*N6q}?K8I%MQWl4Qm(M%y`M3*d}^h>M@b=IjQhy&4H zA`)nz8);=qfTm|t2yUTXC|HPv<lxv+=jD4Kw8qB3TD)4D+=~R`Ddo>JOh*_Q8y5|> zX@=&z;>Bz<eBjLu#hThjY7V$`cfnPHBF5vRFmrDJvOY84$~$1Neyp<#6DJfh{~(z+ zkAl&Gy4bt6+YT$`u2zm$?5~ZR2s?Y_ic<L)lgG?1Hv4YswT4+*oL_i*?zmO6LfNSY zznb!!n6tFltDuxkxzqur(WJU)*&<c4c4bv#s&}=_ONdW8bEbU=HJ7!YO(BOY*5INZ zlnp`JEgv_pXT`YWUnbr|E@u>C{`G(@nqFy~ISHKkkiiDVT%p{YZ(Wz>vNJ9;riBXb z<-H_n03=)RpJ4>q_lA3s`}H=`?m~pYxL*e(ZV~0&S_v{-OP7-;V6GiHdjE+Y`CWIE zEgGQ_FC^$j={Y;i#M~ERVW%0mX%L)(nL3A-lT3=YiOK<7Sy->IHgWw-BAjnBP;8GR zPw-?p{^Wxa7Vl>h_AQ)O7=8~JyB7{87BrMFuA<_zU`|645fiyOgFOD>O)Jhz=bagF zo^Lg=p{vcHl|j5A#NW;LFFt3$9B6fQFXA*aE+?qX}vw+TBFx4+UPNzM0z`xo&F z=PGZWd+RKarbeja#o84PF<^)CwrV#m!M=qHug1)@@z>I76?6ceBM7G$S$<-=M36cf ztreC5l}Xe@1esKO(l6Jn;ixot;+#Z%aiEfSqMR}l16>9;QlYJrvpucMkY67j#vuVw z_SckM_^x@(#p&+o?OHr;97X&!CX^toPFW)`!W_zkLc%?OECy+?2l5IN<3QZ_qE@#s z2RN7F1=<k`0+DN>hbZ>5Rp+UWdsvIa(8`7ZjL5`-61NIXs(It{HVXMFSB_x1C{V1j z0nWRSW-P{ukUi~{s&KYmk`6O3>P9k@=a_>x=37}$@|sw&PjgV_vLSHz@7}7wFNmb& zKCWe(ksoUNjE}1tq<lA})=RoX+*&p?e?E4fO!-=aqVSryN8FOD%kD&@NsR2u@Z^aK zNPN9A+&rOGHGHrMr}7}FgqNOW71-j=oO&2uX`7%@?VjxJ>uz?pnLsM4FKq6q8JZ~W zrdaCQLFZ~$Fq*7g$<8)Ao;X6u)HbM9uLQ-g5IWgwlY5MCm#kdX5zaUvbw#!%9qvWN z*}rH9VbNFDnw`&Ce_ZUzjZ8>4IhKGV;M|#YKqvvZgfGWa5QF~!chT?BrKL1}*B|VQ z^HLMoS8I^s;J6?e{|N(g1mMi4HRkGRkJW3DQx-b{aIJ&DujSHnN%xKN{)b$nf5gR) zLmP<HVt?Zd#B?$cX%{t@)<sdvX%{*Dbh5b_sGV}pNh`ghRIQWU`ZyM4eb&l|%3L>W z?~w%JSmTyVpBDwouBM1U+2qoZ7C}yz`WN*0MS2t|=$U7ElRM)UBqxO_(_=RNmQi&U ze23MOC2XS-1LLRB*NOhIRtG8Tza<bQm(FMar0!9A{4w+awjs18j!MTi#Me7qsf^wl z`*M`OCVqg@XMwOT^5{_r$+18tgHjolzcg0|h$przJu=)kTSNEzsIwY`V}!#kJA61P zh+Q;i6>%DfK9TGYmYLau%+1gBH)a<WgX_>KwJ>R=t>LXC&_q`66T!!ZF=u_$m2-o^ zB?YiCxa6$fezj0)G|ouUdfONa<|=KPOLxozHt+&_0v@(JPIJTZ_z;XXk2*VF$n>ZL zPM8@-k|j3aE>T`U(}CCG90mK<KTPFqt10+YU?BuivM?MWzyZa?gw>$A)|D_OHll75 zrw*%z(r|_3yoFk=j&lMbL}{>zlnr92S}KL6-Z?)$IM0)hNJ<V87cjTnx<<SW)*k$Z z_A5W~N*Z}TMah>IOt=MVA%F}fCFmM>W*W-I?X*sM=vVnDXBR1RhDax9qwv|`b0a5D zfScmsf!g3p1w;+Yw*(0jkHBUk#c5lCne1GU^BBjTt4+pt?)axyN{DZ+=@?Dem5mk6 z^D%5#XxOTIgs8Qqt~y3u?Vh<7*QW_&F>^hxU%Tda*RNe092!C<o5hyR&?BpNEmY_t z{u+9$N~EqYUUreI%3i$qvflVdcsE#lIp}ZsFz<#Ahl1%*Dga|(=<fK@21E;fD1k%f zl_^`>M!nmSmn>P=p3V+SQTuLv^lt>M1Qc8oZVPv|FXmet1BQXPm6p^`%}(jj$I7M+ zcj@Bg{`~{bANay+)!r{wqPOTkI-lx{K{uJyh}`E`f#m0C=_DcNrP4d7#5OMu8>8ns zVSY53VLS6LT{`sI#ao}deDP5KE4BXVk^VO>A4t2M0`&^zoVy=7kBY6cJOsuKD|8DW z9|{xyT{?8DDFZGWBD2F@nrlv7ZJDc1d!7-^zOZ2t#Ym&|W9euKg=4fBsFzk7B3X<S zhKTWbcGb~wyOXUN8rvlQoU0AW#vX~^m5zj3ed%&^TkY;*uSbt_XEQp72H0Z5q-vA% z_2p;}Zw*BdKt%fE0&v+cI8*J1N~Ps~tt7VOSKZT8r_|mMBT0$dQOwRn1#bL2n8zk+ zmnz-&$=wts$3F+o5Rip$vGLlFg&<&ZhD4$$)~ZRd&9u#A(Zrb}Wh0%3tVm*EA&7x7 za&n&FQ#bv@jhA67-7@1e&;ZoB7Aid#FZUEG3{oYP&Xe1*eXZK99d;QP2o*)g=vFMI zBQG9(>E%~49z&Y5*8hH%vo<+J>#tmG;`3*AZhqkgs&Y&3-MqE@{^}*4pHNwSW9^d9 zPk7mLDMFyF2$E#c#}sgV&iD<AWnQ75paa6Bgg-c=3p^u~fY+sDMuZ%V;NK%bBTVs7 zq6qRE`>?iJP&Bo|@EJHsx$ml4eH+X`LEuw_E3G5NR&36tRELpaJXKrZYw0^j3JKWK zs2Lh4R-<VVSE}(6!3>O@cc~vY*e&p&OPB8iK24!E{9deGBhl3^-6En|mEyOC2H^_g z^Msm>3&_joc$YS(*EwxMF|5F$TYLB3v8*%kJPMc#3+6h@H6dy0O*ATlS;b;=vWc$Z za#BU1h4WL3pn&OT+Iy`w9tv$dbmU%bOve*eFFVByC-I^XlsapZcxgcd75KXrY_3+R zqnNE8^{{w*7=y;*RPdH+6SK_jlA92dau#axLJdqhmsQSd80o*jcA0p-SW^m0gi;uO z^=WRL7zJc-5XHL%HO7H1enNeP*NM3*z*vUizz>lho9ux<(qa!fwhl(z8>4+okWPoW zPJ*HehCXVXk#>z0LAppF-GTd;^|)aa)QcJye?$;nUEJ)Bv+Q7Uw2toOLty<~9?j-Y zApq4wQ|xi`Kf`R+Q_De<V_o5|y9qDM-C<ITbN98i=1vu4(`LsQL{%_()cG&fQUi1A z-Ra^){?TkAgTEYUy)4ScgAmXsA?dC+%-u-zmzliiUoz+JhRhbLIF!~O=QaEqZ`X4= ziQHcLadl`rH?sck#NoqEXGCeS>eu$<Zf*k7;C^x7D~NBP46zn)9u;sWkOo!_7tmp6 z1asnjl2Z)POACD;Or4z=H3kBj-XWA`bIK}2ML|Jlg7Qa3PUmcz)jVN4YGFLY#i51p znGV@r%CKxedx#X8474J#>%)R^nR+o6OHnRiA~=sj_SiHuv|?Y~*Xt|fb6>Igc65@7 zwdE^fEjr7S&#gKCAj5i2u(3*!5H_cmN9SjLRx@pM7#?GN6{_cvS{nU3ZgVSBY3sQ% z-=bkZleYJPU7hK9q$b;%6giw<lVLUf8Ct%^YUEg)ou6B6Et+zM;&2cbMUD@Gor0rE z;HRf8!Yf=Ew*&=~6`RM*Gq|ri3Ls_;tnRrO7R&6oA$h|lkW863ZEsK9srF*eZ>?R) z!a+M9R#m2&-|nt6@w0;mhTv+4JBgw)>DOFMaxXU!7&|yp85`+dp}~S_`3#;(#Zs!W z{I3qo)#h?lNR6LLsHqs#&KfPuD$|)!)}oF|_u-)<uxyT0^l|>CUdc!oFNX_Xv%8>y zubI^^ljvJo=m$F%IY=V;Az^iihsv1Jpt{8P+j3sdMXb~EFK7{4lkK85M*qIJ*Yvoa z&AddL{+ybrtyS8QvLrMQqx{Aa-({Q_a66=Mf+O)`l*sS3Jd`*1Z@yIp+ixt*FFHOd zWjyFXNysgG-QJ}{&f0Mq_ewP}NHh9YROp_ore>BPjC5dxx`XUGU9D<Iqwbrtpi$P{ zGlmDVKw+IX-3g)21fM{ME0!Vws=Phv0>01e1s7hTf8E*aXVePmP#I;nu%a{h(Yb36 z5bPU-ahJlltd$#KuRVhT|JnL{A0yQ5``83P&V0dN?6>`3(R$jDthx&{>@VgvfHtYt zxAc?*f8rV!j+(C)Jp(Rx3)%RZ30lI9ap(}nfM1}sbbjuWsmtzh@le3)$qr$}OLO0i zT2qI7`*RIj>Qf*y`7Om72@I7GG$nCG&1RS-@_->u6@}*%Gek>D^1IY+sI-eJwnU<! zSSp`^181akgtBYB-c&KjS^Fj`I9Q;8lezwl>D;(VEJvEiWA+wb5Vycx%%$Ijw9i$R zsPd4g*d|uD3K?1jf5YTLqqiaTC$!V#P%oTxiPy{a!_G>+Ra>Z%9|^(H-rkh<H@iGG zsA)p+75iG){!-(#G08mlEt!wMNi6iJrg->Ps&1j?YFd~-n?_9VRV1Ji6pYq7&+p{? z8HK(Too?G<o^)}=NxZU;))gJHNo@nIrMYwH)WrDu?n&P&$Du=&!NJPVP^DI@yzxfm zP_1&PUKw;>MS8Cv%4AR>Eo~~nD0Q|=jMkh2xKRUED2FCwSU_4`@7j%>U9Mbb;nq0= zB#x@#Jra3Z+M=|rY03(5)?FL7*j$`xtlGF$yq>2TylXdiE;|`+7EXqGdNQyV>ud@% zs?A?kyfiz@qGpepCRDtH{i*b<TG!JqrJdBx3dNy&O{auugD>?}ghCCz#KX{wFLI~U z!#o_#9X$6K?2A2beO_jepFT78sZ(#irQ0{&j`YV2Dc^iM8b6(PMfn{WjEi>qo{3GP zKb*dAPgmY9oW7N}G{&Dw#(3Pv7!5^}C66=46!|=3oL8X|98c-P3J+HdmpOI$G4o>u z=r#W%zpY&QLWkTd6tGMcZacAz)MKa4IWhSAmE$uU80(H~{yrM<Z_`7p>|Vg-B;6f@ z)VTAsN!`6iyZwb4A6Yk4L)75n$F;CQf1xbviJ;EXlE0y@nUliGBb}XS&O8C5;$bXo z3WTAdtI8!VK%zDCp_HfSLK6ApOWc}8s}t%i9=*rhtZP3-Cp@s5HmD)Lv3{BP)XY3; ztsAj(Thq>IacvF1Hfh78_@p^^xn*&F<Xh5&Q}Auz-t53h7G6-$?PhY(Wzp+Raz~9s z4EdBfNdcuo6a23RzZ=Xw@e<`{1Eh<r_@4krGj0(4Xm0kPK!z?N3_JjVUYnNq9yG(H z8RP%=$PI<L?pS<SlqjvZ_K6Z+J9tg)_{8{%t+hQWZ=c#D&mcb|cNf<lDY>r;{HF!h zH~uql`QxD<)5g&c+-p$b$$K|bg&tF0+LbmrwD|s8y>r!8FXFLekDP8$J%hZ5{-{cY zsKhr2y*4Kv^a_;q8h%so+3^Xn+O9oO(pW#KEBRIC+Eb;v<?B)fXxrlng$j0uVY$Bw z9@U4e0&}8GBPO0!5|!!3Y9)@vcvaSmam3|}^xlQiUQONfr_x3=&)rqNL~Ihf34NBr zeL)+}aa#~aUPuASEEY}BKGA<HdJa%x40>K0Z(dP5OQnO+uXByGm{ST`t9+baQ+lA$ ztYYahm>GH}=`O;L#PM(lq{OxZXXAjT$CKR~b<<&U#x<p$tCwoHz*hVm7uL<?J?6v+ z+6WfxmQu@hrOR&;zOmI3!riNi=*zlnQ2EW1>bqLG`FnMCpG{`hx;cC>dWr7Z%08Bb z2^iiNpNPhI5eugpKFDMBlbSX_cPaX1T{x#p(a-C0P?saR9M<K8F5lF}e3psmjt=Nj zv|@^+-4XqQF3`%ssQ9yb{JbtFb&<G&a{-ad+30J!S8ELGkIZTrcvFi0BN;4cjHyeo zS>gKFzP&X&6WD~Yb~g}|!nG?S7}|~LS&B#D`Li_wQ(I;Mj&p2yff>Wr<&Gdei|?9f zWKvQeQ`j;|KG`<JrZw*Wglr>dQT(9hx0}|NI(DIS+=bHdZvH;jIp6U_`PogkiDf%d z9s#l1mMJ1@SC8@=@8ps{ogJTwD`YT&CeuIuSfJLZKN)WH1%5&;g}DP@`*_0(Vc(e! z;~6yIQbSi6jVUbx!*t9akQ+)iQCx<xX8v$Zbrh$#JPX=enzO=Ga%nEyyEa6T5s;(f z%{JwDrDu4te&Q`za5d+q;jzFOfS)l8<=SdYAMd`pxVUia;K5Yydf;aBdea;v#RKpZ zx=*BUh7Z<G(3a~>cq~^M!w0E0Bjoo&MrM{QK^%cKRHDwEKc;N#)QB~XG<wbd%259z zLB%rKy4F_<O0fA)RlAW4q@*b!+O8*_eQKG3j1}xfEmW^HE^tE+R4g?un%;=6S4Oc- z()ys<bNZ#KqD_r-Z)R?q>JAT&oUm0vOsVUQO1B2QyF%oKn?%4t@we9)Ru)3m4OE+K zO!Zy!pQ-4I%1(aVURA9cNc#f4+b?%Oma1>~aI7HAv$;U+=N{8;gW+`I4t9zGHAl-g z@wg#iL?o>a`G9cd|0nD~2YT9pK6;m}|8u;v{{5$H{m<R!&bO$kK?>~1nL&Vq+4gVS zzj+hvvpCVtHdQd6)!`A@q<n+BjW#LrA@OQDDO;v^G$w}l5faA4=eU4nwI0^>8C3g1 z1R8K}^JoZ@gLCoJ<;Tr6Al?Cu(F}zHsw_Uo-V$ZtXlG97AwQ(sr*Vmgx2~L9Ibvg5 zNg~>Wt17(Nc&rIK8n!UHY?&}LwPi)4%F4RBnn7U+N;M};zfLC18vzzcVq(X42M6r$ znh$i9(cx^sU0xxOm(Yr7IMc{aP#OtHye&ujfUFfvxd0o^q@c@kVQB-s-<xmZ{a$vZ z09-p|kdjJkO5$NVYl6O-RVkJIQ)uj4BZp6&`Rs{AXsZ~yG`y{Wp$V8KHaUC5flu3D zXObO9;n=B+TR<A|3Go&WYu>&{ndzn+2xditQD?3!FfP^8!wZFRa8t&6#$>NDR9EJX zcVohQ6^ISnJn=@Cc*cYF!Kq*q-}87MNJQED_tRl~ZPYMZmX;kRAE^8ldy?wXA!1m@ zUery99LgfLk{K!IE}Z48HT(D9?w*3P9^;dL6qmR2ut~f7(4SNzN%K}>*I>2KLK_qf zqK2;DMy+Ben)D>?jHqHIIu{Qf^J=Lpt+$r|k-Qo@=C$`FV^DF}{st3T>`=fQYW6WZ zzGV+P-Mp2vrIi#<lNF*8aL&!5ATW|lu{AtQbE4d063LjDV+dPhSv&6tOaXj_v&o7h zov~=~vYyr2)>%rhH4Pi8kG8x>(O*KqGeq_|VLEhJ&C^!W+fgf#EY@@L6;}nJ`2l~) zdf&Lk+G9v%_?1*_IuFy!YJu(hB{UHw7_v6Dt@?qHvCmI@cI524r!nMqHC3CdHn^M_ zja*%vok8f+F2)$HH{UzqlOIN8oF!rw!i7}jt1K=rG>&&)A&6b~iNVT|3L=ooq2Yro zswiZxEnFpc-{Hy-zk_{)Yvey+jQgv?BM^A;q1E!O{FEA<HZ<Qk8r8?|s<;>FU|(r5 zTyM-Jrs(WR`UxL`V1GUlYD;d}+G_A^;Uke&qpxXf7-ep&E5uDInJ(LEZY*<>6O~Ue z!L+{AVp?tcK$WXkAcoRI&!Lf8wpPJa^nrn89N=kvMNCkOp$!vs94%LTK(%K$YTC`c znJziY)WEsJFbO!-!n=&#YJOC0EYsT6IVzg4QNRCzER1coH*zCuqlSU1&rbG@k2AQc zBOBYK#`_%FtZ;5*SD?G;w#t@gmK1g<yC~gFHgLxO5=jmo;aWUDz|E~MI!^MQ;UpFc z7lZ_^nD|342lCQY^hn=>2>myk|99{b*bwL#OO?-=fM^$!>d#J=svJzg1kKUw>CQyY z53!CMXTypLMnq;<%f7bNV%sVK-<4P_i3~3G5W$wc7d!S)(PLk#xvwWTB$5C5sKLc( z?i3cfg0DL7f#kmqW^H@|ePB$y25GwL;j>~i7#eE43?;=zAgrg{MFOGQLPNz7DG?BA z2U3@3xjMf54@mSLN_>>|OD>P1Z;=xH4P8`;^~4K3+(~_sJ{@GOy$4Qt5ErutG5iEV z#0THMb#VD`YjW=9^}(Yz<_;Zg9XUGna(wHR`unXz{9IW$c<$grbD<xzPIT~R`WFY^ zx-#+3LDXQD7Vt<k6X$OyFlw&Pw{leZ!m>@$skBc+o6Fk?cC`<`>{CL0X<TMr+rxuo z39z_L`p`9Jp2H<{zzL<X$638ce>hoI@jsxrZGiD6k;(B8#=*~#8%r?*3?@02N0P+` z;%kUix(vyOc0Vx7&U%#jB~`W>>&@xu<`ka6z_L9iQHl_tvm|^shi(bdIzsjxJ$|i` z_kI4Rxj)tc{KCxQs|?5sSMbFg4r8n6JAN7`uuWi6r_kL_(NW=9RX=`nAU-`r(o-)0 zd#mr`0Q%f9_#HY$)y?}k=e(=`bsulBj<tQU6C4JvZAm(O(;?tym;&wgLg={x`V>#M zCwnJA@6eIl>k1gJ^Zg$XU=)*~RO#|S+|}qJaB)g$GCJPE?<l`<4NwOZ{LrE(z=M!P zPJ!z=xKASLyY*rxXEwkSPW-9MJ)M_eL2Nc5;ucB&_5e^Tmo|l<1$VZW?hrcwK`LiF zOpUr^w1gz+nj<rO3GVI?^}yc~N#IW@3ArROdE?(>uE9(ai{w@q!5@-H7-=nE4*0`X zLpXMp?mVP$GTv&r0NbHFcXpLN*e?0;HG=$7`Cn4ZgSy{uFLS6##7F=IvNCHtAWP<% zM<wmK^Kj|LuXU&hU#Ix3a%kJOQtLCh;uLJJA|$2N{DmZYdsdf77r$mg#MYlnitJ?Q zDfYob{x@yx2P<EMCToza8ycho<uC>hS||P=>yVE@Z-*jIY?X{0DR2Bh2RGh-B2H*H z8KJEu1$)?)_K+lhSTQ`myCWN(g^p}=bA^);PO3=y{g0FE*>^nau2m+(hv!>K5sd=H zY<Tj;ZFq_=RvR8P1Q;zMV%U=U;K5RBs8gfzpb6j~7E_I}X?1sg@USG@r2jV1r5i)p zGbPIm7L8DrWbH9!CqJzPxJ%;k8&zUzu-qRgeOm79#Elc)6`w-dWk*Tiv;s`7&cnWf zx=MvD!eOrvv;pO6<2dES*@i>FZ~z0bS`wxXybe^QR1j>zLOo73hy_2@s9bHr_Q4Ir zGJK7<0}Cjz3`K4tC$WKr6v7K*@HxHMFaDUZZ~8e6=ck%53Eyi_g=wFrrax2SBFX+z zL6;X7YlwK9GYD5CX<A;)F<>fTN!W$DGabeJfb(Yc5YuuVcdYL_S4Qj)@8-0!qO+}V zN~UTZ;@z9T#MoNm?SwwZSg1B+Sz7~fYtS}0%e`)8WVMZ<uZ@v~yGl#-aqEo+!x~1& z7*&}o4^_t-v4<2{16EnQ6ogs9Y{Z8i<`R{gYWzTDoI>q7rVR_@_zn_A8tq{_T&r`o zfeGqdGse>#9)D=y++q`)c)0@d*`l*@>xRQyc`D&g)|7w~GA%lnKu=RHqLgA!ize;Q z%>byS`Gli()`~b^v-2p%lD9dP=ozQ7s5v-RVLqv3e&H-!C2qvn6b76y?&MlX>$k!5 zX9Ji`2Mg-G25wZ$-=9rDCEud3(qHxRR;gH#`T)(-kcTq(cvF9{GFh5Ehjj`JE?c2z zS+65nq+)0>KCV6w_l&7&CDzXvkJC0A4=Pv9nd~RqUuoBqb>LCn9DS5Eb-LJt6?bB? zY%7>e5Hyz|6`00a<*Y|h$=AZNOWLn)9)^RPHml}iYJI;spBp5)su8ByVJy_5MY1IA z#B+~Z6(`er7%m$_lw|KOd{o^J;X*Xb${6a`z$aUvDx3DC0=`H02GK?}kClg0-c5ho zB&buWKSU*`)l35k?p->qyqPwQnr#{daRhqcIHmwc9MGgk>3k8TW?F{vxuzND#OI+r z^2{&TVi<_deCo|}@Gp@TXNhM|zi}=EUFEy|`2~|S+}2Q05R$Y=3~=~txesScM=%xP zgSR$6j9HdSwK##rFG;XlnQd4Q7dPCm%+EF#*@3;UCO(MrC33CcbBT}5WCclH>)SNZ z>SqlZ7nIBrr@$El#;{Ct^~h6^Ixu>>%@k$-^jt5@>UL;W%#}F+n4z5vZm#EAz3KSa z0YjD)o>zk*(DBjR<H!Obe^H6A_Vi{ow(ee|pH%m(ve&A#4zIM(Gf&T&gXG*`YfJ-l z`;!4gG|l7#WdW611}t$FoYogikES$8oOhoNsI<%78X{f06E2n-kkj!-J+YTaOHh%> z3Mk7JC7K-Pi{e7GGM02&&RUkRcF}3bjv<*?SR+1AD^<CBN@w-k&&9M3Jyv`A;fS%z z3!A97SfuJUh&}r&2YZ0B0tjKtX?LxW`9P)r-kF2rO|>L#R@Sw(Rr+5%aCraGw1jnp zq~5l){-OT<!NEc{c=|xrrJ0#iOS22d&4=n5ngYd7T)c>We$N34Uj%^n?C0j_Wqets zl~>!oe=#d@_;OYvE6~<B^4nAlDYNFp9|s5Z6?L#FBCZMDR*FT&?E~lvjEhX&7l$Vc ztrEXZk{>#j<9K%BBtA>hV<!U|I$N^s8=LW$MS4jAcv9F=$m$>~!4b$xb%=YNR#Myq zy{sPYHCygt(QrOsL?=<^D!?Cy9b-m?k6F03NTTxSS9STly8Ino{weH84^MH9NAUVm zNoz2Y0e@tEwVqJ=1A5eP;F@iwllG>H{u5n(NpGdaR#ge(d?vV)DVsUsW0ecA*^S_l zg|D~laE#nbz@JqGnh*8$6o;9N&is6LPB0K;c~Pw^VlKv4wW>5nV?yP;meU|SgSq=5 z&vdmJ>rM3kLe6gthC`D+{j?YkQtm4q-$wApC-8?^fxrBWMZ_SOH1|FH?kFGZ(BCJ@ z6_nRVwd?ckZ{Xyj&{lr9<6%NHZ|7fpgqpjnuN}Mih3-ppms*!DUH*Wl?(Sawxpc|i z+`9b1t-MRF-rnB*ruWz#S169PlMcANx19R?l0dg9kj3_m9;>M*_YF*~?&ll0+*$n_ z!Rd7P#(pxnzM7k^1|%nBV&@c^WUXH^A&2~c&0{qadJ*i}jh~|>p7L{^V_Are<FOi_ z5|;!XjT5{gT+v-NhD+<WmqWNqGj(izzdgbmNgp9yO#|HZoLhfid(0U@X$o8-)dq{? zj|b&_Qg*Rsy#;$%v8cH3feS<tl<mbL;s3Sm!M!{8FyU`}P)2q08eAOPLB+BmyLo`; zevk71)^hgYSIX=z_L_Ydj)paP*B&u9>|5M!(Z-f~|0>Pc9CYWsTCYlFy_);2WlOFW z#+4yYIWlw!6@2HerK9yLWw-*;`8Ty6x<#xZIzZw{Cg`O4saMtkjhXlea|3$cUWh4K zs{pyLVY6T+7E}dqql>Ea<?-r+TB~2=#IOTpB|pN@Z0#1O0}Y`pI+_B?nZx*;{=L<e zgpq`OQSGjF8;;c7%U^UTL>mNj51QPvzq68fRn1^JqS^ctnS&;wl4wa7ZR$vF4t?Zn zcR-g5e2EN~${lI;Vd{79;NeD{z26V@e%uea(fLZW7!nckO9-V?$oZ}@ei>>!2Hurn z#2}C;u<8_8rAob1XOhv&O%Q`WLqrqKnL_1xc*I9+c+SYKI5%dZkmN;03<=Ot=UQn# zA-}}1V17OPo0%GieppQzD&f2yT#ezI1D+9lAAEkH8Y6|5T=>zX#>vLw%?8>^S);8! zM7WtQQQ}X_rMijB0co45ZKJodk;;W7fIPSLZ4TH(aLD-_1<<7t@ulw*4Z%K^3?l0; zF)~RPNhpE>>k=;UH8@bo7Uz`Vp_QSm*RyJQEoUuerVH0#!LeF?HiR10Xb?82b54$D zqX|PUQ8}AMoY-{o#Rw?tk5kV~qNJ5?EA#-B>HaOzsv&r+bH>hP`%?3K_IADvcU+f9 zXk-B|^c`*NKOg0~lL`#HoHh^&cJ#I_+l;-CtdTW^nHH=kXlOX4(QO)j5HeB}CP0RT zc+wP9rf24vFh4GHx+*w2o|(wkGiol>8r3ZA0L)M~mam?dZ!U0nPz9SOL$5_`L5A78 z+ROsd$^$(U;Nf-;@5COn{DGUY3f<;!(u(Om)mls}wsxVJ2P#J6WtE<NXC&&2xKIM` z0M&#xMk}t`o7XWCQZONn8ZtUy6kMqG+@`@jcerF*;CMAZuPFRXjV~_GG#DT)FGe73 z>C{9@_#PJ+%D1)JtqDS7Jk6~^%YH&v(ANW%%}q>}Lw5%%>LGv9sYteYU983`V+AE~ z@iNLt+{UJ$Zo{$WSJQz=)R(fs%(^q+qfssPJgqami6Q={8c^(DTq||kv>co9#C*Lj z61#G%w{m;sXapBT)m!_9IF-_x)%l<lsoU^Vc&$1a^NGcIl!9(mZM9$3b=B{%F{}1g z0fT!E^;BMXq2kZP5bk+}a9FD}PM=L0s4d{t_uFnb#BOM7u(IEQM+{uOM`eSD4z$-d zqWTIQ^y&&p*^uOQ?F1mT62(ByO=7|LAU9R3YMyoPt7;|oa^&qZ<+$EhmIhbwwX{#m zEbfiFEBov-VF#?xo$|RRBs9Au6op3TNqg*8PtF5&Hf`;>HGj%(Bb^k92f)LUGbVpf zJC={eb!{#=Sb)(n{V;Oe9W6t^7X9~&xCC>RapE--=@z{BD|_@)TwK20(jC8kSx-%# zm_}TA6ogc*nfhMp)wS=*UM+l2_6kdGUxD%4EW_0{CBVWW9K-HMIwEW@*`|&hC5UT= zqY0ZbGZ)uWbh^cObXlG;58P_(EaPr1@_DzwG(MM1BqOo1A~E=)=XJq!Js4k(>hYVp zSkPBvlo|8ufYOF^f#`GXzQB<Zb!E3s{}_iUG(Gw$xCh4D+8B`G9ooN7^Kyin(y<-J zM|!3#e$jTWyE-cHh{P*;vivkpPuX=BhL1bSFLn&TJ2C}U5xZi>b@Cg($Y^{uZ!goC zJa)*5HiUL~Yd*D+<})3zVLrqp9@dF@8t~W~46E$_Ng;z>r4Hb(2(IB{z?40(w$I+d zS%LS#E7NH~>mqw)ne}Rm^4x)DM-Aau#ZQEF;qC;mlix#Iq`_hQ74nI{;xEM{*n{$l z{-T95cc@VG?!~+a=Z3p5@Xo3t>5`~T#>*J5YWc<6?}KO1PSC;b1;2Esag#XLypA|3 zZ<b>L%G}~8Bh4%$8w|x#VW(yw;;N7pKk*@p>W#Iz2v&YPDK4D2NGqotj^L#niBI}5 zqXi4-3Huo7xh$t#3>e6D?-^<KH80UG@h2_j+r;M!BJ*H5B|kzEv`Hc=rR6y+M?-cW z9-1&!^eluVHV}7d^UlLBIAh;v)K6+Wb98#jO{gVK!-I^y(49cD61-A`xDl9WtmfJs zaOb2ibYl{w+y>MnnVM5H77jxq-1VtSV4~NeF=;H%BOrqwEPPvpIkBH50d(zvSIyx$ z<6$xwqZYkJro_aBrlyegJ}*2*YL)Rw&b5}rBe9Q-h#`QkXRc|1tVdUcTICT;x(lPX zEeCVu%PcXmSt%kE`PfDZ@af7(_5A|YIg%GLout6vp+mXue~Ofmp<F`o;c)uqWO}Es zoIF{r^-cCo6+U(HWd2*8ZKPVrg5Z9#md|Ag`R`jo_Sw<&v!~KK)y$Tjt={TeZmV5< zluF|YvHFUmAOxSE)W%2;!s{~%Gq=_ll8b{b*;2lEaaPp#8}6sBnxjf{V$cG0o}<h& znonfIDF|1ps&>=NZfMP11qT8h4mqtiDHWP>o16^IO7vD_BP~v*{XLeWZ1t&x1W#7~ zN$tz3`T_->!GrepP18JQ2p9ok4L)GEUSY2HEwg7SjEsg$KWf0J_-RRHS+mvVVh@XS zw%6Jl`j#~>d~JBRQcY|BAU}W~<Q&>&#bEnDVGCfd(U#*H?eNibh1rzrQ(+LM;Z5Xf zDttFLBD3@LrJ0oZ@iyLZTQcmoQO{*VTo*Uawb00dm68=HI1SbA&U%rS7(gKbGLJ>5 zVO~KOLIkq1dh#N2`C3c+MMNZ286f)J*QK}Ta{g7%v0~1PJtKqUAc#`WNo7B-3(x~v z(GowECXNhwT90ld9v(SNLcVg<khNl!R-P<mNSayGCnj~7(&e5F1_Ff^+b~pmPM(yj zxzK49uc(*mlHiaxmb=hw?yTW$Z6D3Iz2{W^X_cM`GUc-*U%#auEZ<KzLZy`+0kW+5 z>71o~5IEC7>&F>7hF(hYtY0LcrC2m9!WLm%CPKRYK&jOw-#O#pRlHEDTXA>Fh)Sfo zbe-oV{z;xUm0A~qw=7CXa@H9%pb^edffB(blSEZ+9^l5Ba?xr|eo?9<s?1EnT{eGf zVkDp*+5q`rf3}w0Yn;&-uh8n~IbCG`<S#N~Cvgg#U|4G5ecadw2<%WT$N-zs3+u>4 zKrROF;A&&)`a5*+j5X~4e3S_hPoz{P1P-*r!~A>9X@bI}ohFNBZ1w43Iu2@X@CM5y z2`?t1j>}H-(__=nNljrI^kE<JcxloHTyG;A>&+tI)*9=mkBrWw>DL{l*3+QCbQWxA z$CoC3WdE8*cB|UuquQ}@Bh2xV;koxlU}Wdt%rF1^GvUInmrL<)%8hq!<!e%Sq!n#@ zp!pw@jbJk{hqAM;)%G>7De%avS`cjxyEfW9$ajy;!@Hq3-_kU=NuMw97g*lr|6^Ol zHtd<PQ>VwynS(D##Zu|rF;B5w;Ukg|FD4RpK7#;R^l!C7e@z#C);&G3_JeATsnPs< zJ^oFpp$Hf(KEkDlO^fP^w1lG<lyyLN2X#55%PUG7<PI{pRC?$1>B!pruC>{2<5|^E z<!x>|tRs+#rfJFdYtWxoo5pr+-L+-cmS@V{<)`?!x!l?DGTeyg%a4}hy}Z9jG`Fck z{aouub$MC0)4HAZ+v&^ko{+CLsF#z|%J-6TymZ+na^jfjc*z7>?kpZB`xOWnAo=V< zWo|Ndm*bV%!h9Ty$8lo#g-UmiEs7Vaue~!2;6d%^MD(|rCabXbRYgrLxh|qdtM@!p zOh?L29_8K+4fe0#9@h}CPPxoGUr-t_TnQ;<>a{wAAxMZyc>&RRgU1B4_f2;a3b5Jo z_#hlnVvKwEOt-cY+?<dd`Dtr9uA-y=n<QHh-qMZ6zrINGeod=_F~%vEg$O)&X}@U_ z?Z5ni?w&h{E|R_9f6xx-QRp0GZ#GKw%F>3P>+ipKDZVs*dH-wu{U>Y^ZTK`<%B1=S z_FFn)Yg5EWXSZSDwGSRNMW{=2A6)#xrMb&|O^m~X2h%TzD>!=KK-+iOex<$CN%Kny zdnMnn=tQz`D%;%HjkeUzKrNe>#3_o|kMxgD@*Dp+H8x763+6EJLPx35S!x(l?7{<f zZ@jMyTS|?srG^>eNEyf!U9LS?Y8W5v!VY_josz2x*~-&ft4gSkrCfNZ)WC<ORjx{$ zhn80IaH;XI&IT1Ut{QB&J#9&QRL)*r_(ZAk3DcL^8gzNeJd?e#TmRi=2zEXdl5Xs_ zlPYXZLN7d4YCNXGjV{9v)T{@S)|+u!+K3B#tkG%T%sprJ_VH4K|9eU&`SMBk#ChRK zD`Cb_`XZfTSdva%c*@4=X*uuQ)A*$QVR)4B5oNsajFsM<w1ys#_^c(G=TYUfR$r); z8kJI=_Epf>dc5?g4Gzvg$^V=UL-zJ%-jZH_nr|{b*^5{Fg%$mz740rHx=Yvgmg>(W z<67tI&z3Ap#j-qKYV0dD_{Q_}yPJN~r04X8|LOgO7p%?QN#b5B+EZ#&OZDeV^?jwU zSpEyWmhwWW-jk&4w}REAV6PQCV2S&a!~>StXNi4DV!tK!ml^}5F!Kk)&B+Ug>@x$Q zPZtKQ3qz&G;ZpseitTC~(OTKHN9+8>QvHypmu<X`mg<Ab#D5JV|AW(2IzFVw3on%# zFWZ>EQo44`7TrswlXWVm)^b?|$oisXeN`=CYt)a1#;E*olK4_C@pvg3uO8DT{hxsi zMjyVZfXiY6#&XUQ4h2l6`rU3PlTzgLV~~4boMq9G=WuT`yU-7B&V4t9!=NsspZNvB ztkfh4T?pJLO;r%-qVj|}0d%#L)8pZAbK*`PnkRUenu&*X_2+o1DWH$Zyfkc#Njgj# z5xSHkknE^(0hQojp1qBJk}*8RpUk)*d?Zz&KM_RDn8l!Agyo##9Y_m^<B4XyH8MIp zTbr5)iQbAc@4R<pxViA&krl~Dm3%ZyPFr+l{Oy;I9vY-c@D>_0AfDH=R8tzbppvlH zUoAFg8-=$@$QpU}_Pg(%IW@er)U4+d)!|xyqW)AjWw>EWoJbQVWCjuny(1<_V!M}4 ziqwJNiz?v4x%o3bA(_jj!rM2bZnMU_Q}pRBuhgO9Yst+PGXG%Cs^~ZEq@{%^jMvU7 zG`XT;i|+#WSxu?qD6sI(UasWSt}vf)HJr6g2=G-1dc`u7hLjdoFp!c{8HJGoMMj-V zd~3pVwB}(0(O+{V<ju1-R@ykdw7SUpMdzhG;qbuVk--;VDb#Xw;LuQGDC5Yg^1(*` zV3BDHGd0iQO592&CMMJWdAe*WR)yBJ_h23S7$Rv1hTLsx$rh%wC^%^E$s2DJI(n}G z7Rrj6-QB)C9rCn&_h4}*`wt&H@^QXA+q{(-58dtamXYvG-q5y26uvlkuO<!NqmkID zN;gk1Dy?|MF4WsKgMHXb0lJ(X-s&~188>Bb@%y%K2u!AM!R(&HNBWC*Nhsm8!75<0 zuA3FC-v10RBERA;@{ltbDr}>Rddj^lfQ`0-?GWT*NXQj$2PhXU;lR-0T%IC;xoD5M z*Z0@?BD84l?LfXuEBjk`y`sm3x8JQkuLd~^y&8HkADtx!KrRx)r7(OecVT|dT|6|9 z&tBMU7yAzlyp(^7XJJ8rRW^1e=aV=sUDv<iFBNzF#liM=6t;V^o$hO^UDQsm_S{dI zo?e#>nwCm}GK$@#*$K~0#R)NX<i!L1mtVV7KVbYVx3f$#nQwk$f+dqNl`uS@Slt(j z>VefEro8^Ze0(hU8Ef*UWbE}EH%feQf7ILc<V#8F@F!3J(qDLWBH6pSOL{82##c=k zvHs*uEaqM^YL^Bs)%V95+#C`VAIRmXUTmDcoMivN@)weNU+ayZFP3+f&njqqEO+xs zU6%%!w*75&*_;PdCi)tk!ea}wkYe)jr+KUny@<`%i<dtb;?I%G7BK#U!Po5X?ZLjG zJH6FQ1NY9<d;9PmW2^|(PbdQ8fT^Zh|MW=z8<(l?$Q_e><dBc3%=&4H|6zO>S(H|& z<Y-cfFCFpbjDK_NnDO6Sn?0Xz<#K$IGVtG6j$g5L8KRD`F0V`Eqh&j0r5GAlZqi43 zxUhOJe^PN9oP7uH4puyLA<-M^rBX3^gDI4bS#6P+_BO~9M%6&hEk@sDo4D)iFY`9~ zWj?kc7JV_A^Iy^G*EkTCdn<pONBG~UvD)U*#@egaTAJksyvL4B^W*Enw`qP|B zP_an({Hh$fQ@wa>p#O4jTOx*$gT<uY+ehx$28YT`)~5l^eV^~&H`~9jo-U_!Nl6$G zG~!kUjQ$nIHa%zpLl{LK*LJG3#W|ERcOW)Jog1&9UJ*SEPtr`5C>nT>N)_2SpquP0 zgNm)eJ?Kxr328Wux(HXfXR#=MuqT2;1gcBx;S1P&z~jg%40R{H#+)nr#!7-x2%#!U zjO<q+rg_?)C;<!0L191z^^+EE$A4GUloI2o_+B-K467Q~MaU|%5gfOnt9B2*^2#e5 zzWs*>yK}`>;IXRbqN+$ox2lpD{$tC3crcu{%9V=rWL~OO5K9|#`I!JyWJt<6`8AVg zOE>^XIzM-SFqxgD>)T7MPnXL0Dla430T@XTh;k&HTfmUZt;?m)0g4I=>VlDxcB>uJ z$&8tFNG*1YZ<E+%LC@Nx)LORh1^1hRk1P%YR_k~;o8V&Vy~T;?xql=eCFoQlKD$h# zt!)lmM`><!ii@Wi&{EoZw%i1c342H@@>kS>P3pj|T@RSdAlX9a_Pu#*-&@D_jSuXb z{+K{yH<Olb=-)UHvE6-lK%y+!M*j{0ll(~B4`5lmFR)_Ubv4l9#XlZkQDtiYmr&gr zpyk}q;bSkp!v6ta#>a#+_R&17!F>q+C|(5i=$8ud3wu}i^L?zl<;PcpKLPT97y)@s z2gsA?$_NDA1M&#O8RUsx*ETd={JR30=%jXPx=Gg?#u(uE^*nTWeB(nG2_y^WomR*{ zD?pf+$Ra8BGSOyET&jb;^djZ#R}$?0#jB)U!e4nvs@Il10W#z@N1Fl@UdKoLgDWd* zugRX%YA&9uT-K*B@YUD((lPsTbB@?V;nSAl5d<s+Vgo`(4d{JMnHS$bap40|IVyh) zB8OUDGrA%X5G04O`ANy6YcJoa_UE7JJVZ(%X>jO{9gm`??Yw4H8YM8wUxUvX0pRB~ z2XKfDvLz38frY7fK&t5;f85mrER2Q)GQZiF1h=}<@N`$h&*16mh!d`r#O(JXipdi~ z#$%;E3#Z+pGNsU8c*l1&PLqAG-nWQvd;~Hwwao&|RJ+fe%4zvpR(X1|h)LvKtfR_0 ze!aPHZocXjtnkdg0>87dNCY3LqkZb}3JL>JcyQcrG5vl)d)4AEx%2nR-U{K2dR7Fu zN?QUw9zs@S(W;C@%~61<3dV%B7k@SpNSu4a&FM&e9r)+i3NP0kQ7H`VLtQjT$Y5z_ z^o#t>t1(2c2*z8C#~)R@ALU|_v&4@c+%-wg42=<pS3S0cqF&1ni)M7pq0;?Qj zj>CP4+YK9!wp&9&1B(`x_usEyXBajjExj-4m(4-OZE1hBsD(eG8Ty^N{ERNMy4>J` zx0T#sbjBs2=C;YW+O7hbV8SK}jSi}8qzj87D99bt$~vXA6S@;C#)=kQzD2L<<&UY9 z>Cs8c4o@?sk`e!jW4K7n3xn?B#yLq81mDpws)WcTm-9u#s_=-udsvs_JX-L>yvRCw zO{voT!nl8C#yLDe%1uaHl8q--NRNJ8AF`LBZ8>4L2XB=6VO|7o?6I5xJ=&-3cUld6 zBW+er7H%V-C!mD|ShvMrj)Vb3M|F8qRh-eqj3L1jN|9O?eO8wNE;fcH0!4znAm1v{ z>w5QjUB0Od=~izOl1GrD9+5JGXX}pBi5a&?=+IeiHviz}jvWu|c;K1Np3Y}F4|Y7< z(ciJN<C)H9Ha*I7rSq}Q$526h6$R(r<rjGBEbn?uzohf8tGsL1=JNNI4_H21OB2MC zY|c$gxT0larZKf>qppMAAm_yM(a&q@{*soV*qc-HGfT5`afG6cFFres;_wc2gt>bB zX)>qh)?RtXljz(_y2BnRKGf&s+7gAv#BX9+B({cB_9NbypRJ64eth6_pTBV7^BIys zkQgSHfStkTrow%7kDoq!dh{I8r_6*N+pZX|wwT3%$aH&+-RT!RZ}J7Jy{|HIay0*m z#C>LHx7-I{vZ%_PJ*OsALPa59S609GU}U84<jKC#(a@3Qc%V+Gv;0R=yFMSr6&3VV zPWDyW%J)^yY0QT5^)%<))UDVaSYpA*Z@Si;Nh|+cXx(a+7c1pN#G?$nIXfEZ`sx*q zTZP4<-k#jx-L-7x3t#wxM(I{%e8nimmsxjd<MYC|f&{T3FKibNw#z?@vd*}&))#W} zJoA2-HRIz*m8<`d`t7hWz&JrD6AL54#*@WD`g{(kN16m26BD&1Ok!IT6VZ?HX#4AC zqjsJ6Wjbz9xz<JSELzs(@39{vc>Sg5UG3LDr@LdioYUn`>cX$rGqFfS%vwDnqXLc- zW7|acr&}!q_}i3d@8Qq7LB%|FB&O&P57Z{7BA{<668|SMiuvcL*J{D#2a05Mg`G1G zjn-!R!7(#oju!1SO1iGVtI@dH^^7VIY?-ayit+p%y`Ubvrw{xx7Yp(`b+r}!b0vRC z$vPC>|Kkyr-AY;uZ8NBsdh|=m@H49Ss4mOODu5K7)#W!Szs^j)g&53kZ?$T3R~pgZ zB{fXX<Pzcf1Q#v-uwww)|B+d2)Ku?J=reyzm%pORZ`b92(dBn=v0<wr?rKh0WJ`gH zT$;tXRGOdGhCUd+a99;cmp=NsYSB~}%CGJ2C)}jIEt#3wjkvYWUOm2`%b(Vzn@bpy zD<H6-?PhEuzDe{cUCyYEw{&@1m(M7T$dSRTK%X9kheXm!cZUKUI&eXCLpW%Scccl6 zW^^$es7H7EbWyAAB#v6@iEye&N3NgK`*qi=%b+fYbgAf~Nr|4;rArrK6wx!fJfw?M z-lIRL`s~~v(&HbtfzrhgC>_=ABlKsL)~`qHBzFU<WgZ>SMFO>GQkP%Q<#k<#b&(t+ zdRup6x_nBtd_#BRx{T;@MVG6(T+_vHzERzs(dA8DYP$R;U2b!+B|p)K@psm!zk`LQ zZ}^b#X5-c<itmNAx2F~@O%0xKkC67Pu1rWxKC;#NH8u9%sEHH$)?2z<(&d6Kv$~|{ zj7LWOw9<q{SkR<sr{?s!9?$8rM~{!|($wR-x)`$j1>G6)G^M+DbeY!WMP1J8lA&jR zRgYh_G*$I$x_ecZi@Ln5%V}Nyjao0T9=)c^ab4cf<#W0Sv5hXO0tvZH9vS@zceXqI zC^ywW+aSUb{7KNr<iZ9({p1;A*9N>@c#9t8St^%9?$aFTX_r}kt$sU?)9hN)v7$gV z#y@j5dS1i+8MV()Zo~2~=<!orv<!2X_2k@dr6sV)WFLD%vmgI;26l7DW{gz8Bf%2o zinaLf;f_uWS9X>k?dZhqDtEeuG=KBZ1CN&<$HGXCTXog%BmDC_rE=f7o7y+yg2TSm zxxbUUj%|-^=4-o=dOXP&9_)C!W83zwPUVwx*B#}jJGx%(daUb#uH9W*yS8_IyY%hS zS9W%6+qrGWw(Z+G?cY;7Ubl3;`xoSTuxnS>3w)=eYou#W*CSoWyZ&I;nXVt|`c&89 zt}R_pc0JSeC^;VCx~FTQ>ulHCU8lM}=z5Dcm97`M_I5qnwPjnm>-Da<>oZ-OsIQOj zkMQ>4ZGF3T?|63Gwrx-IZ|klz+xG6*w{6R|C)88>*YO;q@Hq0DC(EyQY<rv*KE%Ji zU7fo+w|#QkZc4tkqhrTjIU(86@zlcR&Swd=_Hg-=<$WDbUD(l5Y870)ue|MnXTisx zB69oQ&dr9Ica~o+A9!H*w@bUJfqc6=o+0OUT|1ud+}yRLW80Q3o&0ue>)b+)C+PqG E58_Zx^Z)<= diff --git a/venv/lib/python2.7/site-packages/setuptools/_vendor/six.py b/venv/lib/python2.7/site-packages/setuptools/_vendor/six.py deleted file mode 100644 index 190c023..0000000 --- a/venv/lib/python2.7/site-packages/setuptools/_vendor/six.py +++ /dev/null @@ -1,868 +0,0 @@ -"""Utilities for writing code that runs on Python 2 and 3""" - -# Copyright (c) 2010-2015 Benjamin Peterson -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -from __future__ import absolute_import - -import functools -import itertools -import operator -import sys -import types - -__author__ = "Benjamin Peterson <benjamin@python.org>" -__version__ = "1.10.0" - - -# Useful for very coarse version differentiation. -PY2 = sys.version_info[0] == 2 -PY3 = sys.version_info[0] == 3 -PY34 = sys.version_info[0:2] >= (3, 4) - -if PY3: - string_types = str, - integer_types = int, - class_types = type, - text_type = str - binary_type = bytes - - MAXSIZE = sys.maxsize -else: - string_types = basestring, - integer_types = (int, long) - class_types = (type, types.ClassType) - text_type = unicode - binary_type = str - - if sys.platform.startswith("java"): - # Jython always uses 32 bits. - MAXSIZE = int((1 << 31) - 1) - else: - # It's possible to have sizeof(long) != sizeof(Py_ssize_t). - class X(object): - - def __len__(self): - return 1 << 31 - try: - len(X()) - except OverflowError: - # 32-bit - MAXSIZE = int((1 << 31) - 1) - else: - # 64-bit - MAXSIZE = int((1 << 63) - 1) - del X - - -def _add_doc(func, doc): - """Add documentation to a function.""" - func.__doc__ = doc - - -def _import_module(name): - """Import module, returning the module after the last dot.""" - __import__(name) - return sys.modules[name] - - -class _LazyDescr(object): - - def __init__(self, name): - self.name = name - - def __get__(self, obj, tp): - result = self._resolve() - setattr(obj, self.name, result) # Invokes __set__. - try: - # This is a bit ugly, but it avoids running this again by - # removing this descriptor. - delattr(obj.__class__, self.name) - except AttributeError: - pass - return result - - -class MovedModule(_LazyDescr): - - def __init__(self, name, old, new=None): - super(MovedModule, self).__init__(name) - if PY3: - if new is None: - new = name - self.mod = new - else: - self.mod = old - - def _resolve(self): - return _import_module(self.mod) - - def __getattr__(self, attr): - _module = self._resolve() - value = getattr(_module, attr) - setattr(self, attr, value) - return value - - -class _LazyModule(types.ModuleType): - - def __init__(self, name): - super(_LazyModule, self).__init__(name) - self.__doc__ = self.__class__.__doc__ - - def __dir__(self): - attrs = ["__doc__", "__name__"] - attrs += [attr.name for attr in self._moved_attributes] - return attrs - - # Subclasses should override this - _moved_attributes = [] - - -class MovedAttribute(_LazyDescr): - - def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): - super(MovedAttribute, self).__init__(name) - if PY3: - if new_mod is None: - new_mod = name - self.mod = new_mod - if new_attr is None: - if old_attr is None: - new_attr = name - else: - new_attr = old_attr - self.attr = new_attr - else: - self.mod = old_mod - if old_attr is None: - old_attr = name - self.attr = old_attr - - def _resolve(self): - module = _import_module(self.mod) - return getattr(module, self.attr) - - -class _SixMetaPathImporter(object): - - """ - A meta path importer to import six.moves and its submodules. - - This class implements a PEP302 finder and loader. It should be compatible - with Python 2.5 and all existing versions of Python3 - """ - - def __init__(self, six_module_name): - self.name = six_module_name - self.known_modules = {} - - def _add_module(self, mod, *fullnames): - for fullname in fullnames: - self.known_modules[self.name + "." + fullname] = mod - - def _get_module(self, fullname): - return self.known_modules[self.name + "." + fullname] - - def find_module(self, fullname, path=None): - if fullname in self.known_modules: - return self - return None - - def __get_module(self, fullname): - try: - return self.known_modules[fullname] - except KeyError: - raise ImportError("This loader does not know module " + fullname) - - def load_module(self, fullname): - try: - # in case of a reload - return sys.modules[fullname] - except KeyError: - pass - mod = self.__get_module(fullname) - if isinstance(mod, MovedModule): - mod = mod._resolve() - else: - mod.__loader__ = self - sys.modules[fullname] = mod - return mod - - def is_package(self, fullname): - """ - Return true, if the named module is a package. - - We need this method to get correct spec objects with - Python 3.4 (see PEP451) - """ - return hasattr(self.__get_module(fullname), "__path__") - - def get_code(self, fullname): - """Return None - - Required, if is_package is implemented""" - self.__get_module(fullname) # eventually raises ImportError - return None - get_source = get_code # same as get_code - -_importer = _SixMetaPathImporter(__name__) - - -class _MovedItems(_LazyModule): - - """Lazy loading of moved objects""" - __path__ = [] # mark as package - - -_moved_attributes = [ - MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), - MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), - MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"), - MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), - MovedAttribute("intern", "__builtin__", "sys"), - MovedAttribute("map", "itertools", "builtins", "imap", "map"), - MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"), - MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"), - MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), - MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"), - MovedAttribute("reduce", "__builtin__", "functools"), - MovedAttribute("shlex_quote", "pipes", "shlex", "quote"), - MovedAttribute("StringIO", "StringIO", "io"), - MovedAttribute("UserDict", "UserDict", "collections"), - MovedAttribute("UserList", "UserList", "collections"), - MovedAttribute("UserString", "UserString", "collections"), - MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), - MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), - MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"), - MovedModule("builtins", "__builtin__"), - MovedModule("configparser", "ConfigParser"), - MovedModule("copyreg", "copy_reg"), - MovedModule("dbm_gnu", "gdbm", "dbm.gnu"), - MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"), - MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), - MovedModule("http_cookies", "Cookie", "http.cookies"), - MovedModule("html_entities", "htmlentitydefs", "html.entities"), - MovedModule("html_parser", "HTMLParser", "html.parser"), - MovedModule("http_client", "httplib", "http.client"), - MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), - MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"), - MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), - MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), - MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), - MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), - MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), - MovedModule("cPickle", "cPickle", "pickle"), - MovedModule("queue", "Queue"), - MovedModule("reprlib", "repr"), - MovedModule("socketserver", "SocketServer"), - MovedModule("_thread", "thread", "_thread"), - MovedModule("tkinter", "Tkinter"), - MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), - MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), - MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), - MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), - MovedModule("tkinter_tix", "Tix", "tkinter.tix"), - MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"), - MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), - MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), - MovedModule("tkinter_colorchooser", "tkColorChooser", - "tkinter.colorchooser"), - MovedModule("tkinter_commondialog", "tkCommonDialog", - "tkinter.commondialog"), - MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), - MovedModule("tkinter_font", "tkFont", "tkinter.font"), - MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), - MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", - "tkinter.simpledialog"), - MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"), - MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"), - MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"), - MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), - MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"), - MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"), -] -# Add windows specific modules. -if sys.platform == "win32": - _moved_attributes += [ - MovedModule("winreg", "_winreg"), - ] - -for attr in _moved_attributes: - setattr(_MovedItems, attr.name, attr) - if isinstance(attr, MovedModule): - _importer._add_module(attr, "moves." + attr.name) -del attr - -_MovedItems._moved_attributes = _moved_attributes - -moves = _MovedItems(__name__ + ".moves") -_importer._add_module(moves, "moves") - - -class Module_six_moves_urllib_parse(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_parse""" - - -_urllib_parse_moved_attributes = [ - MovedAttribute("ParseResult", "urlparse", "urllib.parse"), - MovedAttribute("SplitResult", "urlparse", "urllib.parse"), - MovedAttribute("parse_qs", "urlparse", "urllib.parse"), - MovedAttribute("parse_qsl", "urlparse", "urllib.parse"), - MovedAttribute("urldefrag", "urlparse", "urllib.parse"), - MovedAttribute("urljoin", "urlparse", "urllib.parse"), - MovedAttribute("urlparse", "urlparse", "urllib.parse"), - MovedAttribute("urlsplit", "urlparse", "urllib.parse"), - MovedAttribute("urlunparse", "urlparse", "urllib.parse"), - MovedAttribute("urlunsplit", "urlparse", "urllib.parse"), - MovedAttribute("quote", "urllib", "urllib.parse"), - MovedAttribute("quote_plus", "urllib", "urllib.parse"), - MovedAttribute("unquote", "urllib", "urllib.parse"), - MovedAttribute("unquote_plus", "urllib", "urllib.parse"), - MovedAttribute("urlencode", "urllib", "urllib.parse"), - MovedAttribute("splitquery", "urllib", "urllib.parse"), - MovedAttribute("splittag", "urllib", "urllib.parse"), - MovedAttribute("splituser", "urllib", "urllib.parse"), - MovedAttribute("uses_fragment", "urlparse", "urllib.parse"), - MovedAttribute("uses_netloc", "urlparse", "urllib.parse"), - MovedAttribute("uses_params", "urlparse", "urllib.parse"), - MovedAttribute("uses_query", "urlparse", "urllib.parse"), - MovedAttribute("uses_relative", "urlparse", "urllib.parse"), -] -for attr in _urllib_parse_moved_attributes: - setattr(Module_six_moves_urllib_parse, attr.name, attr) -del attr - -Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes - -_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"), - "moves.urllib_parse", "moves.urllib.parse") - - -class Module_six_moves_urllib_error(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_error""" - - -_urllib_error_moved_attributes = [ - MovedAttribute("URLError", "urllib2", "urllib.error"), - MovedAttribute("HTTPError", "urllib2", "urllib.error"), - MovedAttribute("ContentTooShortError", "urllib", "urllib.error"), -] -for attr in _urllib_error_moved_attributes: - setattr(Module_six_moves_urllib_error, attr.name, attr) -del attr - -Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes - -_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"), - "moves.urllib_error", "moves.urllib.error") - - -class Module_six_moves_urllib_request(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_request""" - - -_urllib_request_moved_attributes = [ - MovedAttribute("urlopen", "urllib2", "urllib.request"), - MovedAttribute("install_opener", "urllib2", "urllib.request"), - MovedAttribute("build_opener", "urllib2", "urllib.request"), - MovedAttribute("pathname2url", "urllib", "urllib.request"), - MovedAttribute("url2pathname", "urllib", "urllib.request"), - MovedAttribute("getproxies", "urllib", "urllib.request"), - MovedAttribute("Request", "urllib2", "urllib.request"), - MovedAttribute("OpenerDirector", "urllib2", "urllib.request"), - MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"), - MovedAttribute("ProxyHandler", "urllib2", "urllib.request"), - MovedAttribute("BaseHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"), - MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"), - MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"), - MovedAttribute("FileHandler", "urllib2", "urllib.request"), - MovedAttribute("FTPHandler", "urllib2", "urllib.request"), - MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"), - MovedAttribute("UnknownHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"), - MovedAttribute("urlretrieve", "urllib", "urllib.request"), - MovedAttribute("urlcleanup", "urllib", "urllib.request"), - MovedAttribute("URLopener", "urllib", "urllib.request"), - MovedAttribute("FancyURLopener", "urllib", "urllib.request"), - MovedAttribute("proxy_bypass", "urllib", "urllib.request"), -] -for attr in _urllib_request_moved_attributes: - setattr(Module_six_moves_urllib_request, attr.name, attr) -del attr - -Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes - -_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"), - "moves.urllib_request", "moves.urllib.request") - - -class Module_six_moves_urllib_response(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_response""" - - -_urllib_response_moved_attributes = [ - MovedAttribute("addbase", "urllib", "urllib.response"), - MovedAttribute("addclosehook", "urllib", "urllib.response"), - MovedAttribute("addinfo", "urllib", "urllib.response"), - MovedAttribute("addinfourl", "urllib", "urllib.response"), -] -for attr in _urllib_response_moved_attributes: - setattr(Module_six_moves_urllib_response, attr.name, attr) -del attr - -Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes - -_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"), - "moves.urllib_response", "moves.urllib.response") - - -class Module_six_moves_urllib_robotparser(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_robotparser""" - - -_urllib_robotparser_moved_attributes = [ - MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"), -] -for attr in _urllib_robotparser_moved_attributes: - setattr(Module_six_moves_urllib_robotparser, attr.name, attr) -del attr - -Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes - -_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"), - "moves.urllib_robotparser", "moves.urllib.robotparser") - - -class Module_six_moves_urllib(types.ModuleType): - - """Create a six.moves.urllib namespace that resembles the Python 3 namespace""" - __path__ = [] # mark as package - parse = _importer._get_module("moves.urllib_parse") - error = _importer._get_module("moves.urllib_error") - request = _importer._get_module("moves.urllib_request") - response = _importer._get_module("moves.urllib_response") - robotparser = _importer._get_module("moves.urllib_robotparser") - - def __dir__(self): - return ['parse', 'error', 'request', 'response', 'robotparser'] - -_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"), - "moves.urllib") - - -def add_move(move): - """Add an item to six.moves.""" - setattr(_MovedItems, move.name, move) - - -def remove_move(name): - """Remove item from six.moves.""" - try: - delattr(_MovedItems, name) - except AttributeError: - try: - del moves.__dict__[name] - except KeyError: - raise AttributeError("no such move, %r" % (name,)) - - -if PY3: - _meth_func = "__func__" - _meth_self = "__self__" - - _func_closure = "__closure__" - _func_code = "__code__" - _func_defaults = "__defaults__" - _func_globals = "__globals__" -else: - _meth_func = "im_func" - _meth_self = "im_self" - - _func_closure = "func_closure" - _func_code = "func_code" - _func_defaults = "func_defaults" - _func_globals = "func_globals" - - -try: - advance_iterator = next -except NameError: - def advance_iterator(it): - return it.next() -next = advance_iterator - - -try: - callable = callable -except NameError: - def callable(obj): - return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) - - -if PY3: - def get_unbound_function(unbound): - return unbound - - create_bound_method = types.MethodType - - def create_unbound_method(func, cls): - return func - - Iterator = object -else: - def get_unbound_function(unbound): - return unbound.im_func - - def create_bound_method(func, obj): - return types.MethodType(func, obj, obj.__class__) - - def create_unbound_method(func, cls): - return types.MethodType(func, None, cls) - - class Iterator(object): - - def next(self): - return type(self).__next__(self) - - callable = callable -_add_doc(get_unbound_function, - """Get the function out of a possibly unbound function""") - - -get_method_function = operator.attrgetter(_meth_func) -get_method_self = operator.attrgetter(_meth_self) -get_function_closure = operator.attrgetter(_func_closure) -get_function_code = operator.attrgetter(_func_code) -get_function_defaults = operator.attrgetter(_func_defaults) -get_function_globals = operator.attrgetter(_func_globals) - - -if PY3: - def iterkeys(d, **kw): - return iter(d.keys(**kw)) - - def itervalues(d, **kw): - return iter(d.values(**kw)) - - def iteritems(d, **kw): - return iter(d.items(**kw)) - - def iterlists(d, **kw): - return iter(d.lists(**kw)) - - viewkeys = operator.methodcaller("keys") - - viewvalues = operator.methodcaller("values") - - viewitems = operator.methodcaller("items") -else: - def iterkeys(d, **kw): - return d.iterkeys(**kw) - - def itervalues(d, **kw): - return d.itervalues(**kw) - - def iteritems(d, **kw): - return d.iteritems(**kw) - - def iterlists(d, **kw): - return d.iterlists(**kw) - - viewkeys = operator.methodcaller("viewkeys") - - viewvalues = operator.methodcaller("viewvalues") - - viewitems = operator.methodcaller("viewitems") - -_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.") -_add_doc(itervalues, "Return an iterator over the values of a dictionary.") -_add_doc(iteritems, - "Return an iterator over the (key, value) pairs of a dictionary.") -_add_doc(iterlists, - "Return an iterator over the (key, [values]) pairs of a dictionary.") - - -if PY3: - def b(s): - return s.encode("latin-1") - - def u(s): - return s - unichr = chr - import struct - int2byte = struct.Struct(">B").pack - del struct - byte2int = operator.itemgetter(0) - indexbytes = operator.getitem - iterbytes = iter - import io - StringIO = io.StringIO - BytesIO = io.BytesIO - _assertCountEqual = "assertCountEqual" - if sys.version_info[1] <= 1: - _assertRaisesRegex = "assertRaisesRegexp" - _assertRegex = "assertRegexpMatches" - else: - _assertRaisesRegex = "assertRaisesRegex" - _assertRegex = "assertRegex" -else: - def b(s): - return s - # Workaround for standalone backslash - - def u(s): - return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape") - unichr = unichr - int2byte = chr - - def byte2int(bs): - return ord(bs[0]) - - def indexbytes(buf, i): - return ord(buf[i]) - iterbytes = functools.partial(itertools.imap, ord) - import StringIO - StringIO = BytesIO = StringIO.StringIO - _assertCountEqual = "assertItemsEqual" - _assertRaisesRegex = "assertRaisesRegexp" - _assertRegex = "assertRegexpMatches" -_add_doc(b, """Byte literal""") -_add_doc(u, """Text literal""") - - -def assertCountEqual(self, *args, **kwargs): - return getattr(self, _assertCountEqual)(*args, **kwargs) - - -def assertRaisesRegex(self, *args, **kwargs): - return getattr(self, _assertRaisesRegex)(*args, **kwargs) - - -def assertRegex(self, *args, **kwargs): - return getattr(self, _assertRegex)(*args, **kwargs) - - -if PY3: - exec_ = getattr(moves.builtins, "exec") - - def reraise(tp, value, tb=None): - if value is None: - value = tp() - if value.__traceback__ is not tb: - raise value.with_traceback(tb) - raise value - -else: - def exec_(_code_, _globs_=None, _locs_=None): - """Execute code in a namespace.""" - if _globs_ is None: - frame = sys._getframe(1) - _globs_ = frame.f_globals - if _locs_ is None: - _locs_ = frame.f_locals - del frame - elif _locs_ is None: - _locs_ = _globs_ - exec("""exec _code_ in _globs_, _locs_""") - - exec_("""def reraise(tp, value, tb=None): - raise tp, value, tb -""") - - -if sys.version_info[:2] == (3, 2): - exec_("""def raise_from(value, from_value): - if from_value is None: - raise value - raise value from from_value -""") -elif sys.version_info[:2] > (3, 2): - exec_("""def raise_from(value, from_value): - raise value from from_value -""") -else: - def raise_from(value, from_value): - raise value - - -print_ = getattr(moves.builtins, "print", None) -if print_ is None: - def print_(*args, **kwargs): - """The new-style print function for Python 2.4 and 2.5.""" - fp = kwargs.pop("file", sys.stdout) - if fp is None: - return - - def write(data): - if not isinstance(data, basestring): - data = str(data) - # If the file has an encoding, encode unicode with it. - if (isinstance(fp, file) and - isinstance(data, unicode) and - fp.encoding is not None): - errors = getattr(fp, "errors", None) - if errors is None: - errors = "strict" - data = data.encode(fp.encoding, errors) - fp.write(data) - want_unicode = False - sep = kwargs.pop("sep", None) - if sep is not None: - if isinstance(sep, unicode): - want_unicode = True - elif not isinstance(sep, str): - raise TypeError("sep must be None or a string") - end = kwargs.pop("end", None) - if end is not None: - if isinstance(end, unicode): - want_unicode = True - elif not isinstance(end, str): - raise TypeError("end must be None or a string") - if kwargs: - raise TypeError("invalid keyword arguments to print()") - if not want_unicode: - for arg in args: - if isinstance(arg, unicode): - want_unicode = True - break - if want_unicode: - newline = unicode("\n") - space = unicode(" ") - else: - newline = "\n" - space = " " - if sep is None: - sep = space - if end is None: - end = newline - for i, arg in enumerate(args): - if i: - write(sep) - write(arg) - write(end) -if sys.version_info[:2] < (3, 3): - _print = print_ - - def print_(*args, **kwargs): - fp = kwargs.get("file", sys.stdout) - flush = kwargs.pop("flush", False) - _print(*args, **kwargs) - if flush and fp is not None: - fp.flush() - -_add_doc(reraise, """Reraise an exception.""") - -if sys.version_info[0:2] < (3, 4): - def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS, - updated=functools.WRAPPER_UPDATES): - def wrapper(f): - f = functools.wraps(wrapped, assigned, updated)(f) - f.__wrapped__ = wrapped - return f - return wrapper -else: - wraps = functools.wraps - - -def with_metaclass(meta, *bases): - """Create a base class with a metaclass.""" - # This requires a bit of explanation: the basic idea is to make a dummy - # metaclass for one level of class instantiation that replaces itself with - # the actual metaclass. - class metaclass(meta): - - def __new__(cls, name, this_bases, d): - return meta(name, bases, d) - return type.__new__(metaclass, 'temporary_class', (), {}) - - -def add_metaclass(metaclass): - """Class decorator for creating a class with a metaclass.""" - def wrapper(cls): - orig_vars = cls.__dict__.copy() - slots = orig_vars.get('__slots__') - if slots is not None: - if isinstance(slots, str): - slots = [slots] - for slots_var in slots: - orig_vars.pop(slots_var) - orig_vars.pop('__dict__', None) - orig_vars.pop('__weakref__', None) - return metaclass(cls.__name__, cls.__bases__, orig_vars) - return wrapper - - -def python_2_unicode_compatible(klass): - """ - A decorator that defines __unicode__ and __str__ methods under Python 2. - Under Python 3 it does nothing. - - To support Python 2 and 3 with a single code base, define a __str__ method - returning text and apply this decorator to the class. - """ - if PY2: - if '__str__' not in klass.__dict__: - raise ValueError("@python_2_unicode_compatible cannot be applied " - "to %s because it doesn't define __str__()." % - klass.__name__) - klass.__unicode__ = klass.__str__ - klass.__str__ = lambda self: self.__unicode__().encode('utf-8') - return klass - - -# Complete the moves implementation. -# This code is at the end of this module to speed up module loading. -# Turn this module into a package. -__path__ = [] # required for PEP 302 and PEP 451 -__package__ = __name__ # see PEP 366 @ReservedAssignment -if globals().get("__spec__") is not None: - __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable -# Remove other six meta path importers, since they cause problems. This can -# happen if six is removed from sys.modules and then reloaded. (Setuptools does -# this for some reason.) -if sys.meta_path: - for i, importer in enumerate(sys.meta_path): - # Here's some real nastiness: Another "instance" of the six module might - # be floating around. Therefore, we can't use isinstance() to check for - # the six meta path importer, since the other six instance will have - # inserted an importer with different class. - if (type(importer).__name__ == "_SixMetaPathImporter" and - importer.name == __name__): - del sys.meta_path[i] - break - del i, importer -# Finally, add the importer to the meta path import hook. -sys.meta_path.append(_importer) diff --git a/venv/lib/python2.7/site-packages/setuptools/_vendor/six.pyc b/venv/lib/python2.7/site-packages/setuptools/_vendor/six.pyc deleted file mode 100644 index e881aea7588e2b118f22b290defb8ab20c9ea283..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35865 zcmdUY33y!Bb>4jg5FkKO;3ATuWJ#li5-E}3Dp3nbg8(Ut5=p@iq$rI<j|X!ffB^<G z!+8%RAZxQoTXGyLlH(+8oH}iqHci{4brZK~Yj<;+G-;DGwbRz=l5R<z#$DY#P2K<h z?_1^(l&rY!H!Og8xaV%~+;h)8=iGCb>G{T*!TUaP!}+R-e~#e)$cQoFlk1JK#+2~% zj4hbDXXXp0R4^Xl9#iizr5>dr+-pj`NqB`Rtw_Rsrqq{&`%S6eSma!3Eb<JPpwG+> zGIfjXGjphWRcBPcqE=^7$aIITcylPb#ssTP`^zS{!AyCkG-QIc3am51dIdHxsdS?W zHk#5VRk7KWZZeG@Gr^XuNN}^6!fRD3=r^;s2t?WUsVr)6Wp6dJw;4NNE_<eZw}*Gx zs)sNueA-x`csuK~Ys?j6E*tY~sc4o^=^Z905=K_<T;o>L8{BE;22Fd`!w+i-l3Lc7 zX9!Qn@N-3DhgezZE@Rg!aJR9j(Y<GV`kt-E0^6;6`;BSrJ;rV{Y|p()*pw!0Gj?;5 z{iZZ_yRlo6s&7tX?=u1Z?kDo49md{bf^DkpeQA!JCP2|!^#}6YZZ7vK2FTxG?48B} zd9;6pB7r|5@duReP9lNmy~+v1?nxq1CnE1NmwQz3{-ib_0c>1tJB=OI-!5Z!CXu_7 zNTlvgBKIV(*lX;bByt}kgEgl8wSwJm8sOpwjD0Y{|A2}-lpyf1v5y%0sIdo=47anf z_O>L$A!G4(I04^pEdEk(#8~{LAkc74?!@Ov(#BC^k0eNrB@{bq?3f}!E>QJebGcvw zgpV2fSQ0*N?BhxJgt1Q;`=szewv)!5;*<0Qc-q*fj2%zF4;bqkJCT5Aj6G}Y(+POa z*k_D=HUUe<K4<Ln33%Sv4;ouezz-Q)F?KQmtHxTecmhs=y^Wnoz?!l6n@zwuWAT@Q zbz||Dg7e1WuaRVK8rw=5d%@Ut5)O@xlJJ7D7mZy=id-^wF-cl7_61`<oFu(y>`TVJ zoPe(w`>L@YNx;{Py=?521pKJ6A2as#1boBTj~n}43HS+PzuVYPCg7XKevh$lCE(k} ze#+SIO~6kZ`+dfKe**r1v45ZgjX!AY4;uTKB=v`k{X@onHUWRw*gxEX)gR$NwLfAu z+drD*_)$guF+~0GBnq+*x&DON9RG_M;>V5slg9q3B-fud_9u+}$pri}#{OAjKSyx- zuqh2omfmXYpQChcKiU@{23+-1#{M+vJMEbR$kZ@q@d<;pqvuCWX_pChn*icsmzmwe zCo1!Ty$qo&O0`G(f*oddA7kw2<9wTu;9VH)!{52*kP|Q3Y07%C0e{|XrfAx4;*$G~ z{R^zivp<uFs=t_uss|)W{*tkO*~BE;ZtNHG;1~1YU&(`iH4px^Jcw#LYyRtb@NeY7 zFXh35#{O6bRzI5u|7ITixjgvudGK%L!C%OOznBOAb{>ttlLvn(5B_o<{FMxxhGKot zEJD{kh~D0k^foBo+1nR(uT&>KXo3gSiLSem%P}sx(*9jze^snu|6bCAUru}QfO_yN z#{Qa#IT}6q_w(RCPy@y9(=bjR5>^j&Vuf0ASpA&C>LC*x=)elOfYm<~gW0bd`|A#? zf0SVLk5jB37FPd6X#7*=qDK6UJowM@;6E3VY36^C2mfUr{8#z1znKSrD-ZtbJovRd z_}h8#-{isH$%9|dga0-U{<}Q*@AKe)$b<he5B{e-_>DaHpYz~<$%Fqj5B|42_}}y3 z|Hy;?Gf&vx&4d3d5B^>r{NEWkeTOMMBEEX0ldr%BIlj7WmAL&86Fl6(SI7mv`ljP6 zn$aEwp)Gi^Y1QK;_T!^sq+XAbVFh!Muln*}e;!<!fzz<D4+_bHok*h69FkvhNFFr7 zqa8>h7mytAC|&KKXID8SS0_lWNs&AxtZwj9^#S2uI;{5|?tCxu<=*?~Y7ytK2@Z9< z7rF4>A@|<3o?YkOyWR^@Lv};@>h~v79|4qtP9wHAdXoPenXNQp>?Q?{Xs+;$)poO2 z8a4JNuQUdO*DJxSy4fqih`PlqJ!b6tywY*gxEt22vfZX^w<}vw+3rxbJDF{1&;*a0 z(g|~}aWky?CuG$hS_7-z-lcb*FbxkT{RvZgT$!IVr6+TlXO;PGWq#6S#)Rhk*4V9z zI%(MIQ>FxK?H<KEMGL(&ZW;$*0mgakHU*Gpdz{DK=f!h``x&FT$hZmg`rs}ToHTZa zh!m_avmY?QsLXrc#30N}bm2q-9u;^d0gnkhn}D!Ak@@KaJTCB@i2cbM>`q|><8fGl zXN}#ZKnb?F0?(=7^RUV_={cW(dj)<l0rv?kn+6Qk{Yjk<By~QR)OjFZ=R^5AAI{hL zNL(i=0t_E@6afG%52gSxJ(L2^!Gw1Jy6I<!?ECe;55cxqpkjhaQ>rF2U296#1lG(3 zu;=-**(p<+HqRjvbe~~1(yk_O)|BQ<P&Xx*xL{&TrW>ZzFhRr2HchFiK+BX`#*TWW z3$nikF)}e}9yD{9kbZv1j(MfFu}8g9XfEtuYmW(hj9>%BjwiT2p5R&~uEcoS*b|DZ zVa}icQ0XzVkqLUu?1Bj{(xl2Ta|ktwSuao{Qcn`8P7Fv@5awh`y9y>C0_<tM;u2;c z3M^tCqQH{4=B>5C3ntiaW<PA~2Uwu=BFSNW?+S?ZvT1A)h?oiQic$k)I79k+u`8j^ z6zz;h%k&r4GV!bu8`~4AF}>!^^_uo?EB$GgK49!QA@YjJP<Y0}%OQG8ubSXhzIkq? zY2UuiKC7Is(#Gw0>#R3tO#A3MWG#Kf*iuI((BoxHoE$w8mxrY@V@`!$Sx1t;Cc<CF z^h%ApVj6IeApVLeT`~5&>iZ}rTnc;)(=G*GH`9=HZ%_)BK5hccM2wmJgs~rD!-(?$ z+$8IeC-`nt{$zslo2GqW{USul_oxYPk{genKWv@{Ro^nDx9LR*-e&A9r0W)$`d?p% z7@F_*Cm@>grU~9MhsG~_eI5SJJ@=M*?(OUyv!9}rMkOTV#5VYkO!y$YOJ}26y%yDi zusGFh7caFDZcG=eO&b)WnMzb_FEqkpvr!yhie~U{Z?V#_#eFrDG}};ziH7i~Ooq++ zLKKv1^Q~q(Ivw7N$kCuNTbZw+Xb=VM5QPs;#!(|J)i&I0Pah8Zkay4Up54Q{YXt;r zJ$&@y5%Dowxmc<3MYY=*#n3ZVJoH0obObF~hd=<@gUp8ZARJ@<gz&2}4?nDXYy^2( zt7yQ$>8$P(0AIz&Y}12fgh3e8r(6`{!xkR9TJ74!N)+t6SZVK?YSt~<x9f$)T}%7g zlZ{Jrdmg;d*!^I8|AW<s!o`Q}3+>(bnQrYmv#V8W?W{Gzs8X-*jP{(GE|2dDgJ_`@ zHJkOYGg!VDG;FiIE37RJgIN7|X}Mev8s+j~BEiNOZyQM!t;C~TZdB%jayc3lFyFKb zb$~vbnBlHaR~q0G;e+@H^S(mu{RmeXnS9hWYY_3GXI?~u&_^Ell*wTck0aI=ZL_*C zA2gy$R0B6f&0?iEwa};%8b0l~(Gdz6%Vm{S4=NLBh4_pbT_J?)t%|i};PNCJ#}=Bx zayH$F=m_L+9!oI(Y=OWQ$JXHiB%jb|E4tp^QEY>g+6@lhXeNkbi<K!1K1I|kVFVIJ z!;Wnnr?>$N#vysarBIyaDhwS($wFkVZWHbX;1SE0vO{p3C=)$X81x+HpRByFbTkO7 z?JA@B!(lu+f{ZsKaFvJvhh2fJ=%K7&H+(CGG+;>9=XlL0Mk?o%cn(Cs4Y)3HSGm@x zMdk7{KqVFwRU$}At-wbk?KA@5rdgS#FZEEcx`9V7lcx2SHXCpSVrP4mwIGMixyCxv z8?BI$eZs)VrfrQ931ukF9h0{MD20oGI0{0p5=Cv%ND(%uGa?#5_Hwxj-VDKnr05Yu z*CwG%j<ws(_BLWI`ieuFld}<fDr!Z15ni!SkGjp7PUcJpp!st^Dr75+x7yp__4I7^ z)_A?1YXyn#6K$XB$|pl+s4LVJrt#MTk*D#|Sn4Yb^hB!wooZeT>?tXdbTE<hqa(<9 z4+8OEf&~bb3!4xDH=cUAK*fQzf&+^kSmlEs@}c<e2?QYB$aY}Cf`pswa1Z_5K13e0 zMn>KqvLHCL0fq%Tf?Zb78hcUF5MgA?@gAuhF0_KSe+xn)wOD8T*?m$5r<;vH5fCC7 zcR9`^deG)dZUmRI-sw)qkWFZ5g{$!}-X^aPTs7dWzJ|7-=5*R(R%A>_!XEQ!qWLtR zB)v46y4^G^XPP!XiGU)W36qFHb|E4YPz7-cx*UxwkQ*QckV=u|gjI(GVki2nUxEh1 zQj%u_BC_rlCrAKk@H%}0sb<W@N`0a0x{l+oT#ivMmlptrEAgOI8S>V8r?*LrWCG<j zq&ca=hWi|zSr04J9S-IYoW@5+eqUkrKrCF!RMb}q7i!kg5#%i*5DS;Ym`^n|D#P0L z)%rRWE89`@+G2&ggbAEfSs4;4lNzGp`%uuomk-Hi8ecwH<NDI?Lhfat<;)&P1lf&j zJ_nBm&OQV{E{Nc1j1;ML5X}vxqvwarOBgwjx1RZ6!Ccs44!A56G73+t%|0pOtY;Df z))q8DnWIH|Idqneh8Z6kHcSouyI2sPZkj;swQ||k+U4?V2#WJKZtn87si*bGwD5h% z;}ho$?=FrPav-`Y87~991AQ`zq>PUwJy1ms{gC{lBl#gyVAq4a>6GbE$rv)sU1iJp zAs~MF3<B34GStMaZ=s1_lmezR#+ny3tQdYyI(vn=pvae?u+gj)Y+1R_H15rmcUI(0 z73oz@H%R+B2Pu2i*C4&0Aq~=78It6qZgb41j%C|2QxgiE69#DmD0PKbA_wE80thgH zK*j~#5twY)C-Di{)=cF?=~ML=sQeioa08!OGwnzcq0<Dwz^0azg$2<Ey_pyVlogp# z;NMB`E<7?}C+pg2#corC3hjsSiACNJl;2h3IIsLNd==_WH<C#|ks#ey7+N3Q2&g<! zTRa7OWV{m1xVd|fO;p*Jqa$c%8G!(5PQENSvQpg_Th$n4J+XO>T~M}H#&<t=aa}>F zl~|fm07?A{z(2iG0c_}6WlF25JvsRge;JR#B7Tk(=YdtR1+<FJAwZWwGY%K&gQ5-y z<@>8eVKH2obj%SB52}VUGqtd&SsV-11A1wYy*PeseBbW9#i?2YE;1FbH!BDZ7f(dR zaHhFXx5dc-?#6k%yf#@6RNJK*5J?=4!w;w&JZ8mUu@=fbc@h3LIDO!loQm`9Q^DmE z_)Tb|8v-CJY-x%h5jGhMB)gLpG@<7j%}b5gy%2T`2U^e|L!2UKTgGSIVKGXIpCDQs z&4v<zO(DSHaeM?RI}upChtl@w`P*nU$HG8lfCT`~+6=>a^T7-K=A5NP#41k9$vW&> zzZVfs-?L`t=#Ze{#C>X^UZ-m))Pz5Qx=a{NUd!~bITrmK5RGZH#?gq4Or@q6M2--! zMnV(N1%5UW!{3kGSJQ$ijuv#GUl$Fg`@uE%^FS$?R<W7<5MgQi%?PAiFxO|=8#p8; z)cG{PPj@txa#cn{)>O@#C?~FmHdCs^ZT=ac8e4ip@VBILfI~s;rn_`$h;4<-3k29Q zajtO(99f<mS$pZog0jSbKpK~?U-PsMoDGWb4%8qq=Oh?BsSt>bW>loiNW86%TpTnS z5>Ez8@?wc6oy2!ut?P?{=w8rtGp6Pj0mt*r9?Uo6VM9Jj=?N;5p0GDCW@38MF<1~i z?@S$oNSD|FNip#N`#>0B!T@8WJ+663pSf(9M3)YFreMnb%9B)l5K)P&UWu3bMAoOQ z_8-L~D&lc1z1rCx`G#wu7G4_Fz&VC!SH#ODu1B$Az$RwQ?p!8_>gIHYt^nc}cg>do zhO{M&*Hd8E^rD0C3#;&*q#OFki8gc-x&b^6>O1Kceiju;bJ7g(wSG{H+6%#sVr@!` z1{Ci$;cn=7S_##;%5)GbewI5I6dM6@MKl6nNz616ZWbYtpxE2(pbAyr3aUjoZxIfQ zRPX6aV>Q2Tcz<zQ7zDH!_CK&^dz$Wi$z{r%WJ!l}ftgB3bKO6TuoGG8yX!$5)3&OG zz*uzpRX|P}_oq@RmB!TJsYpWKa5I10Gi2_#L+G(|W|r%v3k$V&VAVz0dy1faYI+4W zmg6LkrbyQrjX092vAE9s>j*mq-Ma?Hy@odBjB}N1;zv696yg3ud{8m@kMN=P9bxDw zAII>}m}cE!bD>@BaOFv5b;nlQ1H66|AC26;e)!mX@!PX{#X#S{4Fdz1<a3ypHOoH{ z1@mDQpnj;6M@Qn4LC36M8euJ5F-OR$FkNaziVCg(!Z4QGCK+^BuRw^bqbQXr@-EWn zI1u?wwxbu1zCxd;b)o76JWh@26Hh^_U`RD33eq^v^rvcdtZpiEjRCHrE7#-#QYi1) z&RU#}G<LzMN*yaw)Fg45iy+t48m)!Mbw@d_1q)NOcH5OpSXpB#UtMe9g$-#Vx0+CC z$vCRbBftz`!RjR|)SC_u7qgJKrI9)*-&woTKoZL=x*&%@JLr)5u7z6dt=A^?K8$r0 zarxq)U8n}is}*ligN+Vn>cL|9!a_3&^g`@HfX&X<Dn%ie%5ix%4BAI)RY!zsvtEbL z=44BRW#UQ9!ZgYVxc(4IFVtcZFu?cXf4Sa7<B(s(zB;1XY)sXrTa`8{QjRf2jJpW- zUA5U-Y6sJLH^XHDOt6#l<>|(PXg&=fj3b8`NdlJb!u<SFIhtt)6|2f~5nQC3iJ}%n zP;;&p%vKy5IS547DjqWoXBpUrjxwRBKBn?oqUp#U3Wu3!zFx*uSQ~8Q$YYEmmTWK; zhD4N6!)YecO~qoWP@6n{=F~|?lQ2mhj*}hCX4Gq_L!==ZY(bJX9H-H22<9ubdU?Kv z%_8$yI<29aDCF9R5{6HmICbn)8lM&zW`W_fK*U)@M@@}pBTWlAp~@<Q?#k**i@Ewb zi)kBCN0m{q7^w@gs?IQq6LA+Ml$h=6qLY;{xT@$Vqpm8-Z0ZswK7QuR_(agAUm>L$ zcoMMsaqResEJwuk(h2F>jz}@<c&$2DcSE`5f*fQQ7J>yg@IIgrv$lg)n?sobk6|%r z*sRV4QT$#q+k_$<V(Qw2ohdA0&Sq`VoWzl`oQcC^@Higc@JhWoEp|Pspy(5)4#%l7 zh+W|_#AFahlK~$C7#HlwHQbSltdhJ9+b<|JtU5={h$Ga49XW?{IXe={p~xF!pehs* z<Is_FIG2-smtYaq7A2L=)E3pJNoyIO%NNZlUlh&d^C6ygM^YbT74~hxt)<du=2BRj z&yw2H*xWm8!%E1WnL{Y|7N&GG2hynCY*%NRO>lv@GnyM?)R>Es0g=6{BX7Qv`T1re zrk>-2u_mLgK|i?Ovb>#@L~|Y8%PxrKGByyqCX|_KLhy(q=N>~)qA<ZxX&pRMhPNoh z^kK5O7}s&iMT|BV!;XBz9r-9xl6Rq#I$6Ut&J9M_IMuq)u48b)1czdgbaVd8;aoi1 z<RY9f?JOB^@5wbvy7-QgicsTSRg&nrw?%AK{Ni?VvKe(q?haUukJ0IfmiSqmueV#( zM8wk;aWNF~)F2K@#C#T0jztMEa5Q@6)JcDQ%n6jvqH#t_t4p=UzP)M@LW#C5yRcj= zas>}7=o%{4R%}E&^px9t=-j378kgh7tKG{DTXtd4Vc5buEt8h!{=1sAMQkliUDLU) zb@O;OCYwWC7j`ZkD<f!~CWL(j$%t_>sjrPpvT{HzQA&vuP~=fZqEgBiLK%4pP#1)9 zFe%y<XC48XZ9*x~phGxhJ+j#VEHvB;DA@&Osj>pgt@?tqSQi@3EEL1LuuCKlqG-_I z1Wxs;4rsdelHTd61TxGiV1W{iyoo?qCZb#<P%9OKT{-n;HG_d;Wj=H`vxKWVtpIi} zRt&&iWNycjKqwpaS4YQV{M{H-WBLCzgX$&MErWgq#GL71P|XMYlgB6yWnDNL?^U<b z`f(}L8!+7?bm*C8b7BUWm9Sib4y*mkJMG%hE_cKQhj)@H?Es7sM(@4b9!6!qf4LIB z=DO{;ucB4(@1>H3Rw4ST*$Nu6^<2LV$IXys5${7UGfzDI;)K_BM$qj>7vNr$PxRy7 zBvNA&GuKwTxrhS<;t$_-hhFfMDn1HlRW$-f(E2CK91W%_m|}=Q9>-~dI$q8h2-AF6 zoy>l9yqjc=x0_X13#f|%3DDwFl93jj4EeZ18vCqp92-k7HQV;obX#n6RopqaB4d2~ zpi-ZYZbG>ulVQ}ZR3p?^s~%a1W|EhX%~`>+1a21+I?GbFbkujW#+h(ug)GMkm#5I? zQH{%!*i;ruup%u8Pb3k{KvOM&Wx;3pNt&@rbtZT$i=z@g+tBJ~Qi=kU)vBK|%CmAX z1NNG?YXNrm#!94G4=N3uW1zS{>z|Byiq$?=X;hc8C}P`U&y^>aTIigRG{_lD36sj! z%}Mr{dzU37CA1ju&VnLr!GsUqyQH9p@!OFU?mgG7sQ6tp>nE=g6<98vOy<a`sBrDj zSVMZXjyVZtA#)n%h^RHDn(F>IjB=X%U)`Cm8ujy4z4;C)=+5}ncLCLR?9a@We(zm+ z=-cbk>{ZuoukxV7mpXctqueLnlmz2)sD%_pSM^TTvXG)L-$Cz^INUi$p=5uDZc4j` zF5J-(dK?kxwD+gw$PRGA5nIW$LWN6;Vh~3Tu(7;90kMe*;K~H-6^Mg*t}Ip+k&4|e zZvV?F?sK6U3{T)O1}|U~6f4VS3`K2Vz+z2u-Yp1&d2B=pwfvQ=PGz~4n=Ue@mq$B` zhAJaZRHq={WjMTBKUC4fI?}?)&DaPUN6iVcanB!i`(ba;3NyU|i%6W0pVrLG8T%|C zlr(%3JAn3GGTQu~2CxmE>u8(!eZb~760XL9H);=UPt7KFK36fMcjD7Q*!izjq8^m< zd-+(wM;{+-qR&cQI}zyO+OA&!O239rNRJ|yJ^I{Yt`>CVM(JdowD0LN92-F~j=Knd zZi}CG#On?NFIhyC^?`$Pl|~WkBlBF9&1TG}oh%~*`N#R7w$|KRUP-<>qf%Ga%`}sQ zcEQ^B#o)I{C`yrz!*b~;_#mQj$yZ7YtZ?I!ugB623D0sv!qN>q(B!s&A3ArTl%8Wc z+p+xvOGKX81WAG&Ajt9zk2hg(x!tqjEqIR~5FJO*sdjU|gQV)n28g^+ozeQ+j^fsK zyjlN778RXo+xcI>L+#^U<tmO2X*+{EprMXHdKY<9^YFG>D(e3ZsZYF2p~qW?y#_tr z4S2>a;BpgI$tX?Aa5~ke0MJn6$*yL&(B{chmq>pB0FGlc+|2}d^2_C(t~V#KGzXZ1 zyEb3eI#wKJy(*};#T9Gdy9jzB=pGQ1RGk%w>rO`z8stV1Em*e*e;IBv^+0@>lmo4S z6$Upb$a}S}A2y??sMw1zs&U#HOOO>ztyTfGWXBhq#ZM|E=<&d~fR4D5hzf8wj`<zM zKm5h}+(Z{Pu?L@U1Rt)lgD&T9<S7EH>E$eTNcNehy$jk{?n)*diw&CPa(ps!5Ey93 zftEjqcS{e=@sMAaB}&No$-!w%co$pk!#5^$>vQ|uv<^^dEJ^-FOD%VHv0R>SH?jAG zRP`xxyW9p5yb5wxV5V$Hnqb_H@TB|4M$m)g0rX(P(|}_6&JnfHm~1XIY_}Uju?QbR zIY!5gcq}*H)X^}qB|mK3J2s3Nd<q%$Vzu6FR*N{Xt;+078|OAh-P+N#q`%Upv1^<( zO1h0n{(3we2j0mLqPnOY{JVg|ogJ+p?fFTCj+SiP7Cs3MxTYX+V4Nh4qLh(T;4pJu zUhIs=&apFqeUi@YSYn4>7lV#wQrw#wH(1Cbx?A6k3M>QB%N>#sz#_y|B=GM6CH;H( zpt$X5^WE1$H*X~lSpy|_usumSrwVlSgFI$*1k#3!rRl`(3TAchatB9D8IT1U$k9it zh?T`#*KS8R)-BY*i2x?!besKe0%|)mx?JrOU~-0{LR~SR{p~>H{shmyLbwmKJC0qM zydFZ9736HOxe#%;7&dk`!w^R>mWr_`PP61pgC|GO)mits-M^nyKPF=vZ*(`OXipYp z!d$QvI(q;Z;a*VYnCtfOYB3j4BzA`rGR1n77?RcAV{`rc(J(EV>in>4tiKbH{xBXH zH*|#&<fUUv9dbv$6K&<x3sufvZ%w6v$EFImqu;5P*0JU7dTpt2JD#=F-$Az9&BtCm z($Pzn7CUp2<V*~xWenY9+#<8_cj4*O(DlN-LTNl}-|w?Qd#=9*5v7T5yFvS|zXlPd zr@!q6J#hUsh$uaqHAt%BVlB8tRUv6gz)4eiAP7q0gxu;K@7s4?H(5(Xc#PaFOsv7_ zTe^LqfGh2#VQJ=fE9G9byxjZ0#oM;wbvueGy&WevYVB*hd-Ofk@ti~9{5w^nQ3<ML zN6j)Z1K-2t)X|`gy4<_b*ty3!R_LmBJ4qbOTDm@aBNCIiyKtFfg$ZLLh^Ju#F`7tE zK=BOi5oGDM#wV5wjSPLchYpWw?<(9dSaKi3>_0koVWCpj4mB6)S8CX6;|J65k7!Xo zj#k8}N`zJ8P`e_RWtRu9BX`OV|6kC{e-voGmXRyPo}D~4g5IVp9dkMAO`V~FPZ&;S zthwkg6|<cdjh}yBjPX2vv<YINQIpRTmy%Ulfir@g`$h5bYD}w+1t>SazYe&^KL~1k z>>AXdMJ#I26YQvgvArc5+%?3<J|^bH#tS#3QJ0zQ`j}oxES92RFE++~qN91lj-P8Z z4;GSZ9w?IB`*sXr*O4qRxiF;z)3t67dHS(=&VG?i4ByP!*D>f%&|=r1*YeURau%^O z5L5cPBDh04iO?8e3;B6!1Y;of>R=3@#o&7o2d6XN%w!;m=--KlWJKACgG|u4i88B` zhqcn4c1I}YE-~0;`uT^@tv{Gi?f<Iz+&mLEzeA*E?e|aNW&UY05^}mnSEh#k2ypo9 zcc|4`)#=ay*JFE+puInmwO5Q7ECy9wkx14=nv-#32!O*aTot&|<|c~%%Q&ixgW-y& z=L4smai#CW%*J~YwO!%0Bm)8{o0tczT0TClQDKD(JIsPfoDoHk(v*i{vq(od?ga3+ z;vt7gG}&cdiFH+*Ho}jSgp@eET4^;Ftk-*@AQd5-Iy!>%DgvaSyRCWD1R|5O26-C= z7GryKMU@mOseDk8y*dzX%*(j-ZzIVX*Km%t@vJy}NQ&$|ixhXopf1cghK|I|k?#6p zY!9zw`!<Gk(XSS@*xf}PJuPz&d6_GNVR=UpXVt19maypBaA!=(&~9r1mME}g89rb7 z7p7DMB2)8%DV77EBbM?3xw=KJxN;Y*`sMXjUES_Zwv)6de~z6=k!1?(N_W|iyK69f z7_nGPEw-T}(C^!#Ry?2BQH&-J@o4h)M|4<Q$;DjqVAxJdvn)1!H|Mu$9<igyaM?{v zTzMQg&*FHRnRUA)9(#7xt3b!=1gl&};lXh1y}!1j-evVvDGT_4%y2RxUMtQIZ6wAn z6OC2o$y(CwP9`>Lqp1H&>}j^hcy4bH4%oWA)6B=gJ2ZkEzk&u+rlIR`iIhey)cwbe zc|#+QBXui>;Kb|NE`dS#F<s&SY3gp7VM**ol8yWlE`3m#vhr=N`T)d$K#jOw45I`^ zE~N1*86N_~{YBc*1zICDmbs`F*MhlfQ4e;EIT8FdRl6do_UDso(|A`cKwXOjgO$~O zEv~lxdx}RMcku@r-($kv-r{`}`bW>-ZeHrs3-EM!<Gx|xJ$_-(!{0fghuhLV;2|BC zGNGQA`k5Es3c&D6(^$=TL?Q-YOc2nq?Y+3tfJCgpH3yNedoQATU7NOefG66idw47S zcHRpA5-RF5FM^ss<v}>2E~I&^008g<aN*P5IYOc!zSIOlk~=KI{dk;#_aE1t?F^%( zdQiko=8Y(I_3IM&^ya1gx_N2u@B_nAlROW0y2`OY4kEK`7(tz%LBP!goK*-J3w`A< zehC{WlnTbdx-7f=yOPX6TOg9S^$%(mEkbI)xJ=3ut7Xu)R3T0Y<9ii!ry<*lQY)Dg zWsw0@xpy%}SBa1eC>CFAh`xyTzd4f=JG|k3(LGo`ohWkZXbY^)oNEmkdHf2R>yP0f zQ7<nAj-)&7a3{+74>OIDlvn4+^E;BpR-%eOiNtIIG}YRMgznrR@8j!W%vU-3ZzK-d zVWx{iptyOR+)cc97pXx@iWL8g^Ed>=%eg3ri}-GUN|8isOe-U9r&mV&f5(jB-KeqF zfQ+u$A{<fNhhK!HuRGkazq09=Z`<||xS2uCqKe{Ey`t4@x#RWhx-ha>sB#7rsr?uf zZlIoXy+e|p!Nny$Yz(Kexsa^A>r&Z418;>ZE^u9*n%|;}HVIwA*-k9fYgX>VxHJA7 zt0Gl^vy?eTO}&P5N<<*!mQnu%vZzzt+?_T?SIl^^w}x{0%k1Qnz|a&nqHB8#L#zAL z$yDsL)7arjm>UlJu#bz+Rk~hyNZSx~%`ozBQR)p|mGzOvB!}jL=MY$~B4C^`65E4x z*$+o0?&{UekBEO0j7Kp!A)C$(c!g*C&1IxvSle{OYUqj7Q#g(`vu!0_sNR4n<}Lxk z);#0S^U=gZBq)mpZg?&t(p`Iz^)@@mR|0D5=Ctb)5LpFc#y0du^vW81v@O_orWSW? z28-38rSCV$S=T)yC`peL^zZAQdA(q!v?GgJSa$V<{1Z-C<4u{cCbL3VgTLP>P<p-r z(TNgLFA$)JM7XSHZssz{a!$-uTJ8vRxqPWzX|-@QtlJx<@jIoNi-aX6g0<-ej)BYF z)q+5b!*MZ<o9>JjV&t%BZ)PV@!Wi!sFuag*T=Ob<<z+rz;o~ECxKxgTjs)iGN;CWq z<INk1KSw5pd#{u;(PK~bk09j%1YpCVo3X9camy5@P6Zllm$Aly0qfWS)&k5p7;SLj zUG9b2l#tts;_23Ts>k?}N6uD@6<r&tTOWrdWHCLe2&|%*ejtlXVFY;avim@%d^05A zW6bRmVJni4EDP>+1m=(&;8X|>aB9MoNQnpc-Rztj07`}P4yv;BxK`htn~qI!x}DV% z%P#XCzODuL&6e*)SH;%2oA47+x3m3YDYub?{uMUzqe)zMxD6Jw*_vRC!^=Ej0(T<5 z@CQp+?kgPJ_z=e2zT>MEDB^H;tzb1B`O=nkrBRvdCFR{Bo2UV`;&wNn#KdSs&j?bu z^#v@9(S%_|c`N>O@>XA{G{$YNMH}GiGw#imMXilvyq2l*PUA--H^=-xgcs4sm9V~? zya;Y4ycf1DH7&wUiB9Ej);q=|7<|rEvUnT8qvtmyb2H2xFqSw=IEk;pb81|(D%1vz z?NNgRhBR<62OqG&y?l6L?jn`pye_9T?y={)-i)wq+aE;d#(TLh1(msWfSusm=rVCB zY#?v(@t4RQ-0|j2I2vtElXC>bb!x<-I1BlAvtm}%Y}cmYH)zNA7xBG{cNieSSz;-d zb%m{@EQZNQskJSmYc-Vojkv#mZLDWBQiy7Yb^&C3#&rdAc_($`B9Y}g((zCjS|v6m zhKMv{BS7*A1fW6MkC89QAh=Pp-?Z=N91v=TF+It73i29YcfB{Jd_CNfju_m>?~-Cy z9{nwH@*L?HNBTB0c%oo{hedoRLcFe4)*KZa7~#VA`1ZjNTiAHta5|AyWoJ9%_Tl_S zdWGi<hGue+F%NIF_$6j(X}w@yF;;oFMRFR`X0GWK$)P)dB5^8KfK(?E&P$bjB@<Ux z_}ytRnXt!BcO_;*0&^j5%5%C@C1o|mHHOcE$nkfkmG`Di&u&dFRx1r&MT*%PtFQ4g z#%6JAh=^(hw<{!#ZQP4SJ9Oi!w{0Iz`;^=`!9JyoV@JtEK!-Ys6Wf#_hv-5yweumT zT;0iyv^z8*c4Lq{;v_u+U1H~zc=N$}Wq#6D4nILoCMr4{r@6%VvwNLn8btKd{OS)) z8Ql@Hx50+~r|@vixs@Rm=c7BLljo0G`tH1I^1(s2khYLnshM42t;CMZadbE?;e<S8 zH)mh6cLLC>_?X%^zxmBq@=%>!o&2mc0>Al+`|WowPgfDE?5OuDP<)Vo>$dMj34Pgw zthO??{o}jK_>FaZoj=J3=di*YhsmW%-K_5(bVFRIg0uNe4EtE)#J7S2rr$n+cud*< zG`mtKVW>^;RY3clqktKmSEKAUq7zp*#3TmsANwBKF2&b=WHP%3X`G!JiPu~S)ci<` zuR>_D#=Si*g%ghX%3@f1!JR2Nb>x|e6QyH5MwVL(<u!TIV=^DK34V-e<X>zKi16i% z^J+Ejpu&x96h@lxx;s_%^?G7xUM|OtH&3DYQ}yO0$Ij$#ci}%xYTbXU%G{w{z3pBm z+|P%0Fv$|_C)JKKj(o4L2=FNzWNtgneSqK>`1m3o5mkEbz8@VP%YAvsSFX+%@N$vm z`M%10#g6*oGpoyU@<4lZM=qy3KfXLGHA{4NXV&bD^YYvUwts++RV+s;YTLg%q>_O; znMSHBAvyEr@@Hq$I4)fVh+y7;;qC}@QSs?CpL@ssoB1}f)@iIbxgNZO@ptiYFCUah z{#HJ=<Dob4I$XF$u$HflI|#-{6dbnLX(o%kBVK6JKw(_6A3Vi=-LeE8u;a;$T=ujr z%PLBm#2uwRw><jXCg^i(odzf@ZXBTCK_;BoeUM29_;`p9ZpYCs6ft#mrY&Ztl8J*D zv<tYRk`wm{7v#X^ox2(`7`l5o5=9wq%mdD#jDH;UO0xoHwEqNObU$NBZ|;Q90QM;e z{U`8HZtjx^Pdw$HWbUW<7-tcVYMic)aHXFAGz%PK(jh)Z_&CDHolH2z$9aM>de1Uc z=7WA9{{=kMY3KYS<KxHt@{x&&6UR@VI(GWZggPyWKRbT($eCjkn)v%~u;^QSd_Nzf zcttD-<Ew`u2#I0R53;#`fUn|YJpBp>oY$=2#yKrwx_drJ2~LM}>9XHu<tJE-vIv*2 z!8QVqk@EEZbe<rScI=K~ByI=ib@SL^;A+BOgu?0Dv=$4R@h|<Fy&LeQe47v&&@W;N z?)y~e|LiNQFAVi;>eczy!rGqI`1-y9+|ave-KLFOhBj^4ba-{orvCNbM*R-O|2KNK z$*by|=}D}6XA*bq|4ANtWAncQz=j_e%MkJ2EO=wj5YFCi>RE%BA-ub%FaRyTwr5jc zzK(Z?HWt>PK9=3!4aQ}!75DD7ynE`k>$^HO4{uqs!Rsg0SMe~sI}#6Cu<zuT#{Zrk zZxGX{HH9?PiyS@pZXEaN8R*%xf~EUGsr0u;d5|{HGgKHtPcxK2L!ibQmQX2I8<)S= zgVOYryQOf~4-Ol=t=D0NI^<_(dH$lN9^LK?tiVqzhgSC#`g`zIkiCQGv7W*pO42XC q`hgAPzWy}@ey!j7e$=yiVC}$0)^U@!x_7{P--?ZR`=GZH?f*aUXPcD( diff --git a/venv/lib/python2.7/site-packages/setuptools/archive_util.py b/venv/lib/python2.7/site-packages/setuptools/archive_util.py deleted file mode 100644 index 8143604..0000000 --- a/venv/lib/python2.7/site-packages/setuptools/archive_util.py +++ /dev/null @@ -1,173 +0,0 @@ -"""Utilities for extracting common archive formats""" - -import zipfile -import tarfile -import os -import shutil -import posixpath -import contextlib -from distutils.errors import DistutilsError - -from pkg_resources import ensure_directory - -__all__ = [ - "unpack_archive", "unpack_zipfile", "unpack_tarfile", "default_filter", - "UnrecognizedFormat", "extraction_drivers", "unpack_directory", -] - - -class UnrecognizedFormat(DistutilsError): - """Couldn't recognize the archive type""" - - -def default_filter(src, dst): - """The default progress/filter callback; returns True for all files""" - return dst - - -def unpack_archive(filename, extract_dir, progress_filter=default_filter, - drivers=None): - """Unpack `filename` to `extract_dir`, or raise ``UnrecognizedFormat`` - - `progress_filter` is a function taking two arguments: a source path - internal to the archive ('/'-separated), and a filesystem path where it - will be extracted. The callback must return the desired extract path - (which may be the same as the one passed in), or else ``None`` to skip - that file or directory. The callback can thus be used to report on the - progress of the extraction, as well as to filter the items extracted or - alter their extraction paths. - - `drivers`, if supplied, must be a non-empty sequence of functions with the - same signature as this function (minus the `drivers` argument), that raise - ``UnrecognizedFormat`` if they do not support extracting the designated - archive type. The `drivers` are tried in sequence until one is found that - does not raise an error, or until all are exhausted (in which case - ``UnrecognizedFormat`` is raised). If you do not supply a sequence of - drivers, the module's ``extraction_drivers`` constant will be used, which - means that ``unpack_zipfile`` and ``unpack_tarfile`` will be tried, in that - order. - """ - for driver in drivers or extraction_drivers: - try: - driver(filename, extract_dir, progress_filter) - except UnrecognizedFormat: - continue - else: - return - else: - raise UnrecognizedFormat( - "Not a recognized archive type: %s" % filename - ) - - -def unpack_directory(filename, extract_dir, progress_filter=default_filter): - """"Unpack" a directory, using the same interface as for archives - - Raises ``UnrecognizedFormat`` if `filename` is not a directory - """ - if not os.path.isdir(filename): - raise UnrecognizedFormat("%s is not a directory" % filename) - - paths = { - filename: ('', extract_dir), - } - for base, dirs, files in os.walk(filename): - src, dst = paths[base] - for d in dirs: - paths[os.path.join(base, d)] = src + d + '/', os.path.join(dst, d) - for f in files: - target = os.path.join(dst, f) - target = progress_filter(src + f, target) - if not target: - # skip non-files - continue - ensure_directory(target) - f = os.path.join(base, f) - shutil.copyfile(f, target) - shutil.copystat(f, target) - - -def unpack_zipfile(filename, extract_dir, progress_filter=default_filter): - """Unpack zip `filename` to `extract_dir` - - Raises ``UnrecognizedFormat`` if `filename` is not a zipfile (as determined - by ``zipfile.is_zipfile()``). See ``unpack_archive()`` for an explanation - of the `progress_filter` argument. - """ - - if not zipfile.is_zipfile(filename): - raise UnrecognizedFormat("%s is not a zip file" % (filename,)) - - with zipfile.ZipFile(filename) as z: - for info in z.infolist(): - name = info.filename - - # don't extract absolute paths or ones with .. in them - if name.startswith('/') or '..' in name.split('/'): - continue - - target = os.path.join(extract_dir, *name.split('/')) - target = progress_filter(name, target) - if not target: - continue - if name.endswith('/'): - # directory - ensure_directory(target) - else: - # file - ensure_directory(target) - data = z.read(info.filename) - with open(target, 'wb') as f: - f.write(data) - unix_attributes = info.external_attr >> 16 - if unix_attributes: - os.chmod(target, unix_attributes) - - -def unpack_tarfile(filename, extract_dir, progress_filter=default_filter): - """Unpack tar/tar.gz/tar.bz2 `filename` to `extract_dir` - - Raises ``UnrecognizedFormat`` if `filename` is not a tarfile (as determined - by ``tarfile.open()``). See ``unpack_archive()`` for an explanation - of the `progress_filter` argument. - """ - try: - tarobj = tarfile.open(filename) - except tarfile.TarError: - raise UnrecognizedFormat( - "%s is not a compressed or uncompressed tar file" % (filename,) - ) - with contextlib.closing(tarobj): - # don't do any chowning! - tarobj.chown = lambda *args: None - for member in tarobj: - name = member.name - # don't extract absolute paths or ones with .. in them - if not name.startswith('/') and '..' not in name.split('/'): - prelim_dst = os.path.join(extract_dir, *name.split('/')) - - # resolve any links and to extract the link targets as normal - # files - while member is not None and (member.islnk() or member.issym()): - linkpath = member.linkname - if member.issym(): - base = posixpath.dirname(member.name) - linkpath = posixpath.join(base, linkpath) - linkpath = posixpath.normpath(linkpath) - member = tarobj._getmember(linkpath) - - if member is not None and (member.isfile() or member.isdir()): - final_dst = progress_filter(name, prelim_dst) - if final_dst: - if final_dst.endswith(os.sep): - final_dst = final_dst[:-1] - try: - # XXX Ugh - tarobj._extract_member(member, final_dst) - except tarfile.ExtractError: - # chown/chmod/mkfifo/mknode/makedev failed - pass - return True - - -extraction_drivers = unpack_directory, unpack_zipfile, unpack_tarfile diff --git a/venv/lib/python2.7/site-packages/setuptools/archive_util.pyc b/venv/lib/python2.7/site-packages/setuptools/archive_util.pyc deleted file mode 100644 index b4188c75e2ec7f7e18cc1a6a04cc2dc31d4681d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6574 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 UZQ;_w%3@j7uGF5dU8`;V7eg<qqW}N^ diff --git a/venv/lib/python2.7/site-packages/setuptools/build_meta.py b/venv/lib/python2.7/site-packages/setuptools/build_meta.py deleted file mode 100644 index e40904a..0000000 --- a/venv/lib/python2.7/site-packages/setuptools/build_meta.py +++ /dev/null @@ -1,254 +0,0 @@ -"""A PEP 517 interface to setuptools - -Previously, when a user or a command line tool (let's call it a "frontend") -needed to make a request of setuptools to take a certain action, for -example, generating a list of installation requirements, the frontend would -would call "setup.py egg_info" or "setup.py bdist_wheel" on the command line. - -PEP 517 defines a different method of interfacing with setuptools. Rather -than calling "setup.py" directly, the frontend should: - - 1. Set the current directory to the directory with a setup.py file - 2. Import this module into a safe python interpreter (one in which - setuptools can potentially set global variables or crash hard). - 3. Call one of the functions defined in PEP 517. - -What each function does is defined in PEP 517. However, here is a "casual" -definition of the functions (this definition should not be relied on for -bug reports or API stability): - - - `build_wheel`: build a wheel in the folder and return the basename - - `get_requires_for_build_wheel`: get the `setup_requires` to build - - `prepare_metadata_for_build_wheel`: get the `install_requires` - - `build_sdist`: build an sdist in the folder and return the basename - - `get_requires_for_build_sdist`: get the `setup_requires` to build - -Again, this is not a formal definition! Just a "taste" of the module. -""" - -import io -import os -import sys -import tokenize -import shutil -import contextlib - -import setuptools -import distutils -from setuptools.py31compat import TemporaryDirectory - -from pkg_resources import parse_requirements - -__all__ = ['get_requires_for_build_sdist', - 'get_requires_for_build_wheel', - 'prepare_metadata_for_build_wheel', - 'build_wheel', - 'build_sdist', - '__legacy__', - 'SetupRequirementsError'] - -class SetupRequirementsError(BaseException): - def __init__(self, specifiers): - self.specifiers = specifiers - - -class Distribution(setuptools.dist.Distribution): - def fetch_build_eggs(self, specifiers): - specifier_list = list(map(str, parse_requirements(specifiers))) - - raise SetupRequirementsError(specifier_list) - - @classmethod - @contextlib.contextmanager - def patch(cls): - """ - Replace - distutils.dist.Distribution with this class - for the duration of this context. - """ - orig = distutils.core.Distribution - distutils.core.Distribution = cls - try: - yield - finally: - distutils.core.Distribution = orig - - -def _to_str(s): - """ - Convert a filename to a string (on Python 2, explicitly - a byte string, not Unicode) as distutils checks for the - exact type str. - """ - if sys.version_info[0] == 2 and not isinstance(s, str): - # Assume it's Unicode, as that's what the PEP says - # should be provided. - return s.encode(sys.getfilesystemencoding()) - return s - - -def _get_immediate_subdirectories(a_dir): - return [name for name in os.listdir(a_dir) - if os.path.isdir(os.path.join(a_dir, name))] - - -def _file_with_extension(directory, extension): - matching = ( - f for f in os.listdir(directory) - if f.endswith(extension) - ) - file, = matching - return file - - -def _open_setup_script(setup_script): - if not os.path.exists(setup_script): - # Supply a default setup.py - return io.StringIO(u"from setuptools import setup; setup()") - - return getattr(tokenize, 'open', open)(setup_script) - - -class _BuildMetaBackend(object): - - def _fix_config(self, config_settings): - config_settings = config_settings or {} - config_settings.setdefault('--global-option', []) - return config_settings - - def _get_build_requires(self, config_settings, requirements): - config_settings = self._fix_config(config_settings) - - sys.argv = sys.argv[:1] + ['egg_info'] + \ - config_settings["--global-option"] - try: - with Distribution.patch(): - self.run_setup() - except SetupRequirementsError as e: - requirements += e.specifiers - - return requirements - - def run_setup(self, setup_script='setup.py'): - # Note that we can reuse our build directory between calls - # Correctness comes first, then optimization later - __file__ = setup_script - __name__ = '__main__' - - with _open_setup_script(__file__) as f: - code = f.read().replace(r'\r\n', r'\n') - - exec(compile(code, __file__, 'exec'), locals()) - - def get_requires_for_build_wheel(self, config_settings=None): - config_settings = self._fix_config(config_settings) - return self._get_build_requires(config_settings, requirements=['wheel']) - - def get_requires_for_build_sdist(self, config_settings=None): - config_settings = self._fix_config(config_settings) - return self._get_build_requires(config_settings, requirements=[]) - - def prepare_metadata_for_build_wheel(self, metadata_directory, - config_settings=None): - sys.argv = sys.argv[:1] + ['dist_info', '--egg-base', - _to_str(metadata_directory)] - self.run_setup() - - dist_info_directory = metadata_directory - while True: - dist_infos = [f for f in os.listdir(dist_info_directory) - if f.endswith('.dist-info')] - - if (len(dist_infos) == 0 and - len(_get_immediate_subdirectories(dist_info_directory)) == 1): - - dist_info_directory = os.path.join( - dist_info_directory, os.listdir(dist_info_directory)[0]) - continue - - assert len(dist_infos) == 1 - break - - # PEP 517 requires that the .dist-info directory be placed in the - # metadata_directory. To comply, we MUST copy the directory to the root - if dist_info_directory != metadata_directory: - shutil.move( - os.path.join(dist_info_directory, dist_infos[0]), - metadata_directory) - shutil.rmtree(dist_info_directory, ignore_errors=True) - - return dist_infos[0] - - def build_wheel(self, wheel_directory, config_settings=None, - metadata_directory=None): - config_settings = self._fix_config(config_settings) - wheel_directory = os.path.abspath(wheel_directory) - - # Build the wheel in a temporary directory, then copy to the target - with TemporaryDirectory(dir=wheel_directory) as tmp_dist_dir: - sys.argv = (sys.argv[:1] + - ['bdist_wheel', '--dist-dir', tmp_dist_dir] + - config_settings["--global-option"]) - self.run_setup() - - wheel_basename = _file_with_extension(tmp_dist_dir, '.whl') - wheel_path = os.path.join(wheel_directory, wheel_basename) - if os.path.exists(wheel_path): - # os.rename will fail overwriting on non-unix env - os.remove(wheel_path) - os.rename(os.path.join(tmp_dist_dir, wheel_basename), wheel_path) - - return wheel_basename - - def build_sdist(self, sdist_directory, config_settings=None): - config_settings = self._fix_config(config_settings) - sdist_directory = os.path.abspath(sdist_directory) - sys.argv = sys.argv[:1] + ['sdist', '--formats', 'gztar'] + \ - config_settings["--global-option"] + \ - ["--dist-dir", sdist_directory] - self.run_setup() - - return _file_with_extension(sdist_directory, '.tar.gz') - - -class _BuildMetaLegacyBackend(_BuildMetaBackend): - """Compatibility backend for setuptools - - This is a version of setuptools.build_meta that endeavors to maintain backwards - compatibility with pre-PEP 517 modes of invocation. It exists as a temporary - bridge between the old packaging mechanism and the new packaging mechanism, - and will eventually be removed. - """ - def run_setup(self, setup_script='setup.py'): - # In order to maintain compatibility with scripts assuming that - # the setup.py script is in a directory on the PYTHONPATH, inject - # '' into sys.path. (pypa/setuptools#1642) - sys_path = list(sys.path) # Save the original path - - script_dir = os.path.dirname(os.path.abspath(setup_script)) - if script_dir not in sys.path: - sys.path.insert(0, script_dir) - - try: - super(_BuildMetaLegacyBackend, - self).run_setup(setup_script=setup_script) - finally: - # While PEP 517 frontends should be calling each hook in a fresh - # subprocess according to the standard (and thus it should not be - # strictly necessary to restore the old sys.path), we'll restore - # the original path so that the path manipulation does not persist - # within the hook after run_setup is called. - sys.path[:] = sys_path - -# The primary backend -_BACKEND = _BuildMetaBackend() - -get_requires_for_build_wheel = _BACKEND.get_requires_for_build_wheel -get_requires_for_build_sdist = _BACKEND.get_requires_for_build_sdist -prepare_metadata_for_build_wheel = _BACKEND.prepare_metadata_for_build_wheel -build_wheel = _BACKEND.build_wheel -build_sdist = _BACKEND.build_sdist - - -# The legacy backend -__legacy__ = _BuildMetaLegacyBackend() diff --git a/venv/lib/python2.7/site-packages/setuptools/build_meta.pyc b/venv/lib/python2.7/site-packages/setuptools/build_meta.pyc deleted file mode 100644 index d89e8f4c310d03394a8aa8a93df4cec5f19cb65f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10676 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 diff --git a/venv/lib/python2.7/site-packages/setuptools/cli-32.exe b/venv/lib/python2.7/site-packages/setuptools/cli-32.exe deleted file mode 100644 index b1487b7819e7286577a043c7726fbe0ca1543083..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65536 zcmeFae|%KMxj%k3yGc&ShO@v10t8qfC>m5WpovRhA=wa=z=p_%6%z1@blsvwI0vv2 zNIY4alVK~j)mwY3trY!Sy|tffZ$+^cObBMdpZutbN^PuECoa`kXb2K>zVBzw<_Fq) zU-$d^{_*|%@qt&)nVIv<%rnnC&oeX6JTqHy>n_PINs<G9rYTAL@TPx0@%--}9r!$a z((i^#&t<$Zd7o|Z8<TGd-?_=NVdM9{v+=gOJh$I=_ub!9J^yrvXQOtv=gzx5rAw<k zcYSZ|9am>%4a-Xw9jfY!Ot@}WQUBkK=MqH|Mf{(O%J6=?F0E)R-u5-_q9XB5EmFjL zRMB1HZ7a&fd)b}0hpCKjVjS>G(qfxk>Uow`_J8Y;?6yo>h9td;lqFW`r_=Cu;je?@ zJ}aCeNvRaYzy7!6vsuJK8t7Ip04X137Vm)<B}y|cNYZo>`v3N5I`@q}=|CK){8#_3 zR`1xV;$zJbJP0ppD|Paae;!F%bM?lxx2d-wfQV@O6ujTW-;jSkRCTolCLPMh2Nx=) zGP{NVA?TB&mP=FqZ|whc3RJSvJUJGyHOs!nBie<k<-z=e)r`kVud+vM0lsONB<Y9b z0<+))qcqReE=`GTutop6y*iN=`x&*3EzZknc4W?3rP&uIJaeXK<D%wvS9N4nkT;0D zPW$-+vpsE9St6ytWVaCXsHU`%GVdR^wE=Xv01fto0vp%r_OvPOWj3j{W@V_Y;fxbp zySskme5v4&(U>PA7G%%m<=|b-UJ~!-boN$bi#jT{Hcy&A=Niq?KHpr`Y-?=MzKk{I zIl-)f*v>o`q`5M7OP+gKtTfLZsOCS(qPDr~x8=!_5`6-VLD0EMY5XaI$Uqq@V-Jap zR-V}6Ja=V~*CHdz@F4Rb<?;{KZ*yd>ij_JtwPEG;g{#zT!Uq*Py$3gDv`Z2tYF|X8 zYEi!^3#I2mi!9?8K!AuX>_C;=ltI=m5eE7*@I4UZ&p}=3ho&bc^h3P|C;`K|s)PJt z@!8GLOb})@Yp*SMou>fLhC@WZw%7ar>1Sm0aW&hPm&@Wqv5z<cJW4gM&zmkfJJ+a@ zj6&r=dVrlbR^{dLe--p{MqAX8%7LY}g_XQXq&T82+UL#6!luP}xs6BE?<fb3E#r6f ze^S%+ZFw$9UEExnmrHC?k~jf28Qa}v(?%Aw6cJb9i=;f%LL7GNV)O&mRYm+WAK2)J zoc6N?AE0A$CG}^`sG(_iS>i_&0GwOEjRhPMrYB*+WA64e$@ELiFO?ay?gvgcC<n$Y z<L^1CK%h$vSZG@q;PL(x?eqG1V1nyS(*z5;SA+M!_HB5xgCaCQzioLANgKIa^30b| zP)0-wnAuW?PuhpB1D*9VD+*d7r2(|XN$tU(8-F?I^V~ojiGY&$x^&Sr^ySP^J_*UW zrARijT__0kuL5&8h*xu#MI`axM$bS5AWndQ;JM+aKJrO?BE}`X#TVcgz$PT9E&8Dq zZ6JXIg6WKy%Zx0-)XbKtWRx0n<OM3tY=>1!dbl2?B=#{!9_2$Llg!~3%n@58CG`RW z1LPlkk=p2eFSa3N`&F?g@~A1mHitQyVq0yNK4^CN8joui^5gTpuf^0f+qMtEYVL?F z$fu`~#PaZA)VQ4Amx;XbZ%EJqQT~UlXZwx7HHW!>vn=MgCVU7v0(=qWSe%!~9KS(N zgLM=3LHzO$mU+*{wx!#)wXd#auhgvU=lF&*IVnT+hZ`~0nCHPOETKA3I;S!sQ8$^{ zZcv4UbEsTEpxvZ3yazYCQD1%G)vA+(ndH~oy5$RmDNA{h9?j)8QlvdBd-|V!63d!_ zr{P-1vS(7D+|itM9Rk61MnI<ijY!Ly%7^jv=YUlg`cLmOwOJ@HClJm79G^?wO8q+) z2vf7m?6nYbY6S#*GNiuY5H+x^+G@?tJP#TL9re>+K~KhBa?C)KKh+E*p-K?e54p;H z-uNb0vkbWyR)1lbnp%G$OG`vjpo}PU*o}&pp;`PEODluTuiNcFBFmELneD_AsyG+G zkGm*r)oMJHmxrXL#=Plxfj%;6&nXBm<I#%{teK#)2aU^vKFj+G2|d8ZfX<DYT4pfZ zfo|^HD@jrnxXrnoJ(D*BEsHtwkuBFp`spvA2GpIQLK~G_Fij)vWt2{I(c2x~KW)!t zCOE{y+%GQUQ^og%kazlaaoZ=NV(uK8O?>)d`#6i)km>UtDzrb-*V{hPU&@;WB&3=+ zxL1-^s(vuM%+x$5wc!b>TMmX_2j=|8Kt*)b-4;r#_ff_ny|oEKpX@DE=!THWD9l;8 zEWjV=HO&BTAtLP*tp;IMlM0_Vn8(sUqI$?Nv_U1G^tEZC@of=jxa%BH_{Ai!MYo}y zE@)vjviC#f;TCVZ=HXtX$EDFgCrJNz+eAX#tsgc!-#{X?u;vu7>K}|6xr+Y+O$ixV zZ+D5)r){a?S581&?=jW!dQYD^njLNZDwQ49Kbq9~QJUTP@Z(p`mlCNjK7uj2dw$*y z?Fs@NOQ3Fcxb;G+-Z81QBhBuJS%CWlpf9gp&E>m+$xzI$NMcrT+APveYg4QEVhkj# zC+2qrf~MxI;{Q2Zk_`Xps%rkG7-Dkc{@y;QZ4Oz0#y`#fgd*BZP3DWK6>a+@*L<mM zcZ+wv6pXlQp*qv|N$8nGnzy|!owe_wFT`9w_5eJz=cRm7?ApYLBWTQ~Z~Xh0d`OLq zTT$CqaQsCoH<7xV;0<Sr-s;g0IvOs}L}lA&k-l0$xByYj4z~8BGDno!&c4z=oz(hi z8grx*iDYlPN`q&LaV@ehXt=Ne8MeK-x}c@DjsM$J%twl6LU~JSD&H^}!^3Q<i@!_g zv@vrzI}>D@EZXPo+Bl`5Zw>0+GLF5OFNogis^p(SM>i~SO7+N+7^b&-f@XG3hYwRL zs{rPg^&WTKXuZW1;J*Vf^E(^LEqH+VoqCH0;~Qle%pqFtZQVGjSX7wPu*PZbFwOi{ zG*lGy6QCZdX|wX?4#`^~>lfT8wQf{0k4{L2{|oR+{f=JfFn@0V9WOeR5QLU=M!U6~ zB7d(sir<zi(J(xWuRwrR^cpgzK1ceMKSTyn=7h94qQ})c3tBJ-kufbC-S8FZ{*A-+ z;wE$p2;6zcG#Z^Q=wCTDUVHvM{Uf{T%s<wYuE%Y9r%meyA9u+1R(iScdR70ky|pt% zO*{K56g<p=`;6dF!Rj_V9Z4Kex3fBWL}~ny1nH|{??HFC&$rtV!@%g$GEs~YjUt-3 zyg5y8xAoVl=3`2GjRmRwg}nzj?Kb^myE<wR3=lWy37hs;ROnh+ySnXsoC;P)_ZOlx zK7zQFs(oe^qFNu3t$Ssyg|9J2k2}y#^%uW0`}(%CH2YD#%Pcs^MniW#E!k`h>Z!)# z>Ws#2b>jJh;6zDv(pxgML&lgyPQ#zcbb!!sgpiDoqu{tG6%!Ja>nvz7KufAa>qaA# z=oV|HC9oE}Y-%~C<~B7KIy+)gcYDw!`k|a8<5gBx6?_n^Hfnl`YGk#JRXDw`Y3W5Z zF72K~Dqd=&sK!kRIocXZ$WcQ@HMx}F(UwwzM=dX^$<yW*)lApsLU0ONe1#L$wDK}< z+m`P7xi@OFy|1a`^g5Sax&QBIL?i`BM9fM)?J~l{Rc2^%VhrUz829&peWXrWCnHlz z(^x9cG-`TL;&SCcT7aJf@*!}hy(}@hIc?50YSx@pYQ~(aH5qypGnehQvcielAG{aU zX~0_@&*J%hxyYZhxenZpYC#MBj39u^sFM>J%<uNLp{5+>??vDyuV3EiM+4QdBA;io zzdv6tSFL<#t<s2TfRwNG7HQKrPlW>QrIPdbG7F+JhObn}j(kln(mY$%K{!!5k#)1E ziz+3WTCrR!=CNXVR%|-O_{kh9N!CV3M%Px+KVv3eg)|H^tUYmMQB9Bbm&lY5<g+!A z3q(W{bNLa7G-%8GR2a%BXjxsm@<>uSRpgw1Z~T#cB&t&nSAs!Ug_}|kVHMz$WCS?l zqwD<1@hy6X9b^#7A}+?pyqY#|7U^Uy<!oE$R#G6OIHC7~?928tC#m||`Rwb!vt=?X zUvCU&<zZuqgAMm)Z5TgaQb)3^o#QYflyA_|`O&KZm&VE*-qc-V@o_Xmrh)G=FTI?~ zaUiwZw;@Gy>*X6#P>C%ujL9h3=b(@6wKWGF78?2)w89yy=;G^09Q<ASzGu)Qw(X;0 z{;ohoCMo#dETWJz;bQfN@r_l;$_tKiy+f|A>y^}WR?(y1w&Cj}$@F5L2YsfEL<3pY z8Z-dF^8sAbhP4Aqi=v(obhDs>e#QftDyng66L`)T%)98HH5&8BF<Y>v2#E?5hTb_9 zH2mD~chFE=MQHmw0&)Lo6u2YqKeGV1@zG*g<1#Bwv#zb_%-_+JlMrxKd<~ir3Ze1+ zy(_eP6{~SYKhV+(S~~v~1yt)79UHaSeZ5h0^WBheRNU;+TO4|;1L|kljg`GxMRVY5 zgy-B?`L%XKbD$65%Wkaf(<V0uOoUxGf)z4#f3Kscu6N_X#60DBpQ${*$V`+W)Q3=C zVh%!IBlLCRI)r)=>P<|yYD*~1E|lWFafIgb%{TqMMK!$}&wwd`weq~AJfD%@n)sU_ zUiHfyy0+TP&cgr)(wf;G1RCO$+F-8vOp><HO7p|jNn-Q6t|xsd^WT9I=Ikc$B){h> zOt(p4nn%&aNx*RFpHZMF4f(Ufvk=7?JRPMYo=R06O@dN!hp9(J{WAdZdPL@b!%!G% zLqHJ$fo+g=B{EqW3P?d+m=J67#;*QZ08JwbS`rFm!NrD0j{xSFfN^d-(+{H;KZnVO zq>c^Kn`akV>TQ^)nUX?$=?!SjnvZ-^xEv3@Td*3+ToB$GLi`Q1f1eLu;*Pvh0=OLj zdhtFgHl&UZQ-JSB8KgFySnsCLa+gvITEM<JVb|Z0=_NNbv&@H6(`bHB@Igt@ghI@c zl*U&;NMph*gq!`YU((D;uXAEi{}>T?_A^wxGy~aKk5P9rYN}h!*-ueoBA*hw4DFOr zciPZ8^v@j#d(UsI=5c%~N>l%e$W7+;ycJQ_!+(R9k!HS|Ec90*HCfot5kX%T)t%N- zi~Jqxa4NIzB;-ca!0JvWei7b)=I>ieG+2$PYbd;x;wr_LQoMggi&;CG;F7fIhG-(% zJ!c$nrEc$qdPCdkvnu1mRQk}y|2ztlU(w@aFd)D-lsL#-NVQSwulrLY!m_|0v*K-t zB7y%f8D%CG3s<7iT|s_@7ZVu%+>P|Sc?3OwD#DH8xgHD=<f-VsApaaa9sX=8nv;#Z z`k}l%#O<|7rBhsro=L%+c2xoT1-LwYZBh#O<!BUXr-(Z|lREpYkzkpMTP0~-Q7W02 zwZh$V@M_pc5wh%Sm%o^4qt8t_^m(klPsMxqW>>+Hq9%@@@^GtBaXR79?>LQ?^WZ#C z2`ni`a{1lFpInCsiUb$05edblZ^2mnBP=hXEp>8aJojRG7BaJEcKD<{j}yzhTP#U? z=Aa#XBtim8=Gg?r4Uj`5WN-&1pw{2h8%&)Z;9p{i7uubJoO^Qd2$-{7c$u@ERF>y& zqN~6wdfjPB!z|)D^aBs!k+_=q&oG%~7!{|m@ca2}v;&KPJ2>;78Umj~@P&9JSqLha zzlFYP<2&bKzVZaVB-Mc?2YHnu!LA|`O$fbh{3s#N;_-HA4$=p_MZ|rGufc4|OmzUu z^JPvljA~1&s$+Aa<w()zNx!G<0L@dyGr)f#BOMeS6)ST`QZT9-X)BDf9E^O4EH=;B zE*o==+8m?Sfptj=P=j*yt%Pm3WkA!^$&z|GbdnQQQMu~aAXl=XRo6Mq&w=2&97(@S z($~pS2zk2aJAG=JelIfRnTs4-Gueoy6w{_W-;!`D2U;p&H9!}KX!)wyGt%13G>Z>O zBaXr}qS-H-6;8gFl+j!hB|&HG__QCH?uAZY6+qd0>UH`KS<+@;OtPgV@|*2uh0NaK zb;wtOjM^yvHpr<LUa2YUt!L-)wNxOQvg7UAl}UBoaAs>tzb)z&!{3Y1&uQu2YF0;6 z-&pJkNPw~TIeP9tMbGFy@$3@M*Ts{I=TY%&5zoVT@~P)d6APo+yaISwqj*6}fd26l zSTkcVuiyVH03~%8i#~&ZzGlPMWCA!0Gf#IJR{FI;?gP_@en$)RA<KPQ>9elZzErW? z-z!$}DeP6T*8k_BYkgYiUq~IY)=yyvyM1}}O7uIRM!^y9drD&sLd~O$*hyeu#5%<D zB|MuR{sPa&<4WTs;8UXSCjiNK>=0hc&P=2=ADrQtvtr8#<-kGZK>Z2~i+YDr(2b== zcR`DCps{r;k|OD?J&uqOeF)jSt;!F64YPom7yZ+9fQ}L6K;B(=8G8lk_6m~j6~x@z zCDMtQotu#j_2}HA-lTK8dcDqNby|73nvIwet;T0PM(}dy%>!Xa=e&Wit+N2(1_4tK zJ>Ho&@F}G;2jTj!uGD5=No4gi+tKUoGxifUO6&p|zC}*Q`Nt@!^HZd-C<VXUGE6z} zYOGW~YKVB}>-c2srIvNJB1pwv_RV7Hs}lRAC|1y*^It@P6dqcjDCIs;$|7}n{a0bN zwEnC0YEJ!ETa@VSNVnP}A=G&bfqB<!qf3&BkW{O;I*ahh!r#?-)j-(OIT_(*`<&~w z3HA5cW@%$e`m=&S$*g^tLCz@<0M`kCCyB^pUPuD`kpR{zjc?QYPNne;dVddtKfN`j zaX-DcDvf*Ty+UdHHQvTv;)Yn1ge#yte=uO|J&YiKVh)%++R_{)&I_qiSd0WOwwE}M zKLJhMY%j5@ZER5*pMVy>1mb=`bXK5zVw9e>%7YwwQE9vvGOqVjDG&Y)-L5pEZIaIC zt1d9l3jE3C<x2EN7|!Ysdg9Sts0z6xi~B92`HDn$#vVI|kHS`EJa!sEBl<X=N~|0e z#G}+#WRvWC64CQfBGXLJSBXA?#3B7;AUgP28#eff33<>jm|E(KL}PG`1?WOK18iyR zr@EEK-#D<=?b9-MKLq7qL@AMpXFN*8q(*e^0F2H-_4k1j+Inw(tI~Km%BD8|oIZZL z3U#LP!ouD_m~3*fC^b0{i;`Lh@J}(6VsVI}X;M5&;!2eyMl~<&Z4!WS0Y`~eMhmOX z*{Fz-wZUowjBH+3?(n{;&a#?E?5n&i88K>u>i%i|!DBr`8qsAZj-fVnlD&ENu7UOj zcr8tPJKsdI-m^h@@FMC~8b8KU@3}+S`I1Qgj`G7<7-#jKJJoyip1alQde8Ti=;Qd- zEqbZmLK{d(>TSv1K-&|`*$o3Y^LH_kih}8`ftlRO=24yNSd>_EospK1t)P)MNSMz5 zMFbXV!)H|iohdPqaK2TlCsdyXsw|yVJM_5R`8Fcji2AR-qupV#6XH@LR3unydzvBM z4f~1F_TbC*c}(zSLwgMXgM4Bpq**9!s9VzD=qH!e1;$?DRCY2k%qp0&7j#pf$VRk@ zJ}vAuqB{{t3Z*G@GUUh<RahMtFhwyjk)sMzr4_lDBo%wm1?Ew<pEzDWl-uxWJxW(S zme6Q9$r7u~*=q@WxCI^x)$b=M|BjXmCLRK`hJZRJi82A?y-FLA>=QH+(oZ~6)oG_G zm7oW8n-SZG)I^@nHz|$JLoI;48x87n8XKNR#<&=^F9+-;eGV0gPPh}0%>uwt*&h7^ zikjIJeH*WM^eCR-1*y{y7<3vkDAAj#<hY}|)uZNEl<988lt+1aVQ<1g!t+y1WES>P zqW!0sNgW>q8t;8)$CzynZ~LYZ=TGX#rStC(HZCa)yTB3evmPy_-~(OswN&RE!Vcqf zp@Gi}J#;B+uy|&hmNr=+9n;P-K_62nm1xV3H2SPw#e|IhbXfof`+6|7-a1piP-HwN z7^H{2zdg+^sM$1pNn(G@e>T6pEQuKCV2I4dULmNrfxpt(oApIA)u1V4mx*V)ZKf|V zchNeer}=!|H??#5LN6WbNlX_CYfykKg_THOR9^_2FTwuZg0(8r_mh$V#aE#VnGn{e zeCl;DfP%p?tggB$k@J+TKa!uwd@4m9VSVvf-3M5SiBUWMu?`fM{}^?u#Rg7oj438} zF(JrR5f9(+cj98FDW)K7zZihT$5@OwgKx%nE3=G6vK4Y@Bde<-Gp$1S)m91meo|RL zn<`b;MO(K26BC3>4jV6|nK2@IAd(jIpM#El1d*~p8E?Q^LTFiSdXY#}J?38eXq6wU zILE&{2PF4XZYiYgP2}og_GW_ZL=T`a(o6hRfQ6D1w{88ns)Va232{Fagx$LRq%S0O zl)0Az+ySZ5pA=~!CT4ui_9ihZH^Qxh#U26>6Z7Hbqn#h2z5ie)Ybiu*0bt+kjg>s@ zjA<Te+x6L%J}EKXCyl?tC*6y`SMYZff1{CJnvdz?E#UyIH1B}!gaNm%H|Bp7#ui@( z%oNtXQp6YWU}CIctPO>{aix*=UiZ)(*qFTw&sY<UCyANuK8K{sX1gzSn6XuE_vK0L zzG=hSeU~9x*zTJ}dxI>C@-?(l4s4*jzOJb5O{H-dahv}rm2DF96vkFyo8F5}t^)$F zZ(9oMi~Bo>vl1%_AO0!k4`R(0WECATr`T9CY<emo<caMP7+pC8BYll5)vw8`??*{r zQwa1doJQE+frH9%)8A24O!>DxmPlhFq~FmY!A0jT?5Z*B+?Z-mztE>vHrpWqH$Nq7 znQ$bS14=<K=P<2<wbKUBCzDz~Nwd$g_PdY~mJ)PknIrr-mL;(=XMopVX(6vP9zl!D zG8t8u=>F3%*>!CDalr@dER`@@Y?!6d@*<PA64UCJIO-D{+shmcuo$LBx>vxe+Ey;C zzAb-8pA`ZV>?nizOJLlY2g_U%w^_#AX+&7PCq<)De2EOb$F4aLln1f;?205wZvaM# zVFVXXgXYER?xJ1UNedWLbhw#43pHVVJOXQCT7oAT1xqP@drH6g1<S->K{s|^C-D8~ zII-`VG_Cp(PnuTk%;)M~Y9hy;0G87Oi^b`fGFXmJv{=-iJc*G;s){U*MNc7w4PZX$ zFG5NYGosTWBeCdAJRx94bOr)R^%*-w;fF~?jmJo-7}k16tTxu|e7FZm>vqP@h}UDJ zMb_<%9ulu7Tg2<vB$|&tC^RDTJ7N`%xTwhn&1g*%jMzDVutmMrtSTNQWXCw9mbgHc zSQk?Rq?y?(K)r~>PMX=bAQTgbqx%Agz--_|=gN^3-U*{nC`=`o*^BWB5aoD5zDc^L zbCPah$}ndW(fDOKfCnSmYs?O0|98q>)A^t1Kmi5fV)^NK<0K|?>Ztkpg{wAx87u#* zeqqFx;gPHrpt<9XQ}|ZXmRbrVBf~@9!{b|~w(2b~o%2V>(ripi+vjs*FBxfV+~`j# zwUV4ks{+SXm<c0&r6KeC5rkopzl66j6a9?+$nen{e9~GIIv0{&3jd(>d9E1#@;j=6 z)uOkr_4gLM5-{%ICcH@ey-Dse{MZBUT1zu282Bo>*21v||3a&=U&8)UQ`x`eDO#(a z$+2t;o8*GowEI!b(%StdRN6V}iP(KElBg`U#9@D{z*)%O`vf>Iabn-XiXWl4ADbAC zbxL$JvcOIfTh5KDUbfOny8snu^oxD!YWTy%94p!42i&pJ2V91~3)1fIfdSdg-sO4d z0#s^?wrun5SjhZ6>?CT{-mI^K=Fel0?4c+GlPClQ3ODjHfx<bfb!|YLTAMfm$~F|; zzUi(GI2jc0gto%WFHCQ)PbR4%le@x}%Msf$Gn>-kp8?Z8kIzIS{LZ2kPIYA1qR0t$ zn7?WzV-v+FcYYJ4Hb@syr5~l=QXFk8m(jW!<oq3}hoUN{(zpzPWU;St4WBx5kz$$J zstdZw%J~Xa)f0lN%jHF>w}53gPr_z=9*MvMv}fS8675hU*yDz=>Qxqp`&p8$PzafG z#m<%=%AZ_k$Zh6-SXSFN%1V}W(ZY$4no;C;s{g~%TEA5qZDWZ>Vk4~|HI(T3pO(1a zDly^=Z=limT__6dNkqF<O)qXlFWR+|h=Y&CAT5mkLH;f(3SopqcV`3xyoaI#cJoZI zim;&G0GtxTkTVqo4z&eA!rAH-<PNvS(l(>HhpOr_vsaOh;YYEgH_}4<XGm>}xWc;# zn?;DgBeLc+Ou7F;1!12zVqb04b$E-(L8Pvlop1dlMR<bP+lzA4QYLl#oVuz6cm(EQ z;W=YB{ik))y=}SxV~#Y-JE9cTiWGBJ8vh#n6tWyja?=(jex4Nl0ne6Hft8KlkV35y z+y&dDCbKdpJ6!*f9e$D*QZ(PwG9*?lf;3mNx%oX9!Dm#%Tj>sXK7|7O2c;w@PH!A` z$}(qT%e{);@wHLrOr+~eoF4r(b2T#R>l_%jYgt>r>5{5}aWNyvNppn~*97@Ca5!n) zRB&u!64`2fsMa0iy>Oxm@QbJ?bpB*$d`r@}3#0zCM9#0Uq@}4Awna{XqNUUrOuWc% zslzKgZj_jgN(3Qdj%SMs)!HOMgJ?$SA5m?n;P?V#d2f=I&$4o7cdM>mQ?y*xMg;gx zgc(g7CW7dRu|;*V=I(Ayq5ilg`3a_A7|!c@Ic8!~S)viH$y!IUBc2WN3Q-Bvj^$c3 z5<sx!+AtAP?XbA>`_KmLmGEEV1Gd_1d=iz5E(t<VUtR&}*5~|vF-8WPHZkV-dpSZz zp_pr!Gxc~5uY<A@^EYRi-j}!SIA#*7YuofZ0ZDU<FPT}zCJ=W74^VFOBqlYZ^z9Ct znpJI{sOCq(3^0R-^me(SFPx2e+bIFLTI}*=5Tu69@DqdIKdD`5F%49^IqMZF*38aD z71(fbhEG!8)PhF}%!TM2><dpIQPFbva~SF(6L|_oSg~2j>p!M007t}T351I#sty)U z+#Si`84w_Buz4?P3V#KB5SPf|6%DG44C5i97KEp0qBcViqnfK8ixAqFYTieA`GW(w zAaRLIV{Rh7ntx26`g<b-#gL;{Hz3<k?DQn<ll%HHt7-aNNgEa5Q|P1E;2FVHjLjkQ z`T-Xxw7Q2{9Y#SISPD$<Tbr+rbgU>ie*R0Z-#Na;r%mD}%<5Jvs_7s90pggwVaNJy z;Gz5ncB#LFXNdQ_W-sV26M91L>)3K<zv8-CZ&&nBu)9dR+1}I*&}Lh1fJ$0Sh=Bu1 zZIV!tHtTQUYHDH4Y44xZ5%^qP#jpQBOzXUV(rydFEg-4H)}rs&NhB^VDy~OgsRcp) zBQj;caunT&@|oX7tBL@ERuek?2okS5fdLs%LT$*NCE(OF3x;97gEqE-ocb9DFl2Q! zgtm63uT#EgNyte@*InzB9Z1=+&_xdqJ!aCwM~?tK*3e@^?B#m2W|4N3p`^dmSjEDp zr5EJ*DeEctDj!a93cWB2&A~*29n=53!&rXK`>HxJ|5fbYYy!?SjKig2`8l{-`R#sJ z{y|JM;N@7?!z#|5{daszTz&pedK?9JQ8F;@qU0|0D_iceAI?7tSL#Z>U6e&#kwgbP zkkbtwSlf+Cu<f@_ncfPo253+zF_re*BqkMOz=e-l@dSF=3tHNe6Mx!NOm-RZ<2n>! z2^i*I1ua#Wv>X0&z_aSn73?s&*dqlVd-T@)W9p>J$FO7ZOZr;Fjpb*IiZ0<kj-=(t z)3frtzZVEN)Zu&;5GEyyDoKyR4}t#_Nqfj|4VZ{Qpi+zi1s_y<&#G{Aa&GbPMOY+9 zMu&t)2l!LwN5#q;zBt0;6CDn2Z&SxMOE<QuqarD*i|U-p1COE7rnIv5v>VIdYQtLL z+vF=8tIkQ-iCW8@Pz=4^uQuJ=>}nca<}1w6IQAlU`d|lyHiM6o3qDTHh2A>nrl2_S zA+q^%P|?VQl|Hvwh66uk?P7j%C%U{@zVS76a{Yy?)f|yCw>|CZvLrN|l>4FS+vXAI zH~1Q@M_VFOIwyh-O%sQD3<-Z4nfz%+pMuT$dA}3f(Y)N<c#Ca<Hc{-Aj|5{d<1iXZ zo-tGXE}|+3jBfS)BafO0JZ&L^nBNGx!%&i(k|jT2v%Ep@)Id7GlWuGz+R=G5+`2DW z)a`k83dV!1XXu&z6g?+ALC@Kb)3f+dJlE~aJ}h2YFNxQLN5m`jA@Q2FOT4byiPxhK zrncaPvkrTn6K}_!eR#*Pnmk1DXa@$0c&dc34gYu3$34$Yo-f5ypTaYP)@Z5EAVe%L z79fULyzOojc5hm0T5GmFJpjT`w=@qL21F6dx9}hS>_d<iZ+bBSNLanucs{{|sq9Nu zZ%5j$dIA$Db&Ad%>KL78sm^jCQ2QJXENk|S6i>1Swe1^0VH!|z6vhVJ3d~qpZgqg? zzXJ`{qP%dJwHn(Uw4c1)+4_+yvo*He^{Zd~>O~p~F~0$D{+lmT#%8yz$>m$BosT^* z0nr20&}O%cv?bbkjJiUE8qVZG$Ol*3*xZhC4DtbUv%|~|qj@h=J~GK)1f2?6ni^AS zZU9&Mjpv%9p98c#N(mlVtgend_5~7@=MO8-+r5XkjLvWM1!50n(f5dF84tfLw0Q}( zm*9+g613dxj758q1+@iGGXVyKBgR-iD*K=c=}3jXt{(VYjZ9Vis|CbfrAYwv)gXY_ zQ4v6I3!prr+D<=J)7@%Qhu1Goo8W5RnM%bbM$r5yo02?~go2uOrV+Uka(kl)NYvB= ziJ(Qrc=R;N`2{d8IC6yuvxg}q);OGU*^kC<_2?JJZgJKx9*$a$VY4ft=wFT9f@+7O zj$`$od74}ad%Gmf_rA69AldC`VZZbwE$pF`3rQ)z)dl0=BiP1ZJ-dY$-og#)1bxSP zNgczsgfSnLVGH~D`xwSpJO32GZILW~7K4{qB>)7j@ZQ<NRquK%CdOgGwE<m;>40L* znbh<k|G`<n?<OE)VVDVMWCQ4WfcB5bU=AtqL#CZZ1^b}qlhbb~9C*-Gk;ZxAT`V0Y zybkv}y{}K37*C}jNCD~Cih>GjdU1BZa@I@C(fhvEMh*p00h0JY@9QPky)JkP4t`7= zqP*~?>!A&M*52<x2k*Th{F-zns1|+)7*@OCH45wZaE#_Jpf@pHc?`&iqX9+x9zkQ3 z#(yT{uqtVpS=@!-#!nke{xxk-Yyf0~*(t(n5msJ^!~C*MP!4Ndq{RF@00SGz1&Krf zl7x`PN^-FpYdVe!k1rrQ)O`+Ple1_!S03m=74>zWqxiQFifLao4{wB9^g%?F=gS~0 zM>_u(!b6Igk78KGX%zF_BQvo$i2dd%>Ll%S;>zYS8{}-d^88%#^8m>@n(H6JN4eBH z0j1d%dV4m1hFL&aSv{tK$Ix%EF=8gH*LA?R>-5G>76)qa5?U!q{5zOkM$(KDXRO2( zGaf}bx2|K?&R=KDobU79gq@AE{9S-_z5ubTUu>V?@OfJ|ccbj>v{^6<LJ%vN_+lT5 zs+VQoBJBbzaqyAIfg+76Ibk<ohp|+arK#>CO_g}6Xg2YP5?z6EY1!XzyS@qf0Ycyo zuOK0K^{@C^(P8ojvDHkzYo|CVWwttu893J<y#^+hB@U&rn!3T0f)?HX1<Az8=m$z; z84_P?0&WlocJb_!`cw(tn=;==vp-BaJ7}^<vkj)5GB<|@BxD3D3m20zCAX#9AzLA% zHeAJuNh-{DyURAfZT&N3>rN%fv?<X)A_D19F*sY|SK`=n3hiSh@}3UycJ4WiH(bHN zbUmqcI2E<H#I??F`i~;nm*C<{G3o5OtmefzxlK(?W9UPt^?{_R4jL<mG)z;|t{nRI z35>GnumQA32}vG6{NITX#smVXGT-f&W{?OLdm#JQzu|LRVj9_7JPjAE=2mf)a`9Ab zAy_6`@*nHK5Zl4;M_QX+{4AWn;AI>6ng`K$p?E4K0IPv1nYAu|;3Z1JysS<AUUB&Z z&@#*(cou0$s4dFTZe<VbvtnZq!)oOs{F}_@DHn%f0h22Bz;l-Xygvx=wvPbJ=czn? za4`J^1Sw++(os(-O7^h_4k30Gv1ow*3jo*yuOlp`=K1je*G1A%BvDKgg|#5YBM4&7 z6Fcw+#8`T96Shm$F-4CMRvOmRzlU3yc>^y2SSS?R4u@cwoDv##^y~sxs3TZ9P{;%d zV4{fxRJ6JmKGh2ygURWXjF~(9skC^I_ki6)F#9EEOd#ZJVmWw7$<^jN><83bny&>Y zLev|G5KaS;mcdAD^#EG;S!iW2dlFE;4^Gs>Ag}%LHh~9<rUs`{k*H`89YP}tZwN9_ z5Nb4>{Qrg)EWdHM7sD`c1JExBvYFoV>hx-(khc<7V#FIC<h0_$S~x^Q-Xqi}81h0S z`z(%QOf59lZteEL8@Cf<Egd#yUDjAzwgL0B?HFrwc{U|)Sf3nluR1}w+xceXKz4pV zDF<3R#md&RV)B~jccRiE>scXhtpKePdPzHNO}c{S>_$Md+4Z2J`3~AJd3QY$$aFIX z`~CFMe8)VB4>GIofqW${KcIdLn~0fokH)b<em8~*vP0#B*Wwcfs_7_=ve2~sD0Cwh z4X~qPqW%M5l^nSL-&NiFUsQeeSbx>K{=2Hp>_(s@oc@#bn%UH3)&+`=hYRR5kn9dZ z4t}=DW@k4MKznW507XWFA~^)<B}jO2XA!N;-9#m#*l;v`Co<_-f^MC^gCL=EAEC~D z;8WB52Ias8vj}~36ULEv*{WTgK1{L~8r$6<UY<ovHi3v~o-iID>W8V7CdN|4i6qAM z4ebxmQmUl=ftwL8iI;^*g+j63Erc38A%+wZ;C|f;g&~0xDhNPW0h~tJdNR=LCeA_F z+`OLKFu)Did$N&(XP^abKo7X0_}Qc+i1%iQ04)<N6RtU%hyow&e})9WON1!ABurbj zSe5(+yGE=FcDHWzM$lQ1Z?>CA%1Iyuqv1qukiSCW1Bc&-h@49tFbOAM`K$%MhYGq; z(=Mdb8GBlv@Exc~)FVe+e8f?}(3glDZXwD$X&-}Zr%EHufLK``s0(E{f(m10Gpv~1 zip{cOe+QoUHphy6YQ=n3>^&=1YQ<i&V&ztBzZF|mOkGKpJVOZ}R|iHdYfRoAhPD`o zCJfAjO>5Ar<~s<uzn7}5Uivr6h%|Jr#I~<T-l^66Eav$kuMl+A-Czo(;)D~h21A_* zQ`$fw6Ok*(FQ;<(B5a<J1c>h2oIp|=g`GTNh0%lGX3!tM2{;A|w$fM&6xeLy#&FBW zLg$8`qxT*s`p<kP{FI20Bq8#+h)~a(@94z@fxIM8dq{xP(RwifN@|u~OhA%2g_*aT zWO5IE*-dg3Po<1&m-?_UCn%BE66HNfnNu2R6tx5x!vsx*e~$$I3b+71-N?j8VH#)w z2u!(M#6@{R?1`9`T<@Vo{xRYha7AVO8L$Pq_Kxt1N(i1+U@-~+tM2Jnl;!>0eF79t za`&uDxqFzE1tpCq?*5dbmvA>3m(ux<kWSVVOF6@ag?XYYR>Ap^S5b0}94oOE(<En$ z!u;GijRYIYiiCzU!>x6)Op5~OTCvw2;0wtUob>WYcvweLn*2RYH5c0bU(rF-f+I~e zJ?;Jr(tMPJ0|^`4<^~5H^sJ2edjcqjt{$0)Qv~`U4^)Gz(0`5=KwY!|f-Tvtyx{Mh z>UY-HodcW0prhZm;p_foQ6+hf2l<u`8iBB-=?pz}zcz*!!uA`N$aE~WIpFqu4VnV? zo-95=e42t!iI1_GgLA`ZxTinmQW}4NG`2+6JNk^_*djq;ddC;~VR*GW0Rc<))4~;g z2LDMLdW{_CRVQa6OiuGzWHovkZVzODhQ2)jTTloaCA8|ORvPQ6bQ~a?8!NZrbl8%d z{GLVLi#U9?eL^*zV&kXaC_#%Te{Z5fKkPxRwAFGijIrd5F`k?;MzdBpU9)32kS*M< zlV`D$N30zl6+ZY?Rh9fosNJat!B{j>Ohc{B6>^iD7!8eD4O5Y*?yiCAaCS<~NYV+e zhRHr%y%HyDErVkvwwGnv>kvLO-rTR7pmo&@vJdL!n2n#~q3B!C%!r+T--lM~JvOCr zmX&ZPC4eH3zMZf!;lp@*Xt+p=5T$WG!r={2V83@`)=~Ac2U1bZXBG-lfSt0eBkU(X zBsp=58&D1u0S23U?Wx6=&4)aSdmK=~W#JVlCwwu5)X?WQ^p~LYyTw0bl>rj~{NsJV zan9z#Apbr&%YW{*w@2(R&YC`73g3c4@(;rh-7PqhhQ|>F-4+^^RuM2Fc83FigO{62 zKsg6dy~={YUOskRc7jj<O28b9t{nuDlkIVNY*KhSN~-23iv>*Ly2!btcgsodhiaaF z(Nrfzump#s%=((j!^xyq;0+K8nAcaC*^fYXVZw?9q@DMn+llsSHX>hA1Z0_%q`Njc zOeE)5^kMVbq|hXU=vWCIk%UpXI(fk9RTw<1<4v^u?B%~hoHUL1ymCKHgxQDre~Ohj z^d85?E!F&ORD%QiC617{XH)q;;lk9jDTT%DaafQPuv#zQ^bu7ATt>$hVvAy<Po&l) zQ`Ku*FQ%YzkMOr)#t!YFqg%9OjU#5@jI<-jUlJea_!hV`L^fQ}WQ@nK%X)Ym(obiW z9tIf5EK1lz(3lRSMsjd~A6sX1%pMaYPQ&yaAU|(83}~9OpspSw#gHj%|E5y|0NeO4 z0BMnlU|#@v$PWp-o#nJ_3GVAS=aUZ5qZ)f*?VA*a6EWiCUEJaA+xVr>vB7<upy=`6 zK~=->`GOD2F7$Fc8S&#d-jJr7(>HPy^SbCOY;q)zN!e7K+yM^r=h#~t3dIqrFK`n< zCWLBTQF)H?&_Q-k_@P+0N#J~Z@;EFjpJP9)yfEKg6;xihC#~Q(ZYh#;qTQRvvpOgC zSG^ZDX0R2q{XOr+jl&k`Ez`a4Y{Y_Htc?20qPHk7(ifJ`L-K^L%WiOp6rg*D1{_>^ z;NUXg%>qvs%rFQj3@McOm7u2O$gv!KdljX@JDk1*#1|Q)^fF&wE1z`!sNP{qPFaTf z#0ZxdTwg#Zrfdbr#r}<G`Ve<5>=F&}qOo#d(l#A<^XgOJ1`lz$Z!2mWEtukH0>@N` zI(+e;%#kF%0kCc1td+=iIaw0-kj`l9*ONiM1}sR^L(3Awf~$6`=uBEivRA8$iqzrk z<aa-C>a9-u``*_!e*WDSr~RP!@FuyaNORz<w6!}i45Y_!lRPR*7HIuqs^%oOKH$_z zb{PF46zPWuuqA7Z3T%rxjU{W~_pV=%l_;%~SymVo!+=B2WA+Q)ckA-Ld&J4MuhQ4z z#0D!CpC{1g1@=DyA@7N8e`Ynk*a6$Vw)ltG`_eMvWot>`6Sc*=`r{20Us4QXqV>Iz z;&Y3C+#iop{OaOZfBb%mPb_}0KmGv4hZp~d;^`>A8F6#-TI_P32pQYg!Yu)ftTa!+ z{uwgL)?fr&xw?NG0)Ol&1iAOjp@)wirFbMw2l&deh}glRfCFAZUw*gSY1d@E#p!L| zcm_?kSID*A)=jDO8Fa2`GiOs7{QWP{k8Kf8xSW{bCfJvg{t72C>gg9VcPv)3Sz9C} zl;5gO!Jmx3wfU`DDc=MRNFFc6>2FLjZiC<*AQX4gBeBNZvWlG$Ck^4`(=M~L#I3AN z=ZZQ<=V@wwITqVLe6Qc^)IUzSk%F-<@xKocdb{b77=3`+yqg}0VF#$yyXleKx(x8q zXoKPJ2;u&Px(;y0NszV3-=U>rAo$xWa9e^a16By_P?Ufn|H6y1It-12KgUIfHl8g7 z7yZFlxCZI4A1z&LR2+>jT)Pv+P|DR7H{moQ%MuKgP26LDwW#7$-B?y}iWsYUl~FnZ z&Yh<cAMow45#X>w(w`zbS;{1H%i1b)c}FNQ7L>)=Sn}GzaaLSC^e5^9@$FK?um#wU zRT`XTjfHCqTKF048dwrX9I+U57-WGxD=v+$5>fc}gsF4yLQYHNlmC*L{dfna`*0e$ zCb{(s5*8dO9s}l79%^N+q(2(!Iw+3C3*c!b_>FDg)t4Z%X0Ud1HbwY0vVlOWC{*E5 z3eo0n4Qw%kNHeLSP<Xjrsc&`JwLIo?7kg5FJXXyvo=mUd#Z%~&UM%^3YSU7AiI}?6 zy#nDMuEtV9?9IWr({HIv<>gpr!CpmYRxzSr7|bE|d>kDyr&zTu400V?93i@~t2qsu zQlCW}3*oR2#)HpV$S9^0t62TLW|dHtSP<mPkb#{nsh?XMQm>8Js`xTM1D1xmCBdoy z-*z>4Ma*#qW?WO=7MzSR%zl<E^DmkLBW{O`>C*@~NxvK`uO|k~sUb)^<dW*=e<V4W zMnQ=t!l$iy3S0)N3R;3jI{O>8sN-Zl2B*tv1_`TQb{M0;-Su;)XfE7y<nR6M6x=jd zMsw;pW;(nH<mR-d6gU$(n<pyIx4|ENB6*3R4WrC-ItvQxV1=_e&Gb8)Y-Okb)ir*A z!=Si*L3_IXq6gP!UChvafs!2U3rulz7%fv8JAno+{_v=dIT>17S>o)H#K+<TSy|~| zC=kT$JA|OiwBaas!I4Bt+5GystJDjG?Pb`c!&HqfdBA3-t-f#y#)GazRzV9~bNsz@ zU7o-9SSOq<M=lbTr>t6l1|8A9q_&_B)#U<587SO5CqrF``|^r$AT|Ktsl14$T4-ce za~hgwHO|CRs=uX)EIv93VlOk(@oBlUtTTuK7}?X?QzW7oWpH&4M<QBMyAs9Ob&q7) z`Y)q6<HT|*SY0%MtmEL)L$Cx`6ZS9!Az0NkVLiN7tm*o0I#+GXo{r9iX*eBigO7k6 zccrl9@X7B9R8__5&hcTGmC;7nA!jjaoww;G?C)bOv}pnBY5g=M=1|~Oe?83E?*ObT z1b2ullG*Kj)j=xY2n;<|0p)w>%(WrTUt>*4ewWE9BqqPRHvlmm_(No#gNRobd_evZ z+SM>R!?{Uy##0G`SS>NtvOMWMTeV@4lofmE1MY<qC1BMPZ2%DYLs?nHT^Fw+iN)6y zO;U&ZeCuExzhJ%o#%4c@+TgX3AFn#r;|o;d9u@yN^BwqvfGXDn_|p&|OiOzan_PwU zc@HMe=Kw{<2Xeve<@?Zfa<an64KvR(D2}xyR>AjOh0R^N-^_lBlDfQSmBx*rAug;L zM(!9F>Cv6v?hBwUz5vxg@PW1yw$>+*LwF9MzF;+fI$y|j@&kEp_OHE3z@WXsn_)V- z1cT&0WZgr4WI!*4bewMw`Ew>U9kx%!7N&kjj}V-y>X(;%;`=>pC^)<uSF@sRYR37a zd&m<Zu?9Cmp|#ns6Z%?jf!1SYA4a&K%d*qa`;drZW(l|!g7cp%@OKq-!8t4az*3Z) z$c&!VaOoFramws6glqKqcZ}IoLG9}PR*+c2QCZ;*Se7lD0qJJp&c6*VTy#icV=n&$ z)>E+vv_SaXhzrNC#5mlI)<GwsnRPM)D|6*Qsm-Bx_+W^(T71}sD+*G#f-=^?(m#i$ zyQ<E&V&w}T>1LbWO8cBktOV@~+J%;q{#VHtvxzI4k{34Nq7>`8CeG&fBIk9Dr`5ct zK~6Zm<0YADO5%;!e7Ysik>A=Do8LDO`g$PLn+yr{iY|f>Xin^6u{xLctmgJ!-0T90 zz=0_S+?+ba3Q)xDIRDZBo-%iA9?#>jfepC}D1a!agS&um`A-gQm~YxgqS#fm!mUIf z1#Y-|$o(QML)T$<^?Jyzf|@d`tAf1nIm+wgD$0mUuu@=y0YN4<)%$P25nPB|*Lg2) znZXxP?NbJBB0Bz-s2v;WIG+mylbh+CcOl$_c?7iv?r$W|0%qC}n6U`QDx8&7)xn4@ zR^hI!GHRT#SDD!)tH|hv%aszXr7RUPT&DILw#1A5O5yuTlnxY-xX}?3??vT-)p%30 zZu_lhR_9X0t!2}tu0z|P>_D<XS%FQ62zMjaoA7NS7q>xArfE_=?XQ3PN+99B#9u@m zbhF0mK^!`8XSQh5(aA1^o#gDuP9h}Z-No9@uSNP{)=qExvBW}zS0RP2Q3K4e&SM`O z`|Q}s%p=;l^JiHXpm4_@zPQeRVn4QVxEF9+<c*3Ku$wcM<m1D5T%K9*0YWlD&hzi% zAmaNHdzGEQU1+GM_Ml7Br`1EI#4WX0B%&_D%nb~4mM;rbR)#%y4xE{=TpkYLN=SLF zF%A7irzmD(c?9Sg1!LI;C)_WvKD;Gwmi|>Abl%@KUmcsZIkxJzE|v)=fBimO-}<`n zGQh?(Pr)ID7pdDR;zlI#?Aix~nBnFzuv8n#!uk0Q+SJ@faB2bS!%b0g!D0T(y(U)A z;T&@V_`wA$CZ7v3gHvk+44Pr2>?2Wz(<5%fWLKE?<eK;7nD<QQ*-1dm*l-(f75j{a z^@8JMP&1EV%7ae-jD5*kv1_q<Cial&>k)i6%}+2qfk<?{OE?a?RPvux;>KUvFkOzj zd*x-7CT^JH&k5#n)*O_v+Y)Y~xo*Q7K<<vy(4Mk)w(vup0x!@*e*kCD6c`Mdi7DVe zuzAFgu??Uvp8%*e&nACxxVb7n*p22@RkPx?kOjS%G(EWtH(*-^F2iqO(rH<iD!{X$ z&~DQGFh^;_u?2&huoC2T7r=Q!9LK^=UKKGZ8HF%CwUt?Zvx7eS?~*@*c6G#ATa+ri zU9-vd@=J0zz|2DdLY?=a0KVjPEH!5Gh2pguF6;^Tq~AwiyZ~vIldHIH1dD*Dh%jL! zW3q_Shm+ZLJfYF~I(i#=52(P+>UQXlQ0EIsO1kwbQM&F^EDHr0nh^tqwh)D2B7?_n zilAi&`QQE=G)hu@5lxJ9;K%_k0oJMH<2)NCd6<`o@)-0kXC=MmSfHk`cDiQkG`}$q z6y~3x0xU+5+li9FoOHubIR>^gcpbyJc)-h;taj85W;S(+Ri@{gWqvXhWtv(Cf0>$e z$lbp%!;Bqs(+)|yc1RbX^k5a#NV3>Jpjg%eryF=Q*T`t}QyBQb7ImkwPZNC^B_zF( zX9T(9EIyHg$#JkFe-8TyIOC_SA3Sie8c8r`C00{j8cFzr7LXdYIx2CGz~tKqz*{(& zWQ18k{xfpq06{0AH#WZ!<c#9H1ZDO2H;*II#%JQ$xeYyx{G<64#0HT$euNgO*ceY7 z7y1~}VN77XuWg<l=_ok9f}Fx#n{xSI0VW)4t)jVxIB1AT<b1e;yP&|nq$>(Di9HWr zfsSP->B2i6qq!$mQ&>m2y&rCJ<(~y}+y7L>SNvLN4Kb7IUjt@^Au7Aq<MG`iZu{ZH z2pnq44>)mgC1zF|GxQc*KD;q8ux7+CO`gv4T{Ko#v%dU$!4bW!U*Im9JC8WPF|nPt zQeq*D8N(MD6*w)9sp$!PsEXxY%SOT9ngx4}<vnn*#_-mC(59)aUpa2lznZt%9+`J5 zyV>ErS=JWN_Ex?Am1omf_Ueg5Y;lU?{E5k{_LcT!Xj6f}<gtm|*i9V+Umo2@ekb^d zRfaq{<banNtCHDD2Yj9E73Yjw9kimtbD0cBDWF9=8AEEV>Cr#788zpWDC|YJ$FPUh z^t4`dMCO4fZ?5%zxH*M=Xos;&<U)4uJ4kuQ`#w&Lz%TzEhxZ;?^Bxd5U-WDm!(Kb_ z`T2JytH5`$-Jwk;q^?bji{0EI(x0=irB4Fidw?cNk=Y^#T?r^kWQ$~Di3}pcCmQQZ z>_9=AzOOXaqY@0rG3PNB0<=u~L&(1bPZ>||5?Nc*401J9D1EI>2oMpc)z>K!eDq!w zWId4pJ{e<0SWvfgUui~8;tB!e0$GPZg&c_gjv992vsk0RI|H+_UL(yYoe9_aE)!P2 zv-rMyo0xoC1|XKT4GhI*zXTBuOFl_z{YbHwJAY4ehpI{}P{enUC0TYxKo(J)Q?)+o zPc%`NTIC|Oue`(pD0kK0TOw&0`Wi={NYS^#1LF=-92g$o5lI*&2ldDrAOR~9u{q%g zHfPzy@A-#gi$|QPjFr2w<?`2jkQMWBoRAlw-c*9!?9lI$-9kF{sMI1@eJI^1ruGT@ z;O?ymVf9Ak!{CA4xLLTH_PZ@^cu`O-16q>Q84g3yg;!hkRLbSDa_teq*X_0o`0%0m z(D0WWy)eqKb)m*1j<Dnr#%mW{2Y3?YVW$p7jx;yB2CAXfCVr+bkxkrxwcTN+5@M{( zg()+`mF4~RVsHSP4@)__$AvX#!ftOV!DV6>SlgW~LW&z_k`#mg{XMrDKH2a&a2oX{ z?OepcE{Zi*>!*tSUT2tkG>HrbRGDl&kD=FMKan;-2`q;f|CSQ=YW`cTolfk)%-73% zOugw0wkplou3o$h7v3;b#eKb96b(4y^&A0;q|(}Mk@gyv)|f}9l4nS4sS|gb8}sGZ zO$f-we22dF=cU4(<fWezzciPXG#~D3ZEQhTH7zN@@vE&4!D0}}&(0s89FQ3<+wWh2 zVdX6dA(kF4EIgd--TX>uv@xxpDeTp6XtZ-|X)jLLEb@LC+g8-eCK(kjtbdgsE(c=x zl>sG62d=SkaaMWIix5;#>jejNV2^%b-sZH(ybzhoS3A6`Wv#^0Zx=k9#*sAk#1`9x zg4;z3?lMvrV-u6~Rw%f^kB{!61`g42OJ$U1K-n#IupP2-FDB}){5NeCy=0G3e)uGy z={N<B)R>N?vBlS7%Ty@Y)vV@REcc>O<AQ>u{538kBpWw7NTb{=<LM2_T6Oc{bZC)L zq(#yly6M@JTVFSdw8&dS^uyR#>8?`tR>C8`xnfJdp*$J|(n#)?bC)n}^~OrC!yU@T zVjJ$LMG6d0#)4j>^tztTIUpTYdxdx@G1@zaF24f)0ZVMg&AqWz1-(pjwe~rdVDvzO z-Y1$=+YR3lC0b8S)_Uo4{|6AqyL4bc>7xPVO$-}qT0gyq4-P0x#DF5ce2dr^P(bf3 zLfLMSQ7Y+M4K~wW!@_5v!isY-=a=kWA|<&cgT6Q8DJMrZkTtDeIj1>vAOx}s<@_d1 zY3fgWLCU#Eko8R>E54!e9Ya3e>xd=Ex?~7h{Vv09l;-qeraP3u-MfVXsF0zO?5U(` z^wu%@M_m}8!JSo$^b4L~bzP?Zrg`FXy`slVWP$DUSIvU%6Q9vAoh9_%dzcqgIhc3q z@}8-EneS@D^fouVF}x=?a_>oP2b(|z{}(Xt0p>kzWdchg+-o<OvkN(|P3FwF<lB22 zyO1NBKMo%ib`td@_oFgWXoh+tY|tTgv&*ot5|>_Rs(&#i2qa5f%mtOBe}#Du+bI~2 zZQE5kwSsVd3kSKe_+S=4mY1@k{<aLq^{eck8$o<nH4>kaw)wW?FWyyJU`~A#Uh`JL zC^X_(4ZV3}Ve|;}X2m&n%LNA;mXCSQmr4GExNpatrWV`RjbtrmH#xjF$=WK&l8~Uf z%h+2a;JvYJh2Tb`=FHSpO{E6@`V_5zRh+@VKRGio1JYxG?G!_z1wDCepMo4(CV&7s z`DRCQqR@kSWcGcBajydvvhR~(P#Uo<28GnmnK#J>04fQ<sFag<)mogH+1CoLYyy|o zO|7rXl(bC2dXSngGQ4b%NqaN4HI>q&0U%j}44QEt&ADPPS*R}Q5R;-4pJ&_vMFtyk zrZLP|Jc5KCx=`z~A0xR&(sdB)b8L9*UYju&w&ii&2{g`v+?Z>L$%2-yPopGKtA-p~ z;230bvKz@5dvT^1>y%u+_W<l3^e=f2Mls@;H)pmb7U23pUA+On5dz<tAUnwqO(&O) z-@Zf#i4(X+NvB)D>QYe>n7J$$!|t#Ef3ua=4%>5a07wiT;uz~;TG0K3O2$tJV2_vX z<wi&2hY;episL$buxb~G@ZaqhD9~<#ldeEiom3dk^8G6S+k*UG9;YhmdV^wDdg$7i zYy^q7QGAe}CLn77-*<W(mN11dQ4Jo=z_kM~9U9SD@Xs>#7K-OgJc~4!Fa~$Rwt#y= zF6U1H87y3Xh*#3CI2x7k(E~Vk9snp7+t@me<EoX|EbEe$H0wtN?D6Imc_|+py=d&6 zj^djhyByE@i@0gE{-RBri9zW6G1^nOjL$=fz-T6)`i-i71%jhTI!jOwE`RW-Bj^%d z%Yt+}P64AEXd&~?XJ{}vyFCWMXKCG~>5h7(aTg*yL6&#lde}D0-LYscFo1b8z|zcF z=|;?hsF~e?nGj`O19-rRR8?-oQH20f%<NP6&K?ug5(Qv)GCBu2ah-tjzyi?Sh?XMS z9HsW*V!r5iAj8d>OtiY71;1!Qdm~Y*3>VqQ^{u$;DZ4o^t7-YUri#DQ%{Ta|6WoB5 zxLG;S8sP7q5sguAWHG8U|22CBHi~@S!^#6sqF}&AeMrZ`dk&Zq6H$0jS-0Vpm;#Z+ zcx--IKv>!jfr&Y2#0&%?sklR_61Kw_6;z39&4@0^+?Ey5au8UB3~=lbtqs83eJ;SF z)RjyE`7FmCBHR@KW1?ynBSx~f7VRYh8Bt;`WoI_N>-(ww67EL?3k{SB9EKFy?mw4x zNx?^9tJ3#VQ8s1gTZouZD&G|43Onx{_?OH{(IzV|6cij;r}u%>ttBP8Kqkf5OYO6| zISIJT6lr|gG%SPHc?BhvXqf5|g{CC&RIk7#ECEA&=RJ8tfxQ9`YMF%%j;<Do`jq=G ze2umI<@nBqH;=NgY`R66#fBTDN@3@4d?+|VEC5ypf4&UvVwMz&jsV9+X(J}dT@~Oi z53=C$Bf&{5MugCxBwmy91#iTn<%oDIT$_s6!}Qe@UDZ5te*IU&@WTayTJ2Jn&teRm zFth><`>7BU4v{$McG4;(AIJV;(HTe&fO)7~OG*a2d4a%}AZ&tG-Zo|DjUtVz&KE6# zK|;BIG0N`r;EN>~5P2nf3=J!yCRHGPut|i6{v_r9R+Gxu!{V#em&ywx=g(iKqgkVM z(X5n6*2;B8j?bryHm4+C>kOCA*C2SNkJ`8Qf8M@-qM=t%V6c6+iZsGwNc-kd`+WE! z8nlf-V&7^A$!Ylo)2yZLnPasDjj-({Nc)?jDY)r}+F)<D33;)eXo0=mYQa-bdmCRa z=ne+M%d@bkiFLt#Ss9B_x%sW)p2z@e4Ftn<G%hK)C-EygjXy~WndnZ|mfs$THO{8Y z|44vUr+qI0dOzIpTEc1V6Ih&&lvS2sTdlVQTJ-TS&>%4nEEA)w^m7O1UQ$=)%zlP} zONt<-{v=5uc!5Ob((?8FlqPBG_5A`yy(*GgTO=eDzcw)%Cfejy)<gu2nTdHx>77Ex z+r+g=xe)r^2ZO8N!1}^*V(pyA-+7+$=YkacLj-k?*razdfk?h!qSY%gODK4wmWO{X zPPn<koQ7)-a9ZSJ(``KerInZeKokeNC>0|XuNcVV1N(22`Mm(ZQJ2*NaMqCiDU9+M z!*Ep){R&PjSKN&TXB%-Z8Ou}-EWXyEe`Hf%4)7vUG#K5Py}NWKF4h=LWVJ4`xw?l+ zf$Qz*#Ax1&B9oMHh)QX0(Qh&(3~9y?#uxFkLpqg8m&eFGXqyws$+nH+za1!u+Vt<p z3G-sxK%2(#9}NHq10x@oY|K%sF>@|$jDp4t7maBT@by!vG1&J_?=DS4W3Hu<x?>6w zu^D>0gT`DfGs$gel^vGnqMFm{Sbi<)U=^ovM}T{v_J7pCAK<HK;4i5rYraFfgY*j$ zGNyO$V3#gw78UcBTEs20XoQTC*g71?|MMF#H(D_Gc^3R00hwTMkv3e;yLj+XLh4+s z%q$AYYHm69mA4F2o_BSZ4x8Y>-2wQGBXnZ^mrGc?bvo8MSvz1spgD`Uk!U$&1RXiB ziRLDk1WeoL$6{zZ(?vgjfdRksQ|J|JABy`ECh`m*He~nmN52(q!R-kxq=%5#(KIn} zL~My()Fw7f<R<|!B!jiL=kA;iaIxQchU-5gPQZSrtYPQET@3_-e9tiO_aRp&{Z^HZ zJHTlb-mWRlN|Wqch>H;>;rMA{+(1;m2|oZ);nqGU6zokoKJN)7dKi3EIEij9ciXht zv8{BCA-qf{#{6gCkKc>mtqAa$FGGaMK#t4K@nbN(oBm8cIMe$S7UyjwVs!oZt(d7| zb7u36v2AI6Mx7gFOt#8!i!#n&PTXIHyGV1R3^>@om0y9&buceznv`%ftx7WsYkJ68 z{~S5%M*=IvZ_I!|FZ|~vJF-4R!5u?^u^+US9nODKzmT%6BDOV&Lb4ea3U_`R1vJAA zm;KzPN&FU+$qq-ZTw&O#+%e=Ff|CJ>;X`W~@D#>A8Uzz08Hu~S8w&sUN9<g|BW^3$ zeDDWS+=KJ@svzxwe_1r4kyb#3RaN9WA71+znNrbv@VxF4Ql`pAF@Yqq`}ct17!psV zq!f@EJ-2-d-LBzxEh@}WWgmXVs9Qe*)^O*ymV5o~I-Ae%yLS^jyf&1^XHYoC{>CSW zMaZFqcBaJ7AbD{0QyR{S8-5R)eFl}o|Dq<3+(O(~@Q@@qUI8rpFf@<leWElzh=lDW z)_%r$l)v$YSm`{uSi+of%P9Ush&DTfJ?-4M^g7PABt~Gr2|w`?LQ+OtA{xQo2$vMn zALoi-m~Whm0>R7YtXnVW*CkLFO;bNc&1^Q&q^imS5H5D_u)|n@dtbATexLU{scQ8K z{0foM_$;z`D{_?w{|y0C%Z20&&Dpt&zQ4BJpWKci^kI?7NTNTQzcmF_o`V!e;%S6F zJS-FAa39pi-)sRKso=2>!1=<ZMWAmv04DozN>vs8dX%H8Dv@R(LV%#G#~Sxxe+^nk zsF9cd2PUF0g@!sqqHC~&(nUH^^o|=R5a~Cl2D*y$vd2Tp+J6RX39$y8jC@|dM``>3 zErhERybREN)Ngz)K(XBinxhZ?z-DtnP*59RErJ3Uc=n_hba%dh+}n%wo{lYr=q9UE zNAnjagDSo7TKZ!=T~H-1s4|QE+%D-??CRk+dI9(x8jC{;Ek6>v6A|<R6a@NsXpOjc zKQRr&fnN?f3iknkINBK=n}q6c-%%H^KL6qP?y1PmW4)*>F|MDKC@eYBn%UGK26~-S zGl-TwzX2rlBrtR0_pr!G^)Di+J$6S2j0<80!7u-pfeRop27#nBXiP?;sZB=^zi}n7 zAr7(_6R7j)KmsR<{*jkNW#yot?{0$VS<-$1guRjcj<CrZ6tWJlryd|on$(z0fQeZ{ z#GL%UL}IEaM9A-3=oFIQINm~jIRZj{bHEhoLVj}w<<~><>k{(o9F*Uje);_sb@7}A zvkP7}TkuPvgR*;^=>84a4Ul{9rG1P|boI`dV;+7?wu*naOZ0FxRS61_^r9v-4);#E zY5N&2uGCzxSQS4)W<PLwLM!Md;Sk7!y>sa|*9KaGF6Q$mfW3*gX-Hq_MK4Yyrgnj; zodHzA?*st-l3xx)@D%p)2KtC<gxqJJBc|xVR~(!A<Ufcb;;}o<40QkWhyFqLPeCF& zUUWY=@zTB@-A65jP50X#GBh0^|NI6BAud|sn^B*+S>|_(x0A0EZx^o>Z#NH$cMe}d z@9X(O5%utS;+@BD5bx>y8u6aNFBk8be3E$2;$y@+mn-63$kWAp4mbZdVdyhA`}jEo z&CR9!jChyx)8f6DpAzo?|ATnn!e1Bf75tERui`I>_Zt43c(3Kph<BJjA>QlxqvE}R zKP28N-znZ(d82r5<J<5i6rQgKm+`wP_4!5$-Y$Yo6kH*K<Oj|xM39s+Um$`HQSb&4 ze1w8CM39`j_+$}$oPwi8@CgcLir`Zeln~Sp%^0}xQgn(so27YE#mx!O1AoLmInKr6 z*Vh))T?$BfO{8pwKTANQ1o?}U@{K~a<KP~y*G%U5iB*cro4O*I617s?-qcmelucGj zjyH8pGUYZaCD)s}Hkq>2O7VD8!^xClk+M0@JA1uI3G#eO>Bk1M4dD+9c}&Na7W~x4 z^W9I2X`?aIn(tqUC}u^N3E@Iznw~oF3u^DPqlM#C$AYCAxt@OBJiKYxf-=kv?Mt<@ z@X&POMyy+@81d_RUncfmaw-S2oM7@C!T;0Vxd290UW<AsGbBR@%pgI-dk|0*#3&CF z0ydEZf)W@AB&3QG$zT#g5|h1oSON(XY?3jR+SaPa(~79Ix3<SVL~XStKodZUAXZU1 z6_itV&TupyBg7h+`>lV^B$Ei%bK85*z2}~RmA&`>e*f!VYyE3s2}W2t*mRDL+r|C9 z-BHe;*vF%45dPr)Anr&THpVEgmMG^A`}nF4xLvr{9lmX$=(*rPy-;UNcrz=pvd2^n zSL)zXy(+bgPpeXY3}em*(8-p1R3Xtv6xu5|ZyY%94b*Ei^$HB@{&Xygz<DtdNR|Bx zU*#HVe2GU;&gE_E8LA+eOC;w|J8TKbaD*ED<(~3Q?p?lTe-tiXQn=BF(db8%VEA10 zqjfj*F!LkAhBIjH)zBdUP6W@y^tR*dZX2T-g?7<1ql_su>SZ$vqKpY~r}R<HrfX(; zv@s0F!7~eNh70}%wqxT?8Hk-Aw7+e{t|KRWyQ21--OY-m>4}Ze^cBgxPX`g{_}Sgj z;{Nz*KOU0)AzWJ|{oj-ROTOmlKz&%Al>X0?;}_&#p&K`I^QR^C95bfVxkWI_+D`>} zt>jK%J**<`M(5?Cj?edJXX?3IZ!;XX-nOD`GBoXw3DKcgA;t75cZw>n{P>CB`0p+K zcAB=$-}-B*tgp>p$pu-PZ65}AingU;cc-aP{CS#uZd=cv$ANvoIBDKk^!U`zi)x%3 zO}h2-qJ1qkU#m*}V0Y?_%kHo$RFtnJ+SeK_Wq7hX)HW*&_EV*V7;VM3zT1~HZlWN` zKoT$!a07{e3vdAbjBlN4$hhwmPm`y~^EA)XJllD;^X%Z+!LyTRCr|jI_jNVdg@vQp z+HIYo=I{rl(xt$9;9f}^>G<1FMlUsve79;Ja*=r%*&;MYIBb)C4ZNt7u23h8@9Bhr zpMU&B7x}i|PcFf;Z_?6_@=99aKKaz@lS$Gi9h8L-5_p@PKNA5D&^XsN?nwPSo9_eF zdLOFR`$a_3QnpZ-p1%4Z+V`RAh5Cq)+akhI18NxRvkz>(52a_FTXLDI5iv;namw&C z@GIa&U@veGcnx?Tpsh#J)+2c)@=WBJz%zlTizmXO--_pnfa<p#Jh7_%Ejv$?=tuUA z)kfNP=x-nqm<)v5m~zts5q+V)scl3*SYa%;UVRsyY&^f(dg~9Wg%*hhYoYxJLPx|( zyLhoMjaZk#yErH2VR^I5Oc=}*dj)i^)fj9R?+BBm{H^{s0yly{HDz~!Ux|pkc2Z$% z1RP@FrXY0vJ?72C$q&4u)bxi8Qd?B9Ca7OE?$5#PV6w{Px{`#Vi9)<uL<~64Vi^(j z{uYI9q^XIkTQmRVvF<Xo_+M{3%rxjjqI;bXkmz3Q4rr0+GWcdg2<-cE5*?hX?^y|a zqfY`hD*@Qy{@sC_J!XYVj#E8^JW#)$6NdR?h5ES~Q24v-L}0jiRd;IUbd|m@`?%7u z6(;G$QxmlO`j?$B?<asFdi_+gu!vrk9Xus%V-9;<P?BsUUWAe`&^JHc(VCtp0y2TY zeAt`P6Y#=GR%|4Dd<7_0j*6g0ai8LLgtLVQ?wh@h^8|OQoLjkV2~~lc!NH-AC`?#X zU|h*U9a4eO@iBK&tYdZpu4wu|m>#>Dr^J1SBolnyV}9RqJggkQ8*<!YIsQsHJ{WRb zgJb@VNBN=_2}O@s$$QLY%KZ`Cx62<emqjU~B$z(WWBwA);B@&y$NiHMQgn5k(I+F| zI8mJ<hBak(E-pc6{WR<^Pw)*Ak2!-5dZT}BHcjN#0x8?2T%?<Xk}*kwAQMDuPZuvE zw@dl(9O5zOhCDeQbSZ!Ie&K0O3AuB8krRwMKM+9f&4QPNZX(e^a(m;@#?jE0HlaPi zW+ZISaC3N@s2&Xi)yD|)B3QYRyw`_+s75N(T97zMx>+(SQV0ZRd4+J6-wAV;j}bDG zv%Io9W*{f53OE^I*<~OQmV|J^>++U~gs?uqU)AONpuecLv!SalJPu)+X(BJ{f_@Sb zzO^&8k<xE5KP7$i;fRz0N(t@exF<=CJE`V<4f3LJpW4$C*_V3`wrBcn122ur<%VUP zIaNq$X58;#VsVx&x!8>7HQx#X)yd+Fi7lCizq9=a15F?HhL8a-u~!iV24Y#T^QU!{ zzy%a@KNyVRv@S+2W^M_82|+%>&P54kmL$+nE{9_yh&RjZ#d!=%aOw5)#$eD|pOKzl zro`tR4>7@@#^heAX)EMxiF)EM$opT5EPsMOt83~$^A}r{yuZuunYhI78Nb9#po4sS z9bXXlmrD%Xd|2k;BD{-CLiQf4p4jVY!aTfX$$?N4<?e#qS_tYheH+J5#sp=mK7R7r ztGKn`kN;%@_T%N+!p2{6Z{ZT_-a^JN9p-#lPvqq`UINcau?sDe5S*&13s<cQ{V=h> z@HW_`44C#^9PeKepR(9t^ix+E_T()7&373PfdQcx5<zy$(J;r}aA*9o#h&H)EAnsV zhC=XgnA)F!bh*%4PMgox2{FJ0W+`hvSAozyW=uAZJkndnBcE@U`kLxa(bQrQg(0>d zW6?^fPSE2)<fAw4=kNH<ShYBv(>R)C9OLM|7oMi*QJXFi0yOtBOB^24%Q{IIMghjK zzr7ECJkUUM1NN;M!~Gh^%nP*Ee0G%)<I7Hr4j}e0$*|!FWfgkly*H7k&|m6qP%q=1 z_oeUxSLDi?&yt{SW+p(3hn&+GJ8M1G+LtRQhd7PJkL8Ms*1k@cF@)g8AQj3!Yq?>c zCt3Vlio;UG%JAx0$gewJc0L!s@JzE^cQ}9hvac;EFoH{5<fmWL_;O8KLCvSba9?Nh zwYh!G`%|+Ms)kW$2NydlFE{L|2iA_|)2@vFqJ=tf5!QCxN`EmbmE&cz2;9sCKj%NK zNU*&L(?_cAXF>-zKgHecr=pD6z7x@U|5~UW$gZvHPc0`w^<R6LnFJT&OlD$KtHz+$ zU>an11p`i85cF8iVrFY$?WJRB(CCI_ao25US9JC2K$r@F#Bi9TUS4RZ?!KMRv9o(o zPU$Cx$&J{e^&=Q?X!rREbDV+EOBaQpQGbW?%0`C$h0ZJXAAtLYapTDIO5#5%+&Dq} z!I2;2bK6AzECtpB-Di+5JFiIU;IrLf&wpM~Ww_vZC6vZz<Y@vYfMdX6U>~pxcpd=9 z{X3jjBr|_dDm@aI2+R_f|Ly0MM}H{!s`HA6*9)9i9;YmFq9Me#U-5nn(D(?SG0uBl zk<ef5yrR+#r`3(sf7y8@l=f1xxCJN#N&y|%2-E@J2k4u>!+AwA^9P^d@AJSu;JCPi z`{r*suPE$5&KG&P=1Z_&gjTD2wu{9r-#M_eGc`i>i!uiI&P5v|&!lC*8wa(xpP(gC zDA#L{I2=Uuk-28IymRPqfSIt[c}i<OXTz6k>I#RErv3nvcIClH@!{vM)zJ_weD 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 diff --git a/venv/lib/python2.7/site-packages/setuptools/cli-64.exe b/venv/lib/python2.7/site-packages/setuptools/cli-64.exe deleted file mode 100644 index 675e6bf3743f3d3011c238657e7128ee9960ef7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 74752 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 &sjKl@1{;unAiW2w^OujNoW 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 diff --git a/venv/lib/python2.7/site-packages/setuptools/cli.exe b/venv/lib/python2.7/site-packages/setuptools/cli.exe deleted file mode 100644 index b1487b7819e7286577a043c7726fbe0ca1543083..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65536 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[c}i<OXTz6k>I#RErv3nvcIClH@!{vM)zJ_weD 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 diff --git a/venv/lib/python2.7/site-packages/setuptools/command/__init__.py b/venv/lib/python2.7/site-packages/setuptools/command/__init__.py deleted file mode 100644 index fe619e2..0000000 --- a/venv/lib/python2.7/site-packages/setuptools/command/__init__.py +++ /dev/null @@ -1,18 +0,0 @@ -__all__ = [ - 'alias', 'bdist_egg', 'bdist_rpm', 'build_ext', 'build_py', 'develop', - 'easy_install', 'egg_info', 'install', 'install_lib', 'rotate', 'saveopts', - 'sdist', 'setopt', 'test', 'install_egg_info', 'install_scripts', - 'register', 'bdist_wininst', 'upload_docs', 'upload', 'build_clib', - 'dist_info', -] - -from distutils.command.bdist import bdist -import sys - -from setuptools.command import install_scripts - -if 'egg' not in bdist.format_commands: - bdist.format_command['egg'] = ('bdist_egg', "Python .egg file") - bdist.format_commands.append('egg') - -del bdist, sys diff --git a/venv/lib/python2.7/site-packages/setuptools/command/__init__.pyc b/venv/lib/python2.7/site-packages/setuptools/command/__init__.pyc deleted file mode 100644 index 3095c2774c2fa8b5ada134deb8f65f6a2042fa1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 936 zcmZuv+invv5S`uJnlv|3Xebe=j}cO{tw0e-72*d#Rp2QVvNjnfxb<GJCu!0*#J}*& zzwrSub^?h6&SrMb%<P%tu?s&NwdY@(pQf-~U4Fmizx}}m`3V3+zye?qumo5JtN<PW zRsm~(hk$j!24EAg1=t3B0N4RM0(=Pg2=Ex@T^KV@7w|FY0Fn^KAp{PefG)t8so8%5 zx(G=L#wE`6K!$KrhT965?|@G|<hDJy+$3&TKo7nJ5TpRtAzU-b34G{3W6@M%6KfS) zs<JmhWl6~Sd=HsC*`S5eDCCOhz*Tybuc^WS<x=V_r#kyGwrinMOR?6zlGzx~GGF;8 zambZhUuZR<GGmibOwxa2<E3Oi>*ZM|%2!xP9Hk-`ljK-?kL7Qh)?Uy~jdC<jv5|A; zk%k%!HXFTDsS`m?%_7%Xi~_T%^}RNjYOdJtb?S7wA^91(9jRZu`T>W$PS5$?<B?NF z1vV_pI&ih7&slmpV0=1LTJ}Q@j@-BZPrF8bVnXmBg&=p=T;~NTZ3ojVN#Ya-zURp0 zd^fwc)N!1W7CB|vu5zQu&1ROFBqp(Cu+;n~=Jy}xxlFOoN!S^?U>M~_E%~IPWo)8Z zrcoLj-LInc3o}XYZZC#k((|EtIh?+-tJipM&UwxA=wp<t{A_#ZXLRvyF0P`T(0zBS sEfRcj6bUild*+VtGRbhE<r_CUd(5U2bb=QDs)cq?58GiYXaq;$Z?(MbxBvhE diff --git a/venv/lib/python2.7/site-packages/setuptools/command/alias.py b/venv/lib/python2.7/site-packages/setuptools/command/alias.py deleted file mode 100644 index 4532b1c..0000000 --- a/venv/lib/python2.7/site-packages/setuptools/command/alias.py +++ /dev/null @@ -1,80 +0,0 @@ -from distutils.errors import DistutilsOptionError - -from setuptools.extern.six.moves import map - -from setuptools.command.setopt import edit_config, option_base, config_file - - -def shquote(arg): - """Quote an argument for later parsing by shlex.split()""" - for c in '"', "'", "\\", "#": - if c in arg: - return repr(arg) - if arg.split() != [arg]: - return repr(arg) - return arg - - -class alias(option_base): - """Define a shortcut that invokes one or more commands""" - - description = "define a shortcut to invoke one or more commands" - command_consumes_arguments = True - - user_options = [ - ('remove', 'r', 'remove (unset) the alias'), - ] + option_base.user_options - - boolean_options = option_base.boolean_options + ['remove'] - - def initialize_options(self): - option_base.initialize_options(self) - self.args = None - self.remove = None - - def finalize_options(self): - option_base.finalize_options(self) - if self.remove and len(self.args) != 1: - raise DistutilsOptionError( - "Must specify exactly one argument (the alias name) when " - "using --remove" - ) - - def run(self): - aliases = self.distribution.get_option_dict('aliases') - - if not self.args: - print("Command Aliases") - print("---------------") - for alias in aliases: - print("setup.py alias", format_alias(alias, aliases)) - return - - elif len(self.args) == 1: - alias, = self.args - if self.remove: - command = None - elif alias in aliases: - print("setup.py alias", format_alias(alias, aliases)) - return - else: - print("No alias definition found for %r" % alias) - return - else: - alias = self.args[0] - command = ' '.join(map(shquote, self.args[1:])) - - edit_config(self.filename, {'aliases': {alias: command}}, self.dry_run) - - -def format_alias(name, aliases): - source, command = aliases[name] - if source == config_file('global'): - source = '--global-config ' - elif source == config_file('user'): - source = '--user-config ' - elif source == config_file('local'): - source = '' - else: - source = '--filename=%r' % source - return source + name + ' ' + command diff --git a/venv/lib/python2.7/site-packages/setuptools/command/alias.pyc b/venv/lib/python2.7/site-packages/setuptools/command/alias.pyc deleted file mode 100644 index 5b34b05406dda2c9676808d2a0e2f37bb1ccbde7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3482 zcmc&$|85gU5S}~#NE`@FDG;EjoS?L(;1~po+NwpgP+C<YZ7)=)5y-mu*2yL3J7;$d z357o>yh<OT57cMq1GL{aX9p0d|K{u)&+hE5XJ@|oc5DC4&wcj%$iu!&o*I5{;&q!4 zDZYW^BEvw|0twg-B@bm-leJpau1Q{(VMEp$GHl9PQ-(9LHUnE-UW%;EO4<<9ltCbA zlRYm)ep_ovI-}+}NoQrX-NK(`|Ke!}(EKro+nMuYpXKhSk<ZHFJ8Mf@S?S_18MXQA z4?&nT^Sypq46+SvmpY@jo;aiJ%G4WVx#@HL5N{ptExhhWh~1Cr<?V-O<XIq3@fF!_ zik%TJ)L#U$x-%p9p>74-0F;eDwrgVVyfy^AtL-M&ybkfpxb!AUiYT!g<Dn^hG$?J9 zC*Ig-lvtM)8`1h+<Ti7&yW~cB=GzxNy*sD!Q%C)Q>gU_^Hf~Vp`f7@2&~9@to@Q%C z)^kX;mi9A3_<LQX-$p}JI18;ive_ee(|wfK?x4(5V_o;jZg=mRT`wMQUtQiQt}NT@ z%l*&Y?icA3dj-$NsC%zF%0`{6a6ZZNj=y?$qxW+caUPF+S?2C_wO<a0Ns)GwJWJft zXwTDOx4FZ>%u+oJA>n**I5-j<59R`OUq|<8;lmw#i`V@MVSp#V2r?utfk0Cy?f@aA z10dU)kwsvS8gLh~cd<g?OH2aj6oG31U4_0w5?9!B*RcF;Gsp_03^^&S?~i@tHxnOa z#iMfDxTu5;861|@M3b#KcLnp(x963US?`?WnL}%a<s+k+vF_x4N7Nn{h~`E7H9TS9 z6tPp(-oik49s<Aw6f119ETQ#k3=Ne!l~pa4mA0aWVf05KvLf>t)_r1nRh2je&k8oD z3ee)>BN$kfS{<4*`QX5@6EDD%kLV49C&7Hs3f_*)4Vd1D45G0Wiv3c2jgi@^vz7rJ zmM%I0osd0$1X3v5ttzRkWQ@1F195lkeB?%^pAGgRvzzpNzNbmuuj=-GrlKMlnv2on zO;bc;t?y2!O0%*;tV!TL0JAqzpaF-6BDpDIrYXi-r6B%*nl>p8sC46F_;2FQv2Ypw zkAhm2078U0xrNuY5IDwJ(TO-Cwq#Vzf?Hv<zyBevLF}F*&)$A`TArbn>zbdCT`xiz zaMaFaxla@WmDO}6t|8mV=3kSZ2Ur|)uy{l4b7KBkO?Lj4r@9ac{LgnT&1Jy^7<K~Q zpix|&tO!~-MSo_=Bz{(WYiel7S$M|n)Wpwe?;!z9@O=tsg|dv@F4LF8@}fE!D`r_y z*3(Kh&b`M#RkRp=!|I;&b>4g&D^N)lv{}(W1<45gD`nLaDes`1%K}HsxJdPYxnMJl z5ha$WJx`T1o8mOJ**Xr?vheg`!}tjU^wO;F6?Hlir_?a<J@q&~j**Ja_<gQahuA8! zB4&NWTsPKphM?f-$^y{+rgpDq$3=B+5y9~Z3U!C4z=S^!9M@WOaP$&<a-Tp*a5QWM z4SeQ<lR-T^j>D;i&*9)0TCHFP$JN<TSwfkps_&Q){a+SuGgv?r*ty3j^?E=N8^bak z=WH@8y<S@Oq4QFc8rQd(-effH_w3mC(=be8#|w|c#lrQbROBj#;XjR?vHJv1=hksJ zo1~cbDV=Ij$7f-El?T-hiev~6vY(@92F(y}tr^UP3t_9#n(Y&7gdmwx>E?GR)phOE zgOFr^>O?K#2&lM+Y;lRK15<HxYO1l0X}Uvtpy|TY)R>wQ-W6!ly8@{K4g8?O7eNn; zDEh@|fs_3<@^U@N9ofCpsT!T?+8Jr~m=LY%PKWBgji+;7_LCewW8;iKr!y_3uP@km z5j}bq$K1IVlrBgRX;JBI!j)s&H!%;$SGhc>G!mpdJ2j0GECfeUK$AC|3s%~Mw`Zux zN_xj%GQ8e9J@)*EoV$OcTr#`3G8aoO+g;+7$tn5xQ*REM6vYze;a;Pxq}8BNtC)(h hjp^H~2puHal?=YB%KwJmH%JHz!1|e5YwpDL{{ZkgE7$-4 diff --git a/venv/lib/python2.7/site-packages/setuptools/command/bdist_egg.py b/venv/lib/python2.7/site-packages/setuptools/command/bdist_egg.py deleted file mode 100644 index 9f8df91..0000000 --- a/venv/lib/python2.7/site-packages/setuptools/command/bdist_egg.py +++ /dev/null @@ -1,502 +0,0 @@ -"""setuptools.command.bdist_egg - -Build .egg distributions""" - -from distutils.errors import DistutilsSetupError -from distutils.dir_util import remove_tree, mkpath -from distutils import log -from types import CodeType -import sys -import os -import re -import textwrap -import marshal - -from setuptools.extern import six - -from pkg_resources import get_build_platform, Distribution, ensure_directory -from pkg_resources import EntryPoint -from setuptools.extension import Library -from setuptools import Command - -try: - # Python 2.7 or >=3.2 - from sysconfig import get_path, get_python_version - - def _get_purelib(): - return get_path("purelib") -except ImportError: - from distutils.sysconfig import get_python_lib, get_python_version - - def _get_purelib(): - return get_python_lib(False) - - -def strip_module(filename): - if '.' in filename: - filename = os.path.splitext(filename)[0] - if filename.endswith('module'): - filename = filename[:-6] - return filename - - -def sorted_walk(dir): - """Do os.walk in a reproducible way, - independent of indeterministic filesystem readdir order - """ - for base, dirs, files in os.walk(dir): - dirs.sort() - files.sort() - yield base, dirs, files - - -def write_stub(resource, pyfile): - _stub_template = textwrap.dedent(""" - def __bootstrap__(): - global __bootstrap__, __loader__, __file__ - import sys, pkg_resources, imp - __file__ = pkg_resources.resource_filename(__name__, %r) - __loader__ = None; del __bootstrap__, __loader__ - imp.load_dynamic(__name__,__file__) - __bootstrap__() - """).lstrip() - with open(pyfile, 'w') as f: - f.write(_stub_template % resource) - - -class bdist_egg(Command): - description = "create an \"egg\" distribution" - - user_options = [ - ('bdist-dir=', 'b', - "temporary directory for creating the distribution"), - ('plat-name=', 'p', "platform name to embed in generated filenames " - "(default: %s)" % get_build_platform()), - ('exclude-source-files', None, - "remove all .py files from the generated egg"), - ('keep-temp', 'k', - "keep the pseudo-installation tree around after " + - "creating the distribution archive"), - ('dist-dir=', 'd', - "directory to put final built distributions in"), - ('skip-build', None, - "skip rebuilding everything (for testing/debugging)"), - ] - - boolean_options = [ - 'keep-temp', 'skip-build', 'exclude-source-files' - ] - - def initialize_options(self): - self.bdist_dir = None - self.plat_name = None - self.keep_temp = 0 - self.dist_dir = None - self.skip_build = 0 - self.egg_output = None - self.exclude_source_files = None - - def finalize_options(self): - ei_cmd = self.ei_cmd = self.get_finalized_command("egg_info") - self.egg_info = ei_cmd.egg_info - - if self.bdist_dir is None: - bdist_base = self.get_finalized_command('bdist').bdist_base - self.bdist_dir = os.path.join(bdist_base, 'egg') - - if self.plat_name is None: - self.plat_name = get_build_platform() - - self.set_undefined_options('bdist', ('dist_dir', 'dist_dir')) - - if self.egg_output is None: - - # Compute filename of the output egg - basename = Distribution( - None, None, ei_cmd.egg_name, ei_cmd.egg_version, - get_python_version(), - self.distribution.has_ext_modules() and self.plat_name - ).egg_name() - - self.egg_output = os.path.join(self.dist_dir, basename + '.egg') - - def do_install_data(self): - # Hack for packages that install data to install's --install-lib - self.get_finalized_command('install').install_lib = self.bdist_dir - - site_packages = os.path.normcase(os.path.realpath(_get_purelib())) - old, self.distribution.data_files = self.distribution.data_files, [] - - for item in old: - if isinstance(item, tuple) and len(item) == 2: - if os.path.isabs(item[0]): - realpath = os.path.realpath(item[0]) - normalized = os.path.normcase(realpath) - if normalized == site_packages or normalized.startswith( - site_packages + os.sep - ): - item = realpath[len(site_packages) + 1:], item[1] - # XXX else: raise ??? - self.distribution.data_files.append(item) - - try: - log.info("installing package data to %s", self.bdist_dir) - self.call_command('install_data', force=0, root=None) - finally: - self.distribution.data_files = old - - def get_outputs(self): - return [self.egg_output] - - def call_command(self, cmdname, **kw): - """Invoke reinitialized command `cmdname` with keyword args""" - for dirname in INSTALL_DIRECTORY_ATTRS: - kw.setdefault(dirname, self.bdist_dir) - kw.setdefault('skip_build', self.skip_build) - kw.setdefault('dry_run', self.dry_run) - cmd = self.reinitialize_command(cmdname, **kw) - self.run_command(cmdname) - return cmd - - def run(self): - # Generate metadata first - self.run_command("egg_info") - # We run install_lib before install_data, because some data hacks - # pull their data path from the install_lib command. - log.info("installing library code to %s", self.bdist_dir) - instcmd = self.get_finalized_command('install') - old_root = instcmd.root - instcmd.root = None - if self.distribution.has_c_libraries() and not self.skip_build: - self.run_command('build_clib') - cmd = self.call_command('install_lib', warn_dir=0) - instcmd.root = old_root - - all_outputs, ext_outputs = self.get_ext_outputs() - self.stubs = [] - to_compile = [] - for (p, ext_name) in enumerate(ext_outputs): - filename, ext = os.path.splitext(ext_name) - pyfile = os.path.join(self.bdist_dir, strip_module(filename) + - '.py') - self.stubs.append(pyfile) - log.info("creating stub loader for %s", ext_name) - if not self.dry_run: - write_stub(os.path.basename(ext_name), pyfile) - to_compile.append(pyfile) - ext_outputs[p] = ext_name.replace(os.sep, '/') - - if to_compile: - cmd.byte_compile(to_compile) - if self.distribution.data_files: - self.do_install_data() - - # Make the EGG-INFO directory - archive_root = self.bdist_dir - egg_info = os.path.join(archive_root, 'EGG-INFO') - self.mkpath(egg_info) - if self.distribution.scripts: - script_dir = os.path.join(egg_info, 'scripts') - log.info("installing scripts to %s", script_dir) - self.call_command('install_scripts', install_dir=script_dir, - no_ep=1) - - self.copy_metadata_to(egg_info) - native_libs = os.path.join(egg_info, "native_libs.txt") - if all_outputs: - log.info("writing %s", native_libs) - if not self.dry_run: - ensure_directory(native_libs) - libs_file = open(native_libs, 'wt') - libs_file.write('\n'.join(all_outputs)) - libs_file.write('\n') - libs_file.close() - elif os.path.isfile(native_libs): - log.info("removing %s", native_libs) - if not self.dry_run: - os.unlink(native_libs) - - write_safety_flag( - os.path.join(archive_root, 'EGG-INFO'), self.zip_safe() - ) - - if os.path.exists(os.path.join(self.egg_info, 'depends.txt')): - log.warn( - "WARNING: 'depends.txt' will not be used by setuptools 0.6!\n" - "Use the install_requires/extras_require setup() args instead." - ) - - if self.exclude_source_files: - self.zap_pyfiles() - - # Make the archive - make_zipfile(self.egg_output, archive_root, verbose=self.verbose, - dry_run=self.dry_run, mode=self.gen_header()) - if not self.keep_temp: - remove_tree(self.bdist_dir, dry_run=self.dry_run) - - # Add to 'Distribution.dist_files' so that the "upload" command works - getattr(self.distribution, 'dist_files', []).append( - ('bdist_egg', get_python_version(), self.egg_output)) - - def zap_pyfiles(self): - log.info("Removing .py files from temporary directory") - for base, dirs, files in walk_egg(self.bdist_dir): - for name in files: - path = os.path.join(base, name) - - if name.endswith('.py'): - log.debug("Deleting %s", path) - os.unlink(path) - - if base.endswith('__pycache__'): - path_old = path - - pattern = r'(?P<name>.+)\.(?P<magic>[^.]+)\.pyc' - m = re.match(pattern, name) - path_new = os.path.join( - base, os.pardir, m.group('name') + '.pyc') - log.info( - "Renaming file from [%s] to [%s]" - % (path_old, path_new)) - try: - os.remove(path_new) - except OSError: - pass - os.rename(path_old, path_new) - - def zip_safe(self): - safe = getattr(self.distribution, 'zip_safe', None) - if safe is not None: - return safe - log.warn("zip_safe flag not set; analyzing archive contents...") - return analyze_egg(self.bdist_dir, self.stubs) - - def gen_header(self): - epm = EntryPoint.parse_map(self.distribution.entry_points or '') - ep = epm.get('setuptools.installation', {}).get('eggsecutable') - if ep is None: - return 'w' # not an eggsecutable, do it the usual way. - - if not ep.attrs or ep.extras: - raise DistutilsSetupError( - "eggsecutable entry point (%r) cannot have 'extras' " - "or refer to a module" % (ep,) - ) - - pyver = sys.version[:3] - pkg = ep.module_name - full = '.'.join(ep.attrs) - base = ep.attrs[0] - basename = os.path.basename(self.egg_output) - - header = ( - "#!/bin/sh\n" - 'if [ `basename $0` = "%(basename)s" ]\n' - 'then exec python%(pyver)s -c "' - "import sys, os; sys.path.insert(0, os.path.abspath('$0')); " - "from %(pkg)s import %(base)s; sys.exit(%(full)s())" - '" "$@"\n' - 'else\n' - ' echo $0 is not the correct name for this egg file.\n' - ' echo Please rename it back to %(basename)s and try again.\n' - ' exec false\n' - 'fi\n' - ) % locals() - - if not self.dry_run: - mkpath(os.path.dirname(self.egg_output), dry_run=self.dry_run) - f = open(self.egg_output, 'w') - f.write(header) - f.close() - return 'a' - - def copy_metadata_to(self, target_dir): - "Copy metadata (egg info) to the target_dir" - # normalize the path (so that a forward-slash in egg_info will - # match using startswith below) - norm_egg_info = os.path.normpath(self.egg_info) - prefix = os.path.join(norm_egg_info, '') - for path in self.ei_cmd.filelist.files: - if path.startswith(prefix): - target = os.path.join(target_dir, path[len(prefix):]) - ensure_directory(target) - self.copy_file(path, target) - - def get_ext_outputs(self): - """Get a list of relative paths to C extensions in the output distro""" - - all_outputs = [] - ext_outputs = [] - - paths = {self.bdist_dir: ''} - for base, dirs, files in sorted_walk(self.bdist_dir): - for filename in files: - if os.path.splitext(filename)[1].lower() in NATIVE_EXTENSIONS: - all_outputs.append(paths[base] + filename) - for filename in dirs: - paths[os.path.join(base, filename)] = (paths[base] + - filename + '/') - - if self.distribution.has_ext_modules(): - build_cmd = self.get_finalized_command('build_ext') - for ext in build_cmd.extensions: - if isinstance(ext, Library): - continue - fullname = build_cmd.get_ext_fullname(ext.name) - filename = build_cmd.get_ext_filename(fullname) - if not os.path.basename(filename).startswith('dl-'): - if os.path.exists(os.path.join(self.bdist_dir, filename)): - ext_outputs.append(filename) - - return all_outputs, ext_outputs - - -NATIVE_EXTENSIONS = dict.fromkeys('.dll .so .dylib .pyd'.split()) - - -def walk_egg(egg_dir): - """Walk an unpacked egg's contents, skipping the metadata directory""" - walker = sorted_walk(egg_dir) - base, dirs, files = next(walker) - if 'EGG-INFO' in dirs: - dirs.remove('EGG-INFO') - yield base, dirs, files - for bdf in walker: - yield bdf - - -def analyze_egg(egg_dir, stubs): - # check for existing flag in EGG-INFO - for flag, fn in safety_flags.items(): - if os.path.exists(os.path.join(egg_dir, 'EGG-INFO', fn)): - return flag - if not can_scan(): - return False - safe = True - for base, dirs, files in walk_egg(egg_dir): - for name in files: - if name.endswith('.py') or name.endswith('.pyw'): - continue - elif name.endswith('.pyc') or name.endswith('.pyo'): - # always scan, even if we already know we're not safe - safe = scan_module(egg_dir, base, name, stubs) and safe - return safe - - -def write_safety_flag(egg_dir, safe): - # Write or remove zip safety flag file(s) - for flag, fn in safety_flags.items(): - fn = os.path.join(egg_dir, fn) - if os.path.exists(fn): - if safe is None or bool(safe) != flag: - os.unlink(fn) - elif safe is not None and bool(safe) == flag: - f = open(fn, 'wt') - f.write('\n') - f.close() - - -safety_flags = { - True: 'zip-safe', - False: 'not-zip-safe', -} - - -def scan_module(egg_dir, base, name, stubs): - """Check whether module possibly uses unsafe-for-zipfile stuff""" - - filename = os.path.join(base, name) - if filename[:-1] in stubs: - return True # Extension module - pkg = base[len(egg_dir) + 1:].replace(os.sep, '.') - module = pkg + (pkg and '.' or '') + os.path.splitext(name)[0] - if six.PY2: - skip = 8 # skip magic & date - elif sys.version_info < (3, 7): - skip = 12 # skip magic & date & file size - else: - skip = 16 # skip magic & reserved? & date & file size - f = open(filename, 'rb') - f.read(skip) - code = marshal.load(f) - f.close() - safe = True - symbols = dict.fromkeys(iter_symbols(code)) - for bad in ['__file__', '__path__']: - if bad in symbols: - log.warn("%s: module references %s", module, bad) - safe = False - if 'inspect' in symbols: - for bad in [ - 'getsource', 'getabsfile', 'getsourcefile', 'getfile' - 'getsourcelines', 'findsource', 'getcomments', 'getframeinfo', - 'getinnerframes', 'getouterframes', 'stack', 'trace' - ]: - if bad in symbols: - log.warn("%s: module MAY be using inspect.%s", module, bad) - safe = False - return safe - - -def iter_symbols(code): - """Yield names and strings used by `code` and its nested code objects""" - for name in code.co_names: - yield name - for const in code.co_consts: - if isinstance(const, six.string_types): - yield const - elif isinstance(const, CodeType): - for name in iter_symbols(const): - yield name - - -def can_scan(): - if not sys.platform.startswith('java') and sys.platform != 'cli': - # CPython, PyPy, etc. - return True - log.warn("Unable to analyze compiled code on this platform.") - log.warn("Please ask the author to include a 'zip_safe'" - " setting (either True or False) in the package's setup.py") - - -# Attribute names of options for commands that might need to be convinced to -# install to the egg build directory - -INSTALL_DIRECTORY_ATTRS = [ - 'install_lib', 'install_dir', 'install_data', 'install_base' -] - - -def make_zipfile(zip_filename, base_dir, verbose=0, dry_run=0, compress=True, - mode='w'): - """Create a zip file from all the files under 'base_dir'. The output - zip file will be named 'base_dir' + ".zip". Uses either the "zipfile" - Python module (if available) or the InfoZIP "zip" utility (if installed - and found on the default search path). If neither tool is available, - raises DistutilsExecError. Returns the name of the output zip file. - """ - import zipfile - - mkpath(os.path.dirname(zip_filename), dry_run=dry_run) - log.info("creating '%s' and adding '%s' to it", zip_filename, base_dir) - - def visit(z, dirname, names): - for name in names: - path = os.path.normpath(os.path.join(dirname, name)) - if os.path.isfile(path): - p = path[len(base_dir) + 1:] - if not dry_run: - z.write(path, p) - log.debug("adding '%s'", p) - - compression = zipfile.ZIP_DEFLATED if compress else zipfile.ZIP_STORED - if not dry_run: - z = zipfile.ZipFile(zip_filename, mode, compression=compression) - for dirname, dirs, files in sorted_walk(base_dir): - visit(z, dirname, files) - z.close() - else: - for dirname, dirs, files in sorted_walk(base_dir): - visit(None, dirname, files) - return zip_filename diff --git a/venv/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyc b/venv/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyc deleted file mode 100644 index df4b5581edbd1cf5a26ee64211e481df2d2c0a10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19800 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 diff --git a/venv/lib/python2.7/site-packages/setuptools/command/bdist_rpm.py b/venv/lib/python2.7/site-packages/setuptools/command/bdist_rpm.py deleted file mode 100644 index 7073092..0000000 --- a/venv/lib/python2.7/site-packages/setuptools/command/bdist_rpm.py +++ /dev/null @@ -1,43 +0,0 @@ -import distutils.command.bdist_rpm as orig - - -class bdist_rpm(orig.bdist_rpm): - """ - Override the default bdist_rpm behavior to do the following: - - 1. Run egg_info to ensure the name and version are properly calculated. - 2. Always run 'install' using --single-version-externally-managed to - disable eggs in RPM distributions. - 3. Replace dash with underscore in the version numbers for better RPM - compatibility. - """ - - def run(self): - # ensure distro name is up-to-date - self.run_command('egg_info') - - orig.bdist_rpm.run(self) - - def _make_spec_file(self): - version = self.distribution.get_version() - rpmversion = version.replace('-', '_') - spec = orig.bdist_rpm._make_spec_file(self) - line23 = '%define version ' + version - line24 = '%define version ' + rpmversion - spec = [ - line.replace( - "Source0: %{name}-%{version}.tar", - "Source0: %{name}-%{unmangled_version}.tar" - ).replace( - "setup.py install ", - "setup.py install --single-version-externally-managed " - ).replace( - "%setup", - "%setup -n %{name}-%{unmangled_version}" - ).replace(line23, line24) - for line in spec - ] - insert_loc = spec.index(line24) + 1 - unmangled_version = "%define unmangled_version " + version - spec.insert(insert_loc, unmangled_version) - return spec diff --git a/venv/lib/python2.7/site-packages/setuptools/command/bdist_rpm.pyc b/venv/lib/python2.7/site-packages/setuptools/command/bdist_rpm.pyc deleted file mode 100644 index 41b82de64787d7775d20a975efb4a5a88e5853ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2130 zcmd5-U31$+6upuiCvhn)Wq=uYV0j2N%*alfl7UW#;cIwn=s3KPnRZ8(*3P<XN!6~L zxV0ac@W=Q~`~Wz2B|Bl#2i~aSU0v<oJ@@O}P3y1Q-7kNC_gO;C)57~Z3_HM-;unx1 zng%ot>9j>@NUFv1IH0see-K>~{dO9%-bt^GGx~2l$8HzmDAm@<vY2hq1FZglVFe~d zbP5#A{y4B|11z*@c+z8EEDTXs;Q3{)%2KCFxHBbEHI6Ie#Kwdesk3;l^HR86q`6lb z=f>pcI-5M|dW3_%7*?53lZn*X7&^I7nXSqiGK*(Q#91m}$Lc&2F*b@aFH~t3B8g2> znb@hc@39{A#rNhsURY5A^1jZji;cN2Dhqoeiuh$z)L=#G!l^QY#v+=<Sv*lGta~6t zhBU<^qu4PkbS8#RpYWP1^{8_2#MUMc;l3(NoFM$zo{4kq&P0`^a5u@}D^7B1*6wH3 zY=kW_Movb`!9D}8Z6^7wh@Bp3qurv$Pq;cfLX00d_n%=}qWYc&mjMON^I+QIRsKft zPI|0<>~=7(GwX@qZeaz<kuZgrQ`g3KUh2sZZ*p8*?Dp88-?GY#d%Wc*JBKtVN<Bx; z2lKcbpqd=&;MK)oaafMB^A`t4FSGrl^5IePwY~TzeO2z`nG}Ox2Zb)8rX-O&cruYs z2UfYNaCvU*b+Penu;Ed^SPa?GI~bM)3U7x#GtB5M44;`lA=H^cYg`ho0$TdqpbyX^ zmm#e}j&a(i=~k1i71{@x3+SU&+e;y&Et&wSML#`zOsftpJKS6;_O}>><qoCWYk7y# z-9}!vY3X&IhxGE801lKX5U>azy1?G1^j2+e$8T=a62Bb=2%vn@dk0Y*qozcWpQXJE zc@NE{vnwLmPqBECS7oC1ABnx!+$gJP?{!18Ro}&>{o>6!Rff`|5mNat?f0PV3xafm zx4w6T{pwAt|D}~|2PgMDp#6L!iYUA0?M+WK2W~%R{U+iYI-<w4cATf{4e6;pQEnZS z+lE3}_vVm^T~nMnBxmspC2gS+Io3uwW{^hDUO4s{p{vsMm|8>L@jy+cTo((tJlCI0 zM#k|64GQ$&@Jf8>TZmWvu^LyJJaL@r8*#lIea08W2OQOhm?*dt+{0ft=!UKC&*A%! z?gl-d6)u95%sVN4d{WNxv@-n3sh2X%6DfV;4jJ_-J}>>BmkGQfUplULXSWmXcIxZ# r6MQqNaK#(jZ!V(#<|6WeHLIRZo>*^BVE)2?T$kZn-%0#`;9lz=tS>hq diff --git a/venv/lib/python2.7/site-packages/setuptools/command/bdist_wininst.py b/venv/lib/python2.7/site-packages/setuptools/command/bdist_wininst.py deleted file mode 100644 index 073de97..0000000 --- a/venv/lib/python2.7/site-packages/setuptools/command/bdist_wininst.py +++ /dev/null @@ -1,21 +0,0 @@ -import distutils.command.bdist_wininst as orig - - -class bdist_wininst(orig.bdist_wininst): - def reinitialize_command(self, command, reinit_subcommands=0): - """ - Supplement reinitialize_command to work around - http://bugs.python.org/issue20819 - """ - cmd = self.distribution.reinitialize_command( - command, reinit_subcommands) - if command in ('install', 'install_lib'): - cmd.install_lib = None - return cmd - - def run(self): - self._is_running = True - try: - orig.bdist_wininst.run(self) - finally: - self._is_running = False diff --git a/venv/lib/python2.7/site-packages/setuptools/command/bdist_wininst.pyc b/venv/lib/python2.7/site-packages/setuptools/command/bdist_wininst.pyc deleted file mode 100644 index f5a1e35d3aa7ef9be87fb87418dcb16a981e23e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1425 zcmd5*OK%e~5FYQgg}xA~dPU?IAvJCQRV_jYfy9jnZ7KnkkhRIWshf?x*t2~^;egtI z%nyJWXO*^yJ9RSNvFG8>pJ&ovn`_U0KKeF<W~B6eOA;ha1^oq-0H*>@6F5qtNI<8o z9}6f_xCXca_<EGEU%$OXG3Gao9&VC4C`>?gZmh8Z7bhfSc}EhS(4+y5C{sM=S^y_X zI4d2M_1g@_kid{N&d%TWB%w>wjDSUKGXb*%t`hi>0_g;7yaIj)iY1t(pi;2poD#rg z4y71aYc-=^S5>Je+G5LVLW(9Y%~Y$Qn@n<Bw9vKAogcSy?`m5t!cGvYS5gk@QRq~c zc;alw`H?gs)cX1Ee)nMEi4W*FCLk|MT))v(X$EcPBHVHae>wCbrMN+E%%wMj8jZ8K zO&kA$i_B5aS)Fm_c`$DUT^>gu&9!iAkwArd(Ch|edWVyuO&^F;n35(dZ_aYm@+|lA z*p-F$K~68^<qJQs=i~0)ce}giU+xX}!^J@{^}94il{}P{sdk#H?_l@iNPUt)V_l(h zWw@<20OXyDA!0KIA0KUvAuX?pjrbc1TCuP#)<cIBj3uE2Ot%3OIHf|R0-zEVAU+pl zU*;9rztE!J=J;NFg#-DRLtpFoK*|K=YfDu-iU#M+C?f}m^pJ(}0DQ>Hpkt1VQ`{fQ zxbq&9goiYNSQV+*PUfY+J4)GnqLo5sRH=z8>XMd`>5OA<ZW6WsT>*qBc7EVDS`i!T t^Q%0i6}JTSLm4_v{dDfsPsWWEA1>ntx?lG~ev8+0_TO+N2JYCc^bae;X#4;G diff --git a/venv/lib/python2.7/site-packages/setuptools/command/build_clib.py b/venv/lib/python2.7/site-packages/setuptools/command/build_clib.py deleted file mode 100644 index 09caff6..0000000 --- a/venv/lib/python2.7/site-packages/setuptools/command/build_clib.py +++ /dev/null @@ -1,98 +0,0 @@ -import distutils.command.build_clib as orig -from distutils.errors import DistutilsSetupError -from distutils import log -from setuptools.dep_util import newer_pairwise_group - - -class build_clib(orig.build_clib): - """ - Override the default build_clib behaviour to do the following: - - 1. Implement a rudimentary timestamp-based dependency system - so 'compile()' doesn't run every time. - 2. Add more keys to the 'build_info' dictionary: - * obj_deps - specify dependencies for each object compiled. - this should be a dictionary mapping a key - with the source filename to a list of - dependencies. Use an empty string for global - dependencies. - * cflags - specify a list of additional flags to pass to - the compiler. - """ - - def build_libraries(self, libraries): - for (lib_name, build_info) in libraries: - sources = build_info.get('sources') - if sources is None or not isinstance(sources, (list, tuple)): - raise DistutilsSetupError( - "in 'libraries' option (library '%s'), " - "'sources' must be present and must be " - "a list of source filenames" % lib_name) - sources = list(sources) - - log.info("building '%s' library", lib_name) - - # Make sure everything is the correct type. - # obj_deps should be a dictionary of keys as sources - # and a list/tuple of files that are its dependencies. - obj_deps = build_info.get('obj_deps', dict()) - if not isinstance(obj_deps, dict): - raise DistutilsSetupError( - "in 'libraries' option (library '%s'), " - "'obj_deps' must be a dictionary of " - "type 'source: list'" % lib_name) - dependencies = [] - - # Get the global dependencies that are specified by the '' key. - # These will go into every source's dependency list. - global_deps = obj_deps.get('', list()) - if not isinstance(global_deps, (list, tuple)): - raise DistutilsSetupError( - "in 'libraries' option (library '%s'), " - "'obj_deps' must be a dictionary of " - "type 'source: list'" % lib_name) - - # Build the list to be used by newer_pairwise_group - # each source will be auto-added to its dependencies. - for source in sources: - src_deps = [source] - src_deps.extend(global_deps) - extra_deps = obj_deps.get(source, list()) - if not isinstance(extra_deps, (list, tuple)): - raise DistutilsSetupError( - "in 'libraries' option (library '%s'), " - "'obj_deps' must be a dictionary of " - "type 'source: list'" % lib_name) - src_deps.extend(extra_deps) - dependencies.append(src_deps) - - expected_objects = self.compiler.object_filenames( - sources, - output_dir=self.build_temp - ) - - if newer_pairwise_group(dependencies, expected_objects) != ([], []): - # First, compile the source code to object files in the library - # directory. (This should probably change to putting object - # files in a temporary build directory.) - macros = build_info.get('macros') - include_dirs = build_info.get('include_dirs') - cflags = build_info.get('cflags') - objects = self.compiler.compile( - sources, - output_dir=self.build_temp, - macros=macros, - include_dirs=include_dirs, - extra_postargs=cflags, - debug=self.debug - ) - - # Now "link" the object files together into a static library. - # (On Unix at least, this isn't really linking -- it just - # builds an archive. Whatever.) - self.compiler.create_static_lib( - expected_objects, - lib_name, - output_dir=self.build_clib, - debug=self.debug - ) diff --git a/venv/lib/python2.7/site-packages/setuptools/command/build_clib.pyc b/venv/lib/python2.7/site-packages/setuptools/command/build_clib.pyc deleted file mode 100644 index 44e47278290cd68a300193fd73d7865c7b897eee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3006 zcmd5;OLH4V5bj;QEZef21j7LiQ&a^hDJ&(BN<oUEc$fo+1WJZ-;Yw;*?TqBL_m!EE zZ3XE7;n(orIKdshp4G!n<&Yb!wd3iT>95~CTluTCdH2_yXAv!)3jTkA*8~_OejX)6 zryia9bX;*OJ|$I3Yjj*Ak55!6sZ-jZ<3>qWDcPX3NykmlHBuGk9eE_{^gGc@qMwd^ z#y#vdAS3<<&y%i)slA2aAU1Yl<HQ^)J1M@=I@jeUYnJ5Wl6VV5rY@8YiZIp}u~ETT z=aa&2Vq-Xo6B$HFJY1Q@@L%CI?_f|w$502O(*sJuvcX~3=L6>$HwB*W&Xv}&RKlJp zA=N0HBv!1U#ZaAu=W#yK!sbHe?${_#lKdjh#*a1~#{Hi7HZ2mBs?3T|=!uMZ8tSRA zm>C<U#r`lfN<u=RGO4m?D$LYal{x_EVRF%l^0bH()xFb!BxSOW1y&{$R4kEt?(|1J z@uid^&9xF|YHC<B*1l7!9cQB)0C8mFJcAC8mLkMmkq=J;s9?mtFolZZ(R8g*tc)1t zTBtBO;e#r&Vxf^N1+%}dJ@zCv!kpxjM8Z)peJxd_VNt+EScHx%6|S*g#P-B#Zs6ZY zi4ly?!W6N{!ImIJL_T^w>&lPNx+i`#5DrJBg@s?OX1Q$2ILU`$@&*X2BX>nKO2V;$ zo@*DabP=JHv2$x8%45*92n~l|1#!(pj?2P{x^!a1`L~O=h4*XD#Rpiq-1lc59Xz}3 zKlN#jUxj9<C|8*;J(^c(R^?ni+aPm5)@RaI$X03O(@USW^%2<`No@G^HaLFsC_}9Q zrb;D%t<!0P>li1%;Vtliv%%$xrFqREW5kM2<_`y1yAC-fn%8MobIR3O!h*Tsm@!^a z%l!E|h|6DCtAl5T<{LEIpfL<=(yU3R7#pmvSK?!Djlb#eF<!-g?6K9asJKAdERkUL zCWABV^S|k6hDNtVr`yh>4Pvr|O>e$Mc86xLZHujko%q4KXBE;7f8i}S2FilB430yc zx0a-nI0r~6qJ2$-gss~oVPcEq7R`1@0tY8|fmxfkIbI9K8>|DuBun*fUODOe-tz_> zAr%h0oIy`4x7V_Oj2U4bXQG3qs6&m~=!m@FgcaR#X(~FmP3O*sqO)M>h;)KFL-iI~ z8P~uv^p?fiI`dyCQDgQX$~7D=HU>q(vd}4#hiKVo%+oj5Xvwoy=~_d{N5W1Ew7F81 zN3KD1Ebz(Q2l>Pn6C21_Bh!h}Fw(iP+fIIzOr+v1<MzrLN3?NETv{Cl1x|)~Y>-SS zIW?S&yL?L_)sO|sqRimwJX20kY~l>Zvq-sh?o*Br7g?ePI7tI{&oL7>V|R)>qmvDR zxB=W09g?T)uVs(0+!@N|8!X$QxpLj%#wZ5dL0s4uTmv@J-e4H5LaPF3XX7Y9Kn83< zmqDEtMkOQL1hq;KCmmG4jrWQmR(!w~4A>>kjaPfF-NI_wUfqS_>?s4|5RHz?b-t-f zAM?HA%u|=RdaRN`X{Q;m0|u<sfKNNi7F%7=<OXwrS-;TnISlNdhq{kjSSoG$FE0Dj zkM%ISIJ^Jwd3Nuie(*5*#9V$VU+8;y#zp^!ei0Y@E@(-zZ|^@I2jBM%e|XqDPt4UR zJer1??61E7dd1YXA-h~z`HjCY%+DCeyXCdL_q~c&@mt=uzgyb_T~hVxp0`)dt1YkT zwLmRs%y0NjukLME-mSL5(Z+t=y><L=*PGyDy30XuJ`G%qg1|*72+~|m5(SbQKoH10 z3WC80n6I7opL@=wpKDNTMSZ94cU_3z10|QAfW3v&duyjJvzue#FkJTLIv%?WTC?Kg wE!V~soy+UhPFaFn#Opx!kb(h!b-D`rAGyhe_p>sfpL6dp8yIeSyZl%A7s@s5OaK4? diff --git a/venv/lib/python2.7/site-packages/setuptools/command/build_ext.py b/venv/lib/python2.7/site-packages/setuptools/command/build_ext.py deleted file mode 100644 index 60a8a32..0000000 --- a/venv/lib/python2.7/site-packages/setuptools/command/build_ext.py +++ /dev/null @@ -1,321 +0,0 @@ -import os -import sys -import itertools -import imp -from distutils.command.build_ext import build_ext as _du_build_ext -from distutils.file_util import copy_file -from distutils.ccompiler import new_compiler -from distutils.sysconfig import customize_compiler, get_config_var -from distutils.errors import DistutilsError -from distutils import log - -from setuptools.extension import Library -from setuptools.extern import six - -try: - # Attempt to use Cython for building extensions, if available - from Cython.Distutils.build_ext import build_ext as _build_ext - # Additionally, assert that the compiler module will load - # also. Ref #1229. - __import__('Cython.Compiler.Main') -except ImportError: - _build_ext = _du_build_ext - -# make sure _config_vars is initialized -get_config_var("LDSHARED") -from distutils.sysconfig import _config_vars as _CONFIG_VARS - - -def _customize_compiler_for_shlib(compiler): - if sys.platform == "darwin": - # building .dylib requires additional compiler flags on OSX; here we - # temporarily substitute the pyconfig.h variables so that distutils' - # 'customize_compiler' uses them before we build the shared libraries. - tmp = _CONFIG_VARS.copy() - try: - # XXX Help! I don't have any idea whether these are right... - _CONFIG_VARS['LDSHARED'] = ( - "gcc -Wl,-x -dynamiclib -undefined dynamic_lookup") - _CONFIG_VARS['CCSHARED'] = " -dynamiclib" - _CONFIG_VARS['SO'] = ".dylib" - customize_compiler(compiler) - finally: - _CONFIG_VARS.clear() - _CONFIG_VARS.update(tmp) - else: - customize_compiler(compiler) - - -have_rtld = False -use_stubs = False -libtype = 'shared' - -if sys.platform == "darwin": - use_stubs = True -elif os.name != 'nt': - try: - import dl - use_stubs = have_rtld = hasattr(dl, 'RTLD_NOW') - except ImportError: - pass - -if_dl = lambda s: s if have_rtld else '' - - -def get_abi3_suffix(): - """Return the file extension for an abi3-compliant Extension()""" - for suffix, _, _ in (s for s in imp.get_suffixes() if s[2] == imp.C_EXTENSION): - if '.abi3' in suffix: # Unix - return suffix - elif suffix == '.pyd': # Windows - return suffix - - -class build_ext(_build_ext): - def run(self): - """Build extensions in build directory, then copy if --inplace""" - old_inplace, self.inplace = self.inplace, 0 - _build_ext.run(self) - self.inplace = old_inplace - if old_inplace: - self.copy_extensions_to_source() - - def copy_extensions_to_source(self): - build_py = self.get_finalized_command('build_py') - for ext in self.extensions: - fullname = self.get_ext_fullname(ext.name) - filename = self.get_ext_filename(fullname) - modpath = fullname.split('.') - package = '.'.join(modpath[:-1]) - package_dir = build_py.get_package_dir(package) - dest_filename = os.path.join(package_dir, - os.path.basename(filename)) - src_filename = os.path.join(self.build_lib, filename) - - # Always copy, even if source is older than destination, to ensure - # that the right extensions for the current Python/platform are - # used. - copy_file( - src_filename, dest_filename, verbose=self.verbose, - dry_run=self.dry_run - ) - if ext._needs_stub: - self.write_stub(package_dir or os.curdir, ext, True) - - def get_ext_filename(self, fullname): - filename = _build_ext.get_ext_filename(self, fullname) - if fullname in self.ext_map: - ext = self.ext_map[fullname] - use_abi3 = ( - six.PY3 - and getattr(ext, 'py_limited_api') - and get_abi3_suffix() - ) - if use_abi3: - so_ext = get_config_var('EXT_SUFFIX') - filename = filename[:-len(so_ext)] - filename = filename + get_abi3_suffix() - if isinstance(ext, Library): - fn, ext = os.path.splitext(filename) - return self.shlib_compiler.library_filename(fn, libtype) - elif use_stubs and ext._links_to_dynamic: - d, fn = os.path.split(filename) - return os.path.join(d, 'dl-' + fn) - return filename - - def initialize_options(self): - _build_ext.initialize_options(self) - self.shlib_compiler = None - self.shlibs = [] - self.ext_map = {} - - def finalize_options(self): - _build_ext.finalize_options(self) - self.extensions = self.extensions or [] - self.check_extensions_list(self.extensions) - self.shlibs = [ext for ext in self.extensions - if isinstance(ext, Library)] - if self.shlibs: - self.setup_shlib_compiler() - for ext in self.extensions: - ext._full_name = self.get_ext_fullname(ext.name) - for ext in self.extensions: - fullname = ext._full_name - self.ext_map[fullname] = ext - - # distutils 3.1 will also ask for module names - # XXX what to do with conflicts? - self.ext_map[fullname.split('.')[-1]] = ext - - ltd = self.shlibs and self.links_to_dynamic(ext) or False - ns = ltd and use_stubs and not isinstance(ext, Library) - ext._links_to_dynamic = ltd - ext._needs_stub = ns - filename = ext._file_name = self.get_ext_filename(fullname) - libdir = os.path.dirname(os.path.join(self.build_lib, filename)) - if ltd and libdir not in ext.library_dirs: - ext.library_dirs.append(libdir) - if ltd and use_stubs and os.curdir not in ext.runtime_library_dirs: - ext.runtime_library_dirs.append(os.curdir) - - def setup_shlib_compiler(self): - compiler = self.shlib_compiler = new_compiler( - compiler=self.compiler, dry_run=self.dry_run, force=self.force - ) - _customize_compiler_for_shlib(compiler) - - if self.include_dirs is not None: - compiler.set_include_dirs(self.include_dirs) - if self.define is not None: - # 'define' option is a list of (name,value) tuples - for (name, value) in self.define: - compiler.define_macro(name, value) - if self.undef is not None: - for macro in self.undef: - compiler.undefine_macro(macro) - if self.libraries is not None: - compiler.set_libraries(self.libraries) - if self.library_dirs is not None: - compiler.set_library_dirs(self.library_dirs) - if self.rpath is not None: - compiler.set_runtime_library_dirs(self.rpath) - if self.link_objects is not None: - compiler.set_link_objects(self.link_objects) - - # hack so distutils' build_extension() builds a library instead - compiler.link_shared_object = link_shared_object.__get__(compiler) - - def get_export_symbols(self, ext): - if isinstance(ext, Library): - return ext.export_symbols - return _build_ext.get_export_symbols(self, ext) - - def build_extension(self, ext): - ext._convert_pyx_sources_to_lang() - _compiler = self.compiler - try: - if isinstance(ext, Library): - self.compiler = self.shlib_compiler - _build_ext.build_extension(self, ext) - if ext._needs_stub: - cmd = self.get_finalized_command('build_py').build_lib - self.write_stub(cmd, ext) - finally: - self.compiler = _compiler - - def links_to_dynamic(self, ext): - """Return true if 'ext' links to a dynamic lib in the same package""" - # XXX this should check to ensure the lib is actually being built - # XXX as dynamic, and not just using a locally-found version or a - # XXX static-compiled version - libnames = dict.fromkeys([lib._full_name for lib in self.shlibs]) - pkg = '.'.join(ext._full_name.split('.')[:-1] + ['']) - return any(pkg + libname in libnames for libname in ext.libraries) - - def get_outputs(self): - return _build_ext.get_outputs(self) + self.__get_stubs_outputs() - - def __get_stubs_outputs(self): - # assemble the base name for each extension that needs a stub - ns_ext_bases = ( - os.path.join(self.build_lib, *ext._full_name.split('.')) - for ext in self.extensions - if ext._needs_stub - ) - # pair each base with the extension - pairs = itertools.product(ns_ext_bases, self.__get_output_extensions()) - return list(base + fnext for base, fnext in pairs) - - def __get_output_extensions(self): - yield '.py' - yield '.pyc' - if self.get_finalized_command('build_py').optimize: - yield '.pyo' - - def write_stub(self, output_dir, ext, compile=False): - log.info("writing stub loader for %s to %s", ext._full_name, - output_dir) - stub_file = (os.path.join(output_dir, *ext._full_name.split('.')) + - '.py') - if compile and os.path.exists(stub_file): - raise DistutilsError(stub_file + " already exists! Please delete.") - if not self.dry_run: - f = open(stub_file, 'w') - f.write( - '\n'.join([ - "def __bootstrap__():", - " global __bootstrap__, __file__, __loader__", - " import sys, os, pkg_resources, imp" + if_dl(", dl"), - " __file__ = pkg_resources.resource_filename" - "(__name__,%r)" - % os.path.basename(ext._file_name), - " del __bootstrap__", - " if '__loader__' in globals():", - " del __loader__", - if_dl(" old_flags = sys.getdlopenflags()"), - " old_dir = os.getcwd()", - " try:", - " os.chdir(os.path.dirname(__file__))", - if_dl(" sys.setdlopenflags(dl.RTLD_NOW)"), - " imp.load_dynamic(__name__,__file__)", - " finally:", - if_dl(" sys.setdlopenflags(old_flags)"), - " os.chdir(old_dir)", - "__bootstrap__()", - "" # terminal \n - ]) - ) - f.close() - if compile: - from distutils.util import byte_compile - - byte_compile([stub_file], optimize=0, - force=True, dry_run=self.dry_run) - optimize = self.get_finalized_command('install_lib').optimize - if optimize > 0: - byte_compile([stub_file], optimize=optimize, - force=True, dry_run=self.dry_run) - if os.path.exists(stub_file) and not self.dry_run: - os.unlink(stub_file) - - -if use_stubs or os.name == 'nt': - # Build shared libraries - # - def link_shared_object( - self, objects, output_libname, output_dir=None, libraries=None, - library_dirs=None, runtime_library_dirs=None, export_symbols=None, - debug=0, extra_preargs=None, extra_postargs=None, build_temp=None, - target_lang=None): - self.link( - self.SHARED_LIBRARY, objects, output_libname, - output_dir, libraries, library_dirs, runtime_library_dirs, - export_symbols, debug, extra_preargs, extra_postargs, - build_temp, target_lang - ) -else: - # Build static libraries everywhere else - libtype = 'static' - - def link_shared_object( - self, objects, output_libname, output_dir=None, libraries=None, - library_dirs=None, runtime_library_dirs=None, export_symbols=None, - debug=0, extra_preargs=None, extra_postargs=None, build_temp=None, - target_lang=None): - # XXX we need to either disallow these attrs on Library instances, - # or warn/abort here if set, or something... - # libraries=None, library_dirs=None, runtime_library_dirs=None, - # export_symbols=None, extra_preargs=None, extra_postargs=None, - # build_temp=None - - assert output_dir is None # distutils build_ext doesn't pass this - output_dir, filename = os.path.split(output_libname) - basename, ext = os.path.splitext(filename) - if self.library_filename("x").startswith('lib'): - # strip 'lib' prefix; this is kludgy if some platform uses - # a different prefix - basename = basename[3:] - - self.create_static_lib( - objects, basename, output_dir, debug, target_lang - ) diff --git a/venv/lib/python2.7/site-packages/setuptools/command/build_ext.pyc b/venv/lib/python2.7/site-packages/setuptools/command/build_ext.pyc deleted file mode 100644 index 647ee5692d2444edf04cb6c2bab5ffa198df9e37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13452 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 diff --git a/venv/lib/python2.7/site-packages/setuptools/command/build_py.py b/venv/lib/python2.7/site-packages/setuptools/command/build_py.py deleted file mode 100644 index b0314fd..0000000 --- a/venv/lib/python2.7/site-packages/setuptools/command/build_py.py +++ /dev/null @@ -1,270 +0,0 @@ -from glob import glob -from distutils.util import convert_path -import distutils.command.build_py as orig -import os -import fnmatch -import textwrap -import io -import distutils.errors -import itertools - -from setuptools.extern import six -from setuptools.extern.six.moves import map, filter, filterfalse - -try: - from setuptools.lib2to3_ex import Mixin2to3 -except ImportError: - - class Mixin2to3: - def run_2to3(self, files, doctests=True): - "do nothing" - - -class build_py(orig.build_py, Mixin2to3): - """Enhanced 'build_py' command that includes data files with packages - - The data files are specified via a 'package_data' argument to 'setup()'. - See 'setuptools.dist.Distribution' for more details. - - Also, this version of the 'build_py' command allows you to specify both - 'py_modules' and 'packages' in the same setup operation. - """ - - def finalize_options(self): - orig.build_py.finalize_options(self) - self.package_data = self.distribution.package_data - self.exclude_package_data = (self.distribution.exclude_package_data or - {}) - if 'data_files' in self.__dict__: - del self.__dict__['data_files'] - self.__updated_files = [] - self.__doctests_2to3 = [] - - def run(self): - """Build modules, packages, and copy data files to build directory""" - if not self.py_modules and not self.packages: - return - - if self.py_modules: - self.build_modules() - - if self.packages: - self.build_packages() - self.build_package_data() - - self.run_2to3(self.__updated_files, False) - self.run_2to3(self.__updated_files, True) - self.run_2to3(self.__doctests_2to3, True) - - # Only compile actual .py files, using our base class' idea of what our - # output files are. - self.byte_compile(orig.build_py.get_outputs(self, include_bytecode=0)) - - def __getattr__(self, attr): - "lazily compute data files" - if attr == 'data_files': - self.data_files = self._get_data_files() - return self.data_files - return orig.build_py.__getattr__(self, attr) - - def build_module(self, module, module_file, package): - if six.PY2 and isinstance(package, six.string_types): - # avoid errors on Python 2 when unicode is passed (#190) - package = package.split('.') - outfile, copied = orig.build_py.build_module(self, module, module_file, - package) - if copied: - self.__updated_files.append(outfile) - return outfile, copied - - def _get_data_files(self): - """Generate list of '(package,src_dir,build_dir,filenames)' tuples""" - self.analyze_manifest() - return list(map(self._get_pkg_data_files, self.packages or ())) - - def _get_pkg_data_files(self, package): - # Locate package source directory - src_dir = self.get_package_dir(package) - - # Compute package build directory - build_dir = os.path.join(*([self.build_lib] + package.split('.'))) - - # Strip directory from globbed filenames - filenames = [ - os.path.relpath(file, src_dir) - for file in self.find_data_files(package, src_dir) - ] - return package, src_dir, build_dir, filenames - - def find_data_files(self, package, src_dir): - """Return filenames for package's data files in 'src_dir'""" - patterns = self._get_platform_patterns( - self.package_data, - package, - src_dir, - ) - globs_expanded = map(glob, patterns) - # flatten the expanded globs into an iterable of matches - globs_matches = itertools.chain.from_iterable(globs_expanded) - glob_files = filter(os.path.isfile, globs_matches) - files = itertools.chain( - self.manifest_files.get(package, []), - glob_files, - ) - return self.exclude_data_files(package, src_dir, files) - - def build_package_data(self): - """Copy data files into build directory""" - for package, src_dir, build_dir, filenames in self.data_files: - for filename in filenames: - target = os.path.join(build_dir, filename) - self.mkpath(os.path.dirname(target)) - srcfile = os.path.join(src_dir, filename) - outf, copied = self.copy_file(srcfile, target) - srcfile = os.path.abspath(srcfile) - if (copied and - srcfile in self.distribution.convert_2to3_doctests): - self.__doctests_2to3.append(outf) - - def analyze_manifest(self): - self.manifest_files = mf = {} - if not self.distribution.include_package_data: - return - src_dirs = {} - for package in self.packages or (): - # Locate package source directory - src_dirs[assert_relative(self.get_package_dir(package))] = package - - self.run_command('egg_info') - ei_cmd = self.get_finalized_command('egg_info') - for path in ei_cmd.filelist.files: - d, f = os.path.split(assert_relative(path)) - prev = None - oldf = f - while d and d != prev and d not in src_dirs: - prev = d - d, df = os.path.split(d) - f = os.path.join(df, f) - if d in src_dirs: - if path.endswith('.py') and f == oldf: - continue # it's a module, not data - mf.setdefault(src_dirs[d], []).append(path) - - def get_data_files(self): - pass # Lazily compute data files in _get_data_files() function. - - def check_package(self, package, package_dir): - """Check namespace packages' __init__ for declare_namespace""" - try: - return self.packages_checked[package] - except KeyError: - pass - - init_py = orig.build_py.check_package(self, package, package_dir) - self.packages_checked[package] = init_py - - if not init_py or not self.distribution.namespace_packages: - return init_py - - for pkg in self.distribution.namespace_packages: - if pkg == package or pkg.startswith(package + '.'): - break - else: - return init_py - - with io.open(init_py, 'rb') as f: - contents = f.read() - if b'declare_namespace' not in contents: - raise distutils.errors.DistutilsError( - "Namespace package problem: %s is a namespace package, but " - "its\n__init__.py does not call declare_namespace()! Please " - 'fix it.\n(See the setuptools manual under ' - '"Namespace Packages" for details.)\n"' % (package,) - ) - return init_py - - def initialize_options(self): - self.packages_checked = {} - orig.build_py.initialize_options(self) - - def get_package_dir(self, package): - res = orig.build_py.get_package_dir(self, package) - if self.distribution.src_root is not None: - return os.path.join(self.distribution.src_root, res) - return res - - def exclude_data_files(self, package, src_dir, files): - """Filter filenames for package's data files in 'src_dir'""" - files = list(files) - patterns = self._get_platform_patterns( - self.exclude_package_data, - package, - src_dir, - ) - match_groups = ( - fnmatch.filter(files, pattern) - for pattern in patterns - ) - # flatten the groups of matches into an iterable of matches - matches = itertools.chain.from_iterable(match_groups) - bad = set(matches) - keepers = ( - fn - for fn in files - if fn not in bad - ) - # ditch dupes - return list(_unique_everseen(keepers)) - - @staticmethod - def _get_platform_patterns(spec, package, src_dir): - """ - yield platform-specific path patterns (suitable for glob - or fn_match) from a glob-based spec (such as - self.package_data or self.exclude_package_data) - matching package in src_dir. - """ - raw_patterns = itertools.chain( - spec.get('', []), - spec.get(package, []), - ) - return ( - # Each pattern has to be converted to a platform-specific path - os.path.join(src_dir, convert_path(pattern)) - for pattern in raw_patterns - ) - - -# from Python docs -def _unique_everseen(iterable, key=None): - "List unique elements, preserving order. Remember all elements ever seen." - # unique_everseen('AAAABBBCCDAABBB') --> A B C D - # unique_everseen('ABBCcAD', str.lower) --> A B C D - seen = set() - seen_add = seen.add - if key is None: - for element in filterfalse(seen.__contains__, iterable): - seen_add(element) - yield element - else: - for element in iterable: - k = key(element) - if k not in seen: - seen_add(k) - yield element - - -def assert_relative(path): - if not os.path.isabs(path): - return path - from distutils.errors import DistutilsSetupError - - msg = textwrap.dedent(""" - Error: setup script specifies an absolute path: - - %s - - setup() arguments must *always* be /-separated paths relative to the - setup.py directory, *never* absolute paths. - """).lstrip() % path - raise DistutilsSetupError(msg) diff --git a/venv/lib/python2.7/site-packages/setuptools/command/build_py.pyc b/venv/lib/python2.7/site-packages/setuptools/command/build_py.pyc deleted file mode 100644 index 1a6078b03a5e0b5b76dbffa9b00bec26af1d613a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11963 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 Nid>v~;hz^*{|^E1Dt!O| diff --git a/venv/lib/python2.7/site-packages/setuptools/command/develop.py b/venv/lib/python2.7/site-packages/setuptools/command/develop.py deleted file mode 100644 index 009e4f9..0000000 --- a/venv/lib/python2.7/site-packages/setuptools/command/develop.py +++ /dev/null @@ -1,221 +0,0 @@ -from distutils.util import convert_path -from distutils import log -from distutils.errors import DistutilsError, DistutilsOptionError -import os -import glob -import io - -from setuptools.extern import six - -import pkg_resources -from setuptools.command.easy_install import easy_install -from setuptools import namespaces -import setuptools - -__metaclass__ = type - - -class develop(namespaces.DevelopInstaller, easy_install): - """Set up package for development""" - - description = "install package in 'development mode'" - - user_options = easy_install.user_options + [ - ("uninstall", "u", "Uninstall this source package"), - ("egg-path=", None, "Set the path to be used in the .egg-link file"), - ] - - boolean_options = easy_install.boolean_options + ['uninstall'] - - command_consumes_arguments = False # override base - - def run(self): - if self.uninstall: - self.multi_version = True - self.uninstall_link() - self.uninstall_namespaces() - else: - self.install_for_development() - self.warn_deprecated_options() - - def initialize_options(self): - self.uninstall = None - self.egg_path = None - easy_install.initialize_options(self) - self.setup_path = None - self.always_copy_from = '.' # always copy eggs installed in curdir - - def finalize_options(self): - ei = self.get_finalized_command("egg_info") - if ei.broken_egg_info: - template = "Please rename %r to %r before using 'develop'" - args = ei.egg_info, ei.broken_egg_info - raise DistutilsError(template % args) - self.args = [ei.egg_name] - - easy_install.finalize_options(self) - self.expand_basedirs() - self.expand_dirs() - # pick up setup-dir .egg files only: no .egg-info - self.package_index.scan(glob.glob('*.egg')) - - egg_link_fn = ei.egg_name + '.egg-link' - self.egg_link = os.path.join(self.install_dir, egg_link_fn) - self.egg_base = ei.egg_base - if self.egg_path is None: - self.egg_path = os.path.abspath(ei.egg_base) - - target = pkg_resources.normalize_path(self.egg_base) - egg_path = pkg_resources.normalize_path( - os.path.join(self.install_dir, self.egg_path)) - if egg_path != target: - raise DistutilsOptionError( - "--egg-path must be a relative path from the install" - " directory to " + target - ) - - # Make a distribution for the package's source - self.dist = pkg_resources.Distribution( - target, - pkg_resources.PathMetadata(target, os.path.abspath(ei.egg_info)), - project_name=ei.egg_name - ) - - self.setup_path = self._resolve_setup_path( - self.egg_base, - self.install_dir, - self.egg_path, - ) - - @staticmethod - def _resolve_setup_path(egg_base, install_dir, egg_path): - """ - Generate a path from egg_base back to '.' where the - setup script resides and ensure that path points to the - setup path from $install_dir/$egg_path. - """ - path_to_setup = egg_base.replace(os.sep, '/').rstrip('/') - if path_to_setup != os.curdir: - path_to_setup = '../' * (path_to_setup.count('/') + 1) - resolved = pkg_resources.normalize_path( - os.path.join(install_dir, egg_path, path_to_setup) - ) - if resolved != pkg_resources.normalize_path(os.curdir): - raise DistutilsOptionError( - "Can't get a consistent path to setup script from" - " installation directory", resolved, - pkg_resources.normalize_path(os.curdir)) - return path_to_setup - - def install_for_development(self): - if six.PY3 and getattr(self.distribution, 'use_2to3', False): - # If we run 2to3 we can not do this inplace: - - # Ensure metadata is up-to-date - self.reinitialize_command('build_py', inplace=0) - self.run_command('build_py') - bpy_cmd = self.get_finalized_command("build_py") - build_path = pkg_resources.normalize_path(bpy_cmd.build_lib) - - # Build extensions - self.reinitialize_command('egg_info', egg_base=build_path) - self.run_command('egg_info') - - self.reinitialize_command('build_ext', inplace=0) - self.run_command('build_ext') - - # Fixup egg-link and easy-install.pth - ei_cmd = self.get_finalized_command("egg_info") - self.egg_path = build_path - self.dist.location = build_path - # XXX - self.dist._provider = pkg_resources.PathMetadata( - build_path, ei_cmd.egg_info) - else: - # Without 2to3 inplace works fine: - self.run_command('egg_info') - - # Build extensions in-place - self.reinitialize_command('build_ext', inplace=1) - self.run_command('build_ext') - - self.install_site_py() # ensure that target dir is site-safe - if setuptools.bootstrap_install_from: - self.easy_install(setuptools.bootstrap_install_from) - setuptools.bootstrap_install_from = None - - self.install_namespaces() - - # create an .egg-link in the installation dir, pointing to our egg - log.info("Creating %s (link to %s)", self.egg_link, self.egg_base) - if not self.dry_run: - with open(self.egg_link, "w") as f: - f.write(self.egg_path + "\n" + self.setup_path) - # postprocess the installed distro, fixing up .pth, installing scripts, - # and handling requirements - self.process_distribution(None, self.dist, not self.no_deps) - - def uninstall_link(self): - if os.path.exists(self.egg_link): - log.info("Removing %s (link to %s)", self.egg_link, self.egg_base) - egg_link_file = open(self.egg_link) - contents = [line.rstrip() for line in egg_link_file] - egg_link_file.close() - if contents not in ([self.egg_path], - [self.egg_path, self.setup_path]): - log.warn("Link points to %s: uninstall aborted", contents) - return - if not self.dry_run: - os.unlink(self.egg_link) - if not self.dry_run: - self.update_pth(self.dist) # remove any .pth link to us - if self.distribution.scripts: - # XXX should also check for entry point scripts! - log.warn("Note: you must uninstall or replace scripts manually!") - - def install_egg_scripts(self, dist): - if dist is not self.dist: - # Installing a dependency, so fall back to normal behavior - return easy_install.install_egg_scripts(self, dist) - - # create wrapper scripts in the script dir, pointing to dist.scripts - - # new-style... - self.install_wrapper_scripts(dist) - - # ...and old-style - for script_name in self.distribution.scripts or []: - script_path = os.path.abspath(convert_path(script_name)) - script_name = os.path.basename(script_path) - with io.open(script_path) as strm: - script_text = strm.read() - self.install_script(dist, script_name, script_text, script_path) - - def install_wrapper_scripts(self, dist): - dist = VersionlessRequirement(dist) - return easy_install.install_wrapper_scripts(self, dist) - - -class VersionlessRequirement: - """ - Adapt a pkg_resources.Distribution to simply return the project - name as the 'requirement' so that scripts will work across - multiple versions. - - >>> from pkg_resources import Distribution - >>> dist = Distribution(project_name='foo', version='1.0') - >>> str(dist.as_requirement()) - 'foo==1.0' - >>> adapted_dist = VersionlessRequirement(dist) - >>> str(adapted_dist.as_requirement()) - 'foo' - """ - - def __init__(self, dist): - self.__dist = dist - - def __getattr__(self, name): - return getattr(self.__dist, name) - - def as_requirement(self): - return self.project_name diff --git a/venv/lib/python2.7/site-packages/setuptools/command/develop.pyc b/venv/lib/python2.7/site-packages/setuptools/command/develop.pyc deleted file mode 100644 index 3f7335f5a479ec77e3ff0ca2d3365fc0ba456ccc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8733 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 Ukq~}sE42l@G3%bGKl9mt00KEHyZ`_I diff --git a/venv/lib/python2.7/site-packages/setuptools/command/dist_info.py b/venv/lib/python2.7/site-packages/setuptools/command/dist_info.py deleted file mode 100644 index c45258f..0000000 --- a/venv/lib/python2.7/site-packages/setuptools/command/dist_info.py +++ /dev/null @@ -1,36 +0,0 @@ -""" -Create a dist_info directory -As defined in the wheel specification -""" - -import os - -from distutils.core import Command -from distutils import log - - -class dist_info(Command): - - description = 'create a .dist-info directory' - - user_options = [ - ('egg-base=', 'e', "directory containing .egg-info directories" - " (default: top of the source tree)"), - ] - - def initialize_options(self): - self.egg_base = None - - def finalize_options(self): - pass - - def run(self): - egg_info = self.get_finalized_command('egg_info') - egg_info.egg_base = self.egg_base - egg_info.finalize_options() - egg_info.run() - dist_info_dir = egg_info.egg_info[:-len('.egg-info')] + '.dist-info' - log.info("creating '{}'".format(os.path.abspath(dist_info_dir))) - - bdist_wheel = self.get_finalized_command('bdist_wheel') - bdist_wheel.egg2dist(egg_info.egg_info, dist_info_dir) diff --git a/venv/lib/python2.7/site-packages/setuptools/command/dist_info.pyc b/venv/lib/python2.7/site-packages/setuptools/command/dist_info.pyc deleted file mode 100644 index b81fe9ddde3edb0d8c320e416a8806ad85c81d38..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2069 zcmd5+O>f&q5S=9@*_J<I6ewb#C_wZQwt&qfEsQisg0}9lH43_y3Mdvdxsq3<xD0pY z#EyL^+<Sj)e?a?YWGVK&KtgGUvme}<H}huVf3}BT{kijdNw-go_jefnCy0t@1gWTs zs8%$Bf`3ePM6;MiF)5z+sP56MPoqBOeKIkPu{xl?h;E2}8x8pLlXQ)5{Sjh#)R`if zq)003gSO4sLF-HzTz4`2-Y1nA+s0IhZIW<ik~e3@)QN9RX~(uKf_2T%{)^{0Rk$wj z#Yb*7E1GJtz!+*b2^)B?Oq7_&!@ECV_@@vC2;nSbMAaHi05WDo@O{)Hpkbwdiv~#Y zlXRWG{T!lP!Z=_f`}c8pHf|=9{nNsmmw_EMi<mBvCZ%gaVH?{_k^??@?*eOlk|Ger zybjNk;M&BEB^ut%yV4|~Gv>>ZujLV89AWrv2%xzl(gN#5B66JafzX3Ec8v)P0Twm; zwg?$-c~g&5yh(&VhnBUSJx8vx^P<bfuC7eyv&*;H#n;_w^X88yhp(H*hut@a<um{G z+v>7=jAznjzh<p%fyalUuJ^-}pC|g4%$qQ8gLAdNtCowzWve_Lv=`wMm_}fNEoysd zv}-x%{!^@a2105DoWTol1_0noynITK<pb7a%Hl(!+J$`(`yQq}_UR5LhQUKH{S5_~ zoC2Am8%5VjrjUx$3ptIr#1w1sO6ySoW3i)XGeNaJypAXgXu8J4o~{$>VmhShCSA!H z9K&DT8tRLon66@)Zi$JWoQqJ~99|CR@rpo9Sz-E$z<!7W?+Zc*DTTr`fAsG9QP{+R zQ%ScJcFL3uoZE>BdKsTe-x4G5V<%_Ah8UuoH#t|9Ols5QOaLJ^y8@I5vFm0<2pm-B zWvea1nRJQb)Qis7f&Wk0i<HAHELmJE6}0S28ht5eL>~o%@-2As8HQ&nk$RxE)DXWt z^+ohRr5vC8Z6}u{>E!=o*O5*x6wtaUW=8A4A<}y0s(H;*PH|;?*;%RFz<$rY>6Vq8 zbIX>b3Z(bJ73~AoXwIx*Z-vH#Xb^AoHsXzV0hztlx^kt~IcFg3Krn~q!Pfqube+ku i!Uc9`T_`FSe>^xPdoLFGdc_6c*C7VcR<x^j<Np9>qX={W diff --git a/venv/lib/python2.7/site-packages/setuptools/command/easy_install.py b/venv/lib/python2.7/site-packages/setuptools/command/easy_install.py deleted file mode 100644 index 06c9827..0000000 --- a/venv/lib/python2.7/site-packages/setuptools/command/easy_install.py +++ /dev/null @@ -1,2342 +0,0 @@ -#!/usr/bin/env python -""" -Easy Install ------------- - -A tool for doing automatic download/extract/build of distutils-based Python -packages. For detailed documentation, see the accompanying EasyInstall.txt -file, or visit the `EasyInstall home page`__. - -__ https://setuptools.readthedocs.io/en/latest/easy_install.html - -""" - -from glob import glob -from distutils.util import get_platform -from distutils.util import convert_path, subst_vars -from distutils.errors import ( - DistutilsArgError, DistutilsOptionError, - DistutilsError, DistutilsPlatformError, -) -from distutils.command.install import INSTALL_SCHEMES, SCHEME_KEYS -from distutils import log, dir_util -from distutils.command.build_scripts import first_line_re -from distutils.spawn import find_executable -import sys -import os -import zipimport -import shutil -import tempfile -import zipfile -import re -import stat -import random -import textwrap -import warnings -import site -import struct -import contextlib -import subprocess -import shlex -import io - - -from sysconfig import get_config_vars, get_path - -from setuptools import SetuptoolsDeprecationWarning - -from setuptools.extern import six -from setuptools.extern.six.moves import configparser, map - -from setuptools import Command -from setuptools.sandbox import run_setup -from setuptools.py27compat import rmtree_safe -from setuptools.command import setopt -from setuptools.archive_util import unpack_archive -from setuptools.package_index import ( - PackageIndex, parse_requirement_arg, URL_SCHEME, -) -from setuptools.command import bdist_egg, egg_info -from setuptools.wheel import Wheel -from pkg_resources import ( - yield_lines, normalize_path, resource_string, ensure_directory, - get_distribution, find_distributions, Environment, Requirement, - Distribution, PathMetadata, EggMetadata, WorkingSet, DistributionNotFound, - VersionConflict, DEVELOP_DIST, -) -import pkg_resources.py31compat - -__metaclass__ = type - -# Turn on PEP440Warnings -warnings.filterwarnings("default", category=pkg_resources.PEP440Warning) - -__all__ = [ - 'samefile', 'easy_install', 'PthDistributions', 'extract_wininst_cfg', - 'main', 'get_exe_prefixes', -] - - -def is_64bit(): - return struct.calcsize("P") == 8 - - -def samefile(p1, p2): - """ - Determine if two paths reference the same file. - - Augments os.path.samefile to work on Windows and - suppresses errors if the path doesn't exist. - """ - both_exist = os.path.exists(p1) and os.path.exists(p2) - use_samefile = hasattr(os.path, 'samefile') and both_exist - if use_samefile: - return os.path.samefile(p1, p2) - norm_p1 = os.path.normpath(os.path.normcase(p1)) - norm_p2 = os.path.normpath(os.path.normcase(p2)) - return norm_p1 == norm_p2 - - -if six.PY2: - - def _to_bytes(s): - return s - - def isascii(s): - try: - six.text_type(s, 'ascii') - return True - except UnicodeError: - return False -else: - - def _to_bytes(s): - return s.encode('utf8') - - def isascii(s): - try: - s.encode('ascii') - return True - except UnicodeError: - return False - - -_one_liner = lambda text: textwrap.dedent(text).strip().replace('\n', '; ') - - -class easy_install(Command): - """Manage a download/build/install process""" - description = "Find/get/install Python packages" - command_consumes_arguments = True - - user_options = [ - ('prefix=', None, "installation prefix"), - ("zip-ok", "z", "install package as a zipfile"), - ("multi-version", "m", "make apps have to require() a version"), - ("upgrade", "U", "force upgrade (searches PyPI for latest versions)"), - ("install-dir=", "d", "install package to DIR"), - ("script-dir=", "s", "install scripts to DIR"), - ("exclude-scripts", "x", "Don't install scripts"), - ("always-copy", "a", "Copy all needed packages to install dir"), - ("index-url=", "i", "base URL of Python Package Index"), - ("find-links=", "f", "additional URL(s) to search for packages"), - ("build-directory=", "b", - "download/extract/build in DIR; keep the results"), - ('optimize=', 'O', - "also compile with optimization: -O1 for \"python -O\", " - "-O2 for \"python -OO\", and -O0 to disable [default: -O0]"), - ('record=', None, - "filename in which to record list of installed files"), - ('always-unzip', 'Z', "don't install as a zipfile, no matter what"), - ('site-dirs=', 'S', "list of directories where .pth files work"), - ('editable', 'e', "Install specified packages in editable form"), - ('no-deps', 'N', "don't install dependencies"), - ('allow-hosts=', 'H', "pattern(s) that hostnames must match"), - ('local-snapshots-ok', 'l', - "allow building eggs from local checkouts"), - ('version', None, "print version information and exit"), - ('no-find-links', None, - "Don't load find-links defined in packages being installed") - ] - boolean_options = [ - 'zip-ok', 'multi-version', 'exclude-scripts', 'upgrade', 'always-copy', - 'editable', - 'no-deps', 'local-snapshots-ok', 'version' - ] - - if site.ENABLE_USER_SITE: - help_msg = "install in user site-package '%s'" % site.USER_SITE - user_options.append(('user', None, help_msg)) - boolean_options.append('user') - - negative_opt = {'always-unzip': 'zip-ok'} - create_index = PackageIndex - - def initialize_options(self): - # the --user option seems to be an opt-in one, - # so the default should be False. - self.user = 0 - self.zip_ok = self.local_snapshots_ok = None - self.install_dir = self.script_dir = self.exclude_scripts = None - self.index_url = None - self.find_links = None - self.build_directory = None - self.args = None - self.optimize = self.record = None - self.upgrade = self.always_copy = self.multi_version = None - self.editable = self.no_deps = self.allow_hosts = None - self.root = self.prefix = self.no_report = None - self.version = None - self.install_purelib = None # for pure module distributions - self.install_platlib = None # non-pure (dists w/ extensions) - self.install_headers = None # for C/C++ headers - self.install_lib = None # set to either purelib or platlib - self.install_scripts = None - self.install_data = None - self.install_base = None - self.install_platbase = None - if site.ENABLE_USER_SITE: - self.install_userbase = site.USER_BASE - self.install_usersite = site.USER_SITE - else: - self.install_userbase = None - self.install_usersite = None - self.no_find_links = None - - # Options not specifiable via command line - self.package_index = None - self.pth_file = self.always_copy_from = None - self.site_dirs = None - self.installed_projects = {} - self.sitepy_installed = False - # Always read easy_install options, even if we are subclassed, or have - # an independent instance created. This ensures that defaults will - # always come from the standard configuration file(s)' "easy_install" - # section, even if this is a "develop" or "install" command, or some - # other embedding. - self._dry_run = None - self.verbose = self.distribution.verbose - self.distribution._set_command_options( - self, self.distribution.get_option_dict('easy_install') - ) - - def delete_blockers(self, blockers): - extant_blockers = ( - filename for filename in blockers - if os.path.exists(filename) or os.path.islink(filename) - ) - list(map(self._delete_path, extant_blockers)) - - def _delete_path(self, path): - log.info("Deleting %s", path) - if self.dry_run: - return - - is_tree = os.path.isdir(path) and not os.path.islink(path) - remover = rmtree if is_tree else os.unlink - remover(path) - - @staticmethod - def _render_version(): - """ - Render the Setuptools version and installation details, then exit. - """ - ver = sys.version[:3] - dist = get_distribution('setuptools') - tmpl = 'setuptools {dist.version} from {dist.location} (Python {ver})' - print(tmpl.format(**locals())) - raise SystemExit() - - def finalize_options(self): - self.version and self._render_version() - - py_version = sys.version.split()[0] - prefix, exec_prefix = get_config_vars('prefix', 'exec_prefix') - - self.config_vars = { - 'dist_name': self.distribution.get_name(), - 'dist_version': self.distribution.get_version(), - 'dist_fullname': self.distribution.get_fullname(), - 'py_version': py_version, - 'py_version_short': py_version[0:3], - 'py_version_nodot': py_version[0] + py_version[2], - 'sys_prefix': prefix, - 'prefix': prefix, - 'sys_exec_prefix': exec_prefix, - 'exec_prefix': exec_prefix, - # Only python 3.2+ has abiflags - 'abiflags': getattr(sys, 'abiflags', ''), - } - - if site.ENABLE_USER_SITE: - self.config_vars['userbase'] = self.install_userbase - self.config_vars['usersite'] = self.install_usersite - - self._fix_install_dir_for_user_site() - - self.expand_basedirs() - self.expand_dirs() - - self._expand( - 'install_dir', 'script_dir', 'build_directory', - 'site_dirs', - ) - # If a non-default installation directory was specified, default the - # script directory to match it. - if self.script_dir is None: - self.script_dir = self.install_dir - - if self.no_find_links is None: - self.no_find_links = False - - # Let install_dir get set by install_lib command, which in turn - # gets its info from the install command, and takes into account - # --prefix and --home and all that other crud. - self.set_undefined_options( - 'install_lib', ('install_dir', 'install_dir') - ) - # Likewise, set default script_dir from 'install_scripts.install_dir' - self.set_undefined_options( - 'install_scripts', ('install_dir', 'script_dir') - ) - - if self.user and self.install_purelib: - self.install_dir = self.install_purelib - self.script_dir = self.install_scripts - # default --record from the install command - self.set_undefined_options('install', ('record', 'record')) - # Should this be moved to the if statement below? It's not used - # elsewhere - normpath = map(normalize_path, sys.path) - self.all_site_dirs = get_site_dirs() - if self.site_dirs is not None: - site_dirs = [ - os.path.expanduser(s.strip()) for s in - self.site_dirs.split(',') - ] - for d in site_dirs: - if not os.path.isdir(d): - log.warn("%s (in --site-dirs) does not exist", d) - elif normalize_path(d) not in normpath: - raise DistutilsOptionError( - d + " (in --site-dirs) is not on sys.path" - ) - else: - self.all_site_dirs.append(normalize_path(d)) - if not self.editable: - self.check_site_dir() - self.index_url = self.index_url or "https://pypi.org/simple/" - self.shadow_path = self.all_site_dirs[:] - for path_item in self.install_dir, normalize_path(self.script_dir): - if path_item not in self.shadow_path: - self.shadow_path.insert(0, path_item) - - if self.allow_hosts is not None: - hosts = [s.strip() for s in self.allow_hosts.split(',')] - else: - hosts = ['*'] - if self.package_index is None: - self.package_index = self.create_index( - self.index_url, search_path=self.shadow_path, hosts=hosts, - ) - self.local_index = Environment(self.shadow_path + sys.path) - - if self.find_links is not None: - if isinstance(self.find_links, six.string_types): - self.find_links = self.find_links.split() - else: - self.find_links = [] - if self.local_snapshots_ok: - self.package_index.scan_egg_links(self.shadow_path + sys.path) - if not self.no_find_links: - self.package_index.add_find_links(self.find_links) - self.set_undefined_options('install_lib', ('optimize', 'optimize')) - if not isinstance(self.optimize, int): - try: - self.optimize = int(self.optimize) - if not (0 <= self.optimize <= 2): - raise ValueError - except ValueError: - raise DistutilsOptionError("--optimize must be 0, 1, or 2") - - if self.editable and not self.build_directory: - raise DistutilsArgError( - "Must specify a build directory (-b) when using --editable" - ) - if not self.args: - raise DistutilsArgError( - "No urls, filenames, or requirements specified (see --help)") - - self.outputs = [] - - def _fix_install_dir_for_user_site(self): - """ - Fix the install_dir if "--user" was used. - """ - if not self.user or not site.ENABLE_USER_SITE: - return - - self.create_home_path() - if self.install_userbase is None: - msg = "User base directory is not specified" - raise DistutilsPlatformError(msg) - self.install_base = self.install_platbase = self.install_userbase - scheme_name = os.name.replace('posix', 'unix') + '_user' - self.select_scheme(scheme_name) - - def _expand_attrs(self, attrs): - for attr in attrs: - val = getattr(self, attr) - if val is not None: - if os.name == 'posix' or os.name == 'nt': - val = os.path.expanduser(val) - val = subst_vars(val, self.config_vars) - setattr(self, attr, val) - - def expand_basedirs(self): - """Calls `os.path.expanduser` on install_base, install_platbase and - root.""" - self._expand_attrs(['install_base', 'install_platbase', 'root']) - - def expand_dirs(self): - """Calls `os.path.expanduser` on install dirs.""" - dirs = [ - 'install_purelib', - 'install_platlib', - 'install_lib', - 'install_headers', - 'install_scripts', - 'install_data', - ] - self._expand_attrs(dirs) - - def run(self): - if self.verbose != self.distribution.verbose: - log.set_verbosity(self.verbose) - try: - for spec in self.args: - self.easy_install(spec, not self.no_deps) - if self.record: - outputs = self.outputs - if self.root: # strip any package prefix - root_len = len(self.root) - for counter in range(len(outputs)): - outputs[counter] = outputs[counter][root_len:] - from distutils import file_util - - self.execute( - file_util.write_file, (self.record, outputs), - "writing list of installed files to '%s'" % - self.record - ) - self.warn_deprecated_options() - finally: - log.set_verbosity(self.distribution.verbose) - - def pseudo_tempname(self): - """Return a pseudo-tempname base in the install directory. - This code is intentionally naive; if a malicious party can write to - the target directory you're already in deep doodoo. - """ - try: - pid = os.getpid() - except Exception: - pid = random.randint(0, sys.maxsize) - return os.path.join(self.install_dir, "test-easy-install-%s" % pid) - - def warn_deprecated_options(self): - pass - - def check_site_dir(self): - """Verify that self.install_dir is .pth-capable dir, if needed""" - - instdir = normalize_path(self.install_dir) - pth_file = os.path.join(instdir, 'easy-install.pth') - - # Is it a configured, PYTHONPATH, implicit, or explicit site dir? - is_site_dir = instdir in self.all_site_dirs - - if not is_site_dir and not self.multi_version: - # No? Then directly test whether it does .pth file processing - is_site_dir = self.check_pth_processing() - else: - # make sure we can write to target dir - testfile = self.pseudo_tempname() + '.write-test' - test_exists = os.path.exists(testfile) - try: - if test_exists: - os.unlink(testfile) - open(testfile, 'w').close() - os.unlink(testfile) - except (OSError, IOError): - self.cant_write_to_target() - - if not is_site_dir and not self.multi_version: - # Can't install non-multi to non-site dir - raise DistutilsError(self.no_default_version_msg()) - - if is_site_dir: - if self.pth_file is None: - self.pth_file = PthDistributions(pth_file, self.all_site_dirs) - else: - self.pth_file = None - - if instdir not in map(normalize_path, _pythonpath()): - # only PYTHONPATH dirs need a site.py, so pretend it's there - self.sitepy_installed = True - elif self.multi_version and not os.path.exists(pth_file): - self.sitepy_installed = True # don't need site.py in this case - self.pth_file = None # and don't create a .pth file - self.install_dir = instdir - - __cant_write_msg = textwrap.dedent(""" - can't create or remove files in install directory - - The following error occurred while trying to add or remove files in the - installation directory: - - %s - - The installation directory you specified (via --install-dir, --prefix, or - the distutils default setting) was: - - %s - """).lstrip() - - __not_exists_id = textwrap.dedent(""" - This directory does not currently exist. Please create it and try again, or - choose a different installation directory (using the -d or --install-dir - option). - """).lstrip() - - __access_msg = textwrap.dedent(""" - Perhaps your account does not have write access to this directory? If the - installation directory is a system-owned directory, you may need to sign in - as the administrator or "root" account. If you do not have administrative - access to this machine, you may wish to choose a different installation - directory, preferably one that is listed in your PYTHONPATH environment - variable. - - For information on other options, you may wish to consult the - documentation at: - - https://setuptools.readthedocs.io/en/latest/easy_install.html - - Please make the appropriate changes for your system and try again. - """).lstrip() - - def cant_write_to_target(self): - msg = self.__cant_write_msg % (sys.exc_info()[1], self.install_dir,) - - if not os.path.exists(self.install_dir): - msg += '\n' + self.__not_exists_id - else: - msg += '\n' + self.__access_msg - raise DistutilsError(msg) - - def check_pth_processing(self): - """Empirically verify whether .pth files are supported in inst. dir""" - instdir = self.install_dir - log.info("Checking .pth file support in %s", instdir) - pth_file = self.pseudo_tempname() + ".pth" - ok_file = pth_file + '.ok' - ok_exists = os.path.exists(ok_file) - tmpl = _one_liner(""" - import os - f = open({ok_file!r}, 'w') - f.write('OK') - f.close() - """) + '\n' - try: - if ok_exists: - os.unlink(ok_file) - dirname = os.path.dirname(ok_file) - pkg_resources.py31compat.makedirs(dirname, exist_ok=True) - f = open(pth_file, 'w') - except (OSError, IOError): - self.cant_write_to_target() - else: - try: - f.write(tmpl.format(**locals())) - f.close() - f = None - executable = sys.executable - if os.name == 'nt': - dirname, basename = os.path.split(executable) - alt = os.path.join(dirname, 'pythonw.exe') - use_alt = ( - basename.lower() == 'python.exe' and - os.path.exists(alt) - ) - if use_alt: - # use pythonw.exe to avoid opening a console window - executable = alt - - from distutils.spawn import spawn - - spawn([executable, '-E', '-c', 'pass'], 0) - - if os.path.exists(ok_file): - log.info( - "TEST PASSED: %s appears to support .pth files", - instdir - ) - return True - finally: - if f: - f.close() - if os.path.exists(ok_file): - os.unlink(ok_file) - if os.path.exists(pth_file): - os.unlink(pth_file) - if not self.multi_version: - log.warn("TEST FAILED: %s does NOT support .pth files", instdir) - return False - - def install_egg_scripts(self, dist): - """Write all the scripts for `dist`, unless scripts are excluded""" - if not self.exclude_scripts and dist.metadata_isdir('scripts'): - for script_name in dist.metadata_listdir('scripts'): - if dist.metadata_isdir('scripts/' + script_name): - # The "script" is a directory, likely a Python 3 - # __pycache__ directory, so skip it. - continue - self.install_script( - dist, script_name, - dist.get_metadata('scripts/' + script_name) - ) - self.install_wrapper_scripts(dist) - - def add_output(self, path): - if os.path.isdir(path): - for base, dirs, files in os.walk(path): - for filename in files: - self.outputs.append(os.path.join(base, filename)) - else: - self.outputs.append(path) - - def not_editable(self, spec): - if self.editable: - raise DistutilsArgError( - "Invalid argument %r: you can't use filenames or URLs " - "with --editable (except via the --find-links option)." - % (spec,) - ) - - def check_editable(self, spec): - if not self.editable: - return - - if os.path.exists(os.path.join(self.build_directory, spec.key)): - raise DistutilsArgError( - "%r already exists in %s; can't do a checkout there" % - (spec.key, self.build_directory) - ) - - @contextlib.contextmanager - def _tmpdir(self): - tmpdir = tempfile.mkdtemp(prefix=u"easy_install-") - try: - # cast to str as workaround for #709 and #710 and #712 - yield str(tmpdir) - finally: - os.path.exists(tmpdir) and rmtree(rmtree_safe(tmpdir)) - - def easy_install(self, spec, deps=False): - if not self.editable: - self.install_site_py() - - with self._tmpdir() as tmpdir: - if not isinstance(spec, Requirement): - if URL_SCHEME(spec): - # It's a url, download it to tmpdir and process - self.not_editable(spec) - dl = self.package_index.download(spec, tmpdir) - return self.install_item(None, dl, tmpdir, deps, True) - - elif os.path.exists(spec): - # Existing file or directory, just process it directly - self.not_editable(spec) - return self.install_item(None, spec, tmpdir, deps, True) - else: - spec = parse_requirement_arg(spec) - - self.check_editable(spec) - dist = self.package_index.fetch_distribution( - spec, tmpdir, self.upgrade, self.editable, - not self.always_copy, self.local_index - ) - if dist is None: - msg = "Could not find suitable distribution for %r" % spec - if self.always_copy: - msg += " (--always-copy skips system and development eggs)" - raise DistutilsError(msg) - elif dist.precedence == DEVELOP_DIST: - # .egg-info dists don't need installing, just process deps - self.process_distribution(spec, dist, deps, "Using") - return dist - else: - return self.install_item(spec, dist.location, tmpdir, deps) - - def install_item(self, spec, download, tmpdir, deps, install_needed=False): - - # Installation is also needed if file in tmpdir or is not an egg - install_needed = install_needed or self.always_copy - install_needed = install_needed or os.path.dirname(download) == tmpdir - install_needed = install_needed or not download.endswith('.egg') - install_needed = install_needed or ( - self.always_copy_from is not None and - os.path.dirname(normalize_path(download)) == - normalize_path(self.always_copy_from) - ) - - if spec and not install_needed: - # at this point, we know it's a local .egg, we just don't know if - # it's already installed. - for dist in self.local_index[spec.project_name]: - if dist.location == download: - break - else: - install_needed = True # it's not in the local index - - log.info("Processing %s", os.path.basename(download)) - - if install_needed: - dists = self.install_eggs(spec, download, tmpdir) - for dist in dists: - self.process_distribution(spec, dist, deps) - else: - dists = [self.egg_distribution(download)] - self.process_distribution(spec, dists[0], deps, "Using") - - if spec is not None: - for dist in dists: - if dist in spec: - return dist - - def select_scheme(self, name): - """Sets the install directories by applying the install schemes.""" - # it's the caller's problem if they supply a bad name! - scheme = INSTALL_SCHEMES[name] - for key in SCHEME_KEYS: - attrname = 'install_' + key - if getattr(self, attrname) is None: - setattr(self, attrname, scheme[key]) - - def process_distribution(self, requirement, dist, deps=True, *info): - self.update_pth(dist) - self.package_index.add(dist) - if dist in self.local_index[dist.key]: - self.local_index.remove(dist) - self.local_index.add(dist) - self.install_egg_scripts(dist) - self.installed_projects[dist.key] = dist - log.info(self.installation_report(requirement, dist, *info)) - if (dist.has_metadata('dependency_links.txt') and - not self.no_find_links): - self.package_index.add_find_links( - dist.get_metadata_lines('dependency_links.txt') - ) - if not deps and not self.always_copy: - return - elif requirement is not None and dist.key != requirement.key: - log.warn("Skipping dependencies for %s", dist) - return # XXX this is not the distribution we were looking for - elif requirement is None or dist not in requirement: - # if we wound up with a different version, resolve what we've got - distreq = dist.as_requirement() - requirement = Requirement(str(distreq)) - log.info("Processing dependencies for %s", requirement) - try: - distros = WorkingSet([]).resolve( - [requirement], self.local_index, self.easy_install - ) - except DistributionNotFound as e: - raise DistutilsError(str(e)) - except VersionConflict as e: - raise DistutilsError(e.report()) - if self.always_copy or self.always_copy_from: - # Force all the relevant distros to be copied or activated - for dist in distros: - if dist.key not in self.installed_projects: - self.easy_install(dist.as_requirement()) - log.info("Finished processing dependencies for %s", requirement) - - def should_unzip(self, dist): - if self.zip_ok is not None: - return not self.zip_ok - if dist.has_metadata('not-zip-safe'): - return True - if not dist.has_metadata('zip-safe'): - return True - return False - - def maybe_move(self, spec, dist_filename, setup_base): - dst = os.path.join(self.build_directory, spec.key) - if os.path.exists(dst): - msg = ( - "%r already exists in %s; build directory %s will not be kept" - ) - log.warn(msg, spec.key, self.build_directory, setup_base) - return setup_base - if os.path.isdir(dist_filename): - setup_base = dist_filename - else: - if os.path.dirname(dist_filename) == setup_base: - os.unlink(dist_filename) # get it out of the tmp dir - contents = os.listdir(setup_base) - if len(contents) == 1: - dist_filename = os.path.join(setup_base, contents[0]) - if os.path.isdir(dist_filename): - # if the only thing there is a directory, move it instead - setup_base = dist_filename - ensure_directory(dst) - shutil.move(setup_base, dst) - return dst - - def install_wrapper_scripts(self, dist): - if self.exclude_scripts: - return - for args in ScriptWriter.best().get_args(dist): - self.write_script(*args) - - def install_script(self, dist, script_name, script_text, dev_path=None): - """Generate a legacy script wrapper and install it""" - spec = str(dist.as_requirement()) - is_script = is_python_script(script_text, script_name) - - if is_script: - body = self._load_template(dev_path) % locals() - script_text = ScriptWriter.get_header(script_text) + body - self.write_script(script_name, _to_bytes(script_text), 'b') - - @staticmethod - def _load_template(dev_path): - """ - There are a couple of template scripts in the package. This - function loads one of them and prepares it for use. - """ - # See https://github.com/pypa/setuptools/issues/134 for info - # on script file naming and downstream issues with SVR4 - name = 'script.tmpl' - if dev_path: - name = name.replace('.tmpl', ' (dev).tmpl') - - raw_bytes = resource_string('setuptools', name) - return raw_bytes.decode('utf-8') - - def write_script(self, script_name, contents, mode="t", blockers=()): - """Write an executable file to the scripts directory""" - self.delete_blockers( # clean up old .py/.pyw w/o a script - [os.path.join(self.script_dir, x) for x in blockers] - ) - log.info("Installing %s script to %s", script_name, self.script_dir) - target = os.path.join(self.script_dir, script_name) - self.add_output(target) - - if self.dry_run: - return - - mask = current_umask() - ensure_directory(target) - if os.path.exists(target): - os.unlink(target) - with open(target, "w" + mode) as f: - f.write(contents) - chmod(target, 0o777 - mask) - - def install_eggs(self, spec, dist_filename, tmpdir): - # .egg dirs or files are already built, so just return them - if dist_filename.lower().endswith('.egg'): - return [self.install_egg(dist_filename, tmpdir)] - elif dist_filename.lower().endswith('.exe'): - return [self.install_exe(dist_filename, tmpdir)] - elif dist_filename.lower().endswith('.whl'): - return [self.install_wheel(dist_filename, tmpdir)] - - # Anything else, try to extract and build - setup_base = tmpdir - if os.path.isfile(dist_filename) and not dist_filename.endswith('.py'): - unpack_archive(dist_filename, tmpdir, self.unpack_progress) - elif os.path.isdir(dist_filename): - setup_base = os.path.abspath(dist_filename) - - if (setup_base.startswith(tmpdir) # something we downloaded - and self.build_directory and spec is not None): - setup_base = self.maybe_move(spec, dist_filename, setup_base) - - # Find the setup.py file - setup_script = os.path.join(setup_base, 'setup.py') - - if not os.path.exists(setup_script): - setups = glob(os.path.join(setup_base, '*', 'setup.py')) - if not setups: - raise DistutilsError( - "Couldn't find a setup script in %s" % - os.path.abspath(dist_filename) - ) - if len(setups) > 1: - raise DistutilsError( - "Multiple setup scripts in %s" % - os.path.abspath(dist_filename) - ) - setup_script = setups[0] - - # Now run it, and return the result - if self.editable: - log.info(self.report_editable(spec, setup_script)) - return [] - else: - return self.build_and_install(setup_script, setup_base) - - def egg_distribution(self, egg_path): - if os.path.isdir(egg_path): - metadata = PathMetadata(egg_path, os.path.join(egg_path, - 'EGG-INFO')) - else: - metadata = EggMetadata(zipimport.zipimporter(egg_path)) - return Distribution.from_filename(egg_path, metadata=metadata) - - def install_egg(self, egg_path, tmpdir): - destination = os.path.join( - self.install_dir, - os.path.basename(egg_path), - ) - destination = os.path.abspath(destination) - if not self.dry_run: - ensure_directory(destination) - - dist = self.egg_distribution(egg_path) - if not samefile(egg_path, destination): - if os.path.isdir(destination) and not os.path.islink(destination): - dir_util.remove_tree(destination, dry_run=self.dry_run) - elif os.path.exists(destination): - self.execute( - os.unlink, - (destination,), - "Removing " + destination, - ) - try: - new_dist_is_zipped = False - if os.path.isdir(egg_path): - if egg_path.startswith(tmpdir): - f, m = shutil.move, "Moving" - else: - f, m = shutil.copytree, "Copying" - elif self.should_unzip(dist): - self.mkpath(destination) - f, m = self.unpack_and_compile, "Extracting" - else: - new_dist_is_zipped = True - if egg_path.startswith(tmpdir): - f, m = shutil.move, "Moving" - else: - f, m = shutil.copy2, "Copying" - self.execute( - f, - (egg_path, destination), - (m + " %s to %s") % ( - os.path.basename(egg_path), - os.path.dirname(destination) - ), - ) - update_dist_caches( - destination, - fix_zipimporter_caches=new_dist_is_zipped, - ) - except Exception: - update_dist_caches(destination, fix_zipimporter_caches=False) - raise - - self.add_output(destination) - return self.egg_distribution(destination) - - def install_exe(self, dist_filename, tmpdir): - # See if it's valid, get data - cfg = extract_wininst_cfg(dist_filename) - if cfg is None: - raise DistutilsError( - "%s is not a valid distutils Windows .exe" % dist_filename - ) - # Create a dummy distribution object until we build the real distro - dist = Distribution( - None, - project_name=cfg.get('metadata', 'name'), - version=cfg.get('metadata', 'version'), platform=get_platform(), - ) - - # Convert the .exe to an unpacked egg - egg_path = os.path.join(tmpdir, dist.egg_name() + '.egg') - dist.location = egg_path - egg_tmp = egg_path + '.tmp' - _egg_info = os.path.join(egg_tmp, 'EGG-INFO') - pkg_inf = os.path.join(_egg_info, 'PKG-INFO') - ensure_directory(pkg_inf) # make sure EGG-INFO dir exists - dist._provider = PathMetadata(egg_tmp, _egg_info) # XXX - self.exe_to_egg(dist_filename, egg_tmp) - - # Write EGG-INFO/PKG-INFO - if not os.path.exists(pkg_inf): - f = open(pkg_inf, 'w') - f.write('Metadata-Version: 1.0\n') - for k, v in cfg.items('metadata'): - if k != 'target_version': - f.write('%s: %s\n' % (k.replace('_', '-').title(), v)) - f.close() - script_dir = os.path.join(_egg_info, 'scripts') - # delete entry-point scripts to avoid duping - self.delete_blockers([ - os.path.join(script_dir, args[0]) - for args in ScriptWriter.get_args(dist) - ]) - # Build .egg file from tmpdir - bdist_egg.make_zipfile( - egg_path, egg_tmp, verbose=self.verbose, dry_run=self.dry_run, - ) - # install the .egg - return self.install_egg(egg_path, tmpdir) - - def exe_to_egg(self, dist_filename, egg_tmp): - """Extract a bdist_wininst to the directories an egg would use""" - # Check for .pth file and set up prefix translations - prefixes = get_exe_prefixes(dist_filename) - to_compile = [] - native_libs = [] - top_level = {} - - def process(src, dst): - s = src.lower() - for old, new in prefixes: - if s.startswith(old): - src = new + src[len(old):] - parts = src.split('/') - dst = os.path.join(egg_tmp, *parts) - dl = dst.lower() - if dl.endswith('.pyd') or dl.endswith('.dll'): - parts[-1] = bdist_egg.strip_module(parts[-1]) - top_level[os.path.splitext(parts[0])[0]] = 1 - native_libs.append(src) - elif dl.endswith('.py') and old != 'SCRIPTS/': - top_level[os.path.splitext(parts[0])[0]] = 1 - to_compile.append(dst) - return dst - if not src.endswith('.pth'): - log.warn("WARNING: can't process %s", src) - return None - - # extract, tracking .pyd/.dll->native_libs and .py -> to_compile - unpack_archive(dist_filename, egg_tmp, process) - stubs = [] - for res in native_libs: - if res.lower().endswith('.pyd'): # create stubs for .pyd's - parts = res.split('/') - resource = parts[-1] - parts[-1] = bdist_egg.strip_module(parts[-1]) + '.py' - pyfile = os.path.join(egg_tmp, *parts) - to_compile.append(pyfile) - stubs.append(pyfile) - bdist_egg.write_stub(resource, pyfile) - self.byte_compile(to_compile) # compile .py's - bdist_egg.write_safety_flag( - os.path.join(egg_tmp, 'EGG-INFO'), - bdist_egg.analyze_egg(egg_tmp, stubs)) # write zip-safety flag - - for name in 'top_level', 'native_libs': - if locals()[name]: - txt = os.path.join(egg_tmp, 'EGG-INFO', name + '.txt') - if not os.path.exists(txt): - f = open(txt, 'w') - f.write('\n'.join(locals()[name]) + '\n') - f.close() - - def install_wheel(self, wheel_path, tmpdir): - wheel = Wheel(wheel_path) - assert wheel.is_compatible() - destination = os.path.join(self.install_dir, wheel.egg_name()) - destination = os.path.abspath(destination) - if not self.dry_run: - ensure_directory(destination) - if os.path.isdir(destination) and not os.path.islink(destination): - dir_util.remove_tree(destination, dry_run=self.dry_run) - elif os.path.exists(destination): - self.execute( - os.unlink, - (destination,), - "Removing " + destination, - ) - try: - self.execute( - wheel.install_as_egg, - (destination,), - ("Installing %s to %s") % ( - os.path.basename(wheel_path), - os.path.dirname(destination) - ), - ) - finally: - update_dist_caches(destination, fix_zipimporter_caches=False) - self.add_output(destination) - return self.egg_distribution(destination) - - __mv_warning = textwrap.dedent(""" - Because this distribution was installed --multi-version, before you can - import modules from this package in an application, you will need to - 'import pkg_resources' and then use a 'require()' call similar to one of - these examples, in order to select the desired version: - - pkg_resources.require("%(name)s") # latest installed version - pkg_resources.require("%(name)s==%(version)s") # this exact version - pkg_resources.require("%(name)s>=%(version)s") # this version or higher - """).lstrip() - - __id_warning = textwrap.dedent(""" - Note also that the installation directory must be on sys.path at runtime for - this to work. (e.g. by being the application's script directory, by being on - PYTHONPATH, or by being added to sys.path by your code.) - """) - - def installation_report(self, req, dist, what="Installed"): - """Helpful installation message for display to package users""" - msg = "\n%(what)s %(eggloc)s%(extras)s" - if self.multi_version and not self.no_report: - msg += '\n' + self.__mv_warning - if self.install_dir not in map(normalize_path, sys.path): - msg += '\n' + self.__id_warning - - eggloc = dist.location - name = dist.project_name - version = dist.version - extras = '' # TODO: self.report_extras(req, dist) - return msg % locals() - - __editable_msg = textwrap.dedent(""" - Extracted editable version of %(spec)s to %(dirname)s - - If it uses setuptools in its setup script, you can activate it in - "development" mode by going to that directory and running:: - - %(python)s setup.py develop - - See the setuptools documentation for the "develop" command for more info. - """).lstrip() - - def report_editable(self, spec, setup_script): - dirname = os.path.dirname(setup_script) - python = sys.executable - return '\n' + self.__editable_msg % locals() - - def run_setup(self, setup_script, setup_base, args): - sys.modules.setdefault('distutils.command.bdist_egg', bdist_egg) - sys.modules.setdefault('distutils.command.egg_info', egg_info) - - args = list(args) - if self.verbose > 2: - v = 'v' * (self.verbose - 1) - args.insert(0, '-' + v) - elif self.verbose < 2: - args.insert(0, '-q') - if self.dry_run: - args.insert(0, '-n') - log.info( - "Running %s %s", setup_script[len(setup_base) + 1:], ' '.join(args) - ) - try: - run_setup(setup_script, args) - except SystemExit as v: - raise DistutilsError("Setup script exited with %s" % (v.args[0],)) - - def build_and_install(self, setup_script, setup_base): - args = ['bdist_egg', '--dist-dir'] - - dist_dir = tempfile.mkdtemp( - prefix='egg-dist-tmp-', dir=os.path.dirname(setup_script) - ) - try: - self._set_fetcher_options(os.path.dirname(setup_script)) - args.append(dist_dir) - - self.run_setup(setup_script, setup_base, args) - all_eggs = Environment([dist_dir]) - eggs = [] - for key in all_eggs: - for dist in all_eggs[key]: - eggs.append(self.install_egg(dist.location, setup_base)) - if not eggs and not self.dry_run: - log.warn("No eggs found in %s (setup script problem?)", - dist_dir) - return eggs - finally: - rmtree(dist_dir) - log.set_verbosity(self.verbose) # restore our log verbosity - - def _set_fetcher_options(self, base): - """ - When easy_install is about to run bdist_egg on a source dist, that - source dist might have 'setup_requires' directives, requiring - additional fetching. Ensure the fetcher options given to easy_install - are available to that command as well. - """ - # find the fetch options from easy_install and write them out - # to the setup.cfg file. - ei_opts = self.distribution.get_option_dict('easy_install').copy() - fetch_directives = ( - 'find_links', 'site_dirs', 'index_url', 'optimize', - 'site_dirs', 'allow_hosts', - ) - fetch_options = {} - for key, val in ei_opts.items(): - if key not in fetch_directives: - continue - fetch_options[key.replace('_', '-')] = val[1] - # create a settings dictionary suitable for `edit_config` - settings = dict(easy_install=fetch_options) - cfg_filename = os.path.join(base, 'setup.cfg') - setopt.edit_config(cfg_filename, settings) - - def update_pth(self, dist): - if self.pth_file is None: - return - - for d in self.pth_file[dist.key]: # drop old entries - if self.multi_version or d.location != dist.location: - log.info("Removing %s from easy-install.pth file", d) - self.pth_file.remove(d) - if d.location in self.shadow_path: - self.shadow_path.remove(d.location) - - if not self.multi_version: - if dist.location in self.pth_file.paths: - log.info( - "%s is already the active version in easy-install.pth", - dist, - ) - else: - log.info("Adding %s to easy-install.pth file", dist) - self.pth_file.add(dist) # add new entry - if dist.location not in self.shadow_path: - self.shadow_path.append(dist.location) - - if not self.dry_run: - - self.pth_file.save() - - if dist.key == 'setuptools': - # Ensure that setuptools itself never becomes unavailable! - # XXX should this check for latest version? - filename = os.path.join(self.install_dir, 'setuptools.pth') - if os.path.islink(filename): - os.unlink(filename) - f = open(filename, 'wt') - f.write(self.pth_file.make_relative(dist.location) + '\n') - f.close() - - def unpack_progress(self, src, dst): - # Progress filter for unpacking - log.debug("Unpacking %s to %s", src, dst) - return dst # only unpack-and-compile skips files for dry run - - def unpack_and_compile(self, egg_path, destination): - to_compile = [] - to_chmod = [] - - def pf(src, dst): - if dst.endswith('.py') and not src.startswith('EGG-INFO/'): - to_compile.append(dst) - elif dst.endswith('.dll') or dst.endswith('.so'): - to_chmod.append(dst) - self.unpack_progress(src, dst) - return not self.dry_run and dst or None - - unpack_archive(egg_path, destination, pf) - self.byte_compile(to_compile) - if not self.dry_run: - for f in to_chmod: - mode = ((os.stat(f)[stat.ST_MODE]) | 0o555) & 0o7755 - chmod(f, mode) - - def byte_compile(self, to_compile): - if sys.dont_write_bytecode: - return - - from distutils.util import byte_compile - - try: - # try to make the byte compile messages quieter - log.set_verbosity(self.verbose - 1) - - byte_compile(to_compile, optimize=0, force=1, dry_run=self.dry_run) - if self.optimize: - byte_compile( - to_compile, optimize=self.optimize, force=1, - dry_run=self.dry_run, - ) - finally: - log.set_verbosity(self.verbose) # restore original verbosity - - __no_default_msg = textwrap.dedent(""" - bad install directory or PYTHONPATH - - You are attempting to install a package to a directory that is not - on PYTHONPATH and which Python does not read ".pth" files from. The - installation directory you specified (via --install-dir, --prefix, or - the distutils default setting) was: - - %s - - and your PYTHONPATH environment variable currently contains: - - %r - - Here are some of your options for correcting the problem: - - * You can choose a different installation directory, i.e., one that is - on PYTHONPATH or supports .pth files - - * You can add the installation directory to the PYTHONPATH environment - variable. (It must then also be on PYTHONPATH whenever you run - Python and want to use the package(s) you are installing.) - - * You can set up the installation directory to support ".pth" files by - using one of the approaches described here: - - https://setuptools.readthedocs.io/en/latest/easy_install.html#custom-installation-locations - - - Please make the appropriate changes for your system and try again.""").lstrip() - - def no_default_version_msg(self): - template = self.__no_default_msg - return template % (self.install_dir, os.environ.get('PYTHONPATH', '')) - - def install_site_py(self): - """Make sure there's a site.py in the target dir, if needed""" - - if self.sitepy_installed: - return # already did it, or don't need to - - sitepy = os.path.join(self.install_dir, "site.py") - source = resource_string("setuptools", "site-patch.py") - source = source.decode('utf-8') - current = "" - - if os.path.exists(sitepy): - log.debug("Checking existing site.py in %s", self.install_dir) - with io.open(sitepy) as strm: - current = strm.read() - - if not current.startswith('def __boot():'): - raise DistutilsError( - "%s is not a setuptools-generated site.py; please" - " remove it." % sitepy - ) - - if current != source: - log.info("Creating %s", sitepy) - if not self.dry_run: - ensure_directory(sitepy) - with io.open(sitepy, 'w', encoding='utf-8') as strm: - strm.write(source) - self.byte_compile([sitepy]) - - self.sitepy_installed = True - - def create_home_path(self): - """Create directories under ~.""" - if not self.user: - return - home = convert_path(os.path.expanduser("~")) - for name, path in six.iteritems(self.config_vars): - if path.startswith(home) and not os.path.isdir(path): - self.debug_print("os.makedirs('%s', 0o700)" % path) - os.makedirs(path, 0o700) - - INSTALL_SCHEMES = dict( - posix=dict( - install_dir='$base/lib/python$py_version_short/site-packages', - script_dir='$base/bin', - ), - ) - - DEFAULT_SCHEME = dict( - install_dir='$base/Lib/site-packages', - script_dir='$base/Scripts', - ) - - def _expand(self, *attrs): - config_vars = self.get_finalized_command('install').config_vars - - if self.prefix: - # Set default install_dir/scripts from --prefix - config_vars = config_vars.copy() - config_vars['base'] = self.prefix - scheme = self.INSTALL_SCHEMES.get(os.name, self.DEFAULT_SCHEME) - for attr, val in scheme.items(): - if getattr(self, attr, None) is None: - setattr(self, attr, val) - - from distutils.util import subst_vars - - for attr in attrs: - val = getattr(self, attr) - if val is not None: - val = subst_vars(val, config_vars) - if os.name == 'posix': - val = os.path.expanduser(val) - setattr(self, attr, val) - - -def _pythonpath(): - items = os.environ.get('PYTHONPATH', '').split(os.pathsep) - return filter(None, items) - - -def get_site_dirs(): - """ - Return a list of 'site' dirs - """ - - sitedirs = [] - - # start with PYTHONPATH - sitedirs.extend(_pythonpath()) - - prefixes = [sys.prefix] - if sys.exec_prefix != sys.prefix: - prefixes.append(sys.exec_prefix) - for prefix in prefixes: - if prefix: - if sys.platform in ('os2emx', 'riscos'): - sitedirs.append(os.path.join(prefix, "Lib", "site-packages")) - elif os.sep == '/': - sitedirs.extend([ - os.path.join( - prefix, - "lib", - "python" + sys.version[:3], - "site-packages", - ), - os.path.join(prefix, "lib", "site-python"), - ]) - else: - sitedirs.extend([ - prefix, - os.path.join(prefix, "lib", "site-packages"), - ]) - if sys.platform == 'darwin': - # for framework builds *only* we add the standard Apple - # locations. Currently only per-user, but /Library and - # /Network/Library could be added too - if 'Python.framework' in prefix: - home = os.environ.get('HOME') - if home: - home_sp = os.path.join( - home, - 'Library', - 'Python', - sys.version[:3], - 'site-packages', - ) - sitedirs.append(home_sp) - lib_paths = get_path('purelib'), get_path('platlib') - for site_lib in lib_paths: - if site_lib not in sitedirs: - sitedirs.append(site_lib) - - if site.ENABLE_USER_SITE: - sitedirs.append(site.USER_SITE) - - try: - sitedirs.extend(site.getsitepackages()) - except AttributeError: - pass - - sitedirs = list(map(normalize_path, sitedirs)) - - return sitedirs - - -def expand_paths(inputs): - """Yield sys.path directories that might contain "old-style" packages""" - - seen = {} - - for dirname in inputs: - dirname = normalize_path(dirname) - if dirname in seen: - continue - - seen[dirname] = 1 - if not os.path.isdir(dirname): - continue - - files = os.listdir(dirname) - yield dirname, files - - for name in files: - if not name.endswith('.pth'): - # We only care about the .pth files - continue - if name in ('easy-install.pth', 'setuptools.pth'): - # Ignore .pth files that we control - continue - - # Read the .pth file - f = open(os.path.join(dirname, name)) - lines = list(yield_lines(f)) - f.close() - - # Yield existing non-dupe, non-import directory lines from it - for line in lines: - if not line.startswith("import"): - line = normalize_path(line.rstrip()) - if line not in seen: - seen[line] = 1 - if not os.path.isdir(line): - continue - yield line, os.listdir(line) - - -def extract_wininst_cfg(dist_filename): - """Extract configuration data from a bdist_wininst .exe - - Returns a configparser.RawConfigParser, or None - """ - f = open(dist_filename, 'rb') - try: - endrec = zipfile._EndRecData(f) - if endrec is None: - return None - - prepended = (endrec[9] - endrec[5]) - endrec[6] - if prepended < 12: # no wininst data here - return None - f.seek(prepended - 12) - - tag, cfglen, bmlen = struct.unpack("<iii", f.read(12)) - if tag not in (0x1234567A, 0x1234567B): - return None # not a valid tag - - f.seek(prepended - (12 + cfglen)) - init = {'version': '', 'target_version': ''} - cfg = configparser.RawConfigParser(init) - try: - part = f.read(cfglen) - # Read up to the first null byte. - config = part.split(b'\0', 1)[0] - # Now the config is in bytes, but for RawConfigParser, it should - # be text, so decode it. - config = config.decode(sys.getfilesystemencoding()) - cfg.readfp(six.StringIO(config)) - except configparser.Error: - return None - if not cfg.has_section('metadata') or not cfg.has_section('Setup'): - return None - return cfg - - finally: - f.close() - - -def get_exe_prefixes(exe_filename): - """Get exe->egg path translations for a given .exe file""" - - prefixes = [ - ('PURELIB/', ''), - ('PLATLIB/pywin32_system32', ''), - ('PLATLIB/', ''), - ('SCRIPTS/', 'EGG-INFO/scripts/'), - ('DATA/lib/site-packages', ''), - ] - z = zipfile.ZipFile(exe_filename) - try: - for info in z.infolist(): - name = info.filename - parts = name.split('/') - if len(parts) == 3 and parts[2] == 'PKG-INFO': - if parts[1].endswith('.egg-info'): - prefixes.insert(0, ('/'.join(parts[:2]), 'EGG-INFO/')) - break - if len(parts) != 2 or not name.endswith('.pth'): - continue - if name.endswith('-nspkg.pth'): - continue - if parts[0].upper() in ('PURELIB', 'PLATLIB'): - contents = z.read(name) - if six.PY3: - contents = contents.decode() - for pth in yield_lines(contents): - pth = pth.strip().replace('\\', '/') - if not pth.startswith('import'): - prefixes.append((('%s/%s/' % (parts[0], pth)), '')) - finally: - z.close() - prefixes = [(x.lower(), y) for x, y in prefixes] - prefixes.sort() - prefixes.reverse() - return prefixes - - -class PthDistributions(Environment): - """A .pth file with Distribution paths in it""" - - dirty = False - - def __init__(self, filename, sitedirs=()): - self.filename = filename - self.sitedirs = list(map(normalize_path, sitedirs)) - self.basedir = normalize_path(os.path.dirname(self.filename)) - self._load() - Environment.__init__(self, [], None, None) - for path in yield_lines(self.paths): - list(map(self.add, find_distributions(path, True))) - - def _load(self): - self.paths = [] - saw_import = False - seen = dict.fromkeys(self.sitedirs) - if os.path.isfile(self.filename): - f = open(self.filename, 'rt') - for line in f: - if line.startswith('import'): - saw_import = True - continue - path = line.rstrip() - self.paths.append(path) - if not path.strip() or path.strip().startswith('#'): - continue - # skip non-existent paths, in case somebody deleted a package - # manually, and duplicate paths as well - path = self.paths[-1] = normalize_path( - os.path.join(self.basedir, path) - ) - if not os.path.exists(path) or path in seen: - self.paths.pop() # skip it - self.dirty = True # we cleaned up, so we're dirty now :) - continue - seen[path] = 1 - f.close() - - if self.paths and not saw_import: - self.dirty = True # ensure anything we touch has import wrappers - while self.paths and not self.paths[-1].strip(): - self.paths.pop() - - def save(self): - """Write changed .pth file back to disk""" - if not self.dirty: - return - - rel_paths = list(map(self.make_relative, self.paths)) - if rel_paths: - log.debug("Saving %s", self.filename) - lines = self._wrap_lines(rel_paths) - data = '\n'.join(lines) + '\n' - - if os.path.islink(self.filename): - os.unlink(self.filename) - with open(self.filename, 'wt') as f: - f.write(data) - - elif os.path.exists(self.filename): - log.debug("Deleting empty %s", self.filename) - os.unlink(self.filename) - - self.dirty = False - - @staticmethod - def _wrap_lines(lines): - return lines - - def add(self, dist): - """Add `dist` to the distribution map""" - new_path = ( - dist.location not in self.paths and ( - dist.location not in self.sitedirs or - # account for '.' being in PYTHONPATH - dist.location == os.getcwd() - ) - ) - if new_path: - self.paths.append(dist.location) - self.dirty = True - Environment.add(self, dist) - - def remove(self, dist): - """Remove `dist` from the distribution map""" - while dist.location in self.paths: - self.paths.remove(dist.location) - self.dirty = True - Environment.remove(self, dist) - - def make_relative(self, path): - npath, last = os.path.split(normalize_path(path)) - baselen = len(self.basedir) - parts = [last] - sep = os.altsep == '/' and '/' or os.sep - while len(npath) >= baselen: - if npath == self.basedir: - parts.append(os.curdir) - parts.reverse() - return sep.join(parts) - npath, last = os.path.split(npath) - parts.append(last) - else: - return path - - -class RewritePthDistributions(PthDistributions): - @classmethod - def _wrap_lines(cls, lines): - yield cls.prelude - for line in lines: - yield line - yield cls.postlude - - prelude = _one_liner(""" - import sys - sys.__plen = len(sys.path) - """) - postlude = _one_liner(""" - import sys - new = sys.path[sys.__plen:] - del sys.path[sys.__plen:] - p = getattr(sys, '__egginsert', 0) - sys.path[p:p] = new - sys.__egginsert = p + len(new) - """) - - -if os.environ.get('SETUPTOOLS_SYS_PATH_TECHNIQUE', 'raw') == 'rewrite': - PthDistributions = RewritePthDistributions - - -def _first_line_re(): - """ - Return a regular expression based on first_line_re suitable for matching - strings. - """ - if isinstance(first_line_re.pattern, str): - return first_line_re - - # first_line_re in Python >=3.1.4 and >=3.2.1 is a bytes pattern. - return re.compile(first_line_re.pattern.decode()) - - -def auto_chmod(func, arg, exc): - if func in [os.unlink, os.remove] and os.name == 'nt': - chmod(arg, stat.S_IWRITE) - return func(arg) - et, ev, _ = sys.exc_info() - six.reraise(et, (ev[0], ev[1] + (" %s %s" % (func, arg)))) - - -def update_dist_caches(dist_path, fix_zipimporter_caches): - """ - Fix any globally cached `dist_path` related data - - `dist_path` should be a path of a newly installed egg distribution (zipped - or unzipped). - - sys.path_importer_cache contains finder objects that have been cached when - importing data from the original distribution. Any such finders need to be - cleared since the replacement distribution might be packaged differently, - e.g. a zipped egg distribution might get replaced with an unzipped egg - folder or vice versa. Having the old finders cached may then cause Python - to attempt loading modules from the replacement distribution using an - incorrect loader. - - zipimport.zipimporter objects are Python loaders charged with importing - data packaged inside zip archives. If stale loaders referencing the - original distribution, are left behind, they can fail to load modules from - the replacement distribution. E.g. if an old zipimport.zipimporter instance - is used to load data from a new zipped egg archive, it may cause the - operation to attempt to locate the requested data in the wrong location - - one indicated by the original distribution's zip archive directory - information. Such an operation may then fail outright, e.g. report having - read a 'bad local file header', or even worse, it may fail silently & - return invalid data. - - zipimport._zip_directory_cache contains cached zip archive directory - information for all existing zipimport.zipimporter instances and all such - instances connected to the same archive share the same cached directory - information. - - If asked, and the underlying Python implementation allows it, we can fix - all existing zipimport.zipimporter instances instead of having to track - them down and remove them one by one, by updating their shared cached zip - archive directory information. This, of course, assumes that the - replacement distribution is packaged as a zipped egg. - - If not asked to fix existing zipimport.zipimporter instances, we still do - our best to clear any remaining zipimport.zipimporter related cached data - that might somehow later get used when attempting to load data from the new - distribution and thus cause such load operations to fail. Note that when - tracking down such remaining stale data, we can not catch every conceivable - usage from here, and we clear only those that we know of and have found to - cause problems if left alive. Any remaining caches should be updated by - whomever is in charge of maintaining them, i.e. they should be ready to - handle us replacing their zip archives with new distributions at runtime. - - """ - # There are several other known sources of stale zipimport.zipimporter - # instances that we do not clear here, but might if ever given a reason to - # do so: - # * Global setuptools pkg_resources.working_set (a.k.a. 'master working - # set') may contain distributions which may in turn contain their - # zipimport.zipimporter loaders. - # * Several zipimport.zipimporter loaders held by local variables further - # up the function call stack when running the setuptools installation. - # * Already loaded modules may have their __loader__ attribute set to the - # exact loader instance used when importing them. Python 3.4 docs state - # that this information is intended mostly for introspection and so is - # not expected to cause us problems. - normalized_path = normalize_path(dist_path) - _uncache(normalized_path, sys.path_importer_cache) - if fix_zipimporter_caches: - _replace_zip_directory_cache_data(normalized_path) - else: - # Here, even though we do not want to fix existing and now stale - # zipimporter cache information, we still want to remove it. Related to - # Python's zip archive directory information cache, we clear each of - # its stale entries in two phases: - # 1. Clear the entry so attempting to access zip archive information - # via any existing stale zipimport.zipimporter instances fails. - # 2. Remove the entry from the cache so any newly constructed - # zipimport.zipimporter instances do not end up using old stale - # zip archive directory information. - # This whole stale data removal step does not seem strictly necessary, - # but has been left in because it was done before we started replacing - # the zip archive directory information cache content if possible, and - # there are no relevant unit tests that we can depend on to tell us if - # this is really needed. - _remove_and_clear_zip_directory_cache_data(normalized_path) - - -def _collect_zipimporter_cache_entries(normalized_path, cache): - """ - Return zipimporter cache entry keys related to a given normalized path. - - Alternative path spellings (e.g. those using different character case or - those using alternative path separators) related to the same path are - included. Any sub-path entries are included as well, i.e. those - corresponding to zip archives embedded in other zip archives. - - """ - result = [] - prefix_len = len(normalized_path) - for p in cache: - np = normalize_path(p) - if (np.startswith(normalized_path) and - np[prefix_len:prefix_len + 1] in (os.sep, '')): - result.append(p) - return result - - -def _update_zipimporter_cache(normalized_path, cache, updater=None): - """ - Update zipimporter cache data for a given normalized path. - - Any sub-path entries are processed as well, i.e. those corresponding to zip - archives embedded in other zip archives. - - Given updater is a callable taking a cache entry key and the original entry - (after already removing the entry from the cache), and expected to update - the entry and possibly return a new one to be inserted in its place. - Returning None indicates that the entry should not be replaced with a new - one. If no updater is given, the cache entries are simply removed without - any additional processing, the same as if the updater simply returned None. - - """ - for p in _collect_zipimporter_cache_entries(normalized_path, cache): - # N.B. pypy's custom zipimport._zip_directory_cache implementation does - # not support the complete dict interface: - # * Does not support item assignment, thus not allowing this function - # to be used only for removing existing cache entries. - # * Does not support the dict.pop() method, forcing us to use the - # get/del patterns instead. For more detailed information see the - # following links: - # https://github.com/pypa/setuptools/issues/202#issuecomment-202913420 - # http://bit.ly/2h9itJX - old_entry = cache[p] - del cache[p] - new_entry = updater and updater(p, old_entry) - if new_entry is not None: - cache[p] = new_entry - - -def _uncache(normalized_path, cache): - _update_zipimporter_cache(normalized_path, cache) - - -def _remove_and_clear_zip_directory_cache_data(normalized_path): - def clear_and_remove_cached_zip_archive_directory_data(path, old_entry): - old_entry.clear() - - _update_zipimporter_cache( - normalized_path, zipimport._zip_directory_cache, - updater=clear_and_remove_cached_zip_archive_directory_data) - - -# PyPy Python implementation does not allow directly writing to the -# zipimport._zip_directory_cache and so prevents us from attempting to correct -# its content. The best we can do there is clear the problematic cache content -# and have PyPy repopulate it as needed. The downside is that if there are any -# stale zipimport.zipimporter instances laying around, attempting to use them -# will fail due to not having its zip archive directory information available -# instead of being automatically corrected to use the new correct zip archive -# directory information. -if '__pypy__' in sys.builtin_module_names: - _replace_zip_directory_cache_data = \ - _remove_and_clear_zip_directory_cache_data -else: - - def _replace_zip_directory_cache_data(normalized_path): - def replace_cached_zip_archive_directory_data(path, old_entry): - # N.B. In theory, we could load the zip directory information just - # once for all updated path spellings, and then copy it locally and - # update its contained path strings to contain the correct - # spelling, but that seems like a way too invasive move (this cache - # structure is not officially documented anywhere and could in - # theory change with new Python releases) for no significant - # benefit. - old_entry.clear() - zipimport.zipimporter(path) - old_entry.update(zipimport._zip_directory_cache[path]) - return old_entry - - _update_zipimporter_cache( - normalized_path, zipimport._zip_directory_cache, - updater=replace_cached_zip_archive_directory_data) - - -def is_python(text, filename='<string>'): - "Is this string a valid Python script?" - try: - compile(text, filename, 'exec') - except (SyntaxError, TypeError): - return False - else: - return True - - -def is_sh(executable): - """Determine if the specified executable is a .sh (contains a #! line)""" - try: - with io.open(executable, encoding='latin-1') as fp: - magic = fp.read(2) - except (OSError, IOError): - return executable - return magic == '#!' - - -def nt_quote_arg(arg): - """Quote a command line argument according to Windows parsing rules""" - return subprocess.list2cmdline([arg]) - - -def is_python_script(script_text, filename): - """Is this text, as a whole, a Python script? (as opposed to shell/bat/etc. - """ - if filename.endswith('.py') or filename.endswith('.pyw'): - return True # extension says it's Python - if is_python(script_text, filename): - return True # it's syntactically valid Python - if script_text.startswith('#!'): - # It begins with a '#!' line, so check if 'python' is in it somewhere - return 'python' in script_text.splitlines()[0].lower() - - return False # Not any Python I can recognize - - -try: - from os import chmod as _chmod -except ImportError: - # Jython compatibility - def _chmod(*args): - pass - - -def chmod(path, mode): - log.debug("changing mode of %s to %o", path, mode) - try: - _chmod(path, mode) - except os.error as e: - log.debug("chmod failed: %s", e) - - -class CommandSpec(list): - """ - A command spec for a #! header, specified as a list of arguments akin to - those passed to Popen. - """ - - options = [] - split_args = dict() - - @classmethod - def best(cls): - """ - Choose the best CommandSpec class based on environmental conditions. - """ - return cls - - @classmethod - def _sys_executable(cls): - _default = os.path.normpath(sys.executable) - return os.environ.get('__PYVENV_LAUNCHER__', _default) - - @classmethod - def from_param(cls, param): - """ - Construct a CommandSpec from a parameter to build_scripts, which may - be None. - """ - if isinstance(param, cls): - return param - if isinstance(param, list): - return cls(param) - if param is None: - return cls.from_environment() - # otherwise, assume it's a string. - return cls.from_string(param) - - @classmethod - def from_environment(cls): - return cls([cls._sys_executable()]) - - @classmethod - def from_string(cls, string): - """ - Construct a command spec from a simple string representing a command - line parseable by shlex.split. - """ - items = shlex.split(string, **cls.split_args) - return cls(items) - - def install_options(self, script_text): - self.options = shlex.split(self._extract_options(script_text)) - cmdline = subprocess.list2cmdline(self) - if not isascii(cmdline): - self.options[:0] = ['-x'] - - @staticmethod - def _extract_options(orig_script): - """ - Extract any options from the first line of the script. - """ - first = (orig_script + '\n').splitlines()[0] - match = _first_line_re().match(first) - options = match.group(1) or '' if match else '' - return options.strip() - - def as_header(self): - return self._render(self + list(self.options)) - - @staticmethod - def _strip_quotes(item): - _QUOTES = '"\'' - for q in _QUOTES: - if item.startswith(q) and item.endswith(q): - return item[1:-1] - return item - - @staticmethod - def _render(items): - cmdline = subprocess.list2cmdline( - CommandSpec._strip_quotes(item.strip()) for item in items) - return '#!' + cmdline + '\n' - - -# For pbr compat; will be removed in a future version. -sys_executable = CommandSpec._sys_executable() - - -class WindowsCommandSpec(CommandSpec): - split_args = dict(posix=False) - - -class ScriptWriter: - """ - Encapsulates behavior around writing entry point scripts for console and - gui apps. - """ - - template = textwrap.dedent(r""" - # EASY-INSTALL-ENTRY-SCRIPT: %(spec)r,%(group)r,%(name)r - __requires__ = %(spec)r - import re - import sys - from pkg_resources import load_entry_point - - if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit( - load_entry_point(%(spec)r, %(group)r, %(name)r)() - ) - """).lstrip() - - command_spec_class = CommandSpec - - @classmethod - def get_script_args(cls, dist, executable=None, wininst=False): - # for backward compatibility - warnings.warn("Use get_args", EasyInstallDeprecationWarning) - writer = (WindowsScriptWriter if wininst else ScriptWriter).best() - header = cls.get_script_header("", executable, wininst) - return writer.get_args(dist, header) - - @classmethod - def get_script_header(cls, script_text, executable=None, wininst=False): - # for backward compatibility - warnings.warn("Use get_header", EasyInstallDeprecationWarning, stacklevel=2) - if wininst: - executable = "python.exe" - return cls.get_header(script_text, executable) - - @classmethod - def get_args(cls, dist, header=None): - """ - Yield write_script() argument tuples for a distribution's - console_scripts and gui_scripts entry points. - """ - if header is None: - header = cls.get_header() - spec = str(dist.as_requirement()) - for type_ in 'console', 'gui': - group = type_ + '_scripts' - for name, ep in dist.get_entry_map(group).items(): - cls._ensure_safe_name(name) - script_text = cls.template % locals() - args = cls._get_script_args(type_, name, header, script_text) - for res in args: - yield res - - @staticmethod - def _ensure_safe_name(name): - """ - Prevent paths in *_scripts entry point names. - """ - has_path_sep = re.search(r'[\\/]', name) - if has_path_sep: - raise ValueError("Path separators not allowed in script names") - - @classmethod - def get_writer(cls, force_windows): - # for backward compatibility - warnings.warn("Use best", EasyInstallDeprecationWarning) - return WindowsScriptWriter.best() if force_windows else cls.best() - - @classmethod - def best(cls): - """ - Select the best ScriptWriter for this environment. - """ - if sys.platform == 'win32' or (os.name == 'java' and os._name == 'nt'): - return WindowsScriptWriter.best() - else: - return cls - - @classmethod - def _get_script_args(cls, type_, name, header, script_text): - # Simply write the stub with no extension. - yield (name, header + script_text) - - @classmethod - def get_header(cls, script_text="", executable=None): - """Create a #! line, getting options (if any) from script_text""" - cmd = cls.command_spec_class.best().from_param(executable) - cmd.install_options(script_text) - return cmd.as_header() - - -class WindowsScriptWriter(ScriptWriter): - command_spec_class = WindowsCommandSpec - - @classmethod - def get_writer(cls): - # for backward compatibility - warnings.warn("Use best", EasyInstallDeprecationWarning) - return cls.best() - - @classmethod - def best(cls): - """ - Select the best ScriptWriter suitable for Windows - """ - writer_lookup = dict( - executable=WindowsExecutableLauncherWriter, - natural=cls, - ) - # for compatibility, use the executable launcher by default - launcher = os.environ.get('SETUPTOOLS_LAUNCHER', 'executable') - return writer_lookup[launcher] - - @classmethod - def _get_script_args(cls, type_, name, header, script_text): - "For Windows, add a .py extension" - ext = dict(console='.pya', gui='.pyw')[type_] - if ext not in os.environ['PATHEXT'].lower().split(';'): - msg = ( - "{ext} not listed in PATHEXT; scripts will not be " - "recognized as executables." - ).format(**locals()) - warnings.warn(msg, UserWarning) - old = ['.pya', '.py', '-script.py', '.pyc', '.pyo', '.pyw', '.exe'] - old.remove(ext) - header = cls._adjust_header(type_, header) - blockers = [name + x for x in old] - yield name + ext, header + script_text, 't', blockers - - @classmethod - def _adjust_header(cls, type_, orig_header): - """ - Make sure 'pythonw' is used for gui and and 'python' is used for - console (regardless of what sys.executable is). - """ - pattern = 'pythonw.exe' - repl = 'python.exe' - if type_ == 'gui': - pattern, repl = repl, pattern - pattern_ob = re.compile(re.escape(pattern), re.IGNORECASE) - new_header = pattern_ob.sub(string=orig_header, repl=repl) - return new_header if cls._use_header(new_header) else orig_header - - @staticmethod - def _use_header(new_header): - """ - Should _adjust_header use the replaced header? - - On non-windows systems, always use. On - Windows systems, only use the replaced header if it resolves - to an executable on the system. - """ - clean_header = new_header[2:-1].strip('"') - return sys.platform != 'win32' or find_executable(clean_header) - - -class WindowsExecutableLauncherWriter(WindowsScriptWriter): - @classmethod - def _get_script_args(cls, type_, name, header, script_text): - """ - For Windows, add a .py extension and an .exe launcher - """ - if type_ == 'gui': - launcher_type = 'gui' - ext = '-script.pyw' - old = ['.pyw'] - else: - launcher_type = 'cli' - ext = '-script.py' - old = ['.py', '.pyc', '.pyo'] - hdr = cls._adjust_header(type_, header) - blockers = [name + x for x in old] - yield (name + ext, hdr + script_text, 't', blockers) - yield ( - name + '.exe', get_win_launcher(launcher_type), - 'b' # write in binary mode - ) - if not is_64bit(): - # install a manifest for the launcher to prevent Windows - # from detecting it as an installer (which it will for - # launchers like easy_install.exe). Consider only - # adding a manifest for launchers detected as installers. - # See Distribute #143 for details. - m_name = name + '.exe.manifest' - yield (m_name, load_launcher_manifest(name), 't') - - -# for backward-compatibility -get_script_args = ScriptWriter.get_script_args -get_script_header = ScriptWriter.get_script_header - - -def get_win_launcher(type): - """ - Load the Windows launcher (executable) suitable for launching a script. - - `type` should be either 'cli' or 'gui' - - Returns the executable as a byte string. - """ - launcher_fn = '%s.exe' % type - if is_64bit(): - launcher_fn = launcher_fn.replace(".", "-64.") - else: - launcher_fn = launcher_fn.replace(".", "-32.") - return resource_string('setuptools', launcher_fn) - - -def load_launcher_manifest(name): - manifest = pkg_resources.resource_string(__name__, 'launcher manifest.xml') - if six.PY2: - return manifest % vars() - else: - return manifest.decode('utf-8') % vars() - - -def rmtree(path, ignore_errors=False, onerror=auto_chmod): - return shutil.rmtree(path, ignore_errors, onerror) - - -def current_umask(): - tmp = os.umask(0o022) - os.umask(tmp) - return tmp - - -def bootstrap(): - # This function is called when setuptools*.egg is run using /bin/sh - import setuptools - - argv0 = os.path.dirname(setuptools.__path__[0]) - sys.argv[0] = argv0 - sys.argv.append(argv0) - main() - - -def main(argv=None, **kw): - from setuptools import setup - from setuptools.dist import Distribution - - class DistributionWithoutHelpCommands(Distribution): - common_usage = "" - - def _show_help(self, *args, **kw): - with _patch_usage(): - Distribution._show_help(self, *args, **kw) - - if argv is None: - argv = sys.argv[1:] - - with _patch_usage(): - setup( - script_args=['-q', 'easy_install', '-v'] + argv, - script_name=sys.argv[0] or 'easy_install', - distclass=DistributionWithoutHelpCommands, - **kw - ) - - -@contextlib.contextmanager -def _patch_usage(): - import distutils.core - USAGE = textwrap.dedent(""" - usage: %(script)s [options] requirement_or_url ... - or: %(script)s --help - """).lstrip() - - def gen_usage(script_name): - return USAGE % dict( - script=os.path.basename(script_name), - ) - - saved = distutils.core.gen_usage - distutils.core.gen_usage = gen_usage - try: - yield - finally: - distutils.core.gen_usage = saved - -class EasyInstallDeprecationWarning(SetuptoolsDeprecationWarning): - """Class for warning about deprecations in EasyInstall in SetupTools. Not ignored by default, unlike DeprecationWarning.""" - diff --git a/venv/lib/python2.7/site-packages/setuptools/command/easy_install.pyc b/venv/lib/python2.7/site-packages/setuptools/command/easy_install.pyc deleted file mode 100644 index 78630df694618b70c381d57a79273653f8d8c07b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 88096 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 ZBL_zsb^U64eG8@e2J1sxckQ_R{{Ta5`1$|< diff --git a/venv/lib/python2.7/site-packages/setuptools/command/egg_info.py b/venv/lib/python2.7/site-packages/setuptools/command/egg_info.py deleted file mode 100644 index 5d8f451..0000000 --- a/venv/lib/python2.7/site-packages/setuptools/command/egg_info.py +++ /dev/null @@ -1,717 +0,0 @@ -"""setuptools.command.egg_info - -Create a distribution's .egg-info directory and contents""" - -from distutils.filelist import FileList as _FileList -from distutils.errors import DistutilsInternalError -from distutils.util import convert_path -from distutils import log -import distutils.errors -import distutils.filelist -import os -import re -import sys -import io -import warnings -import time -import collections - -from setuptools.extern import six -from setuptools.extern.six.moves import map - -from setuptools import Command -from setuptools.command.sdist import sdist -from setuptools.command.sdist import walk_revctrl -from setuptools.command.setopt import edit_config -from setuptools.command import bdist_egg -from pkg_resources import ( - parse_requirements, safe_name, parse_version, - safe_version, yield_lines, EntryPoint, iter_entry_points, to_filename) -import setuptools.unicode_utils as unicode_utils -from setuptools.glob import glob - -from setuptools.extern import packaging -from setuptools import SetuptoolsDeprecationWarning - -def translate_pattern(glob): - """ - Translate a file path glob like '*.txt' in to a regular expression. - This differs from fnmatch.translate which allows wildcards to match - directory separators. It also knows about '**/' which matches any number of - directories. - """ - pat = '' - - # This will split on '/' within [character classes]. This is deliberate. - chunks = glob.split(os.path.sep) - - sep = re.escape(os.sep) - valid_char = '[^%s]' % (sep,) - - for c, chunk in enumerate(chunks): - last_chunk = c == len(chunks) - 1 - - # Chunks that are a literal ** are globstars. They match anything. - if chunk == '**': - if last_chunk: - # Match anything if this is the last component - pat += '.*' - else: - # Match '(name/)*' - pat += '(?:%s+%s)*' % (valid_char, sep) - continue # Break here as the whole path component has been handled - - # Find any special characters in the remainder - i = 0 - chunk_len = len(chunk) - while i < chunk_len: - char = chunk[i] - if char == '*': - # Match any number of name characters - pat += valid_char + '*' - elif char == '?': - # Match a name character - pat += valid_char - elif char == '[': - # Character class - inner_i = i + 1 - # Skip initial !/] chars - if inner_i < chunk_len and chunk[inner_i] == '!': - inner_i = inner_i + 1 - if inner_i < chunk_len and chunk[inner_i] == ']': - inner_i = inner_i + 1 - - # Loop till the closing ] is found - while inner_i < chunk_len and chunk[inner_i] != ']': - inner_i = inner_i + 1 - - if inner_i >= chunk_len: - # Got to the end of the string without finding a closing ] - # Do not treat this as a matching group, but as a literal [ - pat += re.escape(char) - else: - # Grab the insides of the [brackets] - inner = chunk[i + 1:inner_i] - char_class = '' - - # Class negation - if inner[0] == '!': - char_class = '^' - inner = inner[1:] - - char_class += re.escape(inner) - pat += '[%s]' % (char_class,) - - # Skip to the end ] - i = inner_i - else: - pat += re.escape(char) - i += 1 - - # Join each chunk with the dir separator - if not last_chunk: - pat += sep - - pat += r'\Z' - return re.compile(pat, flags=re.MULTILINE|re.DOTALL) - - -class InfoCommon: - tag_build = None - tag_date = None - - @property - def name(self): - return safe_name(self.distribution.get_name()) - - def tagged_version(self): - version = self.distribution.get_version() - # egg_info may be called more than once for a distribution, - # in which case the version string already contains all tags. - if self.vtags and version.endswith(self.vtags): - return safe_version(version) - return safe_version(version + self.vtags) - - def tags(self): - version = '' - if self.tag_build: - version += self.tag_build - if self.tag_date: - version += time.strftime("-%Y%m%d") - return version - vtags = property(tags) - - -class egg_info(InfoCommon, Command): - description = "create a distribution's .egg-info directory" - - user_options = [ - ('egg-base=', 'e', "directory containing .egg-info directories" - " (default: top of the source tree)"), - ('tag-date', 'd', "Add date stamp (e.g. 20050528) to version number"), - ('tag-build=', 'b', "Specify explicit tag to add to version number"), - ('no-date', 'D', "Don't include date stamp [default]"), - ] - - boolean_options = ['tag-date'] - negative_opt = { - 'no-date': 'tag-date', - } - - def initialize_options(self): - self.egg_base = None - self.egg_name = None - self.egg_info = None - self.egg_version = None - self.broken_egg_info = False - - #################################### - # allow the 'tag_svn_revision' to be detected and - # set, supporting sdists built on older Setuptools. - @property - def tag_svn_revision(self): - pass - - @tag_svn_revision.setter - def tag_svn_revision(self, value): - pass - #################################### - - def save_version_info(self, filename): - """ - Materialize the value of date into the - build tag. Install build keys in a deterministic order - to avoid arbitrary reordering on subsequent builds. - """ - egg_info = collections.OrderedDict() - # follow the order these keys would have been added - # when PYTHONHASHSEED=0 - egg_info['tag_build'] = self.tags() - egg_info['tag_date'] = 0 - edit_config(filename, dict(egg_info=egg_info)) - - def finalize_options(self): - # Note: we need to capture the current value returned - # by `self.tagged_version()`, so we can later update - # `self.distribution.metadata.version` without - # repercussions. - self.egg_name = self.name - self.egg_version = self.tagged_version() - parsed_version = parse_version(self.egg_version) - - try: - is_version = isinstance(parsed_version, packaging.version.Version) - spec = ( - "%s==%s" if is_version else "%s===%s" - ) - list( - parse_requirements(spec % (self.egg_name, self.egg_version)) - ) - except ValueError: - raise distutils.errors.DistutilsOptionError( - "Invalid distribution name or version syntax: %s-%s" % - (self.egg_name, self.egg_version) - ) - - if self.egg_base is None: - dirs = self.distribution.package_dir - self.egg_base = (dirs or {}).get('', os.curdir) - - self.ensure_dirname('egg_base') - self.egg_info = to_filename(self.egg_name) + '.egg-info' - if self.egg_base != os.curdir: - self.egg_info = os.path.join(self.egg_base, self.egg_info) - if '-' in self.egg_name: - self.check_broken_egg_info() - - # Set package version for the benefit of dumber commands - # (e.g. sdist, bdist_wininst, etc.) - # - self.distribution.metadata.version = self.egg_version - - # If we bootstrapped around the lack of a PKG-INFO, as might be the - # case in a fresh checkout, make sure that any special tags get added - # to the version info - # - pd = self.distribution._patched_dist - if pd is not None and pd.key == self.egg_name.lower(): - pd._version = self.egg_version - pd._parsed_version = parse_version(self.egg_version) - self.distribution._patched_dist = None - - def write_or_delete_file(self, what, filename, data, force=False): - """Write `data` to `filename` or delete if empty - - If `data` is non-empty, this routine is the same as ``write_file()``. - If `data` is empty but not ``None``, this is the same as calling - ``delete_file(filename)`. If `data` is ``None``, then this is a no-op - unless `filename` exists, in which case a warning is issued about the - orphaned file (if `force` is false), or deleted (if `force` is true). - """ - if data: - self.write_file(what, filename, data) - elif os.path.exists(filename): - if data is None and not force: - log.warn( - "%s not set in setup(), but %s exists", what, filename - ) - return - else: - self.delete_file(filename) - - def write_file(self, what, filename, data): - """Write `data` to `filename` (if not a dry run) after announcing it - - `what` is used in a log message to identify what is being written - to the file. - """ - log.info("writing %s to %s", what, filename) - if six.PY3: - data = data.encode("utf-8") - if not self.dry_run: - f = open(filename, 'wb') - f.write(data) - f.close() - - def delete_file(self, filename): - """Delete `filename` (if not a dry run) after announcing it""" - log.info("deleting %s", filename) - if not self.dry_run: - os.unlink(filename) - - def run(self): - self.mkpath(self.egg_info) - os.utime(self.egg_info, None) - installer = self.distribution.fetch_build_egg - for ep in iter_entry_points('egg_info.writers'): - ep.require(installer=installer) - writer = ep.resolve() - writer(self, ep.name, os.path.join(self.egg_info, ep.name)) - - # Get rid of native_libs.txt if it was put there by older bdist_egg - nl = os.path.join(self.egg_info, "native_libs.txt") - if os.path.exists(nl): - self.delete_file(nl) - - self.find_sources() - - def find_sources(self): - """Generate SOURCES.txt manifest file""" - manifest_filename = os.path.join(self.egg_info, "SOURCES.txt") - mm = manifest_maker(self.distribution) - mm.manifest = manifest_filename - mm.run() - self.filelist = mm.filelist - - def check_broken_egg_info(self): - bei = self.egg_name + '.egg-info' - if self.egg_base != os.curdir: - bei = os.path.join(self.egg_base, bei) - if os.path.exists(bei): - log.warn( - "-" * 78 + '\n' - "Note: Your current .egg-info directory has a '-' in its name;" - '\nthis will not work correctly with "setup.py develop".\n\n' - 'Please rename %s to %s to correct this problem.\n' + '-' * 78, - bei, self.egg_info - ) - self.broken_egg_info = self.egg_info - self.egg_info = bei # make it work for now - - -class FileList(_FileList): - # Implementations of the various MANIFEST.in commands - - def process_template_line(self, line): - # Parse the line: split it up, make sure the right number of words - # is there, and return the relevant words. 'action' is always - # defined: it's the first word of the line. Which of the other - # three are defined depends on the action; it'll be either - # patterns, (dir and patterns), or (dir_pattern). - (action, patterns, dir, dir_pattern) = self._parse_template_line(line) - - # OK, now we know that the action is valid and we have the - # right number of words on the line for that action -- so we - # can proceed with minimal error-checking. - if action == 'include': - self.debug_print("include " + ' '.join(patterns)) - for pattern in patterns: - if not self.include(pattern): - log.warn("warning: no files found matching '%s'", pattern) - - elif action == 'exclude': - self.debug_print("exclude " + ' '.join(patterns)) - for pattern in patterns: - if not self.exclude(pattern): - log.warn(("warning: no previously-included files " - "found matching '%s'"), pattern) - - elif action == 'global-include': - self.debug_print("global-include " + ' '.join(patterns)) - for pattern in patterns: - if not self.global_include(pattern): - log.warn(("warning: no files found matching '%s' " - "anywhere in distribution"), pattern) - - elif action == 'global-exclude': - self.debug_print("global-exclude " + ' '.join(patterns)) - for pattern in patterns: - if not self.global_exclude(pattern): - log.warn(("warning: no previously-included files matching " - "'%s' found anywhere in distribution"), - pattern) - - elif action == 'recursive-include': - self.debug_print("recursive-include %s %s" % - (dir, ' '.join(patterns))) - for pattern in patterns: - if not self.recursive_include(dir, pattern): - log.warn(("warning: no files found matching '%s' " - "under directory '%s'"), - pattern, dir) - - elif action == 'recursive-exclude': - self.debug_print("recursive-exclude %s %s" % - (dir, ' '.join(patterns))) - for pattern in patterns: - if not self.recursive_exclude(dir, pattern): - log.warn(("warning: no previously-included files matching " - "'%s' found under directory '%s'"), - pattern, dir) - - elif action == 'graft': - self.debug_print("graft " + dir_pattern) - if not self.graft(dir_pattern): - log.warn("warning: no directories found matching '%s'", - dir_pattern) - - elif action == 'prune': - self.debug_print("prune " + dir_pattern) - if not self.prune(dir_pattern): - log.warn(("no previously-included directories found " - "matching '%s'"), dir_pattern) - - else: - raise DistutilsInternalError( - "this cannot happen: invalid action '%s'" % action) - - def _remove_files(self, predicate): - """ - Remove all files from the file list that match the predicate. - Return True if any matching files were removed - """ - found = False - for i in range(len(self.files) - 1, -1, -1): - if predicate(self.files[i]): - self.debug_print(" removing " + self.files[i]) - del self.files[i] - found = True - return found - - def include(self, pattern): - """Include files that match 'pattern'.""" - found = [f for f in glob(pattern) if not os.path.isdir(f)] - self.extend(found) - return bool(found) - - def exclude(self, pattern): - """Exclude files that match 'pattern'.""" - match = translate_pattern(pattern) - return self._remove_files(match.match) - - def recursive_include(self, dir, pattern): - """ - Include all files anywhere in 'dir/' that match the pattern. - """ - full_pattern = os.path.join(dir, '**', pattern) - found = [f for f in glob(full_pattern, recursive=True) - if not os.path.isdir(f)] - self.extend(found) - return bool(found) - - def recursive_exclude(self, dir, pattern): - """ - Exclude any file anywhere in 'dir/' that match the pattern. - """ - match = translate_pattern(os.path.join(dir, '**', pattern)) - return self._remove_files(match.match) - - def graft(self, dir): - """Include all files from 'dir/'.""" - found = [ - item - for match_dir in glob(dir) - for item in distutils.filelist.findall(match_dir) - ] - self.extend(found) - return bool(found) - - def prune(self, dir): - """Filter out files from 'dir/'.""" - match = translate_pattern(os.path.join(dir, '**')) - return self._remove_files(match.match) - - def global_include(self, pattern): - """ - Include all files anywhere in the current directory that match the - pattern. This is very inefficient on large file trees. - """ - if self.allfiles is None: - self.findall() - match = translate_pattern(os.path.join('**', pattern)) - found = [f for f in self.allfiles if match.match(f)] - self.extend(found) - return bool(found) - - def global_exclude(self, pattern): - """ - Exclude all files anywhere that match the pattern. - """ - match = translate_pattern(os.path.join('**', pattern)) - return self._remove_files(match.match) - - def append(self, item): - if item.endswith('\r'): # Fix older sdists built on Windows - item = item[:-1] - path = convert_path(item) - - if self._safe_path(path): - self.files.append(path) - - def extend(self, paths): - self.files.extend(filter(self._safe_path, paths)) - - def _repair(self): - """ - Replace self.files with only safe paths - - Because some owners of FileList manipulate the underlying - ``files`` attribute directly, this method must be called to - repair those paths. - """ - self.files = list(filter(self._safe_path, self.files)) - - def _safe_path(self, path): - enc_warn = "'%s' not %s encodable -- skipping" - - # To avoid accidental trans-codings errors, first to unicode - u_path = unicode_utils.filesys_decode(path) - if u_path is None: - log.warn("'%s' in unexpected encoding -- skipping" % path) - return False - - # Must ensure utf-8 encodability - utf8_path = unicode_utils.try_encode(u_path, "utf-8") - if utf8_path is None: - log.warn(enc_warn, path, 'utf-8') - return False - - try: - # accept is either way checks out - if os.path.exists(u_path) or os.path.exists(utf8_path): - return True - # this will catch any encode errors decoding u_path - except UnicodeEncodeError: - log.warn(enc_warn, path, sys.getfilesystemencoding()) - - -class manifest_maker(sdist): - template = "MANIFEST.in" - - def initialize_options(self): - self.use_defaults = 1 - self.prune = 1 - self.manifest_only = 1 - self.force_manifest = 1 - - def finalize_options(self): - pass - - def run(self): - self.filelist = FileList() - if not os.path.exists(self.manifest): - self.write_manifest() # it must exist so it'll get in the list - self.add_defaults() - if os.path.exists(self.template): - self.read_template() - self.prune_file_list() - self.filelist.sort() - self.filelist.remove_duplicates() - self.write_manifest() - - def _manifest_normalize(self, path): - path = unicode_utils.filesys_decode(path) - return path.replace(os.sep, '/') - - def write_manifest(self): - """ - Write the file list in 'self.filelist' to the manifest file - named by 'self.manifest'. - """ - self.filelist._repair() - - # Now _repairs should encodability, but not unicode - files = [self._manifest_normalize(f) for f in self.filelist.files] - msg = "writing manifest file '%s'" % self.manifest - self.execute(write_file, (self.manifest, files), msg) - - def warn(self, msg): - if not self._should_suppress_warning(msg): - sdist.warn(self, msg) - - @staticmethod - def _should_suppress_warning(msg): - """ - suppress missing-file warnings from sdist - """ - return re.match(r"standard file .*not found", msg) - - def add_defaults(self): - sdist.add_defaults(self) - self.check_license() - self.filelist.append(self.template) - self.filelist.append(self.manifest) - rcfiles = list(walk_revctrl()) - if rcfiles: - self.filelist.extend(rcfiles) - elif os.path.exists(self.manifest): - self.read_manifest() - - if os.path.exists("setup.py"): - # setup.py should be included by default, even if it's not - # the script called to create the sdist - self.filelist.append("setup.py") - - ei_cmd = self.get_finalized_command('egg_info') - self.filelist.graft(ei_cmd.egg_info) - - def prune_file_list(self): - build = self.get_finalized_command('build') - base_dir = self.distribution.get_fullname() - self.filelist.prune(build.build_base) - self.filelist.prune(base_dir) - sep = re.escape(os.sep) - self.filelist.exclude_pattern(r'(^|' + sep + r')(RCS|CVS|\.svn)' + sep, - is_regex=1) - - -def write_file(filename, contents): - """Create a file with the specified name and write 'contents' (a - sequence of strings without line terminators) to it. - """ - contents = "\n".join(contents) - - # assuming the contents has been vetted for utf-8 encoding - contents = contents.encode("utf-8") - - with open(filename, "wb") as f: # always write POSIX-style manifest - f.write(contents) - - -def write_pkg_info(cmd, basename, filename): - log.info("writing %s", filename) - if not cmd.dry_run: - metadata = cmd.distribution.metadata - metadata.version, oldver = cmd.egg_version, metadata.version - metadata.name, oldname = cmd.egg_name, metadata.name - - try: - # write unescaped data to PKG-INFO, so older pkg_resources - # can still parse it - metadata.write_pkg_info(cmd.egg_info) - finally: - metadata.name, metadata.version = oldname, oldver - - safe = getattr(cmd.distribution, 'zip_safe', None) - - bdist_egg.write_safety_flag(cmd.egg_info, safe) - - -def warn_depends_obsolete(cmd, basename, filename): - if os.path.exists(filename): - log.warn( - "WARNING: 'depends.txt' is not used by setuptools 0.6!\n" - "Use the install_requires/extras_require setup() args instead." - ) - - -def _write_requirements(stream, reqs): - lines = yield_lines(reqs or ()) - append_cr = lambda line: line + '\n' - lines = map(append_cr, lines) - stream.writelines(lines) - - -def write_requirements(cmd, basename, filename): - dist = cmd.distribution - data = six.StringIO() - _write_requirements(data, dist.install_requires) - extras_require = dist.extras_require or {} - for extra in sorted(extras_require): - data.write('\n[{extra}]\n'.format(**vars())) - _write_requirements(data, extras_require[extra]) - cmd.write_or_delete_file("requirements", filename, data.getvalue()) - - -def write_setup_requirements(cmd, basename, filename): - data = io.StringIO() - _write_requirements(data, cmd.distribution.setup_requires) - cmd.write_or_delete_file("setup-requirements", filename, data.getvalue()) - - -def write_toplevel_names(cmd, basename, filename): - pkgs = dict.fromkeys( - [ - k.split('.', 1)[0] - for k in cmd.distribution.iter_distribution_names() - ] - ) - cmd.write_file("top-level names", filename, '\n'.join(sorted(pkgs)) + '\n') - - -def overwrite_arg(cmd, basename, filename): - write_arg(cmd, basename, filename, True) - - -def write_arg(cmd, basename, filename, force=False): - argname = os.path.splitext(basename)[0] - value = getattr(cmd.distribution, argname, None) - if value is not None: - value = '\n'.join(value) + '\n' - cmd.write_or_delete_file(argname, filename, value, force) - - -def write_entries(cmd, basename, filename): - ep = cmd.distribution.entry_points - - if isinstance(ep, six.string_types) or ep is None: - data = ep - elif ep is not None: - data = [] - for section, contents in sorted(ep.items()): - if not isinstance(contents, six.string_types): - contents = EntryPoint.parse_group(section, contents) - contents = '\n'.join(sorted(map(str, contents.values()))) - data.append('[%s]\n%s\n\n' % (section, contents)) - data = ''.join(data) - - cmd.write_or_delete_file('entry points', filename, data, True) - - -def get_pkg_info_revision(): - """ - Get a -r### off of PKG-INFO Version in case this is an sdist of - a subversion revision. - """ - warnings.warn("get_pkg_info_revision is deprecated.", EggInfoDeprecationWarning) - if os.path.exists('PKG-INFO'): - with io.open('PKG-INFO') as f: - for line in f: - match = re.match(r"Version:.*-r(\d+)\s*$", line) - if match: - return int(match.group(1)) - return 0 - - -class EggInfoDeprecationWarning(SetuptoolsDeprecationWarning): - """Class for warning about deprecations in eggInfo in setupTools. Not ignored by default, unlike DeprecationWarning.""" diff --git a/venv/lib/python2.7/site-packages/setuptools/command/egg_info.pyc b/venv/lib/python2.7/site-packages/setuptools/command/egg_info.pyc deleted file mode 100644 index 19b50375184257782196c67b3819bcdc09ad4fbf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29768 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 U?~jzWV$)@))Hgg>+EE()e>Wwv_5c6? diff --git a/venv/lib/python2.7/site-packages/setuptools/command/install.py b/venv/lib/python2.7/site-packages/setuptools/command/install.py deleted file mode 100644 index 31a5ddb..0000000 --- a/venv/lib/python2.7/site-packages/setuptools/command/install.py +++ /dev/null @@ -1,125 +0,0 @@ -from distutils.errors import DistutilsArgError -import inspect -import glob -import warnings -import platform -import distutils.command.install as orig - -import setuptools - -# Prior to numpy 1.9, NumPy relies on the '_install' name, so provide it for -# now. See https://github.com/pypa/setuptools/issues/199/ -_install = orig.install - - -class install(orig.install): - """Use easy_install to install the package, w/dependencies""" - - user_options = orig.install.user_options + [ - ('old-and-unmanageable', None, "Try not to use this!"), - ('single-version-externally-managed', None, - "used by system package builders to create 'flat' eggs"), - ] - boolean_options = orig.install.boolean_options + [ - 'old-and-unmanageable', 'single-version-externally-managed', - ] - new_commands = [ - ('install_egg_info', lambda self: True), - ('install_scripts', lambda self: True), - ] - _nc = dict(new_commands) - - def initialize_options(self): - orig.install.initialize_options(self) - self.old_and_unmanageable = None - self.single_version_externally_managed = None - - def finalize_options(self): - orig.install.finalize_options(self) - if self.root: - self.single_version_externally_managed = True - elif self.single_version_externally_managed: - if not self.root and not self.record: - raise DistutilsArgError( - "You must specify --record or --root when building system" - " packages" - ) - - def handle_extra_path(self): - if self.root or self.single_version_externally_managed: - # explicit backward-compatibility mode, allow extra_path to work - return orig.install.handle_extra_path(self) - - # Ignore extra_path when installing an egg (or being run by another - # command without --root or --single-version-externally-managed - self.path_file = None - self.extra_dirs = '' - - def run(self): - # Explicit request for old-style install? Just do it - if self.old_and_unmanageable or self.single_version_externally_managed: - return orig.install.run(self) - - if not self._called_from_setup(inspect.currentframe()): - # Run in backward-compatibility mode to support bdist_* commands. - orig.install.run(self) - else: - self.do_egg_install() - - @staticmethod - def _called_from_setup(run_frame): - """ - Attempt to detect whether run() was called from setup() or by another - command. If called by setup(), the parent caller will be the - 'run_command' method in 'distutils.dist', and *its* caller will be - the 'run_commands' method. If called any other way, the - immediate caller *might* be 'run_command', but it won't have been - called by 'run_commands'. Return True in that case or if a call stack - is unavailable. Return False otherwise. - """ - if run_frame is None: - msg = "Call stack not available. bdist_* commands may fail." - warnings.warn(msg) - if platform.python_implementation() == 'IronPython': - msg = "For best results, pass -X:Frames to enable call stack." - warnings.warn(msg) - return True - res = inspect.getouterframes(run_frame)[2] - caller, = res[:1] - info = inspect.getframeinfo(caller) - caller_module = caller.f_globals.get('__name__', '') - return ( - caller_module == 'distutils.dist' - and info.function == 'run_commands' - ) - - def do_egg_install(self): - - easy_install = self.distribution.get_command_class('easy_install') - - cmd = easy_install( - self.distribution, args="x", root=self.root, record=self.record, - ) - cmd.ensure_finalized() # finalize before bdist_egg munges install cmd - cmd.always_copy_from = '.' # make sure local-dir eggs get installed - - # pick up setup-dir .egg files only: no .egg-info - cmd.package_index.scan(glob.glob('*.egg')) - - self.run_command('bdist_egg') - args = [self.distribution.get_command_obj('bdist_egg').egg_output] - - if setuptools.bootstrap_install_from: - # Bootstrap self-installation of setuptools - args.insert(0, setuptools.bootstrap_install_from) - - cmd.args = args - cmd.run() - setuptools.bootstrap_install_from = None - - -# XXX Python 3.1 doesn't see _nc if this is inside the class -install.sub_commands = ( - [cmd for cmd in orig.install.sub_commands if cmd[0] not in install._nc] + - install.new_commands -) diff --git a/venv/lib/python2.7/site-packages/setuptools/command/install.pyc b/venv/lib/python2.7/site-packages/setuptools/command/install.pyc deleted file mode 100644 index 0cc138108747e3caf517c7d962d848a3bcf16cce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5493 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 R?0T*8A8cC3!OFVce*j%7RoVam diff --git a/venv/lib/python2.7/site-packages/setuptools/command/install_egg_info.py b/venv/lib/python2.7/site-packages/setuptools/command/install_egg_info.py deleted file mode 100644 index edc4718..0000000 --- a/venv/lib/python2.7/site-packages/setuptools/command/install_egg_info.py +++ /dev/null @@ -1,62 +0,0 @@ -from distutils import log, dir_util -import os - -from setuptools import Command -from setuptools import namespaces -from setuptools.archive_util import unpack_archive -import pkg_resources - - -class install_egg_info(namespaces.Installer, Command): - """Install an .egg-info directory for the package""" - - description = "Install an .egg-info directory for the package" - - user_options = [ - ('install-dir=', 'd', "directory to install to"), - ] - - def initialize_options(self): - self.install_dir = None - - def finalize_options(self): - self.set_undefined_options('install_lib', - ('install_dir', 'install_dir')) - ei_cmd = self.get_finalized_command("egg_info") - basename = pkg_resources.Distribution( - None, None, ei_cmd.egg_name, ei_cmd.egg_version - ).egg_name() + '.egg-info' - self.source = ei_cmd.egg_info - self.target = os.path.join(self.install_dir, basename) - self.outputs = [] - - def run(self): - self.run_command('egg_info') - if os.path.isdir(self.target) and not os.path.islink(self.target): - dir_util.remove_tree(self.target, dry_run=self.dry_run) - elif os.path.exists(self.target): - self.execute(os.unlink, (self.target,), "Removing " + self.target) - if not self.dry_run: - pkg_resources.ensure_directory(self.target) - self.execute( - self.copytree, (), "Copying %s to %s" % (self.source, self.target) - ) - self.install_namespaces() - - def get_outputs(self): - return self.outputs - - def copytree(self): - # Copy the .egg-info tree to site-packages - def skimmer(src, dst): - # filter out source-control directories; note that 'src' is always - # a '/'-separated path, regardless of platform. 'dst' is a - # platform-specific path. - for skip in '.svn/', 'CVS/': - if src.startswith(skip) or '/' + skip in src: - return None - self.outputs.append(dst) - log.debug("Copying %s to %s", src, dst) - return dst - - unpack_archive(self.source, self.target, skimmer) diff --git a/venv/lib/python2.7/site-packages/setuptools/command/install_egg_info.pyc b/venv/lib/python2.7/site-packages/setuptools/command/install_egg_info.pyc deleted file mode 100644 index ab501473c681547b94d570f73fb92c5b0f2f21a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3639 zcmd5<+io015Ut+(`Vt#LVx&Z3c>p#*ys?5J5Emhwmmp!GaRg#fG#bzJu4g?vGwJSe z?2sTKBjAk>;iLEnJ^<=e?`#qi@ru`;p6=>f)#+1JJ<Y$?SKj^U(u0^5zb3yw=g0oY zMZ*7zGNQSnv7&i{#tl-CHYjV-xG5u=l(lHyrg7W%wWQslamTmYlyzy|qj7IJw@>3f zB^}Zonyrv-)1*O3mwqNXBl>Q<iVgOMJys$8n}5Rw*Bn&Kim8J*NljR}G}{|0balDd zE#~tmPrP7-1$i{rwv1wJz3dXps+<K!VPxXN^jN!17Nxm$QI>^zIt|l&QoI1g7d*gz z$%Q5$z@{?-DB1KrO&OLJB`qk<)+cSLbYK}I-GxnTc+wL|pMw1%bhF!B-19pRqI|H; zyWhm_1GY@Zt}v&ANnr-=P!FJSG}U&Er!17c$)i4XFg>wbD3_C5F<6WlxFW^~Jiu?4 zAG^*4tN(;36l?YcnmrG2i#zv<T)S1S)Ufc<9zOJ1olS=PCMoPwu8m5Q9!E}(jw3Ug z6j`E;9X&o7o!&MF`J<zqI}h_)cgzQO;t%b~N6BMzi+|H{bbnN)C0i`m-*h`)O~bE8 zR=cWnMUmO(tFb@WQLRyZP}}9HdzCdv^VFqLmOj>DQM$Cq?PZo)*i1?w0CU>>2n0WH zh3%g)5DY<^&Y03@bE8RTik>QR4Vrmw^H4>zwv-(@YoUI|Gh4Lvv?0>2fY~G02bE{5 zvi2H1X<%XCyiQXO_$45}KkV@SdoMtor3V2>EzGX1vwfB<X(0z>&z;Np_HYA>T;YO& z468iRlQh>!jf(V4xre0!R}wCub)ZFgG!2cmMP=Ay9LRPzwa%mm>}N$Dz{Qpd!nMQ% zXnV{jjuDvRV4YusK_n`y18>U69ZF?Zq`9{h16^cTAMxIza%JW05JwfjbXiHKVLVS{ z+k?nzY<r>Thxk#WS;KslWfr_7)mL4$p*rdszt^~2`Xh`NGXBYxB^jA~ik*5U?1Qug zKAQWq5HbyG;TohIJcWHcj^iczdOSg?{Ns8?|Je-lyVO^t%d@ma6Cu4{b?dB2D);L2 z$o@ghf!X@A1?s*P5iyxL;I*W_u^7Zb{3;f~dYf<)q>2UMJv%_6#GHnv%7x#7o)^by zJ{?#fxm%Q{XuM@Pc5&&C`W5aGuJNRru)%9A48U{;zfLVjsQ`gcSd-c;&5r`f3~(8P zU3BP-*1`39kUn8{Tj8EQ(Q)Op%&l^nE1m?MbZ#r7!)1UKF2<~=tcF0dh(SJyoXa`F z<O{`E_!k5DCci8|B(<*IQ`glM^)}P>GLv=CSke>-3QcitI8_`cgg)&CuX9z}7tc<d zJ7V1;t{~k$pAit75SRdmy}`w=?8xj4ihd!<07SpBy-G?6^dPp-8B_OSl$eY~B;9<^ zm6IKK#oY%t2+2Y4LLN|L-$!!c`W8!%I%N22z*s))(zn>gJG{b3#bJ_jjQ1?gJ>pNQ z_96?mZ`<R1WU=w?H~S;G1&m(qKTz@|QzQjBxrT5AcJ@)~4kf<Jfr=YMWvTNd;Q8Le z5`9ojB{<79%$iu<iFFdz?NM5uBf<r^9Duc~*?g|eZB&t<sI{)%P(8KDT=&TaKn6HM z2_TYah0eh(mU-U=<wf@Y8x_38y6o^H1fa&os#x)_%VB^N^IvyExrRzK3qwS$Fce0F z;k-zy3{AinhDi}~9qyE98=F*aSaLn6tTuJh3&5t}8j5#N05?(91IVq5a%BwQLc)E7 z_m1i`I?X=*R{QJy=1?v%xPK&^9`J=>#R(*tNY?Rwv%IJV@UZ}qz#;!UyTNWRzA@x8 pB@mKHQo-8y{IypbQRc!yB&_(v^WZaZU)Xh3tu;2;Z#LCh^B?6nVYmPQ diff --git a/venv/lib/python2.7/site-packages/setuptools/command/install_lib.py b/venv/lib/python2.7/site-packages/setuptools/command/install_lib.py deleted file mode 100644 index 2b31c3e..0000000 --- a/venv/lib/python2.7/site-packages/setuptools/command/install_lib.py +++ /dev/null @@ -1,121 +0,0 @@ -import os -import imp -from itertools import product, starmap -import distutils.command.install_lib as orig - - -class install_lib(orig.install_lib): - """Don't add compiled flags to filenames of non-Python files""" - - def run(self): - self.build() - outfiles = self.install() - if outfiles is not None: - # always compile, in case we have any extension stubs to deal with - self.byte_compile(outfiles) - - def get_exclusions(self): - """ - Return a collections.Sized collections.Container of paths to be - excluded for single_version_externally_managed installations. - """ - all_packages = ( - pkg - for ns_pkg in self._get_SVEM_NSPs() - for pkg in self._all_packages(ns_pkg) - ) - - excl_specs = product(all_packages, self._gen_exclusion_paths()) - return set(starmap(self._exclude_pkg_path, excl_specs)) - - def _exclude_pkg_path(self, pkg, exclusion_path): - """ - Given a package name and exclusion path within that package, - compute the full exclusion path. - """ - parts = pkg.split('.') + [exclusion_path] - return os.path.join(self.install_dir, *parts) - - @staticmethod - def _all_packages(pkg_name): - """ - >>> list(install_lib._all_packages('foo.bar.baz')) - ['foo.bar.baz', 'foo.bar', 'foo'] - """ - while pkg_name: - yield pkg_name - pkg_name, sep, child = pkg_name.rpartition('.') - - def _get_SVEM_NSPs(self): - """ - Get namespace packages (list) but only for - single_version_externally_managed installations and empty otherwise. - """ - # TODO: is it necessary to short-circuit here? i.e. what's the cost - # if get_finalized_command is called even when namespace_packages is - # False? - if not self.distribution.namespace_packages: - return [] - - install_cmd = self.get_finalized_command('install') - svem = install_cmd.single_version_externally_managed - - return self.distribution.namespace_packages if svem else [] - - @staticmethod - def _gen_exclusion_paths(): - """ - Generate file paths to be excluded for namespace packages (bytecode - cache files). - """ - # always exclude the package module itself - yield '__init__.py' - - yield '__init__.pyc' - yield '__init__.pyo' - - if not hasattr(imp, 'get_tag'): - return - - base = os.path.join('__pycache__', '__init__.' + imp.get_tag()) - yield base + '.pyc' - yield base + '.pyo' - yield base + '.opt-1.pyc' - yield base + '.opt-2.pyc' - - def copy_tree( - self, infile, outfile, - preserve_mode=1, preserve_times=1, preserve_symlinks=0, level=1 - ): - assert preserve_mode and preserve_times and not preserve_symlinks - exclude = self.get_exclusions() - - if not exclude: - return orig.install_lib.copy_tree(self, infile, outfile) - - # Exclude namespace package __init__.py* files from the output - - from setuptools.archive_util import unpack_directory - from distutils import log - - outfiles = [] - - def pf(src, dst): - if dst in exclude: - log.warn("Skipping installation of %s (namespace package)", - dst) - return False - - log.info("copying %s -> %s", src, os.path.dirname(dst)) - outfiles.append(dst) - return dst - - unpack_directory(infile, outfile, pf) - return outfiles - - def get_outputs(self): - outputs = orig.install_lib.get_outputs(self) - exclude = self.get_exclusions() - if exclude: - return [f for f in outputs if f not in exclude] - return outputs diff --git a/venv/lib/python2.7/site-packages/setuptools/command/install_lib.pyc b/venv/lib/python2.7/site-packages/setuptools/command/install_lib.pyc deleted file mode 100644 index 2bb177f454a3d4d4bd64473b0b6a2940ebc38c0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5518 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 Mjjvhyp1xE64>$`^y8r+H diff --git a/venv/lib/python2.7/site-packages/setuptools/command/install_scripts.py b/venv/lib/python2.7/site-packages/setuptools/command/install_scripts.py deleted file mode 100644 index 1623427..0000000 --- a/venv/lib/python2.7/site-packages/setuptools/command/install_scripts.py +++ /dev/null @@ -1,65 +0,0 @@ -from distutils import log -import distutils.command.install_scripts as orig -import os -import sys - -from pkg_resources import Distribution, PathMetadata, ensure_directory - - -class install_scripts(orig.install_scripts): - """Do normal script install, plus any egg_info wrapper scripts""" - - def initialize_options(self): - orig.install_scripts.initialize_options(self) - self.no_ep = False - - def run(self): - import setuptools.command.easy_install as ei - - self.run_command("egg_info") - if self.distribution.scripts: - orig.install_scripts.run(self) # run first to set up self.outfiles - else: - self.outfiles = [] - if self.no_ep: - # don't install entry point scripts into .egg file! - return - - ei_cmd = self.get_finalized_command("egg_info") - dist = Distribution( - ei_cmd.egg_base, PathMetadata(ei_cmd.egg_base, ei_cmd.egg_info), - ei_cmd.egg_name, ei_cmd.egg_version, - ) - bs_cmd = self.get_finalized_command('build_scripts') - exec_param = getattr(bs_cmd, 'executable', None) - bw_cmd = self.get_finalized_command("bdist_wininst") - is_wininst = getattr(bw_cmd, '_is_running', False) - writer = ei.ScriptWriter - if is_wininst: - exec_param = "python.exe" - writer = ei.WindowsScriptWriter - if exec_param == sys.executable: - # In case the path to the Python executable contains a space, wrap - # it so it's not split up. - exec_param = [exec_param] - # resolve the writer to the environment - writer = writer.best() - cmd = writer.command_spec_class.best().from_param(exec_param) - for args in writer.get_args(dist, cmd.as_header()): - self.write_script(*args) - - def write_script(self, script_name, contents, mode="t", *ignored): - """Write an executable file to the scripts directory""" - from setuptools.command.easy_install import chmod, current_umask - - log.info("Installing %s script to %s", script_name, self.install_dir) - target = os.path.join(self.install_dir, script_name) - self.outfiles.append(target) - - mask = current_umask() - if not self.dry_run: - ensure_directory(target) - f = open(target, "w" + mode) - f.write(contents) - f.close() - chmod(target, 0o777 - mask) diff --git a/venv/lib/python2.7/site-packages/setuptools/command/install_scripts.pyc b/venv/lib/python2.7/site-packages/setuptools/command/install_scripts.pyc deleted file mode 100644 index 2aaa86a58236a96ac95da466067cc870747617a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3161 zcmd5;-EJF26h6EDiyfy44NXgFsS&DVp*C(Qia?+WK?OpHsM=JjuvCrKyJKga_3n0N z+{9IUfznH!g$rJ-4^X~y)|;ff0ClqCvomLA&foVP*WPY)zWnpbi-=aA8oqzPV=aal z{~o18GmnNIdHn8E>eIAF(>e_sqJfzv4V#tRqG3zq8l`JAYtyhzvknbAG+U?PI!>vR zZt(uGM{$GR5S<bIF|7012mL1QP2S<t_aHg8C(S4OeHL67!;{21lZ@sr$upUF8oI;Z zwF~3Wg>DNPI<s@5Rh$?dx!f$=CMJ{2x-d<ZjZ9KF8(~U5KE@yM*n1c>v7c~r=(FcA zZCGQoSb%+y>+}Y(Xi#v_Z}6_~Fg(e7S#D-w+A9z5t?s(lE7G~`h1sH~Cli%q<Ggol z!lKY-rD-E}k{>qXCp`8x21hjYXzJ4`VuQFN3Xl{mAVi4O_vLn1hnSmW60qQ|Vo0*Y zC1IMp)+#SJMAosLKZmK+B4xSKMHyS(WOX|3<C|o#xP}IWNnV9c4_<|4FwWCh8#{P? zGFUt^qwM(T;oi&a!JhegFZ#xwd>g+u5Ac~3gJ**xDekXazwaLYK2c8xxO85)JWuUq zG0JDNFpCHO$;oc92sr(mWy{8qx8+HM)*-VS5+RfgCnrW>RB>8*93WIBa>W7TmpV-w zWFC`i(zHd>wJMldn<gajY|Ew&nP(DM-n70tVd-<Roubk=$X!_p{JKeJNDG8589$=4 zIxQtVytl@;FYBC&Q)EjLc2=WhLvDgXLll~#0K`D}m{_4jr%3oUTEfg0nYR?TWEUoP zcrt^<4RY6MdV`L9GFLpjPH<O4mey$c38RR&L%z9soqo!@*rYa{+?S<WbP8+RG`-FG z@a4&iZCZB3zR&2iLw_OaFMso%BfJOwHN<>h(CApKs@QGdWi(IHxPp`G@bZa{<}Mti zx>SgPRCSDsL=iepp-QYW^9&Oc%NvS?JIu3P?CambtK;FKVs=+$va3V80D1(!t_7Xd zf}sDsMZN?VsLKj$#W`Q_?iB+BTu>!&YUMWZF`v6}l4={U!|ob}iFRt7WCE(VIyzt! zo(E+VS{*Qi19t0tItyo79OuBj0*sil*aRFII%fpG`+24Vo)mWugr1(8#A)NUG5b8p z;{4dYH_!Ikg$)=ea>hs_!VLeF<H{B~Qc)UOE14Oae5Q)fgfp>?Jqpdlx;D0iRvqdP zAeZ}(`Q}wt`y9@IbsYPq6F`Z-R5Xj_S`MwujjYU7MX<VxwMWP2D@cA-47?&Y86o)U zJhn-ANQVEPj5zz;Q0!M2$h+!qcwKMXZ+mUO?r(ZE?*`^Jy{jHSZLf*HuD4n1`dzHt z@to91#7xGK;qPDY*ncoEfuV6qYXyjBJ}sL<^x!Sf2-tw>2;i+@_7a0(3TwbEQwB7E zWPrC-vR<>|0AVuww{Tdw21G&&j0E^!=j|Xr>=kMg#>5M_4PJsVSQFzK-GHVC?g3F9 z^aVQ)VY^f(+FI`d@IA&%&*eRLsH@)AJ8!^cKj#{f78D)M@>nP$nj51tr{=TJ9@(2v z__c&N7@~LAR{a#`-nA0V<K!KJy5Hxl1l-mGHYniy1b9j`aHAF2Rs98qNCoFs%C^7{ z1`(!tk_9`wjSG?+a~2CeW3ynQ3K(djnPW+8m#QtjNOP<EoY)c~43?5wl;EEEBLd#B zvAh;eYdJlc;OBylFHD!~9jaeDxs9VC?tW0M`7RuK#7=U=$lvjIP~}^U2Cw67dm9+# z*PBp`k{~E0^rIAfpQjqHTtrI6d8Cx|`hYPO@X;5*|3J{scxCdloJnBYZ`a#j^o4VI zn#m78LQ`87-shL6&RbVifmP3uy5)n*?z6{|v_9^r#nD6=ZS%Q_(0`ab%AUei_@PBd XlKg#{*2iqBH1sX-VAt#Vw`%_aB+>gg diff --git a/venv/lib/python2.7/site-packages/setuptools/command/launcher manifest.xml b/venv/lib/python2.7/site-packages/setuptools/command/launcher manifest.xml deleted file mode 100644 index 5972a96..0000000 --- a/venv/lib/python2.7/site-packages/setuptools/command/launcher manifest.xml +++ /dev/null @@ -1,15 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="yes"?> -<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> - <assemblyIdentity version="1.0.0.0" - processorArchitecture="X86" - name="%(name)s" - type="win32"/> - <!-- Identify the application security requirements. --> - <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> - <security> - <requestedPrivileges> - <requestedExecutionLevel level="asInvoker" uiAccess="false"/> - </requestedPrivileges> - </security> - </trustInfo> -</assembly> diff --git a/venv/lib/python2.7/site-packages/setuptools/command/py36compat.py b/venv/lib/python2.7/site-packages/setuptools/command/py36compat.py deleted file mode 100644 index 61063e7..0000000 --- a/venv/lib/python2.7/site-packages/setuptools/command/py36compat.py +++ /dev/null @@ -1,136 +0,0 @@ -import os -from glob import glob -from distutils.util import convert_path -from distutils.command import sdist - -from setuptools.extern.six.moves import filter - - -class sdist_add_defaults: - """ - Mix-in providing forward-compatibility for functionality as found in - distutils on Python 3.7. - - Do not edit the code in this class except to update functionality - as implemented in distutils. Instead, override in the subclass. - """ - - def add_defaults(self): - """Add all the default files to self.filelist: - - README or README.txt - - setup.py - - test/test*.py - - all pure Python modules mentioned in setup script - - all files pointed by package_data (build_py) - - all files defined in data_files. - - all files defined as scripts. - - all C sources listed as part of extensions or C libraries - in the setup script (doesn't catch C headers!) - Warns if (README or README.txt) or setup.py are missing; everything - else is optional. - """ - self._add_defaults_standards() - self._add_defaults_optional() - self._add_defaults_python() - self._add_defaults_data_files() - self._add_defaults_ext() - self._add_defaults_c_libs() - self._add_defaults_scripts() - - @staticmethod - def _cs_path_exists(fspath): - """ - Case-sensitive path existence check - - >>> sdist_add_defaults._cs_path_exists(__file__) - True - >>> sdist_add_defaults._cs_path_exists(__file__.upper()) - False - """ - if not os.path.exists(fspath): - return False - # make absolute so we always have a directory - abspath = os.path.abspath(fspath) - directory, filename = os.path.split(abspath) - return filename in os.listdir(directory) - - def _add_defaults_standards(self): - standards = [self.READMES, self.distribution.script_name] - for fn in standards: - if isinstance(fn, tuple): - alts = fn - got_it = False - for fn in alts: - if self._cs_path_exists(fn): - got_it = True - self.filelist.append(fn) - break - - if not got_it: - self.warn("standard file not found: should have one of " + - ', '.join(alts)) - else: - if self._cs_path_exists(fn): - self.filelist.append(fn) - else: - self.warn("standard file '%s' not found" % fn) - - def _add_defaults_optional(self): - optional = ['test/test*.py', 'setup.cfg'] - for pattern in optional: - files = filter(os.path.isfile, glob(pattern)) - self.filelist.extend(files) - - def _add_defaults_python(self): - # build_py is used to get: - # - python modules - # - files defined in package_data - build_py = self.get_finalized_command('build_py') - - # getting python files - if self.distribution.has_pure_modules(): - self.filelist.extend(build_py.get_source_files()) - - # getting package_data files - # (computed in build_py.data_files by build_py.finalize_options) - for pkg, src_dir, build_dir, filenames in build_py.data_files: - for filename in filenames: - self.filelist.append(os.path.join(src_dir, filename)) - - def _add_defaults_data_files(self): - # getting distribution.data_files - if self.distribution.has_data_files(): - for item in self.distribution.data_files: - if isinstance(item, str): - # plain file - item = convert_path(item) - if os.path.isfile(item): - self.filelist.append(item) - else: - # a (dirname, filenames) tuple - dirname, filenames = item - for f in filenames: - f = convert_path(f) - if os.path.isfile(f): - self.filelist.append(f) - - def _add_defaults_ext(self): - if self.distribution.has_ext_modules(): - build_ext = self.get_finalized_command('build_ext') - self.filelist.extend(build_ext.get_source_files()) - - def _add_defaults_c_libs(self): - if self.distribution.has_c_libraries(): - build_clib = self.get_finalized_command('build_clib') - self.filelist.extend(build_clib.get_source_files()) - - def _add_defaults_scripts(self): - if self.distribution.has_scripts(): - build_scripts = self.get_finalized_command('build_scripts') - self.filelist.extend(build_scripts.get_source_files()) - - -if hasattr(sdist.sdist, '_add_defaults_standards'): - # disable the functionality already available upstream - class sdist_add_defaults: - pass diff --git a/venv/lib/python2.7/site-packages/setuptools/command/py36compat.pyc b/venv/lib/python2.7/site-packages/setuptools/command/py36compat.pyc deleted file mode 100644 index 934494dae8f4750a09d0a48eaa25f06beaf3c321..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6198 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 diff --git a/venv/lib/python2.7/site-packages/setuptools/command/register.py b/venv/lib/python2.7/site-packages/setuptools/command/register.py deleted file mode 100644 index 98bc015..0000000 --- a/venv/lib/python2.7/site-packages/setuptools/command/register.py +++ /dev/null @@ -1,18 +0,0 @@ -from distutils import log -import distutils.command.register as orig - - -class register(orig.register): - __doc__ = orig.register.__doc__ - - def run(self): - try: - # Make sure that we are using valid current name/version info - self.run_command('egg_info') - orig.register.run(self) - finally: - self.announce( - "WARNING: Registering is deprecated, use twine to " - "upload instead (https://pypi.org/p/twine/)", - log.WARN - ) diff --git a/venv/lib/python2.7/site-packages/setuptools/command/register.pyc b/venv/lib/python2.7/site-packages/setuptools/command/register.pyc deleted file mode 100644 index b8bf89fbf04a7775cbac0c3ef339f152271a4a8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1080 zcmd5)UvJYe5I;9<fw3WkctS!7ZvnA-6R3h|;_n0EfeNKagCZ1#*bOeJZER;-Ctgtb z#(V&{bGx!{09NjNce&jCes@WJ?QGrqaqUwD>yzO948=c1CGcU;0L&Ro7%=iX&~#vy zz^n_C9*6{FkL)P}(S@G?OMnlPF6E809@bF5@nj6GK(!lFkHTd%oUD}((rr3Z$_o^K z8<hlVC^wz3AW(H|nU7<&it<VNC@)d`A*!=G@Eu?laW4^ZU@(hCFiQRrmZ5|QFd*_i zEIYv7V|bhqz7;rG*M-tk<3D2P=y^VRJ$iMJ=4;4G*QxTUkk-kn3{u=rTQAdaqBLrg zwze^)NR>u@cxPWiu>OE^yRd3tT+J<yx%_T+3G0Wes9dXy%FO4b7NLv2ajMQYQ^U7$ zXr<Ps)s@UK17aS5TTPd~^0Jv`^e!sjqQ$LK#|V-imyS<OBc${E?36DaxX=3J>;CYY z-W$4y!|IVgeJsx09-i9rcibwwOBBkc*$w+|>f$Z;GPE`r)A)<#8a6-Q=)f*=+B|L9 zZ=(X1bavRyP9N`#))l!Fg)Zl^D8d#-iehd=+n}2hj}>zoPEiO`VU!B~W%jS>(P9XZ zC$N3Cy{2^qJ%N998&u<0JGyl-G+2*na6YO)6xYGXIkNw6c*Z>)t~T?8I7hzM*^T56 Dc<2g_ diff --git a/venv/lib/python2.7/site-packages/setuptools/command/rotate.py b/venv/lib/python2.7/site-packages/setuptools/command/rotate.py deleted file mode 100644 index b89353f..0000000 --- a/venv/lib/python2.7/site-packages/setuptools/command/rotate.py +++ /dev/null @@ -1,66 +0,0 @@ -from distutils.util import convert_path -from distutils import log -from distutils.errors import DistutilsOptionError -import os -import shutil - -from setuptools.extern import six - -from setuptools import Command - - -class rotate(Command): - """Delete older distributions""" - - description = "delete older distributions, keeping N newest files" - user_options = [ - ('match=', 'm', "patterns to match (required)"), - ('dist-dir=', 'd', "directory where the distributions are"), - ('keep=', 'k', "number of matching distributions to keep"), - ] - - boolean_options = [] - - def initialize_options(self): - self.match = None - self.dist_dir = None - self.keep = None - - def finalize_options(self): - if self.match is None: - raise DistutilsOptionError( - "Must specify one or more (comma-separated) match patterns " - "(e.g. '.zip' or '.egg')" - ) - if self.keep is None: - raise DistutilsOptionError("Must specify number of files to keep") - try: - self.keep = int(self.keep) - except ValueError: - raise DistutilsOptionError("--keep must be an integer") - if isinstance(self.match, six.string_types): - self.match = [ - convert_path(p.strip()) for p in self.match.split(',') - ] - self.set_undefined_options('bdist', ('dist_dir', 'dist_dir')) - - def run(self): - self.run_command("egg_info") - from glob import glob - - for pattern in self.match: - pattern = self.distribution.get_name() + '*' + pattern - files = glob(os.path.join(self.dist_dir, pattern)) - files = [(os.path.getmtime(f), f) for f in files] - files.sort() - files.reverse() - - log.info("%d file(s) matching %s", len(files), pattern) - files = files[self.keep:] - for (t, f) in files: - log.info("Deleting %s", f) - if not self.dry_run: - if os.path.isdir(f): - shutil.rmtree(f) - else: - os.unlink(f) diff --git a/venv/lib/python2.7/site-packages/setuptools/command/rotate.pyc b/venv/lib/python2.7/site-packages/setuptools/command/rotate.pyc deleted file mode 100644 index 6c1edc13bd04895e776cb9292f9927a0c8b2e6b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3322 zcmd5;+j1L45bfEOWJ|v0o<J`9fXhmVtr(~PRe_?2d5nP#g+WEwlC>jw<-K`kl-Mr& zfrPK%WB7zT@GE=(obI)Jp`Z$$h>~qjPxs99^qju<zt6Sq{WSlqPscwWe?P-#UxLK= zuP7zT6m=CT<~>S1%6#hj74K78qpVKddd1f$ZBVx%YcZap?v#w{lulFDq;9j)Yf##v zY=*is;HOB>&_Gc<O+OR8BKp2NOL2{!wwo{``2)YU!pO~n^o#ttHZCfAZo8Ugqtjwo zF_*!tC)SN!lG-mzmlXLI#uR4bRM#eZ6*C3h$3>R)^4K*nHihdsed3Hdras4K*FiL~ z58#5X$6mqx<9Uh~C|;x?+)<+;M0JX1_zLWRSsCE=b26Bw@M-%3@AekRx=yvzL6OGV z1ToAt$rdawa%<m%IQ~cR{a{DyGRcR*Mv&_l+PYwnq}p1xKkK>v_9u>AmD!u1@R8Fd zw}C4H5e99ecgKm*@m<Tl<)c^P#8iu7yCic)_g!K3gBRP{=)i63^Ckv8qb)m!O{rGy z*f#iloNeJg#h^Njtvq)(HiOsn*+Tw2e2?+jJ0S4wAyFhw<^lX%&A`<JEbxMjb`8`q z*(h@D*b2Fro5qL_i*Or}^Fh@!v$oagfK4PJ)?(BtP4XP?-Fe<Koq;@s?HufN_TM*K z`HP*khr9WMhvtKa{g3S4$MJ!AfZwp}eA6kDawW;F>!s<6TYEB$zUo-*#-%HY)Seyo zD{OTtT&<S-?jp`j^28;*G&#^wA^5b{F)I&9s)>K%9(E1iPTcbw25`wpoU}7d<~BKj z;VVTi73Gyw{KV2nBK7D*x_^~@#yj{t$=>y8GrvVOcyOmhW|x#wyrsx_OGV!yCaOc- z6pg0ol}F}RhIutPYI2BTxAkY&=}3`l(V?Qz4972KfAnbg7dZ*IsMa8+5g=2%5$BSp zZGN*2`!(p3F@S7K-A@Ml0UkCeOpp}-Ut4^*Vs+Uwc&qsCF^*4=-PWta)nIw`ASsu5 z)$*zy4wvuRcmBHTDL5ryCRnsLpt!QaXbCd5VoL|TJV<h<he$IFy88mNEk;*31HR2~ zW6uKa9MhhIIBYTD5DQs5<jm!K5Nr%j5q;ZB$67Lzu!$8!<$WEpmSj543i&W{`z6Ah zv0%$IaUlj&v5=SU3JbK0#(As<Nv`7ws>IBYjgecFZvgxkVGL|M2mV`ZKSuzm1?8(* ze?k6URdZ@lUGYBj`uql*-cG_{4Ko!8k%@sdg|Y<Xriv>Sps4od6w5te(^E&DDEl-5 zToFMvx_0Q%HJ%1)>ojW6Xi8M32?C%KTORp>bRRq1rlZ<KuSti3dC-9;7*AOB5SzDn zbHyVG0fi?V%`xKLJj<~sZ;rAFhK*aGJ6O3Fv2gv_CjH>iQC*Iz79#j?6heiS7s<Y! z*l^+426IIrpNuXYvubxq@og@j@ULn2HEr%L)22ilSGx_#lZcQg$p^)m%E~!%m=;?C zm3#Io*rixXOWPjD9H;XoYdHd>d{um#@#lEbjPvL?<Ara7mk<yjpDhAnzz}%NdznVY zAu6ooYp&-q7!^q_aW+xSTmn_L&=$ra8R0CA9>D65p&=5!j>K20^D5X_EjIfR%#vtH zELR4`k=^FzpsM(pGg`}VoTo{?(`E$;8o7fUcARTu7s(ysq=8WP21FGn4BWEAR|`Oh zL&sZG*VJwGu4<{4cLOt*5Kc{X5t249IMXnM;*^`1Jjtqm(=Sx3&NU4o`}p7Y4Al-C z#nL#0oI(Fn-yrRvpdu3ZM3LmqD9Va>oNBOaP!z>QA7jR3tZko@BswcW;@E04$&YRU z3R|ezx|dJp!g<VvToS@HkkiMN(f`#pgzPh}AeQ@whH7{X&quCo`VFsHZ(fv&gEWKt zqDD#QyUMgG6_Y2E`6^;K51*=P?vHI%rvgaAdmv7F)swbnRqt^pSrsR)U#A^U$dM@~ dz9H@sggmM+@hN8r%dS}j{ukA(n)MJH{-1-t9m4<s diff --git a/venv/lib/python2.7/site-packages/setuptools/command/saveopts.py b/venv/lib/python2.7/site-packages/setuptools/command/saveopts.py deleted file mode 100644 index 611cec5..0000000 --- a/venv/lib/python2.7/site-packages/setuptools/command/saveopts.py +++ /dev/null @@ -1,22 +0,0 @@ -from setuptools.command.setopt import edit_config, option_base - - -class saveopts(option_base): - """Save command-line options to a file""" - - description = "save supplied options to setup.cfg or other config file" - - def run(self): - dist = self.distribution - settings = {} - - for cmd in dist.command_options: - - if cmd == 'saveopts': - continue # don't save our own options! - - for opt, (src, val) in dist.get_option_dict(cmd).items(): - if src == "command line": - settings.setdefault(cmd, {})[opt] = val - - edit_config(self.filename, settings, self.dry_run) diff --git a/venv/lib/python2.7/site-packages/setuptools/command/saveopts.pyc b/venv/lib/python2.7/site-packages/setuptools/command/saveopts.pyc deleted file mode 100644 index b413a5e14f7435f295f6e8b945c259c04d233854..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1291 zcmd5*UuzUG5T9i4uC~^{4?-V=6<-#iw=GJmP()PdlSQsV@le8clReY!zb13%wcI_( z`9b`SegK_GPup*xVRtf<%w&G^n<V;qYwgLm+n;k-j)>-0^!qImnmz#~KqX)(ppr0@ zAhZM{p%9=W_ztiD_&AI}ci=GTQjq;cBax)xO%g_1RC!Yub`<QUMcdTsIP(T?(7w+m zhSvOF1cDY{^TtDt22M;kC^13dJd%?RJ1{s*7_5Ix;*buB^QNk@T5p!NHt}T|A7c|| zabZj2ciEZ!{J3pPYxH#=0yA#=c`=F`7dQCDI696ohuEAkt<c}2{|%q>gTxHr1Yj<} zl9Vt-m<c!$@b<HXc?2`UD&SOt+lI3Zr~#%2!9()af?P=gdGEp}3G+^nU6}V^*5xWW zavx@7N;v6o4CPr+a0m9z_JO`5I`#;=0Z4FTL@Tg}s7J&}pyyz~o$%`<mi)xbPr}qA zuWIYj+2b*H1@BzBsU?G9ZDeq1D{XV6oYZGDmB%&Gh&*kIY+T}iEC_97%ImB$$h2v9 zuH3jzSjP?tZ^|Mloc;0|7(`o-JVvygS31lDA<W+8VV-1VLfa68ACs20&Q3Bk=_GS$ z(UjUapI%JU^QZ2({(8E-b5?KdxMw^0b3c8dFWeT5QJa29Tib5h+GAFho4EaMq~53D z4q(%i{<^wkE&X#(`|WwaLiMZ?0DqqWiB-{)cjY?CM68QPGQ5OPm{LrGQh_O@sz#4X zHkk{hbd!_L??fA)I~yLy;2zmmh5qAe!vzXW<J;e(5_|F>;RW0vam8AHNmZYgsB_^i Z4EW`Q6aJfeLRa=K`|y(Cd43@eqTfswMMVGr diff --git a/venv/lib/python2.7/site-packages/setuptools/command/sdist.py b/venv/lib/python2.7/site-packages/setuptools/command/sdist.py deleted file mode 100644 index dc25398..0000000 --- a/venv/lib/python2.7/site-packages/setuptools/command/sdist.py +++ /dev/null @@ -1,221 +0,0 @@ -from distutils import log -import distutils.command.sdist as orig -import os -import sys -import io -import contextlib - -from setuptools.extern import six - -from .py36compat import sdist_add_defaults - -import pkg_resources - -_default_revctrl = list - - -def walk_revctrl(dirname=''): - """Find all files under revision control""" - for ep in pkg_resources.iter_entry_points('setuptools.file_finders'): - for item in ep.load()(dirname): - yield item - - -class sdist(sdist_add_defaults, orig.sdist): - """Smart sdist that finds anything supported by revision control""" - - user_options = [ - ('formats=', None, - "formats for source distribution (comma-separated list)"), - ('keep-temp', 'k', - "keep the distribution tree around after creating " + - "archive file(s)"), - ('dist-dir=', 'd', - "directory to put the source distribution archive(s) in " - "[default: dist]"), - ] - - negative_opt = {} - - README_EXTENSIONS = ['', '.rst', '.txt', '.md'] - READMES = tuple('README{0}'.format(ext) for ext in README_EXTENSIONS) - - def run(self): - self.run_command('egg_info') - ei_cmd = self.get_finalized_command('egg_info') - self.filelist = ei_cmd.filelist - self.filelist.append(os.path.join(ei_cmd.egg_info, 'SOURCES.txt')) - self.check_readme() - - # Run sub commands - for cmd_name in self.get_sub_commands(): - self.run_command(cmd_name) - - self.make_distribution() - - dist_files = getattr(self.distribution, 'dist_files', []) - for file in self.archive_files: - data = ('sdist', '', file) - if data not in dist_files: - dist_files.append(data) - - def initialize_options(self): - orig.sdist.initialize_options(self) - - self._default_to_gztar() - - def _default_to_gztar(self): - # only needed on Python prior to 3.6. - if sys.version_info >= (3, 6, 0, 'beta', 1): - return - self.formats = ['gztar'] - - def make_distribution(self): - """ - Workaround for #516 - """ - with self._remove_os_link(): - orig.sdist.make_distribution(self) - - @staticmethod - @contextlib.contextmanager - def _remove_os_link(): - """ - In a context, remove and restore os.link if it exists - """ - - class NoValue: - pass - - orig_val = getattr(os, 'link', NoValue) - try: - del os.link - except Exception: - pass - try: - yield - finally: - if orig_val is not NoValue: - setattr(os, 'link', orig_val) - - def __read_template_hack(self): - # This grody hack closes the template file (MANIFEST.in) if an - # exception occurs during read_template. - # Doing so prevents an error when easy_install attempts to delete the - # file. - try: - orig.sdist.read_template(self) - except Exception: - _, _, tb = sys.exc_info() - tb.tb_next.tb_frame.f_locals['template'].close() - raise - - # Beginning with Python 2.7.2, 3.1.4, and 3.2.1, this leaky file handle - # has been fixed, so only override the method if we're using an earlier - # Python. - has_leaky_handle = ( - sys.version_info < (2, 7, 2) - or (3, 0) <= sys.version_info < (3, 1, 4) - or (3, 2) <= sys.version_info < (3, 2, 1) - ) - if has_leaky_handle: - read_template = __read_template_hack - - def _add_defaults_python(self): - """getting python files""" - if self.distribution.has_pure_modules(): - build_py = self.get_finalized_command('build_py') - self.filelist.extend(build_py.get_source_files()) - # This functionality is incompatible with include_package_data, and - # will in fact create an infinite recursion if include_package_data - # is True. Use of include_package_data will imply that - # distutils-style automatic handling of package_data is disabled - if not self.distribution.include_package_data: - for _, src_dir, _, filenames in build_py.data_files: - self.filelist.extend([os.path.join(src_dir, filename) - for filename in filenames]) - - def _add_defaults_data_files(self): - try: - if six.PY2: - sdist_add_defaults._add_defaults_data_files(self) - else: - super()._add_defaults_data_files() - except TypeError: - log.warn("data_files contains unexpected objects") - - def check_readme(self): - for f in self.READMES: - if os.path.exists(f): - return - else: - self.warn( - "standard file not found: should have one of " + - ', '.join(self.READMES) - ) - - def make_release_tree(self, base_dir, files): - orig.sdist.make_release_tree(self, base_dir, files) - - # Save any egg_info command line options used to create this sdist - dest = os.path.join(base_dir, 'setup.cfg') - if hasattr(os, 'link') and os.path.exists(dest): - # unlink and re-copy, since it might be hard-linked, and - # we don't want to change the source version - os.unlink(dest) - self.copy_file('setup.cfg', dest) - - self.get_finalized_command('egg_info').save_version_info(dest) - - def _manifest_is_not_generated(self): - # check for special comment used in 2.7.1 and higher - if not os.path.isfile(self.manifest): - return False - - with io.open(self.manifest, 'rb') as fp: - first_line = fp.readline() - return (first_line != - '# file GENERATED by distutils, do NOT edit\n'.encode()) - - def read_manifest(self): - """Read the manifest file (named by 'self.manifest') and use it to - fill in 'self.filelist', the list of files to include in the source - distribution. - """ - log.info("reading manifest file '%s'", self.manifest) - manifest = open(self.manifest, 'rb') - for line in manifest: - # The manifest must contain UTF-8. See #303. - if six.PY3: - try: - line = line.decode('UTF-8') - except UnicodeDecodeError: - log.warn("%r not UTF-8 decodable -- skipping" % line) - continue - # ignore comments and blank lines - line = line.strip() - if line.startswith('#') or not line: - continue - self.filelist.append(line) - manifest.close() - - def check_license(self): - """Checks if license_file' is configured and adds it to - 'self.filelist' if the value contains a valid path. - """ - - opts = self.distribution.get_option_dict('metadata') - - # ignore the source of the value - _, license_file = opts.get('license_file', (None, None)) - - if license_file is None: - log.debug("'license_file' option was not specified") - return - - if not os.path.exists(license_file): - log.warn("warning: Failed to find the configured license file '%s'", - license_file) - return - - self.filelist.append(license_file) diff --git a/venv/lib/python2.7/site-packages/setuptools/command/sdist.pyc b/venv/lib/python2.7/site-packages/setuptools/command/sdist.pyc deleted file mode 100644 index 3601a38a6665cb4f4982c0c623b84fe4c8dc885b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9479 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 diff --git a/venv/lib/python2.7/site-packages/setuptools/command/setopt.py b/venv/lib/python2.7/site-packages/setuptools/command/setopt.py deleted file mode 100644 index 7e57cc0..0000000 --- a/venv/lib/python2.7/site-packages/setuptools/command/setopt.py +++ /dev/null @@ -1,149 +0,0 @@ -from distutils.util import convert_path -from distutils import log -from distutils.errors import DistutilsOptionError -import distutils -import os - -from setuptools.extern.six.moves import configparser - -from setuptools import Command - -__all__ = ['config_file', 'edit_config', 'option_base', 'setopt'] - - -def config_file(kind="local"): - """Get the filename of the distutils, local, global, or per-user config - - `kind` must be one of "local", "global", or "user" - """ - if kind == 'local': - return 'setup.cfg' - if kind == 'global': - return os.path.join( - os.path.dirname(distutils.__file__), 'distutils.cfg' - ) - if kind == 'user': - dot = os.name == 'posix' and '.' or '' - return os.path.expanduser(convert_path("~/%spydistutils.cfg" % dot)) - raise ValueError( - "config_file() type must be 'local', 'global', or 'user'", kind - ) - - -def edit_config(filename, settings, dry_run=False): - """Edit a configuration file to include `settings` - - `settings` is a dictionary of dictionaries or ``None`` values, keyed by - command/section name. A ``None`` value means to delete the entire section, - while a dictionary lists settings to be changed or deleted in that section. - A setting of ``None`` means to delete that setting. - """ - log.debug("Reading configuration from %s", filename) - opts = configparser.RawConfigParser() - opts.read([filename]) - for section, options in settings.items(): - if options is None: - log.info("Deleting section [%s] from %s", section, filename) - opts.remove_section(section) - else: - if not opts.has_section(section): - log.debug("Adding new section [%s] to %s", section, filename) - opts.add_section(section) - for option, value in options.items(): - if value is None: - log.debug( - "Deleting %s.%s from %s", - section, option, filename - ) - opts.remove_option(section, option) - if not opts.options(section): - log.info("Deleting empty [%s] section from %s", - section, filename) - opts.remove_section(section) - else: - log.debug( - "Setting %s.%s to %r in %s", - section, option, value, filename - ) - opts.set(section, option, value) - - log.info("Writing %s", filename) - if not dry_run: - with open(filename, 'w') as f: - opts.write(f) - - -class option_base(Command): - """Abstract base class for commands that mess with config files""" - - user_options = [ - ('global-config', 'g', - "save options to the site-wide distutils.cfg file"), - ('user-config', 'u', - "save options to the current user's pydistutils.cfg file"), - ('filename=', 'f', - "configuration file to use (default=setup.cfg)"), - ] - - boolean_options = [ - 'global-config', 'user-config', - ] - - def initialize_options(self): - self.global_config = None - self.user_config = None - self.filename = None - - def finalize_options(self): - filenames = [] - if self.global_config: - filenames.append(config_file('global')) - if self.user_config: - filenames.append(config_file('user')) - if self.filename is not None: - filenames.append(self.filename) - if not filenames: - filenames.append(config_file('local')) - if len(filenames) > 1: - raise DistutilsOptionError( - "Must specify only one configuration file option", - filenames - ) - self.filename, = filenames - - -class setopt(option_base): - """Save command-line options to a file""" - - description = "set an option in setup.cfg or another config file" - - user_options = [ - ('command=', 'c', 'command to set an option for'), - ('option=', 'o', 'option to set'), - ('set-value=', 's', 'value of the option'), - ('remove', 'r', 'remove (unset) the value'), - ] + option_base.user_options - - boolean_options = option_base.boolean_options + ['remove'] - - def initialize_options(self): - option_base.initialize_options(self) - self.command = None - self.option = None - self.set_value = None - self.remove = None - - def finalize_options(self): - option_base.finalize_options(self) - if self.command is None or self.option is None: - raise DistutilsOptionError("Must specify --command *and* --option") - if self.set_value is None and not self.remove: - raise DistutilsOptionError("Must specify --set-value or --remove") - - def run(self): - edit_config( - self.filename, { - self.command: {self.option.replace('-', '_'): self.set_value} - }, - self.dry_run - ) diff --git a/venv/lib/python2.7/site-packages/setuptools/command/setopt.pyc b/venv/lib/python2.7/site-packages/setuptools/command/setopt.pyc deleted file mode 100644 index 40d297e41b0be6bf7ba51baa9511e98ddbc8c4be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6596 zcmd5=QEwZ^5uPI{N|Y%}v0bNbn)Yf}6>W=B(xh&Z#%WyJDNr<OdMfHfO+cM^OX{TK z9dmoMq(E-r*bjXRkf%Nr=v&|VRG>egf2lv9{l3{FCE7s?1O;q@x3{}DGdnvw`_1fD z|FtlG?cv!^x>EjXc)yFs{u4!nzbA>vz>_UcJhm&6RAf+<t*UERC8^0^Mz&^LyT<QZ z73D>}E?af2&qy*WgE`rnb98k{8Zwxdt$DO(C7P3{A<?|_YqE7lBK({37{fNjEJ(DV z^|Pcg^V0JqIxCMw9*KOkwMaIzsJ)Am-X)1@ve{a~G~$2b*YZ#+nkc$idf((lXBZZ{ zuD6QbB<s7z1vKu&wip$0Vt+L(;w-(J=UKinC7~Dhhhc6_?s{jzbUPai!Za$*xG_M{ z>BWiBwu$1RgMrbh?M&r%c0y~4I_U92S22TXl6AwROKmH7xE{Ch*e_8W>w4^0B**M3 zvdMN;*nUR}kv&iLD&tC3ikj@r$RpUQCXY($8KwS%5@B8H+Uy7xV7S9Ic;JosXQj|3 zIriitWZ=J9=mKF-Nc$XO&%nMksC|gy=ce$BUE_1gX*e)`*3))0Hsz|XGh6lhNwyOv ztA3XILzA~hFrx2FGe7U+x4j>y(Y8Mr*}~s}oK$69R_@EI{$<CH8U$P>_hn@Z8dOCK zQ;ddd-Ckc!>&Wc_zD{(}k2EdW)#}5{#)k#1z6MJ|(0LTUUthMvqbV-?WAr<1b#+@; z{o-h7Cfcs3nk%dRiW?U-sJX&%RyJDmU@o|<nZ@de&;_-!m&Iv8CyL^n)`O`}sf(2m z>F9W!j?ya)rJ2Jae2(G+w4`9)Z^L9{)Mr~9OBra>f_@%lMGG&{!dleUhk1NIEX?}- zFkkOwNn~=n{@LOB(QElmda(cMjZf28Zsf1u=)PeO-;6%XU%{_GT>s7bFdnw!)D~fq zw2N2Y?{_{}haZoIMV2M@bhYbt2D{+pYr~^}j(!%8<!+OirdRWtUc<XoX?ibt-}0(n zm%7pjoVsp+KVxy6lLM2S6MC@aUX>{Dpen~z*{ktGU%k~kyzaqwxdX7DKY7{vxFQc~ z@?b`eX9y$vbCMS-5a3ghV`Y5=P@|kVw&C*Lr*Ep<M%lK19jk!xra0!u9I43R-#Es2 z<i7|<uFHd2ImS?K<R5tDR3HTZx=yI(20v4FVV9{g%~G@tlnF90hpE9&)D65(|2|d` zLY-&~j6Dl{=F}EWdO2H=-@_#DQ5{Hjq#U>+_D^1MmaM=9=<>w{d4Pc+Vo{FK1MA$w zY<~SAW{mfyI=B4@t8^D&=ZEE<9_1k+RB^#CGCxkc$tW`ZHk_e|)4ts<cm1U8#}?dC z+$CR_9}!6=t=L#@sO{|y;KKH{f1kc?SN(l+WFmj(NTJ}w-&BUr-LmHUx1M102PRA{ zm5K~-+9+O`w1{)#TcfP2D(_$ypf;^j0$8)4a&w>zKvj1)O#4s+3Ob1qrVFWIF_yQc z@@|b8Ikm}Dp4LYBbOgs|U&dw#Oc=p#PntK+2L7^DiaVSQNy<t1zgxDS_`OpUw;~mh znuBQ?Oan45Vw8!DWxKX)C(Kt)e=>t%apZ)LM;Z@u33QvzIFLvQ6rIx?7=R#kFOOBn zWvi%ru%V$kAOb5OM`mZ#52|b~q6or++ZsMU(5S1JmctTC8y9Ba0F_>$-{Q2F!Fxq= zGsy0nPN|><-`&towZkZyv>7H!78j!xm0i^;fO5@=-PsVXLL585OiYVdr8qqffZ7;4 zh{N{$sFRP<lDn|lSt=GRlb@+TIV>fsbE|oJ&jDsrx$ohzZ=jI5B_Q^acM0WrZ>h4# zQd@PP_d;dKTLhlZd*>@`FI8SbPu)A`b;-*g=l3%__9rNeFu#mYB5`ao-9vuY*CZ2Q zkNl;NoU+C|?=fhA-)FQ^mteC+@33#9xV2-8JnSNAKvv~<lhDF%u@y@+fD3XX4h*^v z;$pYlKnhG&(*qZ=+hv+YPwd-QC_TK76ht#N^<$<v7Hi%<hyi3%>4B5R43HuDw5XA0 z4qqjzJIZsolCL>}^`A&MoJ4xp*s*Q~s#F_YPSqzN7J~d%WP0H!DQ?08T{3jF%Ng-u zQg9oO{Voa^9T4A9>$9SnJ1bRw+SK%Rqg4ZCK=Ohc#2M;zK1<!pc5oFGE-NONHOX_} zyu~@F5~qNiFo{1iopLolrh@cqfwML|wGgdC*ij4p1C>6~3(Yw801eB+qykwo?4)@H z;~*j+EQU-ZzjNwyg)#EfXZWwkenawJNkkr(W>A19_VZKRNNXnCzy*9p8#`gYCONVY zmj$3xQ*p=tv1-}TaW-3=)<!_64d{=W9>-jMyN=?0X4iITx^WKyHcePy(<sDF`IEC$ zi)mQ!8Vbdza0u{=G>Z#f=NGQI^ADO1CxC!v)bum>5o(&xjvd%OdoU|_F6_nWlsAOv zv)@J`fU1UfQ6B<Z9rbg7v8vasv^c@1;UajI-CqYSoWLg_Blsc3@vQMR5yMISf51kI z$CB~{!bA!u5IR+-GsvP*!X^nioha*~&hwyxLAk>;c<<mqfK+R|>w+5~3f@9-;s{!M zX2%iE;FoyxI8yiONQ|r4*L)haX0<WX#Yg>dS83S#5S6L0g}Vws<_i*?ljyue7kHCl z^a%bUA{J{naG&An<V9YI=>5eOwy|DW;8rAB(wNp@O#23e+bbwG8G6b9)=pv`g-_y8 z=wgF<9!}q3T7G1fHGzF5qhXpMW{pqTj*A<*6ns-tjIO$V*~N4XB2LLfB(*e?8{e^H zx({4W$)UL&INO@LI5Mk;Y3&%_3OF9c5|?eM3c39zMsOW|Ym`C`j@O8`%G-S^ekro( zy$7Ha@W=}))LiIdMWK)tqzvwpUPg_h8s`&ep&qI6jm^>s!5Zp{Tu`K=Is~`TrNK>M z?Zkhdnd?&Xhj`TR;w@+(D?=F#HVO7UG~A)HG!|aCE@DiY6MJ1Fm<v%j8NbCO+yyw? z^px>UZO3!-juOvG6E)Ilq;qr-x2f2(VV5!BRG4WaAJQu_{~GQruKDeD>CE4MnsVYo z^xt;d`Gku?x?n_);4TZUny!?FoZvk+pSx9}x_`toS*7nFKfdG=4z3b+BbBx{QDBw0 zHl83{<L}mqrQUEbA%?*#a)Vtn?o}5a=1+{T+o`Q(M*%z_aJew87E;%yC37=O!me?) zypE3N$-DKyg(K4!(96<B#N>u|rHsPt8Dm)RE*k$6!dzJ7yh|JlZjp^i?G%hTI>xz) zBi;-Y_jxb)6;S3FXk_QA!5#AcH#pP#l7Oe5;B6MV@=OCFW4n2*Fz>+W9e(~Pi%H-N zet~8S&#B^>K@gXL7m0dtfaqDNSD7nSkvGj(mMV?e#%${aeAn~%$#IDn?0RV#(5CL> z&$R4>!tmbRx_!-KUhxtNEJ%69xMmIulc#IAxn1KS-@5C9a@9(rphiZnc&CGl%1%eK yRz0}C7be!YjiH#rc|0dJ)qLx1mtnm_fKb~m;fT#+cN11!s+_Af&o{4MT=@?kMN^3Y diff --git a/venv/lib/python2.7/site-packages/setuptools/command/test.py b/venv/lib/python2.7/site-packages/setuptools/command/test.py deleted file mode 100644 index 973e4eb..0000000 --- a/venv/lib/python2.7/site-packages/setuptools/command/test.py +++ /dev/null @@ -1,271 +0,0 @@ -import os -import operator -import sys -import contextlib -import itertools -import unittest -from distutils.errors import DistutilsError, DistutilsOptionError -from distutils import log -from unittest import TestLoader - -from setuptools.extern import six -from setuptools.extern.six.moves import map, filter - -from pkg_resources import (resource_listdir, resource_exists, normalize_path, - working_set, _namespace_packages, evaluate_marker, - add_activation_listener, require, EntryPoint) -from setuptools import Command -from .build_py import _unique_everseen - -__metaclass__ = type - - -class ScanningLoader(TestLoader): - - def __init__(self): - TestLoader.__init__(self) - self._visited = set() - - def loadTestsFromModule(self, module, pattern=None): - """Return a suite of all tests cases contained in the given module - - If the module is a package, load tests from all the modules in it. - If the module has an ``additional_tests`` function, call it and add - the return value to the tests. - """ - if module in self._visited: - return None - self._visited.add(module) - - tests = [] - tests.append(TestLoader.loadTestsFromModule(self, module)) - - if hasattr(module, "additional_tests"): - tests.append(module.additional_tests()) - - if hasattr(module, '__path__'): - for file in resource_listdir(module.__name__, ''): - if file.endswith('.py') and file != '__init__.py': - submodule = module.__name__ + '.' + file[:-3] - else: - if resource_exists(module.__name__, file + '/__init__.py'): - submodule = module.__name__ + '.' + file - else: - continue - tests.append(self.loadTestsFromName(submodule)) - - if len(tests) != 1: - return self.suiteClass(tests) - else: - return tests[0] # don't create a nested suite for only one return - - -# adapted from jaraco.classes.properties:NonDataProperty -class NonDataProperty: - def __init__(self, fget): - self.fget = fget - - def __get__(self, obj, objtype=None): - if obj is None: - return self - return self.fget(obj) - - -class test(Command): - """Command to run unit tests after in-place build""" - - description = "run unit tests after in-place build" - - user_options = [ - ('test-module=', 'm', "Run 'test_suite' in specified module"), - ('test-suite=', 's', - "Run single test, case or suite (e.g. 'module.test_suite')"), - ('test-runner=', 'r', "Test runner to use"), - ] - - def initialize_options(self): - self.test_suite = None - self.test_module = None - self.test_loader = None - self.test_runner = None - - def finalize_options(self): - - if self.test_suite and self.test_module: - msg = "You may specify a module or a suite, but not both" - raise DistutilsOptionError(msg) - - if self.test_suite is None: - if self.test_module is None: - self.test_suite = self.distribution.test_suite - else: - self.test_suite = self.test_module + ".test_suite" - - if self.test_loader is None: - self.test_loader = getattr(self.distribution, 'test_loader', None) - if self.test_loader is None: - self.test_loader = "setuptools.command.test:ScanningLoader" - if self.test_runner is None: - self.test_runner = getattr(self.distribution, 'test_runner', None) - - @NonDataProperty - def test_args(self): - return list(self._test_args()) - - def _test_args(self): - if not self.test_suite and sys.version_info >= (2, 7): - yield 'discover' - if self.verbose: - yield '--verbose' - if self.test_suite: - yield self.test_suite - - def with_project_on_sys_path(self, func): - """ - Backward compatibility for project_on_sys_path context. - """ - with self.project_on_sys_path(): - func() - - @contextlib.contextmanager - def project_on_sys_path(self, include_dists=[]): - with_2to3 = six.PY3 and getattr(self.distribution, 'use_2to3', False) - - if with_2to3: - # If we run 2to3 we can not do this inplace: - - # Ensure metadata is up-to-date - self.reinitialize_command('build_py', inplace=0) - self.run_command('build_py') - bpy_cmd = self.get_finalized_command("build_py") - build_path = normalize_path(bpy_cmd.build_lib) - - # Build extensions - self.reinitialize_command('egg_info', egg_base=build_path) - self.run_command('egg_info') - - self.reinitialize_command('build_ext', inplace=0) - self.run_command('build_ext') - else: - # Without 2to3 inplace works fine: - self.run_command('egg_info') - - # Build extensions in-place - self.reinitialize_command('build_ext', inplace=1) - self.run_command('build_ext') - - ei_cmd = self.get_finalized_command("egg_info") - - old_path = sys.path[:] - old_modules = sys.modules.copy() - - try: - project_path = normalize_path(ei_cmd.egg_base) - sys.path.insert(0, project_path) - working_set.__init__() - add_activation_listener(lambda dist: dist.activate()) - require('%s==%s' % (ei_cmd.egg_name, ei_cmd.egg_version)) - with self.paths_on_pythonpath([project_path]): - yield - finally: - sys.path[:] = old_path - sys.modules.clear() - sys.modules.update(old_modules) - working_set.__init__() - - @staticmethod - @contextlib.contextmanager - def paths_on_pythonpath(paths): - """ - Add the indicated paths to the head of the PYTHONPATH environment - variable so that subprocesses will also see the packages at - these paths. - - Do this in a context that restores the value on exit. - """ - nothing = object() - orig_pythonpath = os.environ.get('PYTHONPATH', nothing) - current_pythonpath = os.environ.get('PYTHONPATH', '') - try: - prefix = os.pathsep.join(_unique_everseen(paths)) - to_join = filter(None, [prefix, current_pythonpath]) - new_path = os.pathsep.join(to_join) - if new_path: - os.environ['PYTHONPATH'] = new_path - yield - finally: - if orig_pythonpath is nothing: - os.environ.pop('PYTHONPATH', None) - else: - os.environ['PYTHONPATH'] = orig_pythonpath - - @staticmethod - def install_dists(dist): - """ - Install the requirements indicated by self.distribution and - return an iterable of the dists that were built. - """ - ir_d = dist.fetch_build_eggs(dist.install_requires) - tr_d = dist.fetch_build_eggs(dist.tests_require or []) - er_d = dist.fetch_build_eggs( - v for k, v in dist.extras_require.items() - if k.startswith(':') and evaluate_marker(k[1:]) - ) - return itertools.chain(ir_d, tr_d, er_d) - - def run(self): - installed_dists = self.install_dists(self.distribution) - - cmd = ' '.join(self._argv) - if self.dry_run: - self.announce('skipping "%s" (dry run)' % cmd) - return - - self.announce('running "%s"' % cmd) - - paths = map(operator.attrgetter('location'), installed_dists) - with self.paths_on_pythonpath(paths): - with self.project_on_sys_path(): - self.run_tests() - - def run_tests(self): - # Purge modules under test from sys.modules. The test loader will - # re-import them from the build location. Required when 2to3 is used - # with namespace packages. - if six.PY3 and getattr(self.distribution, 'use_2to3', False): - module = self.test_suite.split('.')[0] - if module in _namespace_packages: - del_modules = [] - if module in sys.modules: - del_modules.append(module) - module += '.' - for name in sys.modules: - if name.startswith(module): - del_modules.append(name) - list(map(sys.modules.__delitem__, del_modules)) - - test = unittest.main( - None, None, self._argv, - testLoader=self._resolve_as_ep(self.test_loader), - testRunner=self._resolve_as_ep(self.test_runner), - exit=False, - ) - if not test.result.wasSuccessful(): - msg = 'Test failed: %s' % test.result - self.announce(msg, log.ERROR) - raise DistutilsError(msg) - - @property - def _argv(self): - return ['unittest'] + self.test_args - - @staticmethod - def _resolve_as_ep(val): - """ - Load the indicated attribute value, called, as a as if it were - specified as an entry point. - """ - if val is None: - return - parsed = EntryPoint.parse("x=" + val) - return parsed.resolve()() diff --git a/venv/lib/python2.7/site-packages/setuptools/command/test.pyc b/venv/lib/python2.7/site-packages/setuptools/command/test.pyc deleted file mode 100644 index 2bd820a9c8a47390d20cacc032a80f9b5d98adee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11758 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 HS(*DEuHDT) diff --git a/venv/lib/python2.7/site-packages/setuptools/command/upload.py b/venv/lib/python2.7/site-packages/setuptools/command/upload.py deleted file mode 100644 index 6db8888..0000000 --- a/venv/lib/python2.7/site-packages/setuptools/command/upload.py +++ /dev/null @@ -1,196 +0,0 @@ -import io -import os -import hashlib -import getpass - -from base64 import standard_b64encode - -from distutils import log -from distutils.command import upload as orig -from distutils.spawn import spawn - -from distutils.errors import DistutilsError - -from setuptools.extern.six.moves.urllib.request import urlopen, Request -from setuptools.extern.six.moves.urllib.error import HTTPError -from setuptools.extern.six.moves.urllib.parse import urlparse - - -class upload(orig.upload): - """ - Override default upload behavior to obtain password - in a variety of different ways. - """ - def run(self): - try: - orig.upload.run(self) - finally: - self.announce( - "WARNING: Uploading via this command is deprecated, use twine " - "to upload instead (https://pypi.org/p/twine/)", - log.WARN - ) - - def finalize_options(self): - orig.upload.finalize_options(self) - self.username = ( - self.username or - getpass.getuser() - ) - # Attempt to obtain password. Short circuit evaluation at the first - # sign of success. - self.password = ( - self.password or - self._load_password_from_keyring() or - self._prompt_for_password() - ) - - def upload_file(self, command, pyversion, filename): - # Makes sure the repository URL is compliant - schema, netloc, url, params, query, fragments = \ - urlparse(self.repository) - if params or query or fragments: - raise AssertionError("Incompatible url %s" % self.repository) - - if schema not in ('http', 'https'): - raise AssertionError("unsupported schema " + schema) - - # Sign if requested - if self.sign: - gpg_args = ["gpg", "--detach-sign", "-a", filename] - if self.identity: - gpg_args[2:2] = ["--local-user", self.identity] - spawn(gpg_args, - dry_run=self.dry_run) - - # Fill in the data - send all the meta-data in case we need to - # register a new release - with open(filename, 'rb') as f: - content = f.read() - - meta = self.distribution.metadata - - data = { - # action - ':action': 'file_upload', - 'protocol_version': '1', - - # identify release - 'name': meta.get_name(), - 'version': meta.get_version(), - - # file content - 'content': (os.path.basename(filename), content), - 'filetype': command, - 'pyversion': pyversion, - 'md5_digest': hashlib.md5(content).hexdigest(), - - # additional meta-data - 'metadata_version': str(meta.get_metadata_version()), - 'summary': meta.get_description(), - 'home_page': meta.get_url(), - 'author': meta.get_contact(), - 'author_email': meta.get_contact_email(), - 'license': meta.get_licence(), - 'description': meta.get_long_description(), - 'keywords': meta.get_keywords(), - 'platform': meta.get_platforms(), - 'classifiers': meta.get_classifiers(), - 'download_url': meta.get_download_url(), - # PEP 314 - 'provides': meta.get_provides(), - 'requires': meta.get_requires(), - 'obsoletes': meta.get_obsoletes(), - } - - data['comment'] = '' - - if self.sign: - data['gpg_signature'] = (os.path.basename(filename) + ".asc", - open(filename+".asc", "rb").read()) - - # set up the authentication - user_pass = (self.username + ":" + self.password).encode('ascii') - # The exact encoding of the authentication string is debated. - # Anyway PyPI only accepts ascii for both username or password. - auth = "Basic " + standard_b64encode(user_pass).decode('ascii') - - # Build up the MIME payload for the POST data - boundary = '--------------GHSKFJDLGDS7543FJKLFHRE75642756743254' - sep_boundary = b'\r\n--' + boundary.encode('ascii') - end_boundary = sep_boundary + b'--\r\n' - body = io.BytesIO() - for key, value in data.items(): - title = '\r\nContent-Disposition: form-data; name="%s"' % key - # handle multiple entries for the same name - if not isinstance(value, list): - value = [value] - for value in value: - if type(value) is tuple: - title += '; filename="%s"' % value[0] - value = value[1] - else: - value = str(value).encode('utf-8') - body.write(sep_boundary) - body.write(title.encode('utf-8')) - body.write(b"\r\n\r\n") - body.write(value) - body.write(end_boundary) - body = body.getvalue() - - msg = "Submitting %s to %s" % (filename, self.repository) - self.announce(msg, log.INFO) - - # build the Request - headers = { - 'Content-type': 'multipart/form-data; boundary=%s' % boundary, - 'Content-length': str(len(body)), - 'Authorization': auth, - } - - request = Request(self.repository, data=body, - headers=headers) - # send the data - try: - result = urlopen(request) - status = result.getcode() - reason = result.msg - except HTTPError as e: - status = e.code - reason = e.msg - except OSError as e: - self.announce(str(e), log.ERROR) - raise - - if status == 200: - self.announce('Server response (%s): %s' % (status, reason), - log.INFO) - if self.show_response: - text = getattr(self, '_read_pypi_response', - lambda x: None)(result) - if text is not None: - msg = '\n'.join(('-' * 75, text, '-' * 75)) - self.announce(msg, log.INFO) - else: - msg = 'Upload failed (%s): %s' % (status, reason) - self.announce(msg, log.ERROR) - raise DistutilsError(msg) - - def _load_password_from_keyring(self): - """ - Attempt to load password from keyring. Suppress Exceptions. - """ - try: - keyring = __import__('keyring') - return keyring.get_password(self.repository, self.username) - except Exception: - pass - - def _prompt_for_password(self): - """ - Prompt for a password on the tty. Suppress Exceptions. - """ - try: - return getpass.getpass() - except (Exception, KeyboardInterrupt): - pass diff --git a/venv/lib/python2.7/site-packages/setuptools/command/upload.pyc b/venv/lib/python2.7/site-packages/setuptools/command/upload.pyc deleted file mode 100644 index 54bccb2d3019ee182e059597fbb1de781a9691c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6915 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 GH~Sy>n_ct( diff --git a/venv/lib/python2.7/site-packages/setuptools/command/upload_docs.py b/venv/lib/python2.7/site-packages/setuptools/command/upload_docs.py deleted file mode 100644 index 07aa564..0000000 --- a/venv/lib/python2.7/site-packages/setuptools/command/upload_docs.py +++ /dev/null @@ -1,206 +0,0 @@ -# -*- coding: utf-8 -*- -"""upload_docs - -Implements a Distutils 'upload_docs' subcommand (upload documentation to -PyPI's pythonhosted.org). -""" - -from base64 import standard_b64encode -from distutils import log -from distutils.errors import DistutilsOptionError -import os -import socket -import zipfile -import tempfile -import shutil -import itertools -import functools - -from setuptools.extern import six -from setuptools.extern.six.moves import http_client, urllib - -from pkg_resources import iter_entry_points -from .upload import upload - - -def _encode(s): - errors = 'surrogateescape' if six.PY3 else 'strict' - return s.encode('utf-8', errors) - - -class upload_docs(upload): - # override the default repository as upload_docs isn't - # supported by Warehouse (and won't be). - DEFAULT_REPOSITORY = 'https://pypi.python.org/pypi/' - - description = 'Upload documentation to PyPI' - - user_options = [ - ('repository=', 'r', - "url of repository [default: %s]" % upload.DEFAULT_REPOSITORY), - ('show-response', None, - 'display full response text from server'), - ('upload-dir=', None, 'directory to upload'), - ] - boolean_options = upload.boolean_options - - def has_sphinx(self): - if self.upload_dir is None: - for ep in iter_entry_points('distutils.commands', 'build_sphinx'): - return True - - sub_commands = [('build_sphinx', has_sphinx)] - - def initialize_options(self): - upload.initialize_options(self) - self.upload_dir = None - self.target_dir = None - - def finalize_options(self): - upload.finalize_options(self) - if self.upload_dir is None: - if self.has_sphinx(): - build_sphinx = self.get_finalized_command('build_sphinx') - self.target_dir = build_sphinx.builder_target_dir - else: - build = self.get_finalized_command('build') - self.target_dir = os.path.join(build.build_base, 'docs') - else: - self.ensure_dirname('upload_dir') - self.target_dir = self.upload_dir - if 'pypi.python.org' in self.repository: - log.warn("Upload_docs command is deprecated. Use RTD instead.") - self.announce('Using upload directory %s' % self.target_dir) - - def create_zipfile(self, filename): - zip_file = zipfile.ZipFile(filename, "w") - try: - self.mkpath(self.target_dir) # just in case - for root, dirs, files in os.walk(self.target_dir): - if root == self.target_dir and not files: - tmpl = "no files found in upload directory '%s'" - raise DistutilsOptionError(tmpl % self.target_dir) - for name in files: - full = os.path.join(root, name) - relative = root[len(self.target_dir):].lstrip(os.path.sep) - dest = os.path.join(relative, name) - zip_file.write(full, dest) - finally: - zip_file.close() - - def run(self): - # Run sub commands - for cmd_name in self.get_sub_commands(): - self.run_command(cmd_name) - - tmp_dir = tempfile.mkdtemp() - name = self.distribution.metadata.get_name() - zip_file = os.path.join(tmp_dir, "%s.zip" % name) - try: - self.create_zipfile(zip_file) - self.upload_file(zip_file) - finally: - shutil.rmtree(tmp_dir) - - @staticmethod - def _build_part(item, sep_boundary): - key, values = item - title = '\nContent-Disposition: form-data; name="%s"' % key - # handle multiple entries for the same name - if not isinstance(values, list): - values = [values] - for value in values: - if isinstance(value, tuple): - title += '; filename="%s"' % value[0] - value = value[1] - else: - value = _encode(value) - yield sep_boundary - yield _encode(title) - yield b"\n\n" - yield value - if value and value[-1:] == b'\r': - yield b'\n' # write an extra newline (lurve Macs) - - @classmethod - def _build_multipart(cls, data): - """ - Build up the MIME payload for the POST data - """ - boundary = b'--------------GHSKFJDLGDS7543FJKLFHRE75642756743254' - sep_boundary = b'\n--' + boundary - end_boundary = sep_boundary + b'--' - end_items = end_boundary, b"\n", - builder = functools.partial( - cls._build_part, - sep_boundary=sep_boundary, - ) - part_groups = map(builder, data.items()) - parts = itertools.chain.from_iterable(part_groups) - body_items = itertools.chain(parts, end_items) - content_type = 'multipart/form-data; boundary=%s' % boundary.decode('ascii') - return b''.join(body_items), content_type - - def upload_file(self, filename): - with open(filename, 'rb') as f: - content = f.read() - meta = self.distribution.metadata - data = { - ':action': 'doc_upload', - 'name': meta.get_name(), - 'content': (os.path.basename(filename), content), - } - # set up the authentication - credentials = _encode(self.username + ':' + self.password) - credentials = standard_b64encode(credentials) - if six.PY3: - credentials = credentials.decode('ascii') - auth = "Basic " + credentials - - body, ct = self._build_multipart(data) - - msg = "Submitting documentation to %s" % (self.repository) - self.announce(msg, log.INFO) - - # build the Request - # We can't use urllib2 since we need to send the Basic - # auth right with the first request - schema, netloc, url, params, query, fragments = \ - urllib.parse.urlparse(self.repository) - assert not params and not query and not fragments - if schema == 'http': - conn = http_client.HTTPConnection(netloc) - elif schema == 'https': - conn = http_client.HTTPSConnection(netloc) - else: - raise AssertionError("unsupported schema " + schema) - - data = '' - try: - conn.connect() - conn.putrequest("POST", url) - content_type = ct - conn.putheader('Content-type', content_type) - conn.putheader('Content-length', str(len(body))) - conn.putheader('Authorization', auth) - conn.endheaders() - conn.send(body) - except socket.error as e: - self.announce(str(e), log.ERROR) - return - - r = conn.getresponse() - if r.status == 200: - msg = 'Server response (%s): %s' % (r.status, r.reason) - self.announce(msg, log.INFO) - elif r.status == 301: - location = r.getheader('Location') - if location is None: - location = 'https://pythonhosted.org/%s/' % meta.get_name() - msg = 'Upload successful. Visit %s' % location - self.announce(msg, log.INFO) - else: - msg = 'Upload failed (%s): %s' % (r.status, r.reason) - self.announce(msg, log.ERROR) - if self.show_response: - print('-' * 75, r.read(), '-' * 75) diff --git a/venv/lib/python2.7/site-packages/setuptools/command/upload_docs.pyc b/venv/lib/python2.7/site-packages/setuptools/command/upload_docs.pyc deleted file mode 100644 index b2c7285ccb56fbb95a9323e614d5fa8206b50d0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8436 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 diff --git a/venv/lib/python2.7/site-packages/setuptools/config.py b/venv/lib/python2.7/site-packages/setuptools/config.py deleted file mode 100644 index b662604..0000000 --- a/venv/lib/python2.7/site-packages/setuptools/config.py +++ /dev/null @@ -1,656 +0,0 @@ -from __future__ import absolute_import, unicode_literals -import io -import os -import sys - -import warnings -import functools -from collections import defaultdict -from functools import partial -from functools import wraps -from importlib import import_module - -from distutils.errors import DistutilsOptionError, DistutilsFileError -from setuptools.extern.packaging.version import LegacyVersion, parse -from setuptools.extern.six import string_types, PY3 - - -__metaclass__ = type - - -def read_configuration( - filepath, find_others=False, ignore_option_errors=False): - """Read given configuration file and returns options from it as a dict. - - :param str|unicode filepath: Path to configuration file - to get options from. - - :param bool find_others: Whether to search for other configuration files - which could be on in various places. - - :param bool ignore_option_errors: Whether to silently ignore - options, values of which could not be resolved (e.g. due to exceptions - in directives such as file:, attr:, etc.). - If False exceptions are propagated as expected. - - :rtype: dict - """ - from setuptools.dist import Distribution, _Distribution - - filepath = os.path.abspath(filepath) - - if not os.path.isfile(filepath): - raise DistutilsFileError( - 'Configuration file %s does not exist.' % filepath) - - current_directory = os.getcwd() - os.chdir(os.path.dirname(filepath)) - - try: - dist = Distribution() - - filenames = dist.find_config_files() if find_others else [] - if filepath not in filenames: - filenames.append(filepath) - - _Distribution.parse_config_files(dist, filenames=filenames) - - handlers = parse_configuration( - dist, dist.command_options, - ignore_option_errors=ignore_option_errors) - - finally: - os.chdir(current_directory) - - return configuration_to_dict(handlers) - - -def _get_option(target_obj, key): - """ - Given a target object and option key, get that option from - the target object, either through a get_{key} method or - from an attribute directly. - """ - getter_name = 'get_{key}'.format(**locals()) - by_attribute = functools.partial(getattr, target_obj, key) - getter = getattr(target_obj, getter_name, by_attribute) - return getter() - - -def configuration_to_dict(handlers): - """Returns configuration data gathered by given handlers as a dict. - - :param list[ConfigHandler] handlers: Handlers list, - usually from parse_configuration() - - :rtype: dict - """ - config_dict = defaultdict(dict) - - for handler in handlers: - for option in handler.set_options: - value = _get_option(handler.target_obj, option) - config_dict[handler.section_prefix][option] = value - - return config_dict - - -def parse_configuration( - distribution, command_options, ignore_option_errors=False): - """Performs additional parsing of configuration options - for a distribution. - - Returns a list of used option handlers. - - :param Distribution distribution: - :param dict command_options: - :param bool ignore_option_errors: Whether to silently ignore - options, values of which could not be resolved (e.g. due to exceptions - in directives such as file:, attr:, etc.). - If False exceptions are propagated as expected. - :rtype: list - """ - options = ConfigOptionsHandler( - distribution, command_options, ignore_option_errors) - options.parse() - - meta = ConfigMetadataHandler( - distribution.metadata, command_options, ignore_option_errors, - distribution.package_dir) - meta.parse() - - return meta, options - - -class ConfigHandler: - """Handles metadata supplied in configuration files.""" - - section_prefix = None - """Prefix for config sections handled by this handler. - Must be provided by class heirs. - - """ - - aliases = {} - """Options aliases. - For compatibility with various packages. E.g.: d2to1 and pbr. - Note: `-` in keys is replaced with `_` by config parser. - - """ - - def __init__(self, target_obj, options, ignore_option_errors=False): - sections = {} - - section_prefix = self.section_prefix - for section_name, section_options in options.items(): - if not section_name.startswith(section_prefix): - continue - - section_name = section_name.replace(section_prefix, '').strip('.') - sections[section_name] = section_options - - self.ignore_option_errors = ignore_option_errors - self.target_obj = target_obj - self.sections = sections - self.set_options = [] - - @property - def parsers(self): - """Metadata item name to parser function mapping.""" - raise NotImplementedError( - '%s must provide .parsers property' % self.__class__.__name__) - - def __setitem__(self, option_name, value): - unknown = tuple() - target_obj = self.target_obj - - # Translate alias into real name. - option_name = self.aliases.get(option_name, option_name) - - current_value = getattr(target_obj, option_name, unknown) - - if current_value is unknown: - raise KeyError(option_name) - - if current_value: - # Already inhabited. Skipping. - return - - skip_option = False - parser = self.parsers.get(option_name) - if parser: - try: - value = parser(value) - - except Exception: - skip_option = True - if not self.ignore_option_errors: - raise - - if skip_option: - return - - setter = getattr(target_obj, 'set_%s' % option_name, None) - if setter is None: - setattr(target_obj, option_name, value) - else: - setter(value) - - self.set_options.append(option_name) - - @classmethod - def _parse_list(cls, value, separator=','): - """Represents value as a list. - - Value is split either by separator (defaults to comma) or by lines. - - :param value: - :param separator: List items separator character. - :rtype: list - """ - if isinstance(value, list): # _get_parser_compound case - return value - - if '\n' in value: - value = value.splitlines() - else: - value = value.split(separator) - - return [chunk.strip() for chunk in value if chunk.strip()] - - @classmethod - def _parse_dict(cls, value): - """Represents value as a dict. - - :param value: - :rtype: dict - """ - separator = '=' - result = {} - for line in cls._parse_list(value): - key, sep, val = line.partition(separator) - if sep != separator: - raise DistutilsOptionError( - 'Unable to parse option value to dict: %s' % value) - result[key.strip()] = val.strip() - - return result - - @classmethod - def _parse_bool(cls, value): - """Represents value as boolean. - - :param value: - :rtype: bool - """ - value = value.lower() - return value in ('1', 'true', 'yes') - - @classmethod - def _exclude_files_parser(cls, key): - """Returns a parser function to make sure field inputs - are not files. - - Parses a value after getting the key so error messages are - more informative. - - :param key: - :rtype: callable - """ - def parser(value): - exclude_directive = 'file:' - if value.startswith(exclude_directive): - raise ValueError( - 'Only strings are accepted for the {0} field, ' - 'files are not accepted'.format(key)) - return value - return parser - - @classmethod - def _parse_file(cls, value): - """Represents value as a string, allowing including text - from nearest files using `file:` directive. - - Directive is sandboxed and won't reach anything outside - directory with setup.py. - - Examples: - file: README.rst, CHANGELOG.md, src/file.txt - - :param str value: - :rtype: str - """ - include_directive = 'file:' - - if not isinstance(value, string_types): - return value - - if not value.startswith(include_directive): - return value - - spec = value[len(include_directive):] - filepaths = (os.path.abspath(path.strip()) for path in spec.split(',')) - return '\n'.join( - cls._read_file(path) - for path in filepaths - if (cls._assert_local(path) or True) - and os.path.isfile(path) - ) - - @staticmethod - def _assert_local(filepath): - if not filepath.startswith(os.getcwd()): - raise DistutilsOptionError( - '`file:` directive can not access %s' % filepath) - - @staticmethod - def _read_file(filepath): - with io.open(filepath, encoding='utf-8') as f: - return f.read() - - @classmethod - def _parse_attr(cls, value, package_dir=None): - """Represents value as a module attribute. - - Examples: - attr: package.attr - attr: package.module.attr - - :param str value: - :rtype: str - """ - attr_directive = 'attr:' - if not value.startswith(attr_directive): - return value - - attrs_path = value.replace(attr_directive, '').strip().split('.') - attr_name = attrs_path.pop() - - module_name = '.'.join(attrs_path) - module_name = module_name or '__init__' - - parent_path = os.getcwd() - if package_dir: - if attrs_path[0] in package_dir: - # A custom path was specified for the module we want to import - custom_path = package_dir[attrs_path[0]] - parts = custom_path.rsplit('/', 1) - if len(parts) > 1: - parent_path = os.path.join(os.getcwd(), parts[0]) - module_name = parts[1] - else: - module_name = custom_path - elif '' in package_dir: - # A custom parent directory was specified for all root modules - parent_path = os.path.join(os.getcwd(), package_dir['']) - sys.path.insert(0, parent_path) - try: - module = import_module(module_name) - value = getattr(module, attr_name) - - finally: - sys.path = sys.path[1:] - - return value - - @classmethod - def _get_parser_compound(cls, *parse_methods): - """Returns parser function to represents value as a list. - - Parses a value applying given methods one after another. - - :param parse_methods: - :rtype: callable - """ - def parse(value): - parsed = value - - for method in parse_methods: - parsed = method(parsed) - - return parsed - - return parse - - @classmethod - def _parse_section_to_dict(cls, section_options, values_parser=None): - """Parses section options into a dictionary. - - Optionally applies a given parser to values. - - :param dict section_options: - :param callable values_parser: - :rtype: dict - """ - value = {} - values_parser = values_parser or (lambda val: val) - for key, (_, val) in section_options.items(): - value[key] = values_parser(val) - return value - - def parse_section(self, section_options): - """Parses configuration file section. - - :param dict section_options: - """ - for (name, (_, value)) in section_options.items(): - try: - self[name] = value - - except KeyError: - pass # Keep silent for a new option may appear anytime. - - def parse(self): - """Parses configuration file items from one - or more related sections. - - """ - for section_name, section_options in self.sections.items(): - - method_postfix = '' - if section_name: # [section.option] variant - method_postfix = '_%s' % section_name - - section_parser_method = getattr( - self, - # Dots in section names are translated into dunderscores. - ('parse_section%s' % method_postfix).replace('.', '__'), - None) - - if section_parser_method is None: - raise DistutilsOptionError( - 'Unsupported distribution option section: [%s.%s]' % ( - self.section_prefix, section_name)) - - section_parser_method(section_options) - - def _deprecated_config_handler(self, func, msg, warning_class): - """ this function will wrap around parameters that are deprecated - - :param msg: deprecation message - :param warning_class: class of warning exception to be raised - :param func: function to be wrapped around - """ - @wraps(func) - def config_handler(*args, **kwargs): - warnings.warn(msg, warning_class) - return func(*args, **kwargs) - - return config_handler - - -class ConfigMetadataHandler(ConfigHandler): - - section_prefix = 'metadata' - - aliases = { - 'home_page': 'url', - 'summary': 'description', - 'classifier': 'classifiers', - 'platform': 'platforms', - } - - strict_mode = False - """We need to keep it loose, to be partially compatible with - `pbr` and `d2to1` packages which also uses `metadata` section. - - """ - - def __init__(self, target_obj, options, ignore_option_errors=False, - package_dir=None): - super(ConfigMetadataHandler, self).__init__(target_obj, options, - ignore_option_errors) - self.package_dir = package_dir - - @property - def parsers(self): - """Metadata item name to parser function mapping.""" - parse_list = self._parse_list - parse_file = self._parse_file - parse_dict = self._parse_dict - exclude_files_parser = self._exclude_files_parser - - return { - 'platforms': parse_list, - 'keywords': parse_list, - 'provides': parse_list, - 'requires': self._deprecated_config_handler( - parse_list, - "The requires parameter is deprecated, please use " - "install_requires for runtime dependencies.", - DeprecationWarning), - 'obsoletes': parse_list, - 'classifiers': self._get_parser_compound(parse_file, parse_list), - 'license': exclude_files_parser('license'), - 'description': parse_file, - 'long_description': parse_file, - 'version': self._parse_version, - 'project_urls': parse_dict, - } - - def _parse_version(self, value): - """Parses `version` option value. - - :param value: - :rtype: str - - """ - version = self._parse_file(value) - - if version != value: - version = version.strip() - # Be strict about versions loaded from file because it's easy to - # accidentally include newlines and other unintended content - if isinstance(parse(version), LegacyVersion): - tmpl = ( - 'Version loaded from {value} does not ' - 'comply with PEP 440: {version}' - ) - raise DistutilsOptionError(tmpl.format(**locals())) - - return version - - version = self._parse_attr(value, self.package_dir) - - if callable(version): - version = version() - - if not isinstance(version, string_types): - if hasattr(version, '__iter__'): - version = '.'.join(map(str, version)) - else: - version = '%s' % version - - return version - - -class ConfigOptionsHandler(ConfigHandler): - - section_prefix = 'options' - - @property - def parsers(self): - """Metadata item name to parser function mapping.""" - parse_list = self._parse_list - parse_list_semicolon = partial(self._parse_list, separator=';') - parse_bool = self._parse_bool - parse_dict = self._parse_dict - - return { - 'zip_safe': parse_bool, - 'use_2to3': parse_bool, - 'include_package_data': parse_bool, - 'package_dir': parse_dict, - 'use_2to3_fixers': parse_list, - 'use_2to3_exclude_fixers': parse_list, - 'convert_2to3_doctests': parse_list, - 'scripts': parse_list, - 'eager_resources': parse_list, - 'dependency_links': parse_list, - 'namespace_packages': parse_list, - 'install_requires': parse_list_semicolon, - 'setup_requires': parse_list_semicolon, - 'tests_require': parse_list_semicolon, - 'packages': self._parse_packages, - 'entry_points': self._parse_file, - 'py_modules': parse_list, - } - - def _parse_packages(self, value): - """Parses `packages` option value. - - :param value: - :rtype: list - """ - find_directives = ['find:', 'find_namespace:'] - trimmed_value = value.strip() - - if trimmed_value not in find_directives: - return self._parse_list(value) - - findns = trimmed_value == find_directives[1] - if findns and not PY3: - raise DistutilsOptionError( - 'find_namespace: directive is unsupported on Python < 3.3') - - # Read function arguments from a dedicated section. - find_kwargs = self.parse_section_packages__find( - self.sections.get('packages.find', {})) - - if findns: - from setuptools import find_namespace_packages as find_packages - else: - from setuptools import find_packages - - return find_packages(**find_kwargs) - - def parse_section_packages__find(self, section_options): - """Parses `packages.find` configuration file section. - - To be used in conjunction with _parse_packages(). - - :param dict section_options: - """ - section_data = self._parse_section_to_dict( - section_options, self._parse_list) - - valid_keys = ['where', 'include', 'exclude'] - - find_kwargs = dict( - [(k, v) for k, v in section_data.items() if k in valid_keys and v]) - - where = find_kwargs.get('where') - if where is not None: - find_kwargs['where'] = where[0] # cast list to single val - - return find_kwargs - - def parse_section_entry_points(self, section_options): - """Parses `entry_points` configuration file section. - - :param dict section_options: - """ - parsed = self._parse_section_to_dict(section_options, self._parse_list) - self['entry_points'] = parsed - - def _parse_package_data(self, section_options): - parsed = self._parse_section_to_dict(section_options, self._parse_list) - - root = parsed.get('*') - if root: - parsed[''] = root - del parsed['*'] - - return parsed - - def parse_section_package_data(self, section_options): - """Parses `package_data` configuration file section. - - :param dict section_options: - """ - self['package_data'] = self._parse_package_data(section_options) - - def parse_section_exclude_package_data(self, section_options): - """Parses `exclude_package_data` configuration file section. - - :param dict section_options: - """ - self['exclude_package_data'] = self._parse_package_data( - section_options) - - def parse_section_extras_require(self, section_options): - """Parses `extras_require` configuration file section. - - :param dict section_options: - """ - parse_list = partial(self._parse_list, separator=';') - self['extras_require'] = self._parse_section_to_dict( - section_options, parse_list) - - def parse_section_data_files(self, section_options): - """Parses `data_files` configuration file section. - - :param dict section_options: - """ - parsed = self._parse_section_to_dict(section_options, self._parse_list) - self['data_files'] = [(k, v) for k, v in parsed.items()] diff --git a/venv/lib/python2.7/site-packages/setuptools/config.pyc b/venv/lib/python2.7/site-packages/setuptools/config.pyc deleted file mode 100644 index 8f5678624724eae67cf9f2c9ec895fe1972f54b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22827 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 D%L)21 diff --git a/venv/lib/python2.7/site-packages/setuptools/dep_util.py b/venv/lib/python2.7/site-packages/setuptools/dep_util.py deleted file mode 100644 index 2931c13..0000000 --- a/venv/lib/python2.7/site-packages/setuptools/dep_util.py +++ /dev/null @@ -1,23 +0,0 @@ -from distutils.dep_util import newer_group - -# yes, this is was almost entirely copy-pasted from -# 'newer_pairwise()', this is just another convenience -# function. -def newer_pairwise_group(sources_groups, targets): - """Walk both arguments in parallel, testing if each source group is newer - than its corresponding target. Returns a pair of lists (sources_groups, - targets) where sources is newer than target, according to the semantics - of 'newer_group()'. - """ - if len(sources_groups) != len(targets): - raise ValueError("'sources_group' and 'targets' must be the same length") - - # build a pair of lists (sources_groups, targets) where source is newer - n_sources = [] - n_targets = [] - for i in range(len(sources_groups)): - if newer_group(sources_groups[i], targets[i]): - n_sources.append(sources_groups[i]) - n_targets.append(targets[i]) - - return n_sources, n_targets diff --git a/venv/lib/python2.7/site-packages/setuptools/dep_util.pyc b/venv/lib/python2.7/site-packages/setuptools/dep_util.pyc deleted file mode 100644 index 84c6b63dbc9152d7c6bcba564b4ffa86c4fde082..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1073 zcmc&zUr*FP5T9+2Q!(P7m<SIh`*y{^6`~SNj4}S<O=HkNLP9P}yVqN3w`FI_0XZHN zKZ9S?M;~;yEdf4(o88&jotfWnXQmB*-<f~%ePJ(wZUnr);f0S`q&x-W0EK{E0U{0H zC%|q1X$W7U9($O-JR-pw-DY9+RJ&2;%DPHC(p<OR@s7V(5Wo!JTr`UC%0UQj03<vU zAAbn202#np(8v&uw}FDoK=ygR_ZH52K%vK)^<Zfxn(aIQw+XWVzV$9F>@8+tbJ6+m z#o;FK++jyHjRQ`_zZL(m*ird`+%IV&mCNcvTS959tdvuEuJaX18p+s9nz7U>nMf>a zmuT6fEDg%00`rmwO_Y^}<CD@kja6w=A4m+WX(+ce)y|?+3~rn($1*p_-cgH)Z545) z#cG0ZSxzU~>5i0N*73DmE%J&~2{X1_C0p2C7s`@Ju)$)c!IeHm%Y$KakIy;(!8P`Q zR5q1^78nPzsFCEpZb4O{Wv*>TlgPK3y8*ywn&*96<+c9cT<OT$oU)nTVg;zrLRFQv zX&be`=WCouH@sh)Fx_I^jyi|#bYb&forzdLBd}mCuADhiq~jyy;&GX$+F^Wp9G^UO z`*wP;zHw;RHr%s~<OLqTOi$e!kF1Kn#+9j7jYZ-%uhRO*Z1g!s?odT#nd4P8)zzpb zlMkyCddQ4zDSZ#826fvtpCmqD0sTdBH|&ePSQ3xKeX$sPihP~O8&mGLN5bI+W>caq cU%<<>{#R}{`4z8<GOcs{+E*I=KXPyGA6|zd>Hq)$ diff --git a/venv/lib/python2.7/site-packages/setuptools/depends.py b/venv/lib/python2.7/site-packages/setuptools/depends.py deleted file mode 100644 index 45e7052..0000000 --- a/venv/lib/python2.7/site-packages/setuptools/depends.py +++ /dev/null @@ -1,186 +0,0 @@ -import sys -import imp -import marshal -from distutils.version import StrictVersion -from imp import PKG_DIRECTORY, PY_COMPILED, PY_SOURCE, PY_FROZEN - -from .py33compat import Bytecode - - -__all__ = [ - 'Require', 'find_module', 'get_module_constant', 'extract_constant' -] - - -class Require: - """A prerequisite to building or installing a distribution""" - - def __init__(self, name, requested_version, module, homepage='', - attribute=None, format=None): - - if format is None and requested_version is not None: - format = StrictVersion - - if format is not None: - requested_version = format(requested_version) - if attribute is None: - attribute = '__version__' - - self.__dict__.update(locals()) - del self.self - - def full_name(self): - """Return full package/distribution name, w/version""" - if self.requested_version is not None: - return '%s-%s' % (self.name, self.requested_version) - return self.name - - def version_ok(self, version): - """Is 'version' sufficiently up-to-date?""" - return self.attribute is None or self.format is None or \ - str(version) != "unknown" and version >= self.requested_version - - def get_version(self, paths=None, default="unknown"): - """Get version number of installed module, 'None', or 'default' - - Search 'paths' for module. If not found, return 'None'. If found, - return the extracted version attribute, or 'default' if no version - attribute was specified, or the value cannot be determined without - importing the module. The version is formatted according to the - requirement's version format (if any), unless it is 'None' or the - supplied 'default'. - """ - - if self.attribute is None: - try: - f, p, i = find_module(self.module, paths) - if f: - f.close() - return default - except ImportError: - return None - - v = get_module_constant(self.module, self.attribute, default, paths) - - if v is not None and v is not default and self.format is not None: - return self.format(v) - - return v - - def is_present(self, paths=None): - """Return true if dependency is present on 'paths'""" - return self.get_version(paths) is not None - - def is_current(self, paths=None): - """Return true if dependency is present and up-to-date on 'paths'""" - version = self.get_version(paths) - if version is None: - return False - return self.version_ok(version) - - -def find_module(module, paths=None): - """Just like 'imp.find_module()', but with package support""" - - parts = module.split('.') - - while parts: - part = parts.pop(0) - f, path, (suffix, mode, kind) = info = imp.find_module(part, paths) - - if kind == PKG_DIRECTORY: - parts = parts or ['__init__'] - paths = [path] - - elif parts: - raise ImportError("Can't find %r in %s" % (parts, module)) - - return info - - -def get_module_constant(module, symbol, default=-1, paths=None): - """Find 'module' by searching 'paths', and extract 'symbol' - - Return 'None' if 'module' does not exist on 'paths', or it does not define - 'symbol'. If the module defines 'symbol' as a constant, return the - constant. Otherwise, return 'default'.""" - - try: - f, path, (suffix, mode, kind) = find_module(module, paths) - except ImportError: - # Module doesn't exist - return None - - try: - if kind == PY_COMPILED: - f.read(8) # skip magic & date - code = marshal.load(f) - elif kind == PY_FROZEN: - code = imp.get_frozen_object(module) - elif kind == PY_SOURCE: - code = compile(f.read(), path, 'exec') - else: - # Not something we can parse; we'll have to import it. :( - if module not in sys.modules: - imp.load_module(module, f, path, (suffix, mode, kind)) - return getattr(sys.modules[module], symbol, None) - - finally: - if f: - f.close() - - return extract_constant(code, symbol, default) - - -def extract_constant(code, symbol, default=-1): - """Extract the constant value of 'symbol' from 'code' - - If the name 'symbol' is bound to a constant value by the Python code - object 'code', return that value. If 'symbol' is bound to an expression, - return 'default'. Otherwise, return 'None'. - - Return value is based on the first assignment to 'symbol'. 'symbol' must - be a global, or at least a non-"fast" local in the code block. That is, - only 'STORE_NAME' and 'STORE_GLOBAL' opcodes are checked, and 'symbol' - must be present in 'code.co_names'. - """ - if symbol not in code.co_names: - # name's not there, can't possibly be an assignment - return None - - name_idx = list(code.co_names).index(symbol) - - STORE_NAME = 90 - STORE_GLOBAL = 97 - LOAD_CONST = 100 - - const = default - - for byte_code in Bytecode(code): - op = byte_code.opcode - arg = byte_code.arg - - if op == LOAD_CONST: - const = code.co_consts[arg] - elif arg == name_idx and (op == STORE_NAME or op == STORE_GLOBAL): - return const - else: - const = default - - -def _update_globals(): - """ - Patch the globals to remove the objects not available on some platforms. - - XXX it'd be better to test assertions about bytecode instead. - """ - - if not sys.platform.startswith('java') and sys.platform != 'cli': - return - incompatible = 'extract_constant', 'get_module_constant' - for name in incompatible: - del globals()[name] - __all__.remove(name) - - -_update_globals() diff --git a/venv/lib/python2.7/site-packages/setuptools/depends.pyc b/venv/lib/python2.7/site-packages/setuptools/depends.pyc deleted file mode 100644 index f4d8a9b7b174b17ff6ff2955df44eb0ab339c63a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7166 zcmc&(&vP6{74F$xt+cY_b?gw5GEO=s%5H)zB{&#Tm4w)`Y#ba(nRT$N!nMrK%u1u3 zof%Ef%92YufL-Lokt#0SsRF7vQ=Iu1xbaVLr3$|9_3TO^IdF<(PphY=`}OPB@5lF^ zs{fjwefyW^AN#8Osp0p>c+B6?1o-c$SgEZ^-%(r6c)X&vD$=j0xT=OVwN+CN*Hl&P zsNs~_no`5M+N!JJwAz|h!x^<TgBdjyOsTk`hO=sG7VmWxOsil<1r4<gBIguGnktx8 z&y{+n)T6CA@)4X<&$0daa{FLTJqHJvhaKnT(*+fr=bEh-RQLi{I#||eU%*kK|KMk> z?VwxCqv;fR<QG2+a}%XWyEY!)`03s5?R)O(%7b<HQE?8#8;`mx>z{7iyT5w7XxR78 z`seP->iF%ByS}x$7Ll?gKZD+_!y@$4AS|Zw;)Z*pC=Z2PKT3k`Fbzg=SX{!l?XW0c zyMCIO!b^&R{Ducb?)k-J@JknT3lq#E&ca#cI(QN2G~|CpJ+JaEa1Rv5l!C<BfmAU8 zuXT|eWRBNqk(>x0S3m(bl-p^~a*H3Lxv8@}%y|M66`?Lt-5W)55GC6>&2>bU<Ct%r z4k81o_C^InT41U2d3rt-JS%uig60T(C^eW-`RnRP6ll<3zi`xXU13H!0fV2hk2%lq zsiKa+x?T7gPkTJ2_CAyOO6^wEZdDaEUOFZ_M@s!dW_Q}$drf5D?e5$A?snUCjAA-I zrAg@Gw<>sV-EIK2=ynT!A7z18gwl;u-;0ebFk#$p%eC^JWGL~5VetaqD5uaAVKClF z7MIse`a9_`%sgB=Rmm%?xa=1FG#`3J8{<kE1G`hpSsv|!iRFDSU+$-IfCDT)Jy<@x zp7)X`gLiN2CGXtG-@D=e$Q-;MJk8(1&vv%_U^$DjYvtu!E8hKdySuS$!eW#aX&Rf; z-5|`uBrr?aVJUzpi6DTB*xc}ds`|3isLVO?uX4%pspx#Fc;rssMhEiVg&9^9ukyRR z9gg72WV~NdFLmrdr_FWd9W*ZZ$rIfl#j(yje*m#8pH?AFu`cQ-%jK<^DJ)tr*A~p0 z5OK+)JI98y7vpou@>$A|_sSD>$-Kskp(d$H(|OVHsfy!AME4;EPDD4OvJXnRQIhgn zRMn9~m4-+MRh43bm2FK8rr_H|nhPLv&*)YusFpUPen0Y~Fe&0gJ<6^X={2hIkHsC0 zl0lL_N!Hqwr~557BE*-_!**b~$VIkdIwDb7S5iMq>C!8WZ8#mgNnUBgs`9GizJlLA z*{5ytXd>aipi@d10))?btPXFe!fK|KZAJaOs*dr$MwfC_Rr$wkcg2}F^hXuddARpj z)ru)Km{s{B<v0>qHt`V_PWm7vs*bt5FOb4G933`=Mf|DsV`U#R;e02b<Q0=~%N_i( zF3bD_Ms_zWba`H#jE221*J*$3bi+Vf&$6gn^kS_=dgN9R_PtSDv}R{@`O^u#+~3iy z%qw<GOT*EW3zxLM*Vjo}U~H5GiyA?SCTYppulCD?Rym{C33VBwz{Z%xi9`D`CpzLL z<5?3@liB)-XSB&eKk7#zxB!2ozwgDPQ2Sm&2794KG!64%lwiXrQL&SbiV3M`n5B8a zD8z+UDq#NssaTh<Bg2Ek!@@gj&-c?@Vi@8XmP`mqpv%J{ET?5AYwbea#yPy?@U2BX zO5)HM9Tg;NrB!l0p=3r`7UMW47qT?@w$`43TAngJ2`7XD&@gCmoWfTVeB6_Bt>$@} zyRw8fdMfyEw%n>1XnFI9qwqn}X3|E|?w_UM@-T!t<!yWqujXYm>Ri*QI+vZgGw;ms zsa&qKocYRET_vScn%Kl2HpaHHjE`kFDRL+cF3QHWF!2w0N5C)!cdAn;w>5(`>)jT( zlJ4)s*}1Rr70+44VS2g9bW5J^;LR{<C@U4ZIKGN|TSVuyREUxU3ewfRMn5NU7v4!g zROwni!m9sETwW5K3LjsR9{sL6k)G)79YCbe{SH3Z_{>-=!gMcl49^)$)F0(JwBQpk zVrWhb%X3c6SrfQh;vWWX06<<scMQ$DVqXA<so(9|X!&h?cd5d1U@Hj*B$wwrIji)( zaVX~!bTsh@gsVICO4Vu3H|mY4=H<DX7#GjSI}|ngJvvs65S0*yphgE@P-pVrvE2py zupk^5TaY&5Bg0%p)fhV^aI#ZZ$J6R~MjbcQ(G0Qi03`NFBHLy<vOUJ}>^N%gqU>>z zZVx#Mrhy59MX>NI`HUG4k7(xfbdryJGBSmZqd}-!@cK)q@~QS)h=9mGBsz={C7@8o z*dQ)&DFPMc^6Cuz$%>b>5c`ml=>_I8dcoMlKz4)sE(8x{X(qq1pDUi44%U4Yjp&U_ zQljT#1(}x@HdA2FeH|YqNub-2bU?t_fs7$ih0+;-2kAsfKRwZ&Z(ecad|=tUh(=YL zm4?%F+Q9#?luF&XQt_!YR36S0<+%cJ94;tie7HR*2DIX9mEvJ?5fBQf2N3FgflyV| z*?jspQI)Ew%8oj!5qMcGbRf@Nz$gGQs7pg7zmciaGWFL?*mj|3lJN0sDqm;i>z@_k zr=|4_OhLV%zfe$2`w5p6b82^94W?E8PoZ;Oc!vrC0Aj~!lIr6qC}<GlHOmE9`3m$N znhau{hxm;>@;Qe)U109X*_%iOp|iy4vS~-k3+CUD*Bz=_%i@!k?j33)(2T&P3`>hZ z7{M4?>6SSh_R_e-a;3{I@djetgi?@(MsQqsfE@gkpB69$m@=6Fi~s~BNMuah;=B{! zgwV-305;|B8t}~1<MPA=C5~~^_yg#yV=R9X8Ki9`P@KTgrDz5M5FHN>LVv9-*_)^v zEy+4n#x<Fehh88)cj)D2$BSh!PQAdDxWjla2{$oCKTn^ANjL57hJN8z`H5uxbeKh` zvT(p08cR(IFGjExsf{Z!oDWh&r0x~;U8Zp-#%;}3uEN#)OoSko?S7xV>ula*^8+-( zD~ms8X~z_Hh{wEvMom|p1)!=agn>Drtcz&*T&^~qt7z-a`HG}YglUx53Lf)UG*n{A zYiKH$=%hPk?j&Z%w8sXFDs2{l0Ct8X3WmY_2mNVvkWnI_0wcctxX17S<Jz4ng9Hrx zcvkGCE|&XTHiQArs#majZ-YH}6-E-IQLrnCD&`N;M?z-DrvY?iJ1lreHf_XcLZen~ zDNRy?v96ZM1(K<Wl0%J#y2X1d&Fx-amPjH$nFTD_W3I$P*ojS)<Y3S=qm4skCkYHD zu!d$ev!p$-jAF+_a>pFU8sOJ&k-!%a2(nDMC}#T=!}?mYlZ0@|=76Q&u=x}Z;2Gp4 z;E>GrqZ}T?!v@<4(;gmd%nBGAcl8i)SN2CH=IQM??Rl|y7n~vvJ<@;&O0He)qkmOP z!Hgl5dr%U(hoJ!|KH#|{V-J%iC{VOIsJ5<l*KU5g+7kCy4&1%Je(UD_mQFJgfDg(+ zYA5suOcLoP$IJ;|WRPj%80uqhxy>a%m12x(*#s;?F<V6*n*fc?#RU6}CyFn!9tYl3 zf;#+mc;FHih%c}liEHulZ7Jqqu_%{m(}>(#Y;LmAXoS1~%P2SyXnAsEgd&uqMFRG~ z^8Nn$&D$tEuXP^C{z6*z>7lZWoq!wYEYr-ri(hByY3M4yz+>pf)m*butGo=PK+su7 zy|5wG!wb$EPOai|2HCFSS;1pA(EvCAV4_%PqyAj}W;w(n7^*RE(w%frv_4kqV1e%8 z_TwvrkC6W}aZw-QvfxmxD{}U(!vkQ2<jLl@*g^DT!z)k(p*mXSHPm#Z`sqHZ+8DJ~ zYQw0v??tiKi!qvLgPN_*Vy|Esz?3$%xw(n-zZFp9dLfDms9B(tfZ{K0DMT>>)qL&2 zS3oJtKL$wQ27%4$p(xlcb`mx6<7iEyj^z20j0$%D-@gM0Ze`T7AY$_O0l}><>xrUk zV|GQCP@)GUWz9r_V0nD$ce|+Gm*s9N3)xz9GD;Xiy&{4fY=srn&nkmsGSjsM`EGfD zKVrzxc+~V&BylVu%sSQ*1Y1xTu2crzM^E4a%ggxlL~NGILWIlZE&!}@sh5Ht1Y(Hb zvcv1wtqjEU-Oo9Nsg*@5L=CnqLmP0Z%O{2?y>A@9%jJJyb>kx*OR6lkdVj&WTDefW QSi7_`cd2=G?u|zCzgQ*A00000 diff --git a/venv/lib/python2.7/site-packages/setuptools/dist.py b/venv/lib/python2.7/site-packages/setuptools/dist.py deleted file mode 100644 index 9a165de..0000000 --- a/venv/lib/python2.7/site-packages/setuptools/dist.py +++ /dev/null @@ -1,1278 +0,0 @@ -# -*- coding: utf-8 -*- -__all__ = ['Distribution'] - -import io -import sys -import re -import os -import warnings -import numbers -import distutils.log -import distutils.core -import distutils.cmd -import distutils.dist -from distutils.util import strtobool -from distutils.debug import DEBUG -from distutils.fancy_getopt import translate_longopt -import itertools - -from collections import defaultdict -from email import message_from_file - -from distutils.errors import ( - DistutilsOptionError, DistutilsPlatformError, DistutilsSetupError, -) -from distutils.util import rfc822_escape -from distutils.version import StrictVersion - -from setuptools.extern import six -from setuptools.extern import packaging -from setuptools.extern.six.moves import map, filter, filterfalse - -from . import SetuptoolsDeprecationWarning - -from setuptools.depends import Require -from setuptools import windows_support -from setuptools.monkey import get_unpatched -from setuptools.config import parse_configuration -import pkg_resources - -__import__('setuptools.extern.packaging.specifiers') -__import__('setuptools.extern.packaging.version') - - -def _get_unpatched(cls): - warnings.warn("Do not call this function", DistDeprecationWarning) - return get_unpatched(cls) - - -def get_metadata_version(self): - mv = getattr(self, 'metadata_version', None) - - if mv is None: - if self.long_description_content_type or self.provides_extras: - mv = StrictVersion('2.1') - elif (self.maintainer is not None or - self.maintainer_email is not None or - getattr(self, 'python_requires', None) is not None): - mv = StrictVersion('1.2') - elif (self.provides or self.requires or self.obsoletes or - self.classifiers or self.download_url): - mv = StrictVersion('1.1') - else: - mv = StrictVersion('1.0') - - self.metadata_version = mv - - return mv - - -def read_pkg_file(self, file): - """Reads the metadata values from a file object.""" - msg = message_from_file(file) - - def _read_field(name): - value = msg[name] - if value == 'UNKNOWN': - return None - return value - - def _read_list(name): - values = msg.get_all(name, None) - if values == []: - return None - return values - - self.metadata_version = StrictVersion(msg['metadata-version']) - self.name = _read_field('name') - self.version = _read_field('version') - self.description = _read_field('summary') - # we are filling author only. - self.author = _read_field('author') - self.maintainer = None - self.author_email = _read_field('author-email') - self.maintainer_email = None - self.url = _read_field('home-page') - self.license = _read_field('license') - - if 'download-url' in msg: - self.download_url = _read_field('download-url') - else: - self.download_url = None - - self.long_description = _read_field('description') - self.description = _read_field('summary') - - if 'keywords' in msg: - self.keywords = _read_field('keywords').split(',') - - self.platforms = _read_list('platform') - self.classifiers = _read_list('classifier') - - # PEP 314 - these fields only exist in 1.1 - if self.metadata_version == StrictVersion('1.1'): - self.requires = _read_list('requires') - self.provides = _read_list('provides') - self.obsoletes = _read_list('obsoletes') - else: - self.requires = None - self.provides = None - self.obsoletes = None - - -# Based on Python 3.5 version -def write_pkg_file(self, file): - """Write the PKG-INFO format data to a file object. - """ - version = self.get_metadata_version() - - if six.PY2: - def write_field(key, value): - file.write("%s: %s\n" % (key, self._encode_field(value))) - else: - def write_field(key, value): - file.write("%s: %s\n" % (key, value)) - - write_field('Metadata-Version', str(version)) - write_field('Name', self.get_name()) - write_field('Version', self.get_version()) - write_field('Summary', self.get_description()) - write_field('Home-page', self.get_url()) - - if version < StrictVersion('1.2'): - write_field('Author', self.get_contact()) - write_field('Author-email', self.get_contact_email()) - else: - optional_fields = ( - ('Author', 'author'), - ('Author-email', 'author_email'), - ('Maintainer', 'maintainer'), - ('Maintainer-email', 'maintainer_email'), - ) - - for field, attr in optional_fields: - attr_val = getattr(self, attr) - - if attr_val is not None: - write_field(field, attr_val) - - write_field('License', self.get_license()) - if self.download_url: - write_field('Download-URL', self.download_url) - for project_url in self.project_urls.items(): - write_field('Project-URL', '%s, %s' % project_url) - - long_desc = rfc822_escape(self.get_long_description()) - write_field('Description', long_desc) - - keywords = ','.join(self.get_keywords()) - if keywords: - write_field('Keywords', keywords) - - if version >= StrictVersion('1.2'): - for platform in self.get_platforms(): - write_field('Platform', platform) - else: - self._write_list(file, 'Platform', self.get_platforms()) - - self._write_list(file, 'Classifier', self.get_classifiers()) - - # PEP 314 - self._write_list(file, 'Requires', self.get_requires()) - self._write_list(file, 'Provides', self.get_provides()) - self._write_list(file, 'Obsoletes', self.get_obsoletes()) - - # Setuptools specific for PEP 345 - if hasattr(self, 'python_requires'): - write_field('Requires-Python', self.python_requires) - - # PEP 566 - if self.long_description_content_type: - write_field( - 'Description-Content-Type', - self.long_description_content_type - ) - if self.provides_extras: - for extra in self.provides_extras: - write_field('Provides-Extra', extra) - - -sequence = tuple, list - - -def check_importable(dist, attr, value): - try: - ep = pkg_resources.EntryPoint.parse('x=' + value) - assert not ep.extras - except (TypeError, ValueError, AttributeError, AssertionError): - raise DistutilsSetupError( - "%r must be importable 'module:attrs' string (got %r)" - % (attr, value) - ) - - -def assert_string_list(dist, attr, value): - """Verify that value is a string list or None""" - try: - assert ''.join(value) != value - except (TypeError, ValueError, AttributeError, AssertionError): - raise DistutilsSetupError( - "%r must be a list of strings (got %r)" % (attr, value) - ) - - -def check_nsp(dist, attr, value): - """Verify that namespace packages are valid""" - ns_packages = value - assert_string_list(dist, attr, ns_packages) - for nsp in ns_packages: - if not dist.has_contents_for(nsp): - raise DistutilsSetupError( - "Distribution contains no modules or packages for " + - "namespace package %r" % nsp - ) - parent, sep, child = nsp.rpartition('.') - if parent and parent not in ns_packages: - distutils.log.warn( - "WARNING: %r is declared as a package namespace, but %r" - " is not: please correct this in setup.py", nsp, parent - ) - - -def check_extras(dist, attr, value): - """Verify that extras_require mapping is valid""" - try: - list(itertools.starmap(_check_extra, value.items())) - except (TypeError, ValueError, AttributeError): - raise DistutilsSetupError( - "'extras_require' must be a dictionary whose values are " - "strings or lists of strings containing valid project/version " - "requirement specifiers." - ) - - -def _check_extra(extra, reqs): - name, sep, marker = extra.partition(':') - if marker and pkg_resources.invalid_marker(marker): - raise DistutilsSetupError("Invalid environment marker: " + marker) - list(pkg_resources.parse_requirements(reqs)) - - -def assert_bool(dist, attr, value): - """Verify that value is True, False, 0, or 1""" - if bool(value) != value: - tmpl = "{attr!r} must be a boolean value (got {value!r})" - raise DistutilsSetupError(tmpl.format(attr=attr, value=value)) - - -def check_requirements(dist, attr, value): - """Verify that install_requires is a valid requirements list""" - try: - list(pkg_resources.parse_requirements(value)) - if isinstance(value, (dict, set)): - raise TypeError("Unordered types are not allowed") - except (TypeError, ValueError) as error: - tmpl = ( - "{attr!r} must be a string or list of strings " - "containing valid project/version requirement specifiers; {error}" - ) - raise DistutilsSetupError(tmpl.format(attr=attr, error=error)) - - -def check_specifier(dist, attr, value): - """Verify that value is a valid version specifier""" - try: - packaging.specifiers.SpecifierSet(value) - except packaging.specifiers.InvalidSpecifier as error: - tmpl = ( - "{attr!r} must be a string " - "containing valid version specifiers; {error}" - ) - raise DistutilsSetupError(tmpl.format(attr=attr, error=error)) - - -def check_entry_points(dist, attr, value): - """Verify that entry_points map is parseable""" - try: - pkg_resources.EntryPoint.parse_map(value) - except ValueError as e: - raise DistutilsSetupError(e) - - -def check_test_suite(dist, attr, value): - if not isinstance(value, six.string_types): - raise DistutilsSetupError("test_suite must be a string") - - -def check_package_data(dist, attr, value): - """Verify that value is a dictionary of package names to glob lists""" - if isinstance(value, dict): - for k, v in value.items(): - if not isinstance(k, str): - break - try: - iter(v) - except TypeError: - break - else: - return - raise DistutilsSetupError( - attr + " must be a dictionary mapping package names to lists of " - "wildcard patterns" - ) - - -def check_packages(dist, attr, value): - for pkgname in value: - if not re.match(r'\w+(\.\w+)*', pkgname): - distutils.log.warn( - "WARNING: %r not a valid package name; please use only " - ".-separated package names in setup.py", pkgname - ) - - -_Distribution = get_unpatched(distutils.core.Distribution) - - -class Distribution(_Distribution): - """Distribution with support for features, tests, and package data - - This is an enhanced version of 'distutils.dist.Distribution' that - effectively adds the following new optional keyword arguments to 'setup()': - - 'install_requires' -- a string or sequence of strings specifying project - versions that the distribution requires when installed, in the format - used by 'pkg_resources.require()'. They will be installed - automatically when the package is installed. If you wish to use - packages that are not available in PyPI, or want to give your users an - alternate download location, you can add a 'find_links' option to the - '[easy_install]' section of your project's 'setup.cfg' file, and then - setuptools will scan the listed web pages for links that satisfy the - requirements. - - 'extras_require' -- a dictionary mapping names of optional "extras" to the - additional requirement(s) that using those extras incurs. For example, - this:: - - extras_require = dict(reST = ["docutils>=0.3", "reSTedit"]) - - indicates that the distribution can optionally provide an extra - capability called "reST", but it can only be used if docutils and - reSTedit are installed. If the user installs your package using - EasyInstall and requests one of your extras, the corresponding - additional requirements will be installed if needed. - - 'features' **deprecated** -- a dictionary mapping option names to - 'setuptools.Feature' - objects. Features are a portion of the distribution that can be - included or excluded based on user options, inter-feature dependencies, - and availability on the current system. Excluded features are omitted - from all setup commands, including source and binary distributions, so - you can create multiple distributions from the same source tree. - Feature names should be valid Python identifiers, except that they may - contain the '-' (minus) sign. Features can be included or excluded - via the command line options '--with-X' and '--without-X', where 'X' is - the name of the feature. Whether a feature is included by default, and - whether you are allowed to control this from the command line, is - determined by the Feature object. See the 'Feature' class for more - information. - - 'test_suite' -- the name of a test suite to run for the 'test' command. - If the user runs 'python setup.py test', the package will be installed, - and the named test suite will be run. The format is the same as - would be used on a 'unittest.py' command line. That is, it is the - dotted name of an object to import and call to generate a test suite. - - 'package_data' -- a dictionary mapping package names to lists of filenames - or globs to use to find data files contained in the named packages. - If the dictionary has filenames or globs listed under '""' (the empty - string), those names will be searched for in every package, in addition - to any names for the specific package. Data files found using these - names/globs will be installed along with the package, in the same - location as the package. Note that globs are allowed to reference - the contents of non-package subdirectories, as long as you use '/' as - a path separator. (Globs are automatically converted to - platform-specific paths at runtime.) - - In addition to these new keywords, this class also has several new methods - for manipulating the distribution's contents. For example, the 'include()' - and 'exclude()' methods can be thought of as in-place add and subtract - commands that add or remove packages, modules, extensions, and so on from - the distribution. They are used by the feature subsystem to configure the - distribution for the included and excluded features. - """ - - _DISTUTILS_UNSUPPORTED_METADATA = { - 'long_description_content_type': None, - 'project_urls': dict, - 'provides_extras': set, - } - - _patched_dist = None - - def patch_missing_pkg_info(self, attrs): - # Fake up a replacement for the data that would normally come from - # PKG-INFO, but which might not yet be built if this is a fresh - # checkout. - # - if not attrs or 'name' not in attrs or 'version' not in attrs: - return - key = pkg_resources.safe_name(str(attrs['name'])).lower() - dist = pkg_resources.working_set.by_key.get(key) - if dist is not None and not dist.has_metadata('PKG-INFO'): - dist._version = pkg_resources.safe_version(str(attrs['version'])) - self._patched_dist = dist - - def __init__(self, attrs=None): - have_package_data = hasattr(self, "package_data") - if not have_package_data: - self.package_data = {} - attrs = attrs or {} - if 'features' in attrs or 'require_features' in attrs: - Feature.warn_deprecated() - self.require_features = [] - self.features = {} - self.dist_files = [] - # Filter-out setuptools' specific options. - self.src_root = attrs.pop("src_root", None) - self.patch_missing_pkg_info(attrs) - self.dependency_links = attrs.pop('dependency_links', []) - self.setup_requires = attrs.pop('setup_requires', []) - for ep in pkg_resources.iter_entry_points('distutils.setup_keywords'): - vars(self).setdefault(ep.name, None) - _Distribution.__init__(self, { - k: v for k, v in attrs.items() - if k not in self._DISTUTILS_UNSUPPORTED_METADATA - }) - - # Fill-in missing metadata fields not supported by distutils. - # Note some fields may have been set by other tools (e.g. pbr) - # above; they are taken preferrentially to setup() arguments - for option, default in self._DISTUTILS_UNSUPPORTED_METADATA.items(): - for source in self.metadata.__dict__, attrs: - if option in source: - value = source[option] - break - else: - value = default() if default else None - setattr(self.metadata, option, value) - - if isinstance(self.metadata.version, numbers.Number): - # Some people apparently take "version number" too literally :) - self.metadata.version = str(self.metadata.version) - - if self.metadata.version is not None: - try: - ver = packaging.version.Version(self.metadata.version) - normalized_version = str(ver) - if self.metadata.version != normalized_version: - warnings.warn( - "Normalizing '%s' to '%s'" % ( - self.metadata.version, - normalized_version, - ) - ) - self.metadata.version = normalized_version - except (packaging.version.InvalidVersion, TypeError): - warnings.warn( - "The version specified (%r) is an invalid version, this " - "may not work as expected with newer versions of " - "setuptools, pip, and PyPI. Please see PEP 440 for more " - "details." % self.metadata.version - ) - self._finalize_requires() - - def _finalize_requires(self): - """ - Set `metadata.python_requires` and fix environment markers - in `install_requires` and `extras_require`. - """ - if getattr(self, 'python_requires', None): - self.metadata.python_requires = self.python_requires - - if getattr(self, 'extras_require', None): - for extra in self.extras_require.keys(): - # Since this gets called multiple times at points where the - # keys have become 'converted' extras, ensure that we are only - # truly adding extras we haven't seen before here. - extra = extra.split(':')[0] - if extra: - self.metadata.provides_extras.add(extra) - - self._convert_extras_requirements() - self._move_install_requirements_markers() - - def _convert_extras_requirements(self): - """ - Convert requirements in `extras_require` of the form - `"extra": ["barbazquux; {marker}"]` to - `"extra:{marker}": ["barbazquux"]`. - """ - spec_ext_reqs = getattr(self, 'extras_require', None) or {} - self._tmp_extras_require = defaultdict(list) - for section, v in spec_ext_reqs.items(): - # Do not strip empty sections. - self._tmp_extras_require[section] - for r in pkg_resources.parse_requirements(v): - suffix = self._suffix_for(r) - self._tmp_extras_require[section + suffix].append(r) - - @staticmethod - def _suffix_for(req): - """ - For a requirement, return the 'extras_require' suffix for - that requirement. - """ - return ':' + str(req.marker) if req.marker else '' - - def _move_install_requirements_markers(self): - """ - Move requirements in `install_requires` that are using environment - markers `extras_require`. - """ - - # divide the install_requires into two sets, simple ones still - # handled by install_requires and more complex ones handled - # by extras_require. - - def is_simple_req(req): - return not req.marker - - spec_inst_reqs = getattr(self, 'install_requires', None) or () - inst_reqs = list(pkg_resources.parse_requirements(spec_inst_reqs)) - simple_reqs = filter(is_simple_req, inst_reqs) - complex_reqs = filterfalse(is_simple_req, inst_reqs) - self.install_requires = list(map(str, simple_reqs)) - - for r in complex_reqs: - self._tmp_extras_require[':' + str(r.marker)].append(r) - self.extras_require = dict( - (k, [str(r) for r in map(self._clean_req, v)]) - for k, v in self._tmp_extras_require.items() - ) - - def _clean_req(self, req): - """ - Given a Requirement, remove environment markers and return it. - """ - req.marker = None - return req - - def _parse_config_files(self, filenames=None): - """ - Adapted from distutils.dist.Distribution.parse_config_files, - this method provides the same functionality in subtly-improved - ways. - """ - from setuptools.extern.six.moves.configparser import ConfigParser - - # Ignore install directory options if we have a venv - if six.PY3 and sys.prefix != sys.base_prefix: - ignore_options = [ - 'install-base', 'install-platbase', 'install-lib', - 'install-platlib', 'install-purelib', 'install-headers', - 'install-scripts', 'install-data', 'prefix', 'exec-prefix', - 'home', 'user', 'root'] - else: - ignore_options = [] - - ignore_options = frozenset(ignore_options) - - if filenames is None: - filenames = self.find_config_files() - - if DEBUG: - self.announce("Distribution.parse_config_files():") - - parser = ConfigParser() - for filename in filenames: - with io.open(filename, encoding='utf-8') as reader: - if DEBUG: - self.announce(" reading {filename}".format(**locals())) - (parser.read_file if six.PY3 else parser.readfp)(reader) - for section in parser.sections(): - options = parser.options(section) - opt_dict = self.get_option_dict(section) - - for opt in options: - if opt != '__name__' and opt not in ignore_options: - val = self._try_str(parser.get(section, opt)) - opt = opt.replace('-', '_') - opt_dict[opt] = (filename, val) - - # Make the ConfigParser forget everything (so we retain - # the original filenames that options come from) - parser.__init__() - - # If there was a "global" section in the config file, use it - # to set Distribution options. - - if 'global' in self.command_options: - for (opt, (src, val)) in self.command_options['global'].items(): - alias = self.negative_opt.get(opt) - try: - if alias: - setattr(self, alias, not strtobool(val)) - elif opt in ('verbose', 'dry_run'): # ugh! - setattr(self, opt, strtobool(val)) - else: - setattr(self, opt, val) - except ValueError as msg: - raise DistutilsOptionError(msg) - - @staticmethod - def _try_str(val): - """ - On Python 2, much of distutils relies on string values being of - type 'str' (bytes) and not unicode text. If the value can be safely - encoded to bytes using the default encoding, prefer that. - - Why the default encoding? Because that value can be implicitly - decoded back to text if needed. - - Ref #1653 - """ - if six.PY3: - return val - try: - return val.encode() - except UnicodeEncodeError: - pass - return val - - def _set_command_options(self, command_obj, option_dict=None): - """ - Set the options for 'command_obj' from 'option_dict'. Basically - this means copying elements of a dictionary ('option_dict') to - attributes of an instance ('command'). - - 'command_obj' must be a Command instance. If 'option_dict' is not - supplied, uses the standard option dictionary for this command - (from 'self.command_options'). - - (Adopted from distutils.dist.Distribution._set_command_options) - """ - command_name = command_obj.get_command_name() - if option_dict is None: - option_dict = self.get_option_dict(command_name) - - if DEBUG: - self.announce(" setting options for '%s' command:" % command_name) - for (option, (source, value)) in option_dict.items(): - if DEBUG: - self.announce(" %s = %s (from %s)" % (option, value, - source)) - try: - bool_opts = [translate_longopt(o) - for o in command_obj.boolean_options] - except AttributeError: - bool_opts = [] - try: - neg_opt = command_obj.negative_opt - except AttributeError: - neg_opt = {} - - try: - is_string = isinstance(value, six.string_types) - if option in neg_opt and is_string: - setattr(command_obj, neg_opt[option], not strtobool(value)) - elif option in bool_opts and is_string: - setattr(command_obj, option, strtobool(value)) - elif hasattr(command_obj, option): - setattr(command_obj, option, value) - else: - raise DistutilsOptionError( - "error in %s: command '%s' has no such option '%s'" - % (source, command_name, option)) - except ValueError as msg: - raise DistutilsOptionError(msg) - - def parse_config_files(self, filenames=None, ignore_option_errors=False): - """Parses configuration files from various levels - and loads configuration. - - """ - self._parse_config_files(filenames=filenames) - - parse_configuration(self, self.command_options, - ignore_option_errors=ignore_option_errors) - self._finalize_requires() - - def parse_command_line(self): - """Process features after parsing command line options""" - result = _Distribution.parse_command_line(self) - if self.features: - self._finalize_features() - return result - - def _feature_attrname(self, name): - """Convert feature name to corresponding option attribute name""" - return 'with_' + name.replace('-', '_') - - def fetch_build_eggs(self, requires): - """Resolve pre-setup requirements""" - resolved_dists = pkg_resources.working_set.resolve( - pkg_resources.parse_requirements(requires), - installer=self.fetch_build_egg, - replace_conflicting=True, - ) - for dist in resolved_dists: - pkg_resources.working_set.add(dist, replace=True) - return resolved_dists - - def finalize_options(self): - _Distribution.finalize_options(self) - if self.features: - self._set_global_opts_from_features() - - for ep in pkg_resources.iter_entry_points('distutils.setup_keywords'): - value = getattr(self, ep.name, None) - if value is not None: - ep.require(installer=self.fetch_build_egg) - ep.load()(self, ep.name, value) - if getattr(self, 'convert_2to3_doctests', None): - # XXX may convert to set here when we can rely on set being builtin - self.convert_2to3_doctests = [ - os.path.abspath(p) - for p in self.convert_2to3_doctests - ] - else: - self.convert_2to3_doctests = [] - - def get_egg_cache_dir(self): - egg_cache_dir = os.path.join(os.curdir, '.eggs') - if not os.path.exists(egg_cache_dir): - os.mkdir(egg_cache_dir) - windows_support.hide_file(egg_cache_dir) - readme_txt_filename = os.path.join(egg_cache_dir, 'README.txt') - with open(readme_txt_filename, 'w') as f: - f.write('This directory contains eggs that were downloaded ' - 'by setuptools to build, test, and run plug-ins.\n\n') - f.write('This directory caches those eggs to prevent ' - 'repeated downloads.\n\n') - f.write('However, it is safe to delete this directory.\n\n') - - return egg_cache_dir - - def fetch_build_egg(self, req): - """Fetch an egg needed for building""" - from setuptools.command.easy_install import easy_install - dist = self.__class__({'script_args': ['easy_install']}) - opts = dist.get_option_dict('easy_install') - opts.clear() - opts.update( - (k, v) - for k, v in self.get_option_dict('easy_install').items() - if k in ( - # don't use any other settings - 'find_links', 'site_dirs', 'index_url', - 'optimize', 'site_dirs', 'allow_hosts', - )) - if self.dependency_links: - links = self.dependency_links[:] - if 'find_links' in opts: - links = opts['find_links'][1] + links - opts['find_links'] = ('setup', links) - install_dir = self.get_egg_cache_dir() - cmd = easy_install( - dist, args=["x"], install_dir=install_dir, - exclude_scripts=True, - always_copy=False, build_directory=None, editable=False, - upgrade=False, multi_version=True, no_report=True, user=False - ) - cmd.ensure_finalized() - return cmd.easy_install(req) - - def _set_global_opts_from_features(self): - """Add --with-X/--without-X options based on optional features""" - - go = [] - no = self.negative_opt.copy() - - for name, feature in self.features.items(): - self._set_feature(name, None) - feature.validate(self) - - if feature.optional: - descr = feature.description - incdef = ' (default)' - excdef = '' - if not feature.include_by_default(): - excdef, incdef = incdef, excdef - - new = ( - ('with-' + name, None, 'include ' + descr + incdef), - ('without-' + name, None, 'exclude ' + descr + excdef), - ) - go.extend(new) - no['without-' + name] = 'with-' + name - - self.global_options = self.feature_options = go + self.global_options - self.negative_opt = self.feature_negopt = no - - def _finalize_features(self): - """Add/remove features and resolve dependencies between them""" - - # First, flag all the enabled items (and thus their dependencies) - for name, feature in self.features.items(): - enabled = self.feature_is_included(name) - if enabled or (enabled is None and feature.include_by_default()): - feature.include_in(self) - self._set_feature(name, 1) - - # Then disable the rest, so that off-by-default features don't - # get flagged as errors when they're required by an enabled feature - for name, feature in self.features.items(): - if not self.feature_is_included(name): - feature.exclude_from(self) - self._set_feature(name, 0) - - def get_command_class(self, command): - """Pluggable version of get_command_class()""" - if command in self.cmdclass: - return self.cmdclass[command] - - eps = pkg_resources.iter_entry_points('distutils.commands', command) - for ep in eps: - ep.require(installer=self.fetch_build_egg) - self.cmdclass[command] = cmdclass = ep.load() - return cmdclass - else: - return _Distribution.get_command_class(self, command) - - def print_commands(self): - for ep in pkg_resources.iter_entry_points('distutils.commands'): - if ep.name not in self.cmdclass: - # don't require extras as the commands won't be invoked - cmdclass = ep.resolve() - self.cmdclass[ep.name] = cmdclass - return _Distribution.print_commands(self) - - def get_command_list(self): - for ep in pkg_resources.iter_entry_points('distutils.commands'): - if ep.name not in self.cmdclass: - # don't require extras as the commands won't be invoked - cmdclass = ep.resolve() - self.cmdclass[ep.name] = cmdclass - return _Distribution.get_command_list(self) - - def _set_feature(self, name, status): - """Set feature's inclusion status""" - setattr(self, self._feature_attrname(name), status) - - def feature_is_included(self, name): - """Return 1 if feature is included, 0 if excluded, 'None' if unknown""" - return getattr(self, self._feature_attrname(name)) - - def include_feature(self, name): - """Request inclusion of feature named 'name'""" - - if self.feature_is_included(name) == 0: - descr = self.features[name].description - raise DistutilsOptionError( - descr + " is required, but was excluded or is not available" - ) - self.features[name].include_in(self) - self._set_feature(name, 1) - - def include(self, **attrs): - """Add items to distribution that are named in keyword arguments - - For example, 'dist.include(py_modules=["x"])' would add 'x' to - the distribution's 'py_modules' attribute, if it was not already - there. - - Currently, this method only supports inclusion for attributes that are - lists or tuples. If you need to add support for adding to other - attributes in this or a subclass, you can add an '_include_X' method, - where 'X' is the name of the attribute. The method will be called with - the value passed to 'include()'. So, 'dist.include(foo={"bar":"baz"})' - will try to call 'dist._include_foo({"bar":"baz"})', which can then - handle whatever special inclusion logic is needed. - """ - for k, v in attrs.items(): - include = getattr(self, '_include_' + k, None) - if include: - include(v) - else: - self._include_misc(k, v) - - def exclude_package(self, package): - """Remove packages, modules, and extensions in named package""" - - pfx = package + '.' - if self.packages: - self.packages = [ - p for p in self.packages - if p != package and not p.startswith(pfx) - ] - - if self.py_modules: - self.py_modules = [ - p for p in self.py_modules - if p != package and not p.startswith(pfx) - ] - - if self.ext_modules: - self.ext_modules = [ - p for p in self.ext_modules - if p.name != package and not p.name.startswith(pfx) - ] - - def has_contents_for(self, package): - """Return true if 'exclude_package(package)' would do something""" - - pfx = package + '.' - - for p in self.iter_distribution_names(): - if p == package or p.startswith(pfx): - return True - - def _exclude_misc(self, name, value): - """Handle 'exclude()' for list/tuple attrs without a special handler""" - if not isinstance(value, sequence): - raise DistutilsSetupError( - "%s: setting must be a list or tuple (%r)" % (name, value) - ) - try: - old = getattr(self, name) - except AttributeError: - raise DistutilsSetupError( - "%s: No such distribution setting" % name - ) - if old is not None and not isinstance(old, sequence): - raise DistutilsSetupError( - name + ": this setting cannot be changed via include/exclude" - ) - elif old: - setattr(self, name, [item for item in old if item not in value]) - - def _include_misc(self, name, value): - """Handle 'include()' for list/tuple attrs without a special handler""" - - if not isinstance(value, sequence): - raise DistutilsSetupError( - "%s: setting must be a list (%r)" % (name, value) - ) - try: - old = getattr(self, name) - except AttributeError: - raise DistutilsSetupError( - "%s: No such distribution setting" % name - ) - if old is None: - setattr(self, name, value) - elif not isinstance(old, sequence): - raise DistutilsSetupError( - name + ": this setting cannot be changed via include/exclude" - ) - else: - new = [item for item in value if item not in old] - setattr(self, name, old + new) - - def exclude(self, **attrs): - """Remove items from distribution that are named in keyword arguments - - For example, 'dist.exclude(py_modules=["x"])' would remove 'x' from - the distribution's 'py_modules' attribute. Excluding packages uses - the 'exclude_package()' method, so all of the package's contained - packages, modules, and extensions are also excluded. - - Currently, this method only supports exclusion from attributes that are - lists or tuples. If you need to add support for excluding from other - attributes in this or a subclass, you can add an '_exclude_X' method, - where 'X' is the name of the attribute. The method will be called with - the value passed to 'exclude()'. So, 'dist.exclude(foo={"bar":"baz"})' - will try to call 'dist._exclude_foo({"bar":"baz"})', which can then - handle whatever special exclusion logic is needed. - """ - for k, v in attrs.items(): - exclude = getattr(self, '_exclude_' + k, None) - if exclude: - exclude(v) - else: - self._exclude_misc(k, v) - - def _exclude_packages(self, packages): - if not isinstance(packages, sequence): - raise DistutilsSetupError( - "packages: setting must be a list or tuple (%r)" % (packages,) - ) - list(map(self.exclude_package, packages)) - - def _parse_command_opts(self, parser, args): - # Remove --with-X/--without-X options when processing command args - self.global_options = self.__class__.global_options - self.negative_opt = self.__class__.negative_opt - - # First, expand any aliases - command = args[0] - aliases = self.get_option_dict('aliases') - while command in aliases: - src, alias = aliases[command] - del aliases[command] # ensure each alias can expand only once! - import shlex - args[:1] = shlex.split(alias, True) - command = args[0] - - nargs = _Distribution._parse_command_opts(self, parser, args) - - # Handle commands that want to consume all remaining arguments - cmd_class = self.get_command_class(command) - if getattr(cmd_class, 'command_consumes_arguments', None): - self.get_option_dict(command)['args'] = ("command line", nargs) - if nargs is not None: - return [] - - return nargs - - def get_cmdline_options(self): - """Return a '{cmd: {opt:val}}' map of all command-line options - - Option names are all long, but do not include the leading '--', and - contain dashes rather than underscores. If the option doesn't take - an argument (e.g. '--quiet'), the 'val' is 'None'. - - Note that options provided by config files are intentionally excluded. - """ - - d = {} - - for cmd, opts in self.command_options.items(): - - for opt, (src, val) in opts.items(): - - if src != "command line": - continue - - opt = opt.replace('_', '-') - - if val == 0: - cmdobj = self.get_command_obj(cmd) - neg_opt = self.negative_opt.copy() - neg_opt.update(getattr(cmdobj, 'negative_opt', {})) - for neg, pos in neg_opt.items(): - if pos == opt: - opt = neg - val = None - break - else: - raise AssertionError("Shouldn't be able to get here") - - elif val == 1: - val = None - - d.setdefault(cmd, {})[opt] = val - - return d - - def iter_distribution_names(self): - """Yield all packages, modules, and extension names in distribution""" - - for pkg in self.packages or (): - yield pkg - - for module in self.py_modules or (): - yield module - - for ext in self.ext_modules or (): - if isinstance(ext, tuple): - name, buildinfo = ext - else: - name = ext.name - if name.endswith('module'): - name = name[:-6] - yield name - - def handle_display_options(self, option_order): - """If there were any non-global "display-only" options - (--help-commands or the metadata display options) on the command - line, display the requested info and return true; else return - false. - """ - import sys - - if six.PY2 or self.help_commands: - return _Distribution.handle_display_options(self, option_order) - - # Stdout may be StringIO (e.g. in tests) - if not isinstance(sys.stdout, io.TextIOWrapper): - return _Distribution.handle_display_options(self, option_order) - - # Don't wrap stdout if utf-8 is already the encoding. Provides - # workaround for #334. - if sys.stdout.encoding.lower() in ('utf-8', 'utf8'): - return _Distribution.handle_display_options(self, option_order) - - # Print metadata in UTF-8 no matter the platform - encoding = sys.stdout.encoding - errors = sys.stdout.errors - newline = sys.platform != 'win32' and '\n' or None - line_buffering = sys.stdout.line_buffering - - sys.stdout = io.TextIOWrapper( - sys.stdout.detach(), 'utf-8', errors, newline, line_buffering) - try: - return _Distribution.handle_display_options(self, option_order) - finally: - sys.stdout = io.TextIOWrapper( - sys.stdout.detach(), encoding, errors, newline, line_buffering) - - -class Feature: - """ - **deprecated** -- The `Feature` facility was never completely implemented - or supported, `has reported issues - <https://github.com/pypa/setuptools/issues/58>`_ and will be removed in - a future version. - - A subset of the distribution that can be excluded if unneeded/wanted - - Features are created using these keyword arguments: - - 'description' -- a short, human readable description of the feature, to - be used in error messages, and option help messages. - - 'standard' -- if true, the feature is included by default if it is - available on the current system. Otherwise, the feature is only - included if requested via a command line '--with-X' option, or if - another included feature requires it. The default setting is 'False'. - - 'available' -- if true, the feature is available for installation on the - current system. The default setting is 'True'. - - 'optional' -- if true, the feature's inclusion can be controlled from the - command line, using the '--with-X' or '--without-X' options. If - false, the feature's inclusion status is determined automatically, - based on 'availabile', 'standard', and whether any other feature - requires it. The default setting is 'True'. - - 'require_features' -- a string or sequence of strings naming features - that should also be included if this feature is included. Defaults to - empty list. May also contain 'Require' objects that should be - added/removed from the distribution. - - 'remove' -- a string or list of strings naming packages to be removed - from the distribution if this feature is *not* included. If the - feature *is* included, this argument is ignored. This argument exists - to support removing features that "crosscut" a distribution, such as - defining a 'tests' feature that removes all the 'tests' subpackages - provided by other features. The default for this argument is an empty - list. (Note: the named package(s) or modules must exist in the base - distribution when the 'setup()' function is initially called.) - - other keywords -- any other keyword arguments are saved, and passed to - the distribution's 'include()' and 'exclude()' methods when the - feature is included or excluded, respectively. So, for example, you - could pass 'packages=["a","b"]' to cause packages 'a' and 'b' to be - added or removed from the distribution as appropriate. - - A feature must include at least one 'requires', 'remove', or other - keyword argument. Otherwise, it can't affect the distribution in any way. - Note also that you can subclass 'Feature' to create your own specialized - feature types that modify the distribution in other ways when included or - excluded. See the docstrings for the various methods here for more detail. - Aside from the methods, the only feature attributes that distributions look - at are 'description' and 'optional'. - """ - - @staticmethod - def warn_deprecated(): - msg = ( - "Features are deprecated and will be removed in a future " - "version. See https://github.com/pypa/setuptools/issues/65." - ) - warnings.warn(msg, DistDeprecationWarning, stacklevel=3) - - def __init__( - self, description, standard=False, available=True, - optional=True, require_features=(), remove=(), **extras): - self.warn_deprecated() - - self.description = description - self.standard = standard - self.available = available - self.optional = optional - if isinstance(require_features, (str, Require)): - require_features = require_features, - - self.require_features = [ - r for r in require_features if isinstance(r, str) - ] - er = [r for r in require_features if not isinstance(r, str)] - if er: - extras['require_features'] = er - - if isinstance(remove, str): - remove = remove, - self.remove = remove - self.extras = extras - - if not remove and not require_features and not extras: - raise DistutilsSetupError( - "Feature %s: must define 'require_features', 'remove', or " - "at least one of 'packages', 'py_modules', etc." - ) - - def include_by_default(self): - """Should this feature be included by default?""" - return self.available and self.standard - - def include_in(self, dist): - """Ensure feature and its requirements are included in distribution - - You may override this in a subclass to perform additional operations on - the distribution. Note that this method may be called more than once - per feature, and so should be idempotent. - - """ - - if not self.available: - raise DistutilsPlatformError( - self.description + " is required, " - "but is not available on this platform" - ) - - dist.include(**self.extras) - - for f in self.require_features: - dist.include_feature(f) - - def exclude_from(self, dist): - """Ensure feature is excluded from distribution - - You may override this in a subclass to perform additional operations on - the distribution. This method will be called at most once per - feature, and only after all included features have been asked to - include themselves. - """ - - dist.exclude(**self.extras) - - if self.remove: - for item in self.remove: - dist.exclude_package(item) - - def validate(self, dist): - """Verify that feature makes sense in context of distribution - - This method is called by the distribution just before it parses its - command line. It checks to ensure that the 'remove' attribute, if any, - contains only valid package/module names that are present in the base - distribution when 'setup()' is called. You may override it in a - subclass to perform any other required validation of the feature - against a target distribution. - """ - - for item in self.remove: - if not dist.has_contents_for(item): - raise DistutilsSetupError( - "%s wants to be able to remove %s, but the distribution" - " doesn't contain any packages or modules under %s" - % (self.description, item, item) - ) - - -class DistDeprecationWarning(SetuptoolsDeprecationWarning): - """Class for warning about deprecations in dist in - setuptools. Not ignored by default, unlike DeprecationWarning.""" diff --git a/venv/lib/python2.7/site-packages/setuptools/dist.pyc b/venv/lib/python2.7/site-packages/setuptools/dist.pyc deleted file mode 100644 index 2e5477eea7c1df28f1ab96cb201a8bbee87931c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51591 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 V;@N@G(E~$A{wUG^LkEB4{{{2GLHqy! diff --git a/venv/lib/python2.7/site-packages/setuptools/extension.py b/venv/lib/python2.7/site-packages/setuptools/extension.py deleted file mode 100644 index 2946889..0000000 --- a/venv/lib/python2.7/site-packages/setuptools/extension.py +++ /dev/null @@ -1,57 +0,0 @@ -import re -import functools -import distutils.core -import distutils.errors -import distutils.extension - -from setuptools.extern.six.moves import map - -from .monkey import get_unpatched - - -def _have_cython(): - """ - Return True if Cython can be imported. - """ - cython_impl = 'Cython.Distutils.build_ext' - try: - # from (cython_impl) import build_ext - __import__(cython_impl, fromlist=['build_ext']).build_ext - return True - except Exception: - pass - return False - - -# for compatibility -have_pyrex = _have_cython - -_Extension = get_unpatched(distutils.core.Extension) - - -class Extension(_Extension): - """Extension that uses '.c' files in place of '.pyx' files""" - - def __init__(self, name, sources, *args, **kw): - # The *args is needed for compatibility as calls may use positional - # arguments. py_limited_api may be set only via keyword. - self.py_limited_api = kw.pop("py_limited_api", False) - _Extension.__init__(self, name, sources, *args, **kw) - - def _convert_pyx_sources_to_lang(self): - """ - Replace sources with .pyx extensions to sources with the target - language extension. This mechanism allows language authors to supply - pre-converted sources but to prefer the .pyx sources. - """ - if _have_cython(): - # the build has Cython, so allow it to compile the .pyx files - return - lang = self.language or '' - target_ext = '.cpp' if lang.lower() == 'c++' else '.c' - sub = functools.partial(re.sub, '.pyx$', target_ext) - self.sources = list(map(sub, self.sources)) - - -class Library(Extension): - """Just like a regular Extension, but built as a library instead""" diff --git a/venv/lib/python2.7/site-packages/setuptools/extension.pyc b/venv/lib/python2.7/site-packages/setuptools/extension.pyc deleted file mode 100644 index fb29e9d8a568cc72d940d6be3c6f3c3478d2f324..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2742 zcmd5;?QYye6uo0_HrX^^1rb_6Vfc_5DA`S+N{dtwB9tEp0&*e&D<R9VXLr5v+V0Fa z$yUh^6n^t2yb*7~1HifCT_=5l;AC#*d(PZ@?wR=itS*22``T|Y%|0K0zd|v8!6f(< zlo9otx}d(8_j}a$=k?Z&`og^KQP!r(BJ~$ZB$(QwY>6fv>UYpypg*wjGO1<i-yzi@ z<<oeD#;bINL)Iv1lUkzzPFv)eS46+|S1DN{wd#61P47CRJltLe;`Cp92ipQw%U791 zWy+1ZXBD-fvSF2%k&Q<xao6VY1(bah^9%;NT@p>V$P!(k=@GyW1#pS6AYnZ^{5ii% zEu3(&O!^54A#y>#*cMQ<c$Zz6Wr;6Pw$iyg(v_0wK<-cNsK{j;<?<LEld{lOC0#ew zyoE*egzh(~v6W3T(><=zED6=QwM!Tt=wgy#%y!UdhPD~K<?DxGy=NE(e0u;Q;<MfS z=jX91ZCd1(=YJbzM%8Y)gJ$fI@$zgNO>)NMsP#&no<>&nP9xnL6j`FQ>AgJfO+VAe z`Ps>%y%+iJo_@R+KQ-r{ColCbzG2xr>Xm7^ljg=oS+-*z{V)uF>KVABv_+Abn^oLS z<p#jI<<zd=$Z!;$s<4K{ZL<bLt+w#JO|c|aMN7<XG+XH6$a6TBU!xcaqrfjm);=OA z9Nj=d&sAC!9B#9Z%oCXBa|F_kA}cGSjC|0IAIL$Pp_=Bh%%WJyVu0>)dOjP7c>{K4 z8|6n7^C`?li^h&b7L@UrL7~TN9JjcBA?N~~K2Q78M;;JJ<6+r><y)51FiR&XSP_D{ zb!7RJvM7T^{0%r*b*vlEjv5Gkp4u?1mpB%xY~UD>M-ydvu_-DYE8{vNJv3l4(aG7Z z20Y+ff56}vGx=|bn1jd-F8e6v1q^cWibz8Nkn8XxGO@hR(Y%C11&uu(MxLH{q#v`? z<cReGUCvz((vRCLD)9c5PnSNyCGZ?a0=soMR1hAHR;Shz=dr(Wv`f!An`;`({3y>- zJCe)?*-+R>TgX?&?MO)rZ!6pElSTQkiiYZXSyvv7QX?lS9z}U-CK5?goEh27j4CLH zu6M7>GMhG=m0In@MSiMSN}8jOE6YeQI8Yj_RyEEUvRZNYN(b;OJnX~74<EW1bmOu# z%#3bqnB08951qOOEIW>Eb6ieJfE0)G*r3W|m)?$UWu$EyWsYT9IXyPjv11>LSbzl- z+=X$X8LXpL55hf;;<ejY{Q?%pTji;J2MEHMqeHkPocS`eMab^>2;+v;irO8oCDz53 zxF_mtT;io6r(qb*bb3-GRmM$bSr{fo49(_L2)1CZZ|Z8dpu+(_ClbZ5wzWmu>$Dx# z@6%%)>1m8!_ce;k;BP7}^p(fV7ck#d#>y-`Q8JQR4XZ5DvXQS(B$Jh2Gb<y58CiV< zWY<^~B~GS;cd<<%*}MnyKXB0dfbkT?rAk|DZ!os|Y~F-%VxBb5cw8U>I76B)%k!I7 zS80v(wy(e1Ie(Vy+vvZ3Ji9D6I`5kFygMmQm2s(LIZ~4%KT*?wJzr-l$I(5f<y2!C uYbt|r@eTMNqJS@Q`~GyY@~lpaFCB3<fony~e!LBD!|$xOz1RHBd;bAa)TVL( diff --git a/venv/lib/python2.7/site-packages/setuptools/extern/__init__.py b/venv/lib/python2.7/site-packages/setuptools/extern/__init__.py deleted file mode 100644 index cb2fa32..0000000 --- a/venv/lib/python2.7/site-packages/setuptools/extern/__init__.py +++ /dev/null @@ -1,73 +0,0 @@ -import sys - - -class VendorImporter: - """ - A PEP 302 meta path importer for finding optionally-vendored - or otherwise naturally-installed packages from root_name. - """ - - def __init__(self, root_name, vendored_names=(), vendor_pkg=None): - self.root_name = root_name - self.vendored_names = set(vendored_names) - self.vendor_pkg = vendor_pkg or root_name.replace('extern', '_vendor') - - @property - def search_path(self): - """ - Search first the vendor package then as a natural package. - """ - yield self.vendor_pkg + '.' - yield '' - - def find_module(self, fullname, path=None): - """ - Return self when fullname starts with root_name and the - target module is one vendored through this importer. - """ - root, base, target = fullname.partition(self.root_name + '.') - if root: - return - if not any(map(target.startswith, self.vendored_names)): - return - return self - - def load_module(self, fullname): - """ - Iterate over the search path to locate and load fullname. - """ - root, base, target = fullname.partition(self.root_name + '.') - for prefix in self.search_path: - try: - extant = prefix + target - __import__(extant) - mod = sys.modules[extant] - sys.modules[fullname] = mod - # mysterious hack: - # Remove the reference to the extant package/module - # on later Python versions to cause relative imports - # in the vendor package to resolve the same modules - # as those going through this importer. - if sys.version_info >= (3, ): - del sys.modules[extant] - return mod - except ImportError: - pass - else: - raise ImportError( - "The '{target}' package is required; " - "normally this is bundled with this package so if you get " - "this warning, consult the packager of your " - "distribution.".format(**locals()) - ) - - def install(self): - """ - Install this importer into sys.meta_path if not already present. - """ - if self not in sys.meta_path: - sys.meta_path.append(self) - - -names = 'six', 'packaging', 'pyparsing', -VendorImporter(__name__, names, 'setuptools._vendor').install() diff --git a/venv/lib/python2.7/site-packages/setuptools/extern/__init__.pyc b/venv/lib/python2.7/site-packages/setuptools/extern/__init__.pyc deleted file mode 100644 index 7cfdead189ed51632173cc3b6c7a6d57d1876076..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3323 zcmd5;ZEqVz5T5m0UPv0CKtKq(<*hCvaZ6DFQJ~OPqP$qurD`FfI$eD0<dXB<b$6Y_ z#rXiK_=flbKZRe$4}fQ8ZHFT9nOw5t*_++D*_mf%w*Kex;@dx-dC;TD)4=a_4EHHW ziho5p(I%K0rSp{5=`qnU(RZ7Q(goVAkx^voWFVfS<2vm&Sgf#bqrC_n*<X0N{tVcA zrbtVBdr+0u8$0`C9iq=M+?OB*AA@F4C~UD#XnI_u%?6n!8^NDfv>8OO20Yd@`28mA zYYMYK(MEfob>cNGYCNCmJGbuWE0^BY1LG52C4NU|6H|1*w7Q=aX;y6OvhrD3BzZns z+ZTgPDhjZq^gG5LWX|X!@k1+Xvch>VCWXr0Ub1bR?%Q&pZCU!bNCswIcJ~@Ega@DY z28MedWUOdR6cc$cH9i<mYc#G?wZ_ujI-eiMKE_Lk8tj^lHY@4+7N|LdD+@mdHV)>t zo8bKd$jk)K>z(luh3TQhI43);sq&;}JjW}D<7#ia&E|S0&gA`wbwsQ?;*Yg40&yN( zr?T08;!S5iv7LUIr^dR@qr=YVirp#>_AXz2SX{bl-@DrTz#V>=KC+kaY*(GTohqx= zCN5m_m%rJL?{r}3u<~V@yMMCbpq)6*ip<CHdNuMK;OU%AckB>S3u;C66mu9gj2?!2 z9t0lT6-ck%Q}8KB9nO>!ehsk%im|d`65HDWBCPWoG1tK<(+KmcLMKiqQyfesA=az{ z0VP^z*HE|3eDIoZZ1-vK-&3%|$x&lYhZUZ(GpM<wdK_-{C%?FX;n+ir$lykRQqd{^ z`+c2`@ZX@LCd1ZVWVCMh8Ub|UCYJ;DdXoW+)$R)s<5d8$`x#nievc4&TWE%xK42gB zhk4F9q>*FRJAIHLYiF?5Ns)3aX8W;d+ju=F(_wCO=5$$1V~70oJGLBd@8B1bY3iRu zEMf?C+k9rpo(f;gxD*KTC54h=B)@~Cl3WQ^u~Cv3vNz)B3N)w2OA4`rg<<Q3*-8L( z`I=aLS^&XiFb*DE#Yx-}2sO{CmTIV%F?yU)d`321fbj>I{{Tj9f{nvp1qC&_`5<SY zj3UOyxIwE&Edff4!J*(6AZ6U5myYIWJjca{=ZdZ|hmzl<y(Zc5RM4W23w(QyHts*X zNDb7oy+yLWkx~ltZ!zxU9g=)^o@07U^ow+lpMc&55XeVxUxCaJbQ{$aWlWd*#xk^k zMJWZ+E_|u;vd3ZuUS1~Y450slQO4Qheh0Y=9T$EGz&yGztrLt*YaR|WYtoN&QQ86b zk_j@M-WnDucNBrUz;)7Fv@3Pi*Q0W%8R#N9NNj<=^^We9g&XFfU`^JeWyxx*)699B zZ4DXF>!Bivk<z21Wmp;tJcnDbjlwG3F^)s`7=>05kl{S9gO424p(6K7&&4FP_FLAX z!Lx7CRtJd}mK~Qn>B*8I(KC=oXPG?5gv+xmtgPv0hr*)dCxs6gSEi>WK{)P{1bH1s zyH`P|aZWw0>S_^x%WAo`0y@v5R#&b16U|6c<}GYN4Mcm`RkSxp_O%JWD{Y>00l-Fu z-Dq>Vxd`M0qv6K!WF6C40eHHRTj%SI)N@8kQF@)^)+Fgj!?Vs5{sgLBxkp4VLb+7D z*-r6(QdPMAgx<yZej5DGH;>6};X2sRtr{yzZ0ib^C$|Fb8h|d>^mr02Oy!ysr)3X3 zH?}SsM8sDm*;U!HGS-hG26yxVlk-g80696maR1w-hmjyXSqgKj(W<R9SLT<N7G4Qy ziqzrrg#1TY2(uBInZwLI3)#v2YJGZTWTgTICxt6JbWbP=v#AofU<zu)7|(Y?cDIY( a1b3>uC1Jf5YSt%w_mV5(QvK}BmiimDtvxOP diff --git a/venv/lib/python2.7/site-packages/setuptools/glibc.py b/venv/lib/python2.7/site-packages/setuptools/glibc.py deleted file mode 100644 index a134591..0000000 --- a/venv/lib/python2.7/site-packages/setuptools/glibc.py +++ /dev/null @@ -1,86 +0,0 @@ -# This file originally from pip: -# https://github.com/pypa/pip/blob/8f4f15a5a95d7d5b511ceaee9ed261176c181970/src/pip/_internal/utils/glibc.py -from __future__ import absolute_import - -import ctypes -import re -import warnings - - -def glibc_version_string(): - "Returns glibc version string, or None if not using glibc." - - # ctypes.CDLL(None) internally calls dlopen(NULL), and as the dlopen - # manpage says, "If filename is NULL, then the returned handle is for the - # main program". This way we can let the linker do the work to figure out - # which libc our process is actually using. - process_namespace = ctypes.CDLL(None) - try: - gnu_get_libc_version = process_namespace.gnu_get_libc_version - except AttributeError: - # Symbol doesn't exist -> therefore, we are not linked to - # glibc. - return None - - # Call gnu_get_libc_version, which returns a string like "2.5" - gnu_get_libc_version.restype = ctypes.c_char_p - version_str = gnu_get_libc_version() - # py2 / py3 compatibility: - if not isinstance(version_str, str): - version_str = version_str.decode("ascii") - - return version_str - - -# Separated out from have_compatible_glibc for easier unit testing -def check_glibc_version(version_str, required_major, minimum_minor): - # Parse string and check against requested version. - # - # We use a regexp instead of str.split because we want to discard any - # random junk that might come after the minor version -- this might happen - # in patched/forked versions of glibc (e.g. Linaro's version of glibc - # uses version strings like "2.20-2014.11"). See gh-3588. - m = re.match(r"(?P<major>[0-9]+)\.(?P<minor>[0-9]+)", version_str) - if not m: - warnings.warn("Expected glibc version with 2 components major.minor," - " got: %s" % version_str, RuntimeWarning) - return False - return (int(m.group("major")) == required_major and - int(m.group("minor")) >= minimum_minor) - - -def have_compatible_glibc(required_major, minimum_minor): - version_str = glibc_version_string() - if version_str is None: - return False - return check_glibc_version(version_str, required_major, minimum_minor) - - -# platform.libc_ver regularly returns completely nonsensical glibc -# versions. E.g. on my computer, platform says: -# -# ~$ python2.7 -c 'import platform; print(platform.libc_ver())' -# ('glibc', '2.7') -# ~$ python3.5 -c 'import platform; print(platform.libc_ver())' -# ('glibc', '2.9') -# -# But the truth is: -# -# ~$ ldd --version -# ldd (Debian GLIBC 2.22-11) 2.22 -# -# This is unfortunate, because it means that the linehaul data on libc -# versions that was generated by pip 8.1.2 and earlier is useless and -# misleading. Solution: instead of using platform, use our code that actually -# works. -def libc_ver(): - """Try to determine the glibc version - - Returns a tuple of strings (lib, version) which default to empty strings - in case the lookup fails. - """ - glibc_version = glibc_version_string() - if glibc_version is None: - return ("", "") - else: - return ("glibc", glibc_version) diff --git a/venv/lib/python2.7/site-packages/setuptools/glibc.pyc b/venv/lib/python2.7/site-packages/setuptools/glibc.pyc deleted file mode 100644 index d3f04e00e35809d3459132faee91193a4423c377..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2230 zcmc&#ZEqVz5T3nroH$LIHb6zoixvsQ1(G<0Dk7+qASj=LRb46-rL9hvyS07sy>)jl ziL2xT3jctg${*mFJ)5@t0AktWxtY6pdFI(U|L@i1ul~6CGNIYW!~gz1k$C|n#aB>H zR0ui}B>38++@mAU`JnrB<j?gE9d#)6=})4g1xh<k=~BAjltoIrPFdn0hruEeWcX1a zAnY1Md~B+`u`0@ny3%&ws`BAj!0+dMR5gKOiB1H^xDs?pG+m_&SbVw^^sHQ`j_uH7 zne+|`Avn|T{J;WT2#UHauZS)^vWs*9xkOhUnGx$JJ?@r+dQ=iy4g*eZ_8>xK8(kVX z%CqA{o+@p!s+7j+tQ>91O3Oi2Dwz#sSy|Z_Sle5-E!Q5KB+CZDGFRV)NbIy$28E)n zUk(nO!U632u#Czk8Yvrbrf8PQ-h|^Pi*(1p=dsp+XNdzv$vD<gjc$lELL#o^G#N@T zHZBuoT@O~f#HmWERJpe7ZQNGtDpAHnWn3sz$B7ELTzdmzmN`O?0WQf2a{{ej>+CeP zs(%{m{;<kZpwWMQ-k*M}kIS>k{oPmP&aQs2n|x=^_tMvT2cJ>hf7-9JddroS=Uevv zZ=>i*-vHOzR#k4^RvpUQ^|Zy~Z6LTDfXgi!28$NggfCXbs=wf`h@Q75*1d!~W^DQ2 z(FVkw(?&2`F!M{FE_^aOWHEVA*kk)0OaeZEp&bG*+;9Tg`b-LZ!JUamRl+lzxo~^y z@@Rr*0!D9OK8Fl`eDbh}Pb&TB`Oenf%da<HY&%m{zA>2}aO30iS|wJc|Do1dX2<dy znN&Cmr7EqFF4}g%0XF5Rvfs-ujANH`v>H1DCI-4<Ld^U&89Tb1#kvG~E%W%o@hWUe zn-%I=>vWI&8t0e{<Cm4zSw^~Q>VQ!VS2;ctQma=@rd1lX6|f!UWkpj&u1w1(ySP5~ zyodD3SS6Fl5o&&zcsz#dr^R*A6+Ll7bi_v@VaVpxakSZh0n6jcEez}f&}gzm`Yxk; z2y|cqX?Ughm_0W;Xc6Mzp~LD9Yac_nGZ)_F%X=&stm{MO17sh^rz&E8#Wp+6Rg2LB zI1CerfXfPSNt_PB=r~lqgfc?~&Eu8e&rrd}KWxv@5ct5{o(J<69(by!(pEB6R%viU zNjp~WGJbhk;xpf~vBX};m8^!dC2M4WJ+L`ny&LjuoF!uf9L7y<IkqZlJDuO{f@P&l zV$<fzt7_8Jau{d1*>+y^fJXSlI(7^K?lAmxF51g~C)vKGcxvx(>H0><Lz-{K1L*D4 zx^8M-(1XRj2%>1%;MJv~D1?bZ*Cen0kWWYG`eS~EpRo80;!R6V`@dH{_w}%-(k54r W_%yncddph@8&~|^z22?fhyMU8L>~13 diff --git a/venv/lib/python2.7/site-packages/setuptools/glob.py b/venv/lib/python2.7/site-packages/setuptools/glob.py deleted file mode 100644 index 9d7cbc5..0000000 --- a/venv/lib/python2.7/site-packages/setuptools/glob.py +++ /dev/null @@ -1,174 +0,0 @@ -""" -Filename globbing utility. Mostly a copy of `glob` from Python 3.5. - -Changes include: - * `yield from` and PEP3102 `*` removed. - * Hidden files are not ignored. -""" - -import os -import re -import fnmatch - -__all__ = ["glob", "iglob", "escape"] - - -def glob(pathname, recursive=False): - """Return a list of paths matching a pathname pattern. - - The pattern may contain simple shell-style wildcards a la - fnmatch. However, unlike fnmatch, filenames starting with a - dot are special cases that are not matched by '*' and '?' - patterns. - - If recursive is true, the pattern '**' will match any files and - zero or more directories and subdirectories. - """ - return list(iglob(pathname, recursive=recursive)) - - -def iglob(pathname, recursive=False): - """Return an iterator which yields the paths matching a pathname pattern. - - The pattern may contain simple shell-style wildcards a la - fnmatch. However, unlike fnmatch, filenames starting with a - dot are special cases that are not matched by '*' and '?' - patterns. - - If recursive is true, the pattern '**' will match any files and - zero or more directories and subdirectories. - """ - it = _iglob(pathname, recursive) - if recursive and _isrecursive(pathname): - s = next(it) # skip empty string - assert not s - return it - - -def _iglob(pathname, recursive): - dirname, basename = os.path.split(pathname) - if not has_magic(pathname): - if basename: - if os.path.lexists(pathname): - yield pathname - else: - # Patterns ending with a slash should match only directories - if os.path.isdir(dirname): - yield pathname - return - if not dirname: - if recursive and _isrecursive(basename): - for x in glob2(dirname, basename): - yield x - else: - for x in glob1(dirname, basename): - yield x - return - # `os.path.split()` returns the argument itself as a dirname if it is a - # drive or UNC path. Prevent an infinite recursion if a drive or UNC path - # contains magic characters (i.e. r'\\?\C:'). - if dirname != pathname and has_magic(dirname): - dirs = _iglob(dirname, recursive) - else: - dirs = [dirname] - if has_magic(basename): - if recursive and _isrecursive(basename): - glob_in_dir = glob2 - else: - glob_in_dir = glob1 - else: - glob_in_dir = glob0 - for dirname in dirs: - for name in glob_in_dir(dirname, basename): - yield os.path.join(dirname, name) - - -# These 2 helper functions non-recursively glob inside a literal directory. -# They return a list of basenames. `glob1` accepts a pattern while `glob0` -# takes a literal basename (so it only has to check for its existence). - - -def glob1(dirname, pattern): - if not dirname: - if isinstance(pattern, bytes): - dirname = os.curdir.encode('ASCII') - else: - dirname = os.curdir - try: - names = os.listdir(dirname) - except OSError: - return [] - return fnmatch.filter(names, pattern) - - -def glob0(dirname, basename): - if not basename: - # `os.path.split()` returns an empty basename for paths ending with a - # directory separator. 'q*x/' should match only directories. - if os.path.isdir(dirname): - return [basename] - else: - if os.path.lexists(os.path.join(dirname, basename)): - return [basename] - return [] - - -# This helper function recursively yields relative pathnames inside a literal -# directory. - - -def glob2(dirname, pattern): - assert _isrecursive(pattern) - yield pattern[:0] - for x in _rlistdir(dirname): - yield x - - -# Recursively yields relative pathnames inside a literal directory. -def _rlistdir(dirname): - if not dirname: - if isinstance(dirname, bytes): - dirname = os.curdir.encode('ASCII') - else: - dirname = os.curdir - try: - names = os.listdir(dirname) - except os.error: - return - for x in names: - yield x - path = os.path.join(dirname, x) if dirname else x - for y in _rlistdir(path): - yield os.path.join(x, y) - - -magic_check = re.compile('([*?[])') -magic_check_bytes = re.compile(b'([*?[])') - - -def has_magic(s): - if isinstance(s, bytes): - match = magic_check_bytes.search(s) - else: - match = magic_check.search(s) - return match is not None - - -def _isrecursive(pattern): - if isinstance(pattern, bytes): - return pattern == b'**' - else: - return pattern == '**' - - -def escape(pathname): - """Escape all special characters. - """ - # Escaping is done by wrapping any of "*?[" between square brackets. - # Metacharacters do not work in the drive part and shouldn't be escaped. - drive, pathname = os.path.splitdrive(pathname) - if isinstance(pathname, bytes): - pathname = magic_check_bytes.sub(br'[\1]', pathname) - else: - pathname = magic_check.sub(r'[\1]', pathname) - return drive + pathname diff --git a/venv/lib/python2.7/site-packages/setuptools/glob.pyc b/venv/lib/python2.7/site-packages/setuptools/glob.pyc deleted file mode 100644 index d8938eab3b7168c3619ff71b8876ff5535e2da8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5311 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 diff --git a/venv/lib/python2.7/site-packages/setuptools/gui-32.exe b/venv/lib/python2.7/site-packages/setuptools/gui-32.exe deleted file mode 100644 index f8d3509653ba8f80ca7f3aa7f95616142ba83a94..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65536 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 diff --git a/venv/lib/python2.7/site-packages/setuptools/gui-64.exe b/venv/lib/python2.7/site-packages/setuptools/gui-64.exe deleted file mode 100644 index 330c51a5dde15a0bb610a48cd0ca11770c914dae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 75264 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 diff --git a/venv/lib/python2.7/site-packages/setuptools/gui.exe b/venv/lib/python2.7/site-packages/setuptools/gui.exe deleted file mode 100644 index f8d3509653ba8f80ca7f3aa7f95616142ba83a94..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65536 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 diff --git a/venv/lib/python2.7/site-packages/setuptools/launch.py b/venv/lib/python2.7/site-packages/setuptools/launch.py deleted file mode 100644 index 308283e..0000000 --- a/venv/lib/python2.7/site-packages/setuptools/launch.py +++ /dev/null @@ -1,35 +0,0 @@ -""" -Launch the Python script on the command line after -setuptools is bootstrapped via import. -""" - -# Note that setuptools gets imported implicitly by the -# invocation of this script using python -m setuptools.launch - -import tokenize -import sys - - -def run(): - """ - Run the script in sys.argv[1] as if it had - been invoked naturally. - """ - __builtins__ - script_name = sys.argv[1] - namespace = dict( - __file__=script_name, - __name__='__main__', - __doc__=None, - ) - sys.argv[:] = sys.argv[1:] - - open_ = getattr(tokenize, 'open', open) - script = open_(script_name).read() - norm_script = script.replace('\\r\\n', '\\n') - code = compile(norm_script, script_name, 'exec') - exec(code, namespace) - - -if __name__ == '__main__': - run() diff --git a/venv/lib/python2.7/site-packages/setuptools/launch.pyc b/venv/lib/python2.7/site-packages/setuptools/launch.pyc deleted file mode 100644 index ac2eecf862d0ec30506aec31af864f7f72611f87..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1108 zcmc&z+invv5S_gwZI%=XBoI8|#|WueDo_OyAmACQY6~yDXyvRYiJOhR*xt}o$pb1s zz_;=NFm@u!AK=Z-9@{gXGslzU*IxGY``wEQwj-wRJ9_PVG6LX~Yy={PI)YOI8yv%F z3?hLa<d6WSAX1pcVBP>Ga03u23X9=n(D6r|k;y*tR#j8xrpS($ZmJctm645Og#2Qq z=X0(EtEEE5#|}+q(Y1}!y0%POHqzQzXL!?~U<=8aoHyFIVJ3gmI0_YXDbo(UAAH)M zWRSRE1ee4%g2!uGNIbC>(IY^-J0LP*oU9}G>-S`X2G{}Yg6IP7z)b>ciVLAPbl|Qp zbDh8{fy*9<9T2n<!#V}bV3mdpy%5!b75ySezfh)=!5vTSm`uiK6z!(^trn70S=u2t zlf~J=1>;osm`TT`Tm<(KqGD1l^o%r6+_i?+^>P^YWJHI$T{2}kmNk~;cB1(Fb~5Ku z(T*3XEQPKJr-XHb%6f2a&Xx5|aIV4zUSV|<NV|TB8MU%@QdtU2Xo2VkKTkOTAuAWa zkyaS;Owe)XOkm@Pxsumd_*}uwAQ!>SU{mvI6GF|<PzeKnpDrjCdZqNGxE?KfU>oo5 zJIu2$op;{o7($db^Kv`)*(xn?Kwk*P&Isj=kqhoHUvQI;buG}?{Q4?iJ~t!vZFX?@ zRXsa2FAl4h_Ue_mHqU5Gn*4L#$Y!53aHRgeJNPsykMrAR{TJ4u>xa!Uh-F%}M``UN zPotAYdr>z$z4%^yKiWKn7eD-O3a@YBRWJN?6%W1fmwa2r|0!jcIJ}-~(bo9ZD{C_{ N-A+I1C%p&#=nrCk3hV#? diff --git a/venv/lib/python2.7/site-packages/setuptools/lib2to3_ex.py b/venv/lib/python2.7/site-packages/setuptools/lib2to3_ex.py deleted file mode 100644 index 4b1a73f..0000000 --- a/venv/lib/python2.7/site-packages/setuptools/lib2to3_ex.py +++ /dev/null @@ -1,62 +0,0 @@ -""" -Customized Mixin2to3 support: - - - adds support for converting doctests - - -This module raises an ImportError on Python 2. -""" - -from distutils.util import Mixin2to3 as _Mixin2to3 -from distutils import log -from lib2to3.refactor import RefactoringTool, get_fixers_from_package - -import setuptools - - -class DistutilsRefactoringTool(RefactoringTool): - def log_error(self, msg, *args, **kw): - log.error(msg, *args) - - def log_message(self, msg, *args): - log.info(msg, *args) - - def log_debug(self, msg, *args): - log.debug(msg, *args) - - -class Mixin2to3(_Mixin2to3): - def run_2to3(self, files, doctests=False): - # See of the distribution option has been set, otherwise check the - # setuptools default. - if self.distribution.use_2to3 is not True: - return - if not files: - return - log.info("Fixing " + " ".join(files)) - self.__build_fixer_names() - self.__exclude_fixers() - if doctests: - if setuptools.run_2to3_on_doctests: - r = DistutilsRefactoringTool(self.fixer_names) - r.refactor(files, write=True, doctests_only=True) - else: - _Mixin2to3.run_2to3(self, files) - - def __build_fixer_names(self): - if self.fixer_names: - return - self.fixer_names = [] - for p in setuptools.lib2to3_fixer_packages: - self.fixer_names.extend(get_fixers_from_package(p)) - if self.distribution.use_2to3_fixers is not None: - for p in self.distribution.use_2to3_fixers: - self.fixer_names.extend(get_fixers_from_package(p)) - - def __exclude_fixers(self): - excluded_fixers = getattr(self, 'exclude_fixers', []) - if self.distribution.use_2to3_exclude_fixers is not None: - excluded_fixers.extend(self.distribution.use_2to3_exclude_fixers) - for fixer_name in excluded_fixers: - if fixer_name in self.fixer_names: - self.fixer_names.remove(fixer_name) diff --git a/venv/lib/python2.7/site-packages/setuptools/lib2to3_ex.pyc b/venv/lib/python2.7/site-packages/setuptools/lib2to3_ex.pyc deleted file mode 100644 index cbd2a0cc8047d1d6aebb42de78390b6695eef490..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3490 zcmd5;U2hvj6us-O#BS22DWp&px)P{ZNQwJ_s!}0DKPcj%q1r~OuvD!a@7UdBz3c3Z zQ>SVlAcz<E2Yuj2@&n+UyKB3x5JKW1bu!m8v!2;|?>YC(RR3IUeg4zwCw(bDReXPg zW~VTbNEg<Vs3M6cql$E^;&EJ+q$Z=fbnC^qCP_m^OVVAE(Xw=xi`lv)P3blzYKU2q z0oE<aFCxbxKXzLZEsLq@Y;!(ak*F?@+AVr;1k<`Zu`V0M&rRe%h^KLS&1KhpI~k9& z+}&!m{7t_XMRqph53=0vXX&BIU7Qa6DC;|8oo%&RJ5OWlkFscz7(egD)>yxn`rnVZ z(YJYyby?~^JaSL*b#1E^|AkN6gA1++Gk<q6#VjS+uwCKvGcbV}^!hH#@zR|vOWb+P z4UG#2@zmrt9OT(39QXSBy`kB5AK>A=*t&^}6Z_W6IS_pH9W?t1i~$hHo-j{c<jB)b zmAG)GCc&dNed^Pp8X5;bpxO6eoXDOhFYsTH-#tJhNHO={)&K&HvW~G~9@<>*Xsk&F zjysL)P$zo%&^o?i|5+PW)YuHY&Nz<`d(LzYdwFM&B@v?TJfC)suIIbyv;C_#4$><( z@-J@mZ`$dX(ewNYKErWmr!$Vnn{jGgFG)7t)d$1yVaFOb89QXrzTQpZU1A@a>DKs2 zF#!Ofdb|z?EZq`M6F`^QzC-)(31Gx=I><DUK?9>;iDnt*grhwL7Z~lxSPKTdkKzB1 zmw-oRcQSkj17^uFVD*pXQij{6(~gLQVcHv+Fm#lPFf0l?3<C~>6`Ip93*5AK5>ySy ztFvg9lxld*YO@-kCw&@z$lN<<_A*RS=>|29V)v-GWwF<0#a^EmJ2}qXx$#{z`v=Sm z6uZ_t3U$9J`384-gyOfp_E6A!*h@8iuTE7s_T)U8$CV9=v-XyXUPbcXnDISq^-7R! z{^}IhysXL#?6txza30`wQH}Q4t9S>mBwZ7?Dto87fG??(x<drFEi3Cj^?c|%%8&0j z|16K4!73256z(uflcP2j))CYQs+q^T5Y8-B8ceJSDGMr3JNd+@m<22to!ZOd)P00e zI9Kp6+?~WpR7kV3$hr$}{lZN9$s{tRd@IKms^qAt`6SgB!@+RotU~ShZk7FVZ?ZKn zkB5S-b5}Hk*-omvsymvCL7d>^;^Nu%ny7q1=@Vh|B{;-<T2`f0*S(t8K)c|z@CSB# zXS_?5J|QKo$xdbFujmxa%vY6$Lmh`A)6WEf?N#L7lZ)~aXH>yo5UN&^liWP;<uRYs zNl_4*%>G%XoBDH|{P*RdJWi3x#lgqK1{Z0Fz1x79oiGJ><!NmltIJHCNuz)T7wCyf zM$Wi5V+n)Z&Qenxs$8asjZYRacMgvH1LwCeZP#D~pw-aU0OGoL&QtIh=^VTR3~+}) z{vjIx?zlPwN`WikxJ9@iErdzui5rqWy}}3gp0wp<g*T7_#{Gumw-@MPUSYm12e;+1 z;za&zJF57b)!3$XI2v5Add}qqBD`_U5qWb(a2d~nPics_BAS~~c4!typWfoiWu-P) zt=2^;pD>QZD#Z2Yb!EDVIZI&_K)3E~c&n(tHmMhop#j&Zn%wUt)&wlxfQ1`;2(ySs zdnY0%a6^bmc{r||ZMNDf-o!Vgvf_v*2dMmdU*4kC12p&;^Li7UKP;}YjJho5t(o!$ mq*GDAEO?dbcOU^O@Lv_Tm#>%Mn4;OJtf3q?Dl65EQ-1@(m^dZ? diff --git a/venv/lib/python2.7/site-packages/setuptools/monkey.py b/venv/lib/python2.7/site-packages/setuptools/monkey.py deleted file mode 100644 index 3c77f8c..0000000 --- a/venv/lib/python2.7/site-packages/setuptools/monkey.py +++ /dev/null @@ -1,179 +0,0 @@ -""" -Monkey patching of distutils. -""" - -import sys -import distutils.filelist -import platform -import types -import functools -from importlib import import_module -import inspect - -from setuptools.extern import six - -import setuptools - -__all__ = [] -""" -Everything is private. Contact the project team -if you think you need this functionality. -""" - - -def _get_mro(cls): - """ - Returns the bases classes for cls sorted by the MRO. - - Works around an issue on Jython where inspect.getmro will not return all - base classes if multiple classes share the same name. Instead, this - function will return a tuple containing the class itself, and the contents - of cls.__bases__. See https://github.com/pypa/setuptools/issues/1024. - """ - if platform.python_implementation() == "Jython": - return (cls,) + cls.__bases__ - return inspect.getmro(cls) - - -def get_unpatched(item): - lookup = ( - get_unpatched_class if isinstance(item, six.class_types) else - get_unpatched_function if isinstance(item, types.FunctionType) else - lambda item: None - ) - return lookup(item) - - -def get_unpatched_class(cls): - """Protect against re-patching the distutils if reloaded - - Also ensures that no other distutils extension monkeypatched the distutils - first. - """ - external_bases = ( - cls - for cls in _get_mro(cls) - if not cls.__module__.startswith('setuptools') - ) - base = next(external_bases) - if not base.__module__.startswith('distutils'): - msg = "distutils has already been patched by %r" % cls - raise AssertionError(msg) - return base - - -def patch_all(): - # we can't patch distutils.cmd, alas - distutils.core.Command = setuptools.Command - - has_issue_12885 = sys.version_info <= (3, 5, 3) - - if has_issue_12885: - # fix findall bug in distutils (http://bugs.python.org/issue12885) - distutils.filelist.findall = setuptools.findall - - needs_warehouse = ( - sys.version_info < (2, 7, 13) - or - (3, 4) < sys.version_info < (3, 4, 6) - or - (3, 5) < sys.version_info <= (3, 5, 3) - ) - - if needs_warehouse: - warehouse = 'https://upload.pypi.org/legacy/' - distutils.config.PyPIRCCommand.DEFAULT_REPOSITORY = warehouse - - _patch_distribution_metadata() - - # Install Distribution throughout the distutils - for module in distutils.dist, distutils.core, distutils.cmd: - module.Distribution = setuptools.dist.Distribution - - # Install the patched Extension - distutils.core.Extension = setuptools.extension.Extension - distutils.extension.Extension = setuptools.extension.Extension - if 'distutils.command.build_ext' in sys.modules: - sys.modules['distutils.command.build_ext'].Extension = ( - setuptools.extension.Extension - ) - - patch_for_msvc_specialized_compiler() - - -def _patch_distribution_metadata(): - """Patch write_pkg_file and read_pkg_file for higher metadata standards""" - for attr in ('write_pkg_file', 'read_pkg_file', 'get_metadata_version'): - new_val = getattr(setuptools.dist, attr) - setattr(distutils.dist.DistributionMetadata, attr, new_val) - - -def patch_func(replacement, target_mod, func_name): - """ - Patch func_name in target_mod with replacement - - Important - original must be resolved by name to avoid - patching an already patched function. - """ - original = getattr(target_mod, func_name) - - # set the 'unpatched' attribute on the replacement to - # point to the original. - vars(replacement).setdefault('unpatched', original) - - # replace the function in the original module - setattr(target_mod, func_name, replacement) - - -def get_unpatched_function(candidate): - return getattr(candidate, 'unpatched') - - -def patch_for_msvc_specialized_compiler(): - """ - Patch functions in distutils to use standalone Microsoft Visual C++ - compilers. - """ - # import late to avoid circular imports on Python < 3.5 - msvc = import_module('setuptools.msvc') - - if platform.system() != 'Windows': - # Compilers only availables on Microsoft Windows - return - - def patch_params(mod_name, func_name): - """ - Prepare the parameters for patch_func to patch indicated function. - """ - repl_prefix = 'msvc9_' if 'msvc9' in mod_name else 'msvc14_' - repl_name = repl_prefix + func_name.lstrip('_') - repl = getattr(msvc, repl_name) - mod = import_module(mod_name) - if not hasattr(mod, func_name): - raise ImportError(func_name) - return repl, mod, func_name - - # Python 2.7 to 3.4 - msvc9 = functools.partial(patch_params, 'distutils.msvc9compiler') - - # Python 3.5+ - msvc14 = functools.partial(patch_params, 'distutils._msvccompiler') - - try: - # Patch distutils.msvc9compiler - patch_func(*msvc9('find_vcvarsall')) - patch_func(*msvc9('query_vcvarsall')) - except ImportError: - pass - - try: - # Patch distutils._msvccompiler._get_vc_env - patch_func(*msvc14('_get_vc_env')) - except ImportError: - pass - - try: - # Patch distutils._msvccompiler.gen_lib_options for Numpy - patch_func(*msvc14('gen_lib_options')) - except ImportError: - pass diff --git a/venv/lib/python2.7/site-packages/setuptools/monkey.pyc b/venv/lib/python2.7/site-packages/setuptools/monkey.pyc deleted file mode 100644 index 458250eb45b02b4a6e845156f72ff8893eaa1038..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6478 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 diff --git a/venv/lib/python2.7/site-packages/setuptools/msvc.py b/venv/lib/python2.7/site-packages/setuptools/msvc.py deleted file mode 100644 index b9c472f..0000000 --- a/venv/lib/python2.7/site-packages/setuptools/msvc.py +++ /dev/null @@ -1,1301 +0,0 @@ -""" -Improved support for Microsoft Visual C++ compilers. - -Known supported compilers: --------------------------- -Microsoft Visual C++ 9.0: - Microsoft Visual C++ Compiler for Python 2.7 (x86, amd64) - Microsoft Windows SDK 6.1 (x86, x64, ia64) - Microsoft Windows SDK 7.0 (x86, x64, ia64) - -Microsoft Visual C++ 10.0: - Microsoft Windows SDK 7.1 (x86, x64, ia64) - -Microsoft Visual C++ 14.0: - Microsoft Visual C++ Build Tools 2015 (x86, x64, arm) - Microsoft Visual Studio 2017 (x86, x64, arm, arm64) - Microsoft Visual Studio Build Tools 2017 (x86, x64, arm, arm64) -""" - -import os -import sys -import platform -import itertools -import distutils.errors -from setuptools.extern.packaging.version import LegacyVersion - -from setuptools.extern.six.moves import filterfalse - -from .monkey import get_unpatched - -if platform.system() == 'Windows': - from setuptools.extern.six.moves import winreg - safe_env = os.environ -else: - """ - Mock winreg and environ so the module can be imported - on this platform. - """ - - class winreg: - HKEY_USERS = None - HKEY_CURRENT_USER = None - HKEY_LOCAL_MACHINE = None - HKEY_CLASSES_ROOT = None - - safe_env = dict() - -_msvc9_suppress_errors = ( - # msvc9compiler isn't available on some platforms - ImportError, - - # msvc9compiler raises DistutilsPlatformError in some - # environments. See #1118. - distutils.errors.DistutilsPlatformError, -) - -try: - from distutils.msvc9compiler import Reg -except _msvc9_suppress_errors: - pass - - -def msvc9_find_vcvarsall(version): - """ - Patched "distutils.msvc9compiler.find_vcvarsall" to use the standalone - compiler build for Python (VCForPython). Fall back to original behavior - when the standalone compiler is not available. - - Redirect the path of "vcvarsall.bat". - - Known supported compilers - ------------------------- - Microsoft Visual C++ 9.0: - Microsoft Visual C++ Compiler for Python 2.7 (x86, amd64) - - Parameters - ---------- - version: float - Required Microsoft Visual C++ version. - - Return - ------ - vcvarsall.bat path: str - """ - VC_BASE = r'Software\%sMicrosoft\DevDiv\VCForPython\%0.1f' - key = VC_BASE % ('', version) - try: - # Per-user installs register the compiler path here - productdir = Reg.get_value(key, "installdir") - except KeyError: - try: - # All-user installs on a 64-bit system register here - key = VC_BASE % ('Wow6432Node\\', version) - productdir = Reg.get_value(key, "installdir") - except KeyError: - productdir = None - - if productdir: - vcvarsall = os.path.os.path.join(productdir, "vcvarsall.bat") - if os.path.isfile(vcvarsall): - return vcvarsall - - return get_unpatched(msvc9_find_vcvarsall)(version) - - -def msvc9_query_vcvarsall(ver, arch='x86', *args, **kwargs): - """ - Patched "distutils.msvc9compiler.query_vcvarsall" for support extra - compilers. - - Set environment without use of "vcvarsall.bat". - - Known supported compilers - ------------------------- - Microsoft Visual C++ 9.0: - Microsoft Visual C++ Compiler for Python 2.7 (x86, amd64) - Microsoft Windows SDK 6.1 (x86, x64, ia64) - Microsoft Windows SDK 7.0 (x86, x64, ia64) - - Microsoft Visual C++ 10.0: - Microsoft Windows SDK 7.1 (x86, x64, ia64) - - Parameters - ---------- - ver: float - Required Microsoft Visual C++ version. - arch: str - Target architecture. - - Return - ------ - environment: dict - """ - # Try to get environement from vcvarsall.bat (Classical way) - try: - orig = get_unpatched(msvc9_query_vcvarsall) - return orig(ver, arch, *args, **kwargs) - except distutils.errors.DistutilsPlatformError: - # Pass error if Vcvarsall.bat is missing - pass - except ValueError: - # Pass error if environment not set after executing vcvarsall.bat - pass - - # If error, try to set environment directly - try: - return EnvironmentInfo(arch, ver).return_env() - except distutils.errors.DistutilsPlatformError as exc: - _augment_exception(exc, ver, arch) - raise - - -def msvc14_get_vc_env(plat_spec): - """ - Patched "distutils._msvccompiler._get_vc_env" for support extra - compilers. - - Set environment without use of "vcvarsall.bat". - - Known supported compilers - ------------------------- - Microsoft Visual C++ 14.0: - Microsoft Visual C++ Build Tools 2015 (x86, x64, arm) - Microsoft Visual Studio 2017 (x86, x64, arm, arm64) - Microsoft Visual Studio Build Tools 2017 (x86, x64, arm, arm64) - - Parameters - ---------- - plat_spec: str - Target architecture. - - Return - ------ - environment: dict - """ - # Try to get environment from vcvarsall.bat (Classical way) - try: - return get_unpatched(msvc14_get_vc_env)(plat_spec) - except distutils.errors.DistutilsPlatformError: - # Pass error Vcvarsall.bat is missing - pass - - # If error, try to set environment directly - try: - return EnvironmentInfo(plat_spec, vc_min_ver=14.0).return_env() - except distutils.errors.DistutilsPlatformError as exc: - _augment_exception(exc, 14.0) - raise - - -def msvc14_gen_lib_options(*args, **kwargs): - """ - Patched "distutils._msvccompiler.gen_lib_options" for fix - compatibility between "numpy.distutils" and "distutils._msvccompiler" - (for Numpy < 1.11.2) - """ - if "numpy.distutils" in sys.modules: - import numpy as np - if LegacyVersion(np.__version__) < LegacyVersion('1.11.2'): - return np.distutils.ccompiler.gen_lib_options(*args, **kwargs) - return get_unpatched(msvc14_gen_lib_options)(*args, **kwargs) - - -def _augment_exception(exc, version, arch=''): - """ - Add details to the exception message to help guide the user - as to what action will resolve it. - """ - # Error if MSVC++ directory not found or environment not set - message = exc.args[0] - - if "vcvarsall" in message.lower() or "visual c" in message.lower(): - # Special error message if MSVC++ not installed - tmpl = 'Microsoft Visual C++ {version:0.1f} is required.' - message = tmpl.format(**locals()) - msdownload = 'www.microsoft.com/download/details.aspx?id=%d' - if version == 9.0: - if arch.lower().find('ia64') > -1: - # For VC++ 9.0, if IA64 support is needed, redirect user - # to Windows SDK 7.0 - message += ' Get it with "Microsoft Windows SDK 7.0": ' - message += msdownload % 3138 - else: - # For VC++ 9.0 redirect user to Vc++ for Python 2.7 : - # This redirection link is maintained by Microsoft. - # Contact vspython@microsoft.com if it needs updating. - message += ' Get it from http://aka.ms/vcpython27' - elif version == 10.0: - # For VC++ 10.0 Redirect user to Windows SDK 7.1 - message += ' Get it with "Microsoft Windows SDK 7.1": ' - message += msdownload % 8279 - elif version >= 14.0: - # For VC++ 14.0 Redirect user to Visual C++ Build Tools - message += (' Get it with "Microsoft Visual C++ Build Tools": ' - r'https://visualstudio.microsoft.com/downloads/') - - exc.args = (message, ) - - -class PlatformInfo: - """ - Current and Target Architectures informations. - - Parameters - ---------- - arch: str - Target architecture. - """ - current_cpu = safe_env.get('processor_architecture', '').lower() - - def __init__(self, arch): - self.arch = arch.lower().replace('x64', 'amd64') - - @property - def target_cpu(self): - return self.arch[self.arch.find('_') + 1:] - - def target_is_x86(self): - return self.target_cpu == 'x86' - - def current_is_x86(self): - return self.current_cpu == 'x86' - - def current_dir(self, hidex86=False, x64=False): - """ - Current platform specific subfolder. - - Parameters - ---------- - hidex86: bool - return '' and not '\x86' if architecture is x86. - x64: bool - return '\x64' and not '\amd64' if architecture is amd64. - - Return - ------ - subfolder: str - '\target', or '' (see hidex86 parameter) - """ - return ( - '' if (self.current_cpu == 'x86' and hidex86) else - r'\x64' if (self.current_cpu == 'amd64' and x64) else - r'\%s' % self.current_cpu - ) - - def target_dir(self, hidex86=False, x64=False): - r""" - Target platform specific subfolder. - - Parameters - ---------- - hidex86: bool - return '' and not '\x86' if architecture is x86. - x64: bool - return '\x64' and not '\amd64' if architecture is amd64. - - Return - ------ - subfolder: str - '\current', or '' (see hidex86 parameter) - """ - return ( - '' if (self.target_cpu == 'x86' and hidex86) else - r'\x64' if (self.target_cpu == 'amd64' and x64) else - r'\%s' % self.target_cpu - ) - - def cross_dir(self, forcex86=False): - r""" - Cross platform specific subfolder. - - Parameters - ---------- - forcex86: bool - Use 'x86' as current architecture even if current acritecture is - not x86. - - Return - ------ - subfolder: str - '' if target architecture is current architecture, - '\current_target' if not. - """ - current = 'x86' if forcex86 else self.current_cpu - return ( - '' if self.target_cpu == current else - self.target_dir().replace('\\', '\\%s_' % current) - ) - - -class RegistryInfo: - """ - Microsoft Visual Studio related registry informations. - - Parameters - ---------- - platform_info: PlatformInfo - "PlatformInfo" instance. - """ - HKEYS = (winreg.HKEY_USERS, - winreg.HKEY_CURRENT_USER, - winreg.HKEY_LOCAL_MACHINE, - winreg.HKEY_CLASSES_ROOT) - - def __init__(self, platform_info): - self.pi = platform_info - - @property - def visualstudio(self): - """ - Microsoft Visual Studio root registry key. - """ - return 'VisualStudio' - - @property - def sxs(self): - """ - Microsoft Visual Studio SxS registry key. - """ - return os.path.join(self.visualstudio, 'SxS') - - @property - def vc(self): - """ - Microsoft Visual C++ VC7 registry key. - """ - return os.path.join(self.sxs, 'VC7') - - @property - def vs(self): - """ - Microsoft Visual Studio VS7 registry key. - """ - return os.path.join(self.sxs, 'VS7') - - @property - def vc_for_python(self): - """ - Microsoft Visual C++ for Python registry key. - """ - return r'DevDiv\VCForPython' - - @property - def microsoft_sdk(self): - """ - Microsoft SDK registry key. - """ - return 'Microsoft SDKs' - - @property - def windows_sdk(self): - """ - Microsoft Windows/Platform SDK registry key. - """ - return os.path.join(self.microsoft_sdk, 'Windows') - - @property - def netfx_sdk(self): - """ - Microsoft .NET Framework SDK registry key. - """ - return os.path.join(self.microsoft_sdk, 'NETFXSDK') - - @property - def windows_kits_roots(self): - """ - Microsoft Windows Kits Roots registry key. - """ - return r'Windows Kits\Installed Roots' - - def microsoft(self, key, x86=False): - """ - Return key in Microsoft software registry. - - Parameters - ---------- - key: str - Registry key path where look. - x86: str - Force x86 software registry. - - Return - ------ - str: value - """ - node64 = '' if self.pi.current_is_x86() or x86 else 'Wow6432Node' - return os.path.join('Software', node64, 'Microsoft', key) - - def lookup(self, key, name): - """ - Look for values in registry in Microsoft software registry. - - Parameters - ---------- - key: str - Registry key path where look. - name: str - Value name to find. - - Return - ------ - str: value - """ - KEY_READ = winreg.KEY_READ - openkey = winreg.OpenKey - ms = self.microsoft - for hkey in self.HKEYS: - try: - bkey = openkey(hkey, ms(key), 0, KEY_READ) - except (OSError, IOError): - if not self.pi.current_is_x86(): - try: - bkey = openkey(hkey, ms(key, True), 0, KEY_READ) - except (OSError, IOError): - continue - else: - continue - try: - return winreg.QueryValueEx(bkey, name)[0] - except (OSError, IOError): - pass - - -class SystemInfo: - """ - Microsoft Windows and Visual Studio related system inormations. - - Parameters - ---------- - registry_info: RegistryInfo - "RegistryInfo" instance. - vc_ver: float - Required Microsoft Visual C++ version. - """ - - # Variables and properties in this class use originals CamelCase variables - # names from Microsoft source files for more easy comparaison. - WinDir = safe_env.get('WinDir', '') - ProgramFiles = safe_env.get('ProgramFiles', '') - ProgramFilesx86 = safe_env.get('ProgramFiles(x86)', ProgramFiles) - - def __init__(self, registry_info, vc_ver=None): - self.ri = registry_info - self.pi = self.ri.pi - self.vc_ver = vc_ver or self._find_latest_available_vc_ver() - - def _find_latest_available_vc_ver(self): - try: - return self.find_available_vc_vers()[-1] - except IndexError: - err = 'No Microsoft Visual C++ version found' - raise distutils.errors.DistutilsPlatformError(err) - - def find_available_vc_vers(self): - """ - Find all available Microsoft Visual C++ versions. - """ - ms = self.ri.microsoft - vckeys = (self.ri.vc, self.ri.vc_for_python, self.ri.vs) - vc_vers = [] - for hkey in self.ri.HKEYS: - for key in vckeys: - try: - bkey = winreg.OpenKey(hkey, ms(key), 0, winreg.KEY_READ) - except (OSError, IOError): - continue - subkeys, values, _ = winreg.QueryInfoKey(bkey) - for i in range(values): - try: - ver = float(winreg.EnumValue(bkey, i)[0]) - if ver not in vc_vers: - vc_vers.append(ver) - except ValueError: - pass - for i in range(subkeys): - try: - ver = float(winreg.EnumKey(bkey, i)) - if ver not in vc_vers: - vc_vers.append(ver) - except ValueError: - pass - return sorted(vc_vers) - - @property - def VSInstallDir(self): - """ - Microsoft Visual Studio directory. - """ - # Default path - name = 'Microsoft Visual Studio %0.1f' % self.vc_ver - default = os.path.join(self.ProgramFilesx86, name) - - # Try to get path from registry, if fail use default path - return self.ri.lookup(self.ri.vs, '%0.1f' % self.vc_ver) or default - - @property - def VCInstallDir(self): - """ - Microsoft Visual C++ directory. - """ - self.VSInstallDir - - guess_vc = self._guess_vc() or self._guess_vc_legacy() - - # Try to get "VC++ for Python" path from registry as default path - reg_path = os.path.join(self.ri.vc_for_python, '%0.1f' % self.vc_ver) - python_vc = self.ri.lookup(reg_path, 'installdir') - default_vc = os.path.join(python_vc, 'VC') if python_vc else guess_vc - - # Try to get path from registry, if fail use default path - path = self.ri.lookup(self.ri.vc, '%0.1f' % self.vc_ver) or default_vc - - if not os.path.isdir(path): - msg = 'Microsoft Visual C++ directory not found' - raise distutils.errors.DistutilsPlatformError(msg) - - return path - - def _guess_vc(self): - """ - Locate Visual C for 2017 - """ - if self.vc_ver <= 14.0: - return - - default = r'VC\Tools\MSVC' - guess_vc = os.path.join(self.VSInstallDir, default) - # Subdir with VC exact version as name - try: - vc_exact_ver = os.listdir(guess_vc)[-1] - return os.path.join(guess_vc, vc_exact_ver) - except (OSError, IOError, IndexError): - pass - - def _guess_vc_legacy(self): - """ - Locate Visual C for versions prior to 2017 - """ - default = r'Microsoft Visual Studio %0.1f\VC' % self.vc_ver - return os.path.join(self.ProgramFilesx86, default) - - @property - def WindowsSdkVersion(self): - """ - Microsoft Windows SDK versions for specified MSVC++ version. - """ - if self.vc_ver <= 9.0: - return ('7.0', '6.1', '6.0a') - elif self.vc_ver == 10.0: - return ('7.1', '7.0a') - elif self.vc_ver == 11.0: - return ('8.0', '8.0a') - elif self.vc_ver == 12.0: - return ('8.1', '8.1a') - elif self.vc_ver >= 14.0: - return ('10.0', '8.1') - - @property - def WindowsSdkLastVersion(self): - """ - Microsoft Windows SDK last version - """ - return self._use_last_dir_name(os.path.join( - self.WindowsSdkDir, 'lib')) - - @property - def WindowsSdkDir(self): - """ - Microsoft Windows SDK directory. - """ - sdkdir = '' - for ver in self.WindowsSdkVersion: - # Try to get it from registry - loc = os.path.join(self.ri.windows_sdk, 'v%s' % ver) - sdkdir = self.ri.lookup(loc, 'installationfolder') - if sdkdir: - break - if not sdkdir or not os.path.isdir(sdkdir): - # Try to get "VC++ for Python" version from registry - path = os.path.join(self.ri.vc_for_python, '%0.1f' % self.vc_ver) - install_base = self.ri.lookup(path, 'installdir') - if install_base: - sdkdir = os.path.join(install_base, 'WinSDK') - if not sdkdir or not os.path.isdir(sdkdir): - # If fail, use default new path - for ver in self.WindowsSdkVersion: - intver = ver[:ver.rfind('.')] - path = r'Microsoft SDKs\Windows Kits\%s' % (intver) - d = os.path.join(self.ProgramFiles, path) - if os.path.isdir(d): - sdkdir = d - if not sdkdir or not os.path.isdir(sdkdir): - # If fail, use default old path - for ver in self.WindowsSdkVersion: - path = r'Microsoft SDKs\Windows\v%s' % ver - d = os.path.join(self.ProgramFiles, path) - if os.path.isdir(d): - sdkdir = d - if not sdkdir: - # If fail, use Platform SDK - sdkdir = os.path.join(self.VCInstallDir, 'PlatformSDK') - return sdkdir - - @property - def WindowsSDKExecutablePath(self): - """ - Microsoft Windows SDK executable directory. - """ - # Find WinSDK NetFx Tools registry dir name - if self.vc_ver <= 11.0: - netfxver = 35 - arch = '' - else: - netfxver = 40 - hidex86 = True if self.vc_ver <= 12.0 else False - arch = self.pi.current_dir(x64=True, hidex86=hidex86) - fx = 'WinSDK-NetFx%dTools%s' % (netfxver, arch.replace('\\', '-')) - - # liste all possibles registry paths - regpaths = [] - if self.vc_ver >= 14.0: - for ver in self.NetFxSdkVersion: - regpaths += [os.path.join(self.ri.netfx_sdk, ver, fx)] - - for ver in self.WindowsSdkVersion: - regpaths += [os.path.join(self.ri.windows_sdk, 'v%sA' % ver, fx)] - - # Return installation folder from the more recent path - for path in regpaths: - execpath = self.ri.lookup(path, 'installationfolder') - if execpath: - break - return execpath - - @property - def FSharpInstallDir(self): - """ - Microsoft Visual F# directory. - """ - path = r'%0.1f\Setup\F#' % self.vc_ver - path = os.path.join(self.ri.visualstudio, path) - return self.ri.lookup(path, 'productdir') or '' - - @property - def UniversalCRTSdkDir(self): - """ - Microsoft Universal CRT SDK directory. - """ - # Set Kit Roots versions for specified MSVC++ version - if self.vc_ver >= 14.0: - vers = ('10', '81') - else: - vers = () - - # Find path of the more recent Kit - for ver in vers: - sdkdir = self.ri.lookup(self.ri.windows_kits_roots, - 'kitsroot%s' % ver) - if sdkdir: - break - return sdkdir or '' - - @property - def UniversalCRTSdkLastVersion(self): - """ - Microsoft Universal C Runtime SDK last version - """ - return self._use_last_dir_name(os.path.join( - self.UniversalCRTSdkDir, 'lib')) - - @property - def NetFxSdkVersion(self): - """ - Microsoft .NET Framework SDK versions. - """ - # Set FxSdk versions for specified MSVC++ version - if self.vc_ver >= 14.0: - return ('4.6.1', '4.6') - else: - return () - - @property - def NetFxSdkDir(self): - """ - Microsoft .NET Framework SDK directory. - """ - for ver in self.NetFxSdkVersion: - loc = os.path.join(self.ri.netfx_sdk, ver) - sdkdir = self.ri.lookup(loc, 'kitsinstallationfolder') - if sdkdir: - break - return sdkdir or '' - - @property - def FrameworkDir32(self): - """ - Microsoft .NET Framework 32bit directory. - """ - # Default path - guess_fw = os.path.join(self.WinDir, r'Microsoft.NET\Framework') - - # Try to get path from registry, if fail use default path - return self.ri.lookup(self.ri.vc, 'frameworkdir32') or guess_fw - - @property - def FrameworkDir64(self): - """ - Microsoft .NET Framework 64bit directory. - """ - # Default path - guess_fw = os.path.join(self.WinDir, r'Microsoft.NET\Framework64') - - # Try to get path from registry, if fail use default path - return self.ri.lookup(self.ri.vc, 'frameworkdir64') or guess_fw - - @property - def FrameworkVersion32(self): - """ - Microsoft .NET Framework 32bit versions. - """ - return self._find_dot_net_versions(32) - - @property - def FrameworkVersion64(self): - """ - Microsoft .NET Framework 64bit versions. - """ - return self._find_dot_net_versions(64) - - def _find_dot_net_versions(self, bits): - """ - Find Microsoft .NET Framework versions. - - Parameters - ---------- - bits: int - Platform number of bits: 32 or 64. - """ - # Find actual .NET version in registry - reg_ver = self.ri.lookup(self.ri.vc, 'frameworkver%d' % bits) - dot_net_dir = getattr(self, 'FrameworkDir%d' % bits) - ver = reg_ver or self._use_last_dir_name(dot_net_dir, 'v') or '' - - # Set .NET versions for specified MSVC++ version - if self.vc_ver >= 12.0: - frameworkver = (ver, 'v4.0') - elif self.vc_ver >= 10.0: - frameworkver = ('v4.0.30319' if ver.lower()[:2] != 'v4' else ver, - 'v3.5') - elif self.vc_ver == 9.0: - frameworkver = ('v3.5', 'v2.0.50727') - if self.vc_ver == 8.0: - frameworkver = ('v3.0', 'v2.0.50727') - return frameworkver - - def _use_last_dir_name(self, path, prefix=''): - """ - Return name of the last dir in path or '' if no dir found. - - Parameters - ---------- - path: str - Use dirs in this path - prefix: str - Use only dirs startings by this prefix - """ - matching_dirs = ( - dir_name - for dir_name in reversed(os.listdir(path)) - if os.path.isdir(os.path.join(path, dir_name)) and - dir_name.startswith(prefix) - ) - return next(matching_dirs, None) or '' - - -class EnvironmentInfo: - """ - Return environment variables for specified Microsoft Visual C++ version - and platform : Lib, Include, Path and libpath. - - This function is compatible with Microsoft Visual C++ 9.0 to 14.0. - - Script created by analysing Microsoft environment configuration files like - "vcvars[...].bat", "SetEnv.Cmd", "vcbuildtools.bat", ... - - Parameters - ---------- - arch: str - Target architecture. - vc_ver: float - Required Microsoft Visual C++ version. If not set, autodetect the last - version. - vc_min_ver: float - Minimum Microsoft Visual C++ version. - """ - - # Variables and properties in this class use originals CamelCase variables - # names from Microsoft source files for more easy comparaison. - - def __init__(self, arch, vc_ver=None, vc_min_ver=0): - self.pi = PlatformInfo(arch) - self.ri = RegistryInfo(self.pi) - self.si = SystemInfo(self.ri, vc_ver) - - if self.vc_ver < vc_min_ver: - err = 'No suitable Microsoft Visual C++ version found' - raise distutils.errors.DistutilsPlatformError(err) - - @property - def vc_ver(self): - """ - Microsoft Visual C++ version. - """ - return self.si.vc_ver - - @property - def VSTools(self): - """ - Microsoft Visual Studio Tools - """ - paths = [r'Common7\IDE', r'Common7\Tools'] - - if self.vc_ver >= 14.0: - arch_subdir = self.pi.current_dir(hidex86=True, x64=True) - paths += [r'Common7\IDE\CommonExtensions\Microsoft\TestWindow'] - paths += [r'Team Tools\Performance Tools'] - paths += [r'Team Tools\Performance Tools%s' % arch_subdir] - - return [os.path.join(self.si.VSInstallDir, path) for path in paths] - - @property - def VCIncludes(self): - """ - Microsoft Visual C++ & Microsoft Foundation Class Includes - """ - return [os.path.join(self.si.VCInstallDir, 'Include'), - os.path.join(self.si.VCInstallDir, r'ATLMFC\Include')] - - @property - def VCLibraries(self): - """ - Microsoft Visual C++ & Microsoft Foundation Class Libraries - """ - if self.vc_ver >= 15.0: - arch_subdir = self.pi.target_dir(x64=True) - else: - arch_subdir = self.pi.target_dir(hidex86=True) - paths = ['Lib%s' % arch_subdir, r'ATLMFC\Lib%s' % arch_subdir] - - if self.vc_ver >= 14.0: - paths += [r'Lib\store%s' % arch_subdir] - - return [os.path.join(self.si.VCInstallDir, path) for path in paths] - - @property - def VCStoreRefs(self): - """ - Microsoft Visual C++ store references Libraries - """ - if self.vc_ver < 14.0: - return [] - return [os.path.join(self.si.VCInstallDir, r'Lib\store\references')] - - @property - def VCTools(self): - """ - Microsoft Visual C++ Tools - """ - si = self.si - tools = [os.path.join(si.VCInstallDir, 'VCPackages')] - - forcex86 = True if self.vc_ver <= 10.0 else False - arch_subdir = self.pi.cross_dir(forcex86) - if arch_subdir: - tools += [os.path.join(si.VCInstallDir, 'Bin%s' % arch_subdir)] - - if self.vc_ver == 14.0: - path = 'Bin%s' % self.pi.current_dir(hidex86=True) - tools += [os.path.join(si.VCInstallDir, path)] - - elif self.vc_ver >= 15.0: - host_dir = (r'bin\HostX86%s' if self.pi.current_is_x86() else - r'bin\HostX64%s') - tools += [os.path.join( - si.VCInstallDir, host_dir % self.pi.target_dir(x64=True))] - - if self.pi.current_cpu != self.pi.target_cpu: - tools += [os.path.join( - si.VCInstallDir, host_dir % self.pi.current_dir(x64=True))] - - else: - tools += [os.path.join(si.VCInstallDir, 'Bin')] - - return tools - - @property - def OSLibraries(self): - """ - Microsoft Windows SDK Libraries - """ - if self.vc_ver <= 10.0: - arch_subdir = self.pi.target_dir(hidex86=True, x64=True) - return [os.path.join(self.si.WindowsSdkDir, 'Lib%s' % arch_subdir)] - - else: - arch_subdir = self.pi.target_dir(x64=True) - lib = os.path.join(self.si.WindowsSdkDir, 'lib') - libver = self._sdk_subdir - return [os.path.join(lib, '%sum%s' % (libver , arch_subdir))] - - @property - def OSIncludes(self): - """ - Microsoft Windows SDK Include - """ - include = os.path.join(self.si.WindowsSdkDir, 'include') - - if self.vc_ver <= 10.0: - return [include, os.path.join(include, 'gl')] - - else: - if self.vc_ver >= 14.0: - sdkver = self._sdk_subdir - else: - sdkver = '' - return [os.path.join(include, '%sshared' % sdkver), - os.path.join(include, '%sum' % sdkver), - os.path.join(include, '%swinrt' % sdkver)] - - @property - def OSLibpath(self): - """ - Microsoft Windows SDK Libraries Paths - """ - ref = os.path.join(self.si.WindowsSdkDir, 'References') - libpath = [] - - if self.vc_ver <= 9.0: - libpath += self.OSLibraries - - if self.vc_ver >= 11.0: - libpath += [os.path.join(ref, r'CommonConfiguration\Neutral')] - - if self.vc_ver >= 14.0: - libpath += [ - ref, - os.path.join(self.si.WindowsSdkDir, 'UnionMetadata'), - os.path.join( - ref, - 'Windows.Foundation.UniversalApiContract', - '1.0.0.0', - ), - os.path.join( - ref, - 'Windows.Foundation.FoundationContract', - '1.0.0.0', - ), - os.path.join( - ref, - 'Windows.Networking.Connectivity.WwanContract', - '1.0.0.0', - ), - os.path.join( - self.si.WindowsSdkDir, - 'ExtensionSDKs', - 'Microsoft.VCLibs', - '%0.1f' % self.vc_ver, - 'References', - 'CommonConfiguration', - 'neutral', - ), - ] - return libpath - - @property - def SdkTools(self): - """ - Microsoft Windows SDK Tools - """ - return list(self._sdk_tools()) - - def _sdk_tools(self): - """ - Microsoft Windows SDK Tools paths generator - """ - if self.vc_ver < 15.0: - bin_dir = 'Bin' if self.vc_ver <= 11.0 else r'Bin\x86' - yield os.path.join(self.si.WindowsSdkDir, bin_dir) - - if not self.pi.current_is_x86(): - arch_subdir = self.pi.current_dir(x64=True) - path = 'Bin%s' % arch_subdir - yield os.path.join(self.si.WindowsSdkDir, path) - - if self.vc_ver == 10.0 or self.vc_ver == 11.0: - if self.pi.target_is_x86(): - arch_subdir = '' - else: - arch_subdir = self.pi.current_dir(hidex86=True, x64=True) - path = r'Bin\NETFX 4.0 Tools%s' % arch_subdir - yield os.path.join(self.si.WindowsSdkDir, path) - - elif self.vc_ver >= 15.0: - path = os.path.join(self.si.WindowsSdkDir, 'Bin') - arch_subdir = self.pi.current_dir(x64=True) - sdkver = self.si.WindowsSdkLastVersion - yield os.path.join(path, '%s%s' % (sdkver, arch_subdir)) - - if self.si.WindowsSDKExecutablePath: - yield self.si.WindowsSDKExecutablePath - - @property - def _sdk_subdir(self): - """ - Microsoft Windows SDK version subdir - """ - ucrtver = self.si.WindowsSdkLastVersion - return ('%s\\' % ucrtver) if ucrtver else '' - - @property - def SdkSetup(self): - """ - Microsoft Windows SDK Setup - """ - if self.vc_ver > 9.0: - return [] - - return [os.path.join(self.si.WindowsSdkDir, 'Setup')] - - @property - def FxTools(self): - """ - Microsoft .NET Framework Tools - """ - pi = self.pi - si = self.si - - if self.vc_ver <= 10.0: - include32 = True - include64 = not pi.target_is_x86() and not pi.current_is_x86() - else: - include32 = pi.target_is_x86() or pi.current_is_x86() - include64 = pi.current_cpu == 'amd64' or pi.target_cpu == 'amd64' - - tools = [] - if include32: - tools += [os.path.join(si.FrameworkDir32, ver) - for ver in si.FrameworkVersion32] - if include64: - tools += [os.path.join(si.FrameworkDir64, ver) - for ver in si.FrameworkVersion64] - return tools - - @property - def NetFxSDKLibraries(self): - """ - Microsoft .Net Framework SDK Libraries - """ - if self.vc_ver < 14.0 or not self.si.NetFxSdkDir: - return [] - - arch_subdir = self.pi.target_dir(x64=True) - return [os.path.join(self.si.NetFxSdkDir, r'lib\um%s' % arch_subdir)] - - @property - def NetFxSDKIncludes(self): - """ - Microsoft .Net Framework SDK Includes - """ - if self.vc_ver < 14.0 or not self.si.NetFxSdkDir: - return [] - - return [os.path.join(self.si.NetFxSdkDir, r'include\um')] - - @property - def VsTDb(self): - """ - Microsoft Visual Studio Team System Database - """ - return [os.path.join(self.si.VSInstallDir, r'VSTSDB\Deploy')] - - @property - def MSBuild(self): - """ - Microsoft Build Engine - """ - if self.vc_ver < 12.0: - return [] - elif self.vc_ver < 15.0: - base_path = self.si.ProgramFilesx86 - arch_subdir = self.pi.current_dir(hidex86=True) - else: - base_path = self.si.VSInstallDir - arch_subdir = '' - - path = r'MSBuild\%0.1f\bin%s' % (self.vc_ver, arch_subdir) - build = [os.path.join(base_path, path)] - - if self.vc_ver >= 15.0: - # Add Roslyn C# & Visual Basic Compiler - build += [os.path.join(base_path, path, 'Roslyn')] - - return build - - @property - def HTMLHelpWorkshop(self): - """ - Microsoft HTML Help Workshop - """ - if self.vc_ver < 11.0: - return [] - - return [os.path.join(self.si.ProgramFilesx86, 'HTML Help Workshop')] - - @property - def UCRTLibraries(self): - """ - Microsoft Universal C Runtime SDK Libraries - """ - if self.vc_ver < 14.0: - return [] - - arch_subdir = self.pi.target_dir(x64=True) - lib = os.path.join(self.si.UniversalCRTSdkDir, 'lib') - ucrtver = self._ucrt_subdir - return [os.path.join(lib, '%sucrt%s' % (ucrtver, arch_subdir))] - - @property - def UCRTIncludes(self): - """ - Microsoft Universal C Runtime SDK Include - """ - if self.vc_ver < 14.0: - return [] - - include = os.path.join(self.si.UniversalCRTSdkDir, 'include') - return [os.path.join(include, '%sucrt' % self._ucrt_subdir)] - - @property - def _ucrt_subdir(self): - """ - Microsoft Universal C Runtime SDK version subdir - """ - ucrtver = self.si.UniversalCRTSdkLastVersion - return ('%s\\' % ucrtver) if ucrtver else '' - - @property - def FSharp(self): - """ - Microsoft Visual F# - """ - if self.vc_ver < 11.0 and self.vc_ver > 12.0: - return [] - - return self.si.FSharpInstallDir - - @property - def VCRuntimeRedist(self): - """ - Microsoft Visual C++ runtime redistribuable dll - """ - arch_subdir = self.pi.target_dir(x64=True) - if self.vc_ver < 15: - redist_path = self.si.VCInstallDir - vcruntime = 'redist%s\\Microsoft.VC%d0.CRT\\vcruntime%d0.dll' - else: - redist_path = self.si.VCInstallDir.replace('\\Tools', '\\Redist') - vcruntime = 'onecore%s\\Microsoft.VC%d0.CRT\\vcruntime%d0.dll' - - # Visual Studio 2017 is still Visual C++ 14.0 - dll_ver = 14.0 if self.vc_ver == 15 else self.vc_ver - - vcruntime = vcruntime % (arch_subdir, self.vc_ver, dll_ver) - return os.path.join(redist_path, vcruntime) - - def return_env(self, exists=True): - """ - Return environment dict. - - Parameters - ---------- - exists: bool - It True, only return existing paths. - """ - env = dict( - include=self._build_paths('include', - [self.VCIncludes, - self.OSIncludes, - self.UCRTIncludes, - self.NetFxSDKIncludes], - exists), - lib=self._build_paths('lib', - [self.VCLibraries, - self.OSLibraries, - self.FxTools, - self.UCRTLibraries, - self.NetFxSDKLibraries], - exists), - libpath=self._build_paths('libpath', - [self.VCLibraries, - self.FxTools, - self.VCStoreRefs, - self.OSLibpath], - exists), - path=self._build_paths('path', - [self.VCTools, - self.VSTools, - self.VsTDb, - self.SdkTools, - self.SdkSetup, - self.FxTools, - self.MSBuild, - self.HTMLHelpWorkshop, - self.FSharp], - exists), - ) - if self.vc_ver >= 14 and os.path.isfile(self.VCRuntimeRedist): - env['py_vcruntime_redist'] = self.VCRuntimeRedist - return env - - def _build_paths(self, name, spec_path_lists, exists): - """ - Given an environment variable name and specified paths, - return a pathsep-separated string of paths containing - unique, extant, directories from those paths and from - the environment variable. Raise an error if no paths - are resolved. - """ - # flatten spec_path_lists - spec_paths = itertools.chain.from_iterable(spec_path_lists) - env_paths = safe_env.get(name, '').split(os.pathsep) - paths = itertools.chain(spec_paths, env_paths) - extant_paths = list(filter(os.path.isdir, paths)) if exists else paths - if not extant_paths: - msg = "%s environment variable is empty" % name.upper() - raise distutils.errors.DistutilsPlatformError(msg) - unique_paths = self._unique_everseen(extant_paths) - return os.pathsep.join(unique_paths) - - # from Python docs - def _unique_everseen(self, iterable, key=None): - """ - List unique elements, preserving order. - Remember all elements ever seen. - - _unique_everseen('AAAABBBCCDAABBB') --> A B C D - - _unique_everseen('ABBCcAD', str.lower) --> A B C D - """ - seen = set() - seen_add = seen.add - if key is None: - for element in filterfalse(seen.__contains__, iterable): - seen_add(element) - yield element - else: - for element in iterable: - k = key(element) - if k not in seen: - seen_add(k) - yield element diff --git a/venv/lib/python2.7/site-packages/setuptools/msvc.pyc b/venv/lib/python2.7/site-packages/setuptools/msvc.pyc deleted file mode 100644 index e4967edca8002f18c3f3b1d26e032ccd21bb8563..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44716 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 diff --git a/venv/lib/python2.7/site-packages/setuptools/namespaces.py b/venv/lib/python2.7/site-packages/setuptools/namespaces.py deleted file mode 100644 index dc16106..0000000 --- a/venv/lib/python2.7/site-packages/setuptools/namespaces.py +++ /dev/null @@ -1,107 +0,0 @@ -import os -from distutils import log -import itertools - -from setuptools.extern.six.moves import map - - -flatten = itertools.chain.from_iterable - - -class Installer: - - nspkg_ext = '-nspkg.pth' - - def install_namespaces(self): - nsp = self._get_all_ns_packages() - if not nsp: - return - filename, ext = os.path.splitext(self._get_target()) - filename += self.nspkg_ext - self.outputs.append(filename) - log.info("Installing %s", filename) - lines = map(self._gen_nspkg_line, nsp) - - if self.dry_run: - # always generate the lines, even in dry run - list(lines) - return - - with open(filename, 'wt') as f: - f.writelines(lines) - - def uninstall_namespaces(self): - filename, ext = os.path.splitext(self._get_target()) - filename += self.nspkg_ext - if not os.path.exists(filename): - return - log.info("Removing %s", filename) - os.remove(filename) - - def _get_target(self): - return self.target - - _nspkg_tmpl = ( - "import sys, types, os", - "has_mfs = sys.version_info > (3, 5)", - "p = os.path.join(%(root)s, *%(pth)r)", - "importlib = has_mfs and __import__('importlib.util')", - "has_mfs and __import__('importlib.machinery')", - "m = has_mfs and " - "sys.modules.setdefault(%(pkg)r, " - "importlib.util.module_from_spec(" - "importlib.machinery.PathFinder.find_spec(%(pkg)r, " - "[os.path.dirname(p)])))", - "m = m or " - "sys.modules.setdefault(%(pkg)r, types.ModuleType(%(pkg)r))", - "mp = (m or []) and m.__dict__.setdefault('__path__',[])", - "(p not in mp) and mp.append(p)", - ) - "lines for the namespace installer" - - _nspkg_tmpl_multi = ( - 'm and setattr(sys.modules[%(parent)r], %(child)r, m)', - ) - "additional line(s) when a parent package is indicated" - - def _get_root(self): - return "sys._getframe(1).f_locals['sitedir']" - - def _gen_nspkg_line(self, pkg): - # ensure pkg is not a unicode string under Python 2.7 - pkg = str(pkg) - pth = tuple(pkg.split('.')) - root = self._get_root() - tmpl_lines = self._nspkg_tmpl - parent, sep, child = pkg.rpartition('.') - if parent: - tmpl_lines += self._nspkg_tmpl_multi - return ';'.join(tmpl_lines) % locals() + '\n' - - def _get_all_ns_packages(self): - """Return sorted list of all package namespaces""" - pkgs = self.distribution.namespace_packages or [] - return sorted(flatten(map(self._pkg_names, pkgs))) - - @staticmethod - def _pkg_names(pkg): - """ - Given a namespace package, yield the components of that - package. - - >>> names = Installer._pkg_names('a.b.c') - >>> set(names) == set(['a', 'a.b', 'a.b.c']) - True - """ - parts = pkg.split('.') - while parts: - yield '.'.join(parts) - parts.pop() - - -class DevelopInstaller(Installer): - def _get_root(self): - return repr(str(self.egg_path)) - - def _get_target(self): - return self.egg_link diff --git a/venv/lib/python2.7/site-packages/setuptools/namespaces.pyc b/venv/lib/python2.7/site-packages/setuptools/namespaces.pyc deleted file mode 100644 index 9fc8d26e3a6e7b67acc87e749adec100dd57247f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5681 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 GclaMb1)kpk diff --git a/venv/lib/python2.7/site-packages/setuptools/package_index.py b/venv/lib/python2.7/site-packages/setuptools/package_index.py deleted file mode 100644 index 6b06f2c..0000000 --- a/venv/lib/python2.7/site-packages/setuptools/package_index.py +++ /dev/null @@ -1,1136 +0,0 @@ -"""PyPI and direct package downloading""" -import sys -import os -import re -import shutil -import socket -import base64 -import hashlib -import itertools -import warnings -from functools import wraps - -from setuptools.extern import six -from setuptools.extern.six.moves import urllib, http_client, configparser, map - -import setuptools -from pkg_resources import ( - CHECKOUT_DIST, Distribution, BINARY_DIST, normalize_path, SOURCE_DIST, - Environment, find_distributions, safe_name, safe_version, - to_filename, Requirement, DEVELOP_DIST, EGG_DIST, -) -from setuptools import ssl_support -from distutils import log -from distutils.errors import DistutilsError -from fnmatch import translate -from setuptools.py27compat import get_all_headers -from setuptools.py33compat import unescape -from setuptools.wheel import Wheel - -__metaclass__ = type - -EGG_FRAGMENT = re.compile(r'^egg=([-A-Za-z0-9_.+!]+)$') -HREF = re.compile(r"""href\s*=\s*['"]?([^'"> ]+)""", re.I) -PYPI_MD5 = re.compile( - r'<a href="([^"#]+)">([^<]+)</a>\n\s+\(<a (?:title="MD5 hash"\n\s+)' - r'href="[^?]+\?:action=show_md5&digest=([0-9a-f]{32})">md5</a>\)' -) -URL_SCHEME = re.compile('([-+.a-z0-9]{2,}):', re.I).match -EXTENSIONS = ".tar.gz .tar.bz2 .tar .zip .tgz".split() - -__all__ = [ - 'PackageIndex', 'distros_for_url', 'parse_bdist_wininst', - 'interpret_distro_name', -] - -_SOCKET_TIMEOUT = 15 - -_tmpl = "setuptools/{setuptools.__version__} Python-urllib/{py_major}" -user_agent = _tmpl.format(py_major=sys.version[:3], setuptools=setuptools) - - -def parse_requirement_arg(spec): - try: - return Requirement.parse(spec) - except ValueError: - raise DistutilsError( - "Not a URL, existing file, or requirement spec: %r" % (spec,) - ) - - -def parse_bdist_wininst(name): - """Return (base,pyversion) or (None,None) for possible .exe name""" - - lower = name.lower() - base, py_ver, plat = None, None, None - - if lower.endswith('.exe'): - if lower.endswith('.win32.exe'): - base = name[:-10] - plat = 'win32' - elif lower.startswith('.win32-py', -16): - py_ver = name[-7:-4] - base = name[:-16] - plat = 'win32' - elif lower.endswith('.win-amd64.exe'): - base = name[:-14] - plat = 'win-amd64' - elif lower.startswith('.win-amd64-py', -20): - py_ver = name[-7:-4] - base = name[:-20] - plat = 'win-amd64' - return base, py_ver, plat - - -def egg_info_for_url(url): - parts = urllib.parse.urlparse(url) - scheme, server, path, parameters, query, fragment = parts - base = urllib.parse.unquote(path.split('/')[-1]) - if server == 'sourceforge.net' and base == 'download': # XXX Yuck - base = urllib.parse.unquote(path.split('/')[-2]) - if '#' in base: - base, fragment = base.split('#', 1) - return base, fragment - - -def distros_for_url(url, metadata=None): - """Yield egg or source distribution objects that might be found at a URL""" - base, fragment = egg_info_for_url(url) - for dist in distros_for_location(url, base, metadata): - yield dist - if fragment: - match = EGG_FRAGMENT.match(fragment) - if match: - for dist in interpret_distro_name( - url, match.group(1), metadata, precedence=CHECKOUT_DIST - ): - yield dist - - -def distros_for_location(location, basename, metadata=None): - """Yield egg or source distribution objects based on basename""" - if basename.endswith('.egg.zip'): - basename = basename[:-4] # strip the .zip - if basename.endswith('.egg') and '-' in basename: - # only one, unambiguous interpretation - return [Distribution.from_location(location, basename, metadata)] - if basename.endswith('.whl') and '-' in basename: - wheel = Wheel(basename) - if not wheel.is_compatible(): - return [] - return [Distribution( - location=location, - project_name=wheel.project_name, - version=wheel.version, - # Increase priority over eggs. - precedence=EGG_DIST + 1, - )] - if basename.endswith('.exe'): - win_base, py_ver, platform = parse_bdist_wininst(basename) - if win_base is not None: - return interpret_distro_name( - location, win_base, metadata, py_ver, BINARY_DIST, platform - ) - # Try source distro extensions (.zip, .tgz, etc.) - # - for ext in EXTENSIONS: - if basename.endswith(ext): - basename = basename[:-len(ext)] - return interpret_distro_name(location, basename, metadata) - return [] # no extension matched - - -def distros_for_filename(filename, metadata=None): - """Yield possible egg or source distribution objects based on a filename""" - return distros_for_location( - normalize_path(filename), os.path.basename(filename), metadata - ) - - -def interpret_distro_name( - location, basename, metadata, py_version=None, precedence=SOURCE_DIST, - platform=None -): - """Generate alternative interpretations of a source distro name - - Note: if `location` is a filesystem filename, you should call - ``pkg_resources.normalize_path()`` on it before passing it to this - routine! - """ - # Generate alternative interpretations of a source distro name - # Because some packages are ambiguous as to name/versions split - # e.g. "adns-python-1.1.0", "egenix-mx-commercial", etc. - # So, we generate each possible interepretation (e.g. "adns, python-1.1.0" - # "adns-python, 1.1.0", and "adns-python-1.1.0, no version"). In practice, - # the spurious interpretations should be ignored, because in the event - # there's also an "adns" package, the spurious "python-1.1.0" version will - # compare lower than any numeric version number, and is therefore unlikely - # to match a request for it. It's still a potential problem, though, and - # in the long run PyPI and the distutils should go for "safe" names and - # versions in distribution archive names (sdist and bdist). - - parts = basename.split('-') - if not py_version and any(re.match(r'py\d\.\d$', p) for p in parts[2:]): - # it is a bdist_dumb, not an sdist -- bail out - return - - for p in range(1, len(parts) + 1): - yield Distribution( - location, metadata, '-'.join(parts[:p]), '-'.join(parts[p:]), - py_version=py_version, precedence=precedence, - platform=platform - ) - - -# From Python 2.7 docs -def unique_everseen(iterable, key=None): - "List unique elements, preserving order. Remember all elements ever seen." - # unique_everseen('AAAABBBCCDAABBB') --> A B C D - # unique_everseen('ABBCcAD', str.lower) --> A B C D - seen = set() - seen_add = seen.add - if key is None: - for element in six.moves.filterfalse(seen.__contains__, iterable): - seen_add(element) - yield element - else: - for element in iterable: - k = key(element) - if k not in seen: - seen_add(k) - yield element - - -def unique_values(func): - """ - Wrap a function returning an iterable such that the resulting iterable - only ever yields unique items. - """ - - @wraps(func) - def wrapper(*args, **kwargs): - return unique_everseen(func(*args, **kwargs)) - - return wrapper - - -REL = re.compile(r"""<([^>]*\srel\s*=\s*['"]?([^'">]+)[^>]*)>""", re.I) -# this line is here to fix emacs' cruddy broken syntax highlighting - - -@unique_values -def find_external_links(url, page): - """Find rel="homepage" and rel="download" links in `page`, yielding URLs""" - - for match in REL.finditer(page): - tag, rel = match.groups() - rels = set(map(str.strip, rel.lower().split(','))) - if 'homepage' in rels or 'download' in rels: - for match in HREF.finditer(tag): - yield urllib.parse.urljoin(url, htmldecode(match.group(1))) - - for tag in ("<th>Home Page", "<th>Download URL"): - pos = page.find(tag) - if pos != -1: - match = HREF.search(page, pos) - if match: - yield urllib.parse.urljoin(url, htmldecode(match.group(1))) - - -class ContentChecker: - """ - A null content checker that defines the interface for checking content - """ - - def feed(self, block): - """ - Feed a block of data to the hash. - """ - return - - def is_valid(self): - """ - Check the hash. Return False if validation fails. - """ - return True - - def report(self, reporter, template): - """ - Call reporter with information about the checker (hash name) - substituted into the template. - """ - return - - -class HashChecker(ContentChecker): - pattern = re.compile( - r'(?P<hash_name>sha1|sha224|sha384|sha256|sha512|md5)=' - r'(?P<expected>[a-f0-9]+)' - ) - - def __init__(self, hash_name, expected): - self.hash_name = hash_name - self.hash = hashlib.new(hash_name) - self.expected = expected - - @classmethod - def from_url(cls, url): - "Construct a (possibly null) ContentChecker from a URL" - fragment = urllib.parse.urlparse(url)[-1] - if not fragment: - return ContentChecker() - match = cls.pattern.search(fragment) - if not match: - return ContentChecker() - return cls(**match.groupdict()) - - def feed(self, block): - self.hash.update(block) - - def is_valid(self): - return self.hash.hexdigest() == self.expected - - def report(self, reporter, template): - msg = template % self.hash_name - return reporter(msg) - - -class PackageIndex(Environment): - """A distribution index that scans web pages for download URLs""" - - def __init__( - self, index_url="https://pypi.org/simple/", hosts=('*',), - ca_bundle=None, verify_ssl=True, *args, **kw - ): - Environment.__init__(self, *args, **kw) - self.index_url = index_url + "/" [:not index_url.endswith('/')] - self.scanned_urls = {} - self.fetched_urls = {} - self.package_pages = {} - self.allows = re.compile('|'.join(map(translate, hosts))).match - self.to_scan = [] - use_ssl = ( - verify_ssl - and ssl_support.is_available - and (ca_bundle or ssl_support.find_ca_bundle()) - ) - if use_ssl: - self.opener = ssl_support.opener_for(ca_bundle) - else: - self.opener = urllib.request.urlopen - - def process_url(self, url, retrieve=False): - """Evaluate a URL as a possible download, and maybe retrieve it""" - if url in self.scanned_urls and not retrieve: - return - self.scanned_urls[url] = True - if not URL_SCHEME(url): - self.process_filename(url) - return - else: - dists = list(distros_for_url(url)) - if dists: - if not self.url_ok(url): - return - self.debug("Found link: %s", url) - - if dists or not retrieve or url in self.fetched_urls: - list(map(self.add, dists)) - return # don't need the actual page - - if not self.url_ok(url): - self.fetched_urls[url] = True - return - - self.info("Reading %s", url) - self.fetched_urls[url] = True # prevent multiple fetch attempts - tmpl = "Download error on %s: %%s -- Some packages may not be found!" - f = self.open_url(url, tmpl % url) - if f is None: - return - self.fetched_urls[f.url] = True - if 'html' not in f.headers.get('content-type', '').lower(): - f.close() # not html, we can't process it - return - - base = f.url # handle redirects - page = f.read() - if not isinstance(page, str): - # In Python 3 and got bytes but want str. - if isinstance(f, urllib.error.HTTPError): - # Errors have no charset, assume latin1: - charset = 'latin-1' - else: - charset = f.headers.get_param('charset') or 'latin-1' - page = page.decode(charset, "ignore") - f.close() - for match in HREF.finditer(page): - link = urllib.parse.urljoin(base, htmldecode(match.group(1))) - self.process_url(link) - if url.startswith(self.index_url) and getattr(f, 'code', None) != 404: - page = self.process_index(url, page) - - def process_filename(self, fn, nested=False): - # process filenames or directories - if not os.path.exists(fn): - self.warn("Not found: %s", fn) - return - - if os.path.isdir(fn) and not nested: - path = os.path.realpath(fn) - for item in os.listdir(path): - self.process_filename(os.path.join(path, item), True) - - dists = distros_for_filename(fn) - if dists: - self.debug("Found: %s", fn) - list(map(self.add, dists)) - - def url_ok(self, url, fatal=False): - s = URL_SCHEME(url) - is_file = s and s.group(1).lower() == 'file' - if is_file or self.allows(urllib.parse.urlparse(url)[1]): - return True - msg = ( - "\nNote: Bypassing %s (disallowed host; see " - "http://bit.ly/2hrImnY for details).\n") - if fatal: - raise DistutilsError(msg % url) - else: - self.warn(msg, url) - - def scan_egg_links(self, search_path): - dirs = filter(os.path.isdir, search_path) - egg_links = ( - (path, entry) - for path in dirs - for entry in os.listdir(path) - if entry.endswith('.egg-link') - ) - list(itertools.starmap(self.scan_egg_link, egg_links)) - - def scan_egg_link(self, path, entry): - with open(os.path.join(path, entry)) as raw_lines: - # filter non-empty lines - lines = list(filter(None, map(str.strip, raw_lines))) - - if len(lines) != 2: - # format is not recognized; punt - return - - egg_path, setup_path = lines - - for dist in find_distributions(os.path.join(path, egg_path)): - dist.location = os.path.join(path, *lines) - dist.precedence = SOURCE_DIST - self.add(dist) - - def process_index(self, url, page): - """Process the contents of a PyPI page""" - - def scan(link): - # Process a URL to see if it's for a package page - if link.startswith(self.index_url): - parts = list(map( - urllib.parse.unquote, link[len(self.index_url):].split('/') - )) - if len(parts) == 2 and '#' not in parts[1]: - # it's a package page, sanitize and index it - pkg = safe_name(parts[0]) - ver = safe_version(parts[1]) - self.package_pages.setdefault(pkg.lower(), {})[link] = True - return to_filename(pkg), to_filename(ver) - return None, None - - # process an index page into the package-page index - for match in HREF.finditer(page): - try: - scan(urllib.parse.urljoin(url, htmldecode(match.group(1)))) - except ValueError: - pass - - pkg, ver = scan(url) # ensure this page is in the page index - if pkg: - # process individual package page - for new_url in find_external_links(url, page): - # Process the found URL - base, frag = egg_info_for_url(new_url) - if base.endswith('.py') and not frag: - if ver: - new_url += '#egg=%s-%s' % (pkg, ver) - else: - self.need_version_info(url) - self.scan_url(new_url) - - return PYPI_MD5.sub( - lambda m: '<a href="%s#md5=%s">%s</a>' % m.group(1, 3, 2), page - ) - else: - return "" # no sense double-scanning non-package pages - - def need_version_info(self, url): - self.scan_all( - "Page at %s links to .py file(s) without version info; an index " - "scan is required.", url - ) - - def scan_all(self, msg=None, *args): - if self.index_url not in self.fetched_urls: - if msg: - self.warn(msg, *args) - self.info( - "Scanning index of all packages (this may take a while)" - ) - self.scan_url(self.index_url) - - def find_packages(self, requirement): - self.scan_url(self.index_url + requirement.unsafe_name + '/') - - if not self.package_pages.get(requirement.key): - # Fall back to safe version of the name - self.scan_url(self.index_url + requirement.project_name + '/') - - if not self.package_pages.get(requirement.key): - # We couldn't find the target package, so search the index page too - self.not_found_in_index(requirement) - - for url in list(self.package_pages.get(requirement.key, ())): - # scan each page that might be related to the desired package - self.scan_url(url) - - def obtain(self, requirement, installer=None): - self.prescan() - self.find_packages(requirement) - for dist in self[requirement.key]: - if dist in requirement: - return dist - self.debug("%s does not match %s", requirement, dist) - return super(PackageIndex, self).obtain(requirement, installer) - - def check_hash(self, checker, filename, tfp): - """ - checker is a ContentChecker - """ - checker.report( - self.debug, - "Validating %%s checksum for %s" % filename) - if not checker.is_valid(): - tfp.close() - os.unlink(filename) - raise DistutilsError( - "%s validation failed for %s; " - "possible download problem?" - % (checker.hash.name, os.path.basename(filename)) - ) - - def add_find_links(self, urls): - """Add `urls` to the list that will be prescanned for searches""" - for url in urls: - if ( - self.to_scan is None # if we have already "gone online" - or not URL_SCHEME(url) # or it's a local file/directory - or url.startswith('file:') - or list(distros_for_url(url)) # or a direct package link - ): - # then go ahead and process it now - self.scan_url(url) - else: - # otherwise, defer retrieval till later - self.to_scan.append(url) - - def prescan(self): - """Scan urls scheduled for prescanning (e.g. --find-links)""" - if self.to_scan: - list(map(self.scan_url, self.to_scan)) - self.to_scan = None # from now on, go ahead and process immediately - - def not_found_in_index(self, requirement): - if self[requirement.key]: # we've seen at least one distro - meth, msg = self.info, "Couldn't retrieve index page for %r" - else: # no distros seen for this name, might be misspelled - meth, msg = ( - self.warn, - "Couldn't find index page for %r (maybe misspelled?)") - meth(msg, requirement.unsafe_name) - self.scan_all() - - def download(self, spec, tmpdir): - """Locate and/or download `spec` to `tmpdir`, returning a local path - - `spec` may be a ``Requirement`` object, or a string containing a URL, - an existing local filename, or a project/version requirement spec - (i.e. the string form of a ``Requirement`` object). If it is the URL - of a .py file with an unambiguous ``#egg=name-version`` tag (i.e., one - that escapes ``-`` as ``_`` throughout), a trivial ``setup.py`` is - automatically created alongside the downloaded file. - - If `spec` is a ``Requirement`` object or a string containing a - project/version requirement spec, this method returns the location of - a matching distribution (possibly after downloading it to `tmpdir`). - If `spec` is a locally existing file or directory name, it is simply - returned unchanged. If `spec` is a URL, it is downloaded to a subpath - of `tmpdir`, and the local filename is returned. Various errors may be - raised if a problem occurs during downloading. - """ - if not isinstance(spec, Requirement): - scheme = URL_SCHEME(spec) - if scheme: - # It's a url, download it to tmpdir - found = self._download_url(scheme.group(1), spec, tmpdir) - base, fragment = egg_info_for_url(spec) - if base.endswith('.py'): - found = self.gen_setup(found, fragment, tmpdir) - return found - elif os.path.exists(spec): - # Existing file or directory, just return it - return spec - else: - spec = parse_requirement_arg(spec) - return getattr(self.fetch_distribution(spec, tmpdir), 'location', None) - - def fetch_distribution( - self, requirement, tmpdir, force_scan=False, source=False, - develop_ok=False, local_index=None): - """Obtain a distribution suitable for fulfilling `requirement` - - `requirement` must be a ``pkg_resources.Requirement`` instance. - If necessary, or if the `force_scan` flag is set, the requirement is - searched for in the (online) package index as well as the locally - installed packages. If a distribution matching `requirement` is found, - the returned distribution's ``location`` is the value you would have - gotten from calling the ``download()`` method with the matching - distribution's URL or filename. If no matching distribution is found, - ``None`` is returned. - - If the `source` flag is set, only source distributions and source - checkout links will be considered. Unless the `develop_ok` flag is - set, development and system eggs (i.e., those using the ``.egg-info`` - format) will be ignored. - """ - # process a Requirement - self.info("Searching for %s", requirement) - skipped = {} - dist = None - - def find(req, env=None): - if env is None: - env = self - # Find a matching distribution; may be called more than once - - for dist in env[req.key]: - - if dist.precedence == DEVELOP_DIST and not develop_ok: - if dist not in skipped: - self.warn( - "Skipping development or system egg: %s", dist, - ) - skipped[dist] = 1 - continue - - test = ( - dist in req - and (dist.precedence <= SOURCE_DIST or not source) - ) - if test: - loc = self.download(dist.location, tmpdir) - dist.download_location = loc - if os.path.exists(dist.download_location): - return dist - - if force_scan: - self.prescan() - self.find_packages(requirement) - dist = find(requirement) - - if not dist and local_index is not None: - dist = find(requirement, local_index) - - if dist is None: - if self.to_scan is not None: - self.prescan() - dist = find(requirement) - - if dist is None and not force_scan: - self.find_packages(requirement) - dist = find(requirement) - - if dist is None: - self.warn( - "No local packages or working download links found for %s%s", - (source and "a source distribution of " or ""), - requirement, - ) - else: - self.info("Best match: %s", dist) - return dist.clone(location=dist.download_location) - - def fetch(self, requirement, tmpdir, force_scan=False, source=False): - """Obtain a file suitable for fulfilling `requirement` - - DEPRECATED; use the ``fetch_distribution()`` method now instead. For - backward compatibility, this routine is identical but returns the - ``location`` of the downloaded distribution instead of a distribution - object. - """ - dist = self.fetch_distribution(requirement, tmpdir, force_scan, source) - if dist is not None: - return dist.location - return None - - def gen_setup(self, filename, fragment, tmpdir): - match = EGG_FRAGMENT.match(fragment) - dists = match and [ - d for d in - interpret_distro_name(filename, match.group(1), None) if d.version - ] or [] - - if len(dists) == 1: # unambiguous ``#egg`` fragment - basename = os.path.basename(filename) - - # Make sure the file has been downloaded to the temp dir. - if os.path.dirname(filename) != tmpdir: - dst = os.path.join(tmpdir, basename) - from setuptools.command.easy_install import samefile - if not samefile(filename, dst): - shutil.copy2(filename, dst) - filename = dst - - with open(os.path.join(tmpdir, 'setup.py'), 'w') as file: - file.write( - "from setuptools import setup\n" - "setup(name=%r, version=%r, py_modules=[%r])\n" - % ( - dists[0].project_name, dists[0].version, - os.path.splitext(basename)[0] - ) - ) - return filename - - elif match: - raise DistutilsError( - "Can't unambiguously interpret project/version identifier %r; " - "any dashes in the name or version should be escaped using " - "underscores. %r" % (fragment, dists) - ) - else: - raise DistutilsError( - "Can't process plain .py files without an '#egg=name-version'" - " suffix to enable automatic setup script generation." - ) - - dl_blocksize = 8192 - - def _download_to(self, url, filename): - self.info("Downloading %s", url) - # Download the file - fp = None - try: - checker = HashChecker.from_url(url) - fp = self.open_url(url) - if isinstance(fp, urllib.error.HTTPError): - raise DistutilsError( - "Can't download %s: %s %s" % (url, fp.code, fp.msg) - ) - headers = fp.info() - blocknum = 0 - bs = self.dl_blocksize - size = -1 - if "content-length" in headers: - # Some servers return multiple Content-Length headers :( - sizes = get_all_headers(headers, 'Content-Length') - size = max(map(int, sizes)) - self.reporthook(url, filename, blocknum, bs, size) - with open(filename, 'wb') as tfp: - while True: - block = fp.read(bs) - if block: - checker.feed(block) - tfp.write(block) - blocknum += 1 - self.reporthook(url, filename, blocknum, bs, size) - else: - break - self.check_hash(checker, filename, tfp) - return headers - finally: - if fp: - fp.close() - - def reporthook(self, url, filename, blocknum, blksize, size): - pass # no-op - - def open_url(self, url, warning=None): - if url.startswith('file:'): - return local_open(url) - try: - return open_with_auth(url, self.opener) - except (ValueError, http_client.InvalidURL) as v: - msg = ' '.join([str(arg) for arg in v.args]) - if warning: - self.warn(warning, msg) - else: - raise DistutilsError('%s %s' % (url, msg)) - except urllib.error.HTTPError as v: - return v - except urllib.error.URLError as v: - if warning: - self.warn(warning, v.reason) - else: - raise DistutilsError("Download error for %s: %s" - % (url, v.reason)) - except http_client.BadStatusLine as v: - if warning: - self.warn(warning, v.line) - else: - raise DistutilsError( - '%s returned a bad status line. The server might be ' - 'down, %s' % - (url, v.line) - ) - except (http_client.HTTPException, socket.error) as v: - if warning: - self.warn(warning, v) - else: - raise DistutilsError("Download error for %s: %s" - % (url, v)) - - def _download_url(self, scheme, url, tmpdir): - # Determine download filename - # - name, fragment = egg_info_for_url(url) - if name: - while '..' in name: - name = name.replace('..', '.').replace('\\', '_') - else: - name = "__downloaded__" # default if URL has no path contents - - if name.endswith('.egg.zip'): - name = name[:-4] # strip the extra .zip before download - - filename = os.path.join(tmpdir, name) - - # Download the file - # - if scheme == 'svn' or scheme.startswith('svn+'): - return self._download_svn(url, filename) - elif scheme == 'git' or scheme.startswith('git+'): - return self._download_git(url, filename) - elif scheme.startswith('hg+'): - return self._download_hg(url, filename) - elif scheme == 'file': - return urllib.request.url2pathname(urllib.parse.urlparse(url)[2]) - else: - self.url_ok(url, True) # raises error if not allowed - return self._attempt_download(url, filename) - - def scan_url(self, url): - self.process_url(url, True) - - def _attempt_download(self, url, filename): - headers = self._download_to(url, filename) - if 'html' in headers.get('content-type', '').lower(): - return self._download_html(url, headers, filename) - else: - return filename - - def _download_html(self, url, headers, filename): - file = open(filename) - for line in file: - if line.strip(): - # Check for a subversion index page - if re.search(r'<title>([^- ]+ - )?Revision \d+:', line): - # it's a subversion index page: - file.close() - os.unlink(filename) - return self._download_svn(url, filename) - break # not an index page - file.close() - os.unlink(filename) - raise DistutilsError("Unexpected HTML page found at " + url) - - def _download_svn(self, url, filename): - warnings.warn("SVN download support is deprecated", UserWarning) - url = url.split('#', 1)[0] # remove any fragment for svn's sake - creds = '' - if url.lower().startswith('svn:') and '@' in url: - scheme, netloc, path, p, q, f = urllib.parse.urlparse(url) - if not netloc and path.startswith('//') and '/' in path[2:]: - netloc, path = path[2:].split('/', 1) - auth, host = _splituser(netloc) - if auth: - if ':' in auth: - user, pw = auth.split(':', 1) - creds = " --username=%s --password=%s" % (user, pw) - else: - creds = " --username=" + auth - netloc = host - parts = scheme, netloc, url, p, q, f - url = urllib.parse.urlunparse(parts) - self.info("Doing subversion checkout from %s to %s", url, filename) - os.system("svn checkout%s -q %s %s" % (creds, url, filename)) - return filename - - @staticmethod - def _vcs_split_rev_from_url(url, pop_prefix=False): - scheme, netloc, path, query, frag = urllib.parse.urlsplit(url) - - scheme = scheme.split('+', 1)[-1] - - # Some fragment identification fails - path = path.split('#', 1)[0] - - rev = None - if '@' in path: - path, rev = path.rsplit('@', 1) - - # Also, discard fragment - url = urllib.parse.urlunsplit((scheme, netloc, path, query, '')) - - return url, rev - - def _download_git(self, url, filename): - filename = filename.split('#', 1)[0] - url, rev = self._vcs_split_rev_from_url(url, pop_prefix=True) - - self.info("Doing git clone from %s to %s", url, filename) - os.system("git clone --quiet %s %s" % (url, filename)) - - if rev is not None: - self.info("Checking out %s", rev) - os.system("git -C %s checkout --quiet %s" % ( - filename, - rev, - )) - - return filename - - def _download_hg(self, url, filename): - filename = filename.split('#', 1)[0] - url, rev = self._vcs_split_rev_from_url(url, pop_prefix=True) - - self.info("Doing hg clone from %s to %s", url, filename) - os.system("hg clone --quiet %s %s" % (url, filename)) - - if rev is not None: - self.info("Updating to %s", rev) - os.system("hg --cwd %s up -C -r %s -q" % ( - filename, - rev, - )) - - return filename - - def debug(self, msg, *args): - log.debug(msg, *args) - - def info(self, msg, *args): - log.info(msg, *args) - - def warn(self, msg, *args): - log.warn(msg, *args) - - -# This pattern matches a character entity reference (a decimal numeric -# references, a hexadecimal numeric reference, or a named reference). -entity_sub = re.compile(r'&(#(\d+|x[\da-fA-F]+)|[\w.:-]+);?').sub - - -def decode_entity(match): - what = match.group(0) - return unescape(what) - - -def htmldecode(text): - """ - Decode HTML entities in the given text. - - >>> htmldecode( - ... 'https://../package_name-0.1.2.tar.gz' - ... '?tokena=A&tokenb=B">package_name-0.1.2.tar.gz') - 'https://../package_name-0.1.2.tar.gz?tokena=A&tokenb=B">package_name-0.1.2.tar.gz' - """ - return entity_sub(decode_entity, text) - - -def socket_timeout(timeout=15): - def _socket_timeout(func): - def _socket_timeout(*args, **kwargs): - old_timeout = socket.getdefaulttimeout() - socket.setdefaulttimeout(timeout) - try: - return func(*args, **kwargs) - finally: - socket.setdefaulttimeout(old_timeout) - - return _socket_timeout - - return _socket_timeout - - -def _encode_auth(auth): - """ - A function compatible with Python 2.3-3.3 that will encode - auth from a URL suitable for an HTTP header. - >>> str(_encode_auth('username%3Apassword')) - 'dXNlcm5hbWU6cGFzc3dvcmQ=' - - Long auth strings should not cause a newline to be inserted. - >>> long_auth = 'username:' + 'password'*10 - >>> chr(10) in str(_encode_auth(long_auth)) - False - """ - auth_s = urllib.parse.unquote(auth) - # convert to bytes - auth_bytes = auth_s.encode() - encoded_bytes = base64.b64encode(auth_bytes) - # convert back to a string - encoded = encoded_bytes.decode() - # strip the trailing carriage return - return encoded.replace('\n', '') - - -class Credential: - """ - A username/password pair. Use like a namedtuple. - """ - - def __init__(self, username, password): - self.username = username - self.password = password - - def __iter__(self): - yield self.username - yield self.password - - def __str__(self): - return '%(username)s:%(password)s' % vars(self) - - -class PyPIConfig(configparser.RawConfigParser): - def __init__(self): - """ - Load from ~/.pypirc - """ - defaults = dict.fromkeys(['username', 'password', 'repository'], '') - configparser.RawConfigParser.__init__(self, defaults) - - rc = os.path.join(os.path.expanduser('~'), '.pypirc') - if os.path.exists(rc): - self.read(rc) - - @property - def creds_by_repository(self): - sections_with_repositories = [ - section for section in self.sections() - if self.get(section, 'repository').strip() - ] - - return dict(map(self._get_repo_cred, sections_with_repositories)) - - def _get_repo_cred(self, section): - repo = self.get(section, 'repository').strip() - return repo, Credential( - self.get(section, 'username').strip(), - self.get(section, 'password').strip(), - ) - - def find_credential(self, url): - """ - If the URL indicated appears to be a repository defined in this - config, return the credential for that repository. - """ - for repository, cred in self.creds_by_repository.items(): - if url.startswith(repository): - return cred - - -def open_with_auth(url, opener=urllib.request.urlopen): - """Open a urllib2 request, handling HTTP authentication""" - - parsed = urllib.parse.urlparse(url) - scheme, netloc, path, params, query, frag = parsed - - # Double scheme does not raise on Mac OS X as revealed by a - # failing test. We would expect "nonnumeric port". Refs #20. - if netloc.endswith(':'): - raise http_client.InvalidURL("nonnumeric port: ''") - - if scheme in ('http', 'https'): - auth, address = _splituser(netloc) - else: - auth = None - - if not auth: - cred = PyPIConfig().find_credential(url) - if cred: - auth = str(cred) - info = cred.username, url - log.info('Authenticating as %s for %s (from .pypirc)', *info) - - if auth: - auth = "Basic " + _encode_auth(auth) - parts = scheme, address, path, params, query, frag - new_url = urllib.parse.urlunparse(parts) - request = urllib.request.Request(new_url) - request.add_header("Authorization", auth) - else: - request = urllib.request.Request(url) - - request.add_header('User-Agent', user_agent) - fp = opener(request) - - if auth: - # Put authentication info back into request URL if same host, - # so that links found on the page will work - s2, h2, path2, param2, query2, frag2 = urllib.parse.urlparse(fp.url) - if s2 == scheme and h2 == address: - parts = s2, netloc, path2, param2, query2, frag2 - fp.url = urllib.parse.urlunparse(parts) - - return fp - - -# copy of urllib.parse._splituser from Python 3.8 -def _splituser(host): - """splituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'.""" - user, delim, host = host.rpartition('@') - return (user if delim else None), host - - -# adding a timeout to avoid freezing package_index -open_with_auth = socket_timeout(_SOCKET_TIMEOUT)(open_with_auth) - - -def fix_sf_url(url): - return url # backward compatibility - - -def local_open(url): - """Read a local path, with special support for directories""" - scheme, server, path, param, query, frag = urllib.parse.urlparse(url) - filename = urllib.request.url2pathname(path) - if os.path.isfile(filename): - return urllib.request.urlopen(url) - elif path.endswith('/') and os.path.isdir(filename): - files = [] - for f in os.listdir(filename): - filepath = os.path.join(filename, f) - if f == 'index.html': - with open(filepath, 'r') as fp: - body = fp.read() - break - elif os.path.isdir(filepath): - f += '/' - files.append('<a href="{name}">{name}</a>'.format(name=f)) - else: - tmpl = ( - "<html><head><title>{url}" - "{files}") - body = tmpl.format(url=url, files='\n'.join(files)) - status, message = 200, "OK" - else: - status, message, body = 404, "Path not found", "Not found" - - headers = {'content-type': 'text/html'} - body_stream = six.StringIO(body) - return urllib.error.HTTPError(url, status, message, headers, body_stream) diff --git a/venv/lib/python2.7/site-packages/setuptools/package_index.pyc b/venv/lib/python2.7/site-packages/setuptools/package_index.pyc deleted file mode 100644 index 887ee4c7f0b72f942ff329d539b5fada05bc37f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44744 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 z 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 diff --git a/venv/lib/python2.7/site-packages/setuptools/pep425tags.py b/venv/lib/python2.7/site-packages/setuptools/pep425tags.py deleted file mode 100644 index 48745a2..0000000 --- a/venv/lib/python2.7/site-packages/setuptools/pep425tags.py +++ /dev/null @@ -1,319 +0,0 @@ -# This file originally from pip: -# https://github.com/pypa/pip/blob/8f4f15a5a95d7d5b511ceaee9ed261176c181970/src/pip/_internal/pep425tags.py -"""Generate and work with PEP 425 Compatibility Tags.""" -from __future__ import absolute_import - -import distutils.util -from distutils import log -import platform -import re -import sys -import sysconfig -import warnings -from collections import OrderedDict - -from .extern import six - -from . import glibc - -_osx_arch_pat = re.compile(r'(.+)_(\d+)_(\d+)_(.+)') - - -def get_config_var(var): - try: - return sysconfig.get_config_var(var) - except IOError as e: # Issue #1074 - warnings.warn("{}".format(e), RuntimeWarning) - return None - - -def get_abbr_impl(): - """Return abbreviated implementation name.""" - if hasattr(sys, 'pypy_version_info'): - pyimpl = 'pp' - elif sys.platform.startswith('java'): - pyimpl = 'jy' - elif sys.platform == 'cli': - pyimpl = 'ip' - else: - pyimpl = 'cp' - return pyimpl - - -def get_impl_ver(): - """Return implementation version.""" - impl_ver = get_config_var("py_version_nodot") - if not impl_ver or get_abbr_impl() == 'pp': - impl_ver = ''.join(map(str, get_impl_version_info())) - return impl_ver - - -def get_impl_version_info(): - """Return sys.version_info-like tuple for use in decrementing the minor - version.""" - if get_abbr_impl() == 'pp': - # as per https://github.com/pypa/pip/issues/2882 - return (sys.version_info[0], sys.pypy_version_info.major, - sys.pypy_version_info.minor) - else: - return sys.version_info[0], sys.version_info[1] - - -def get_impl_tag(): - """ - Returns the Tag for this specific implementation. - """ - return "{}{}".format(get_abbr_impl(), get_impl_ver()) - - -def get_flag(var, fallback, expected=True, warn=True): - """Use a fallback method for determining SOABI flags if the needed config - var is unset or unavailable.""" - val = get_config_var(var) - if val is None: - if warn: - log.debug("Config variable '%s' is unset, Python ABI tag may " - "be incorrect", var) - return fallback() - return val == expected - - -def get_abi_tag(): - """Return the ABI tag based on SOABI (if available) or emulate SOABI - (CPython 2, PyPy).""" - soabi = get_config_var('SOABI') - impl = get_abbr_impl() - if not soabi and impl in {'cp', 'pp'} and hasattr(sys, 'maxunicode'): - d = '' - m = '' - u = '' - if get_flag('Py_DEBUG', - lambda: hasattr(sys, 'gettotalrefcount'), - warn=(impl == 'cp')): - d = 'd' - if get_flag('WITH_PYMALLOC', - lambda: impl == 'cp', - warn=(impl == 'cp')): - m = 'm' - if get_flag('Py_UNICODE_SIZE', - lambda: sys.maxunicode == 0x10ffff, - expected=4, - warn=(impl == 'cp' and - six.PY2)) \ - and six.PY2: - u = 'u' - abi = '%s%s%s%s%s' % (impl, get_impl_ver(), d, m, u) - elif soabi and soabi.startswith('cpython-'): - abi = 'cp' + soabi.split('-')[1] - elif soabi: - abi = soabi.replace('.', '_').replace('-', '_') - else: - abi = None - return abi - - -def _is_running_32bit(): - return sys.maxsize == 2147483647 - - -def get_platform(): - """Return our platform name 'win32', 'linux_x86_64'""" - if sys.platform == 'darwin': - # distutils.util.get_platform() returns the release based on the value - # of MACOSX_DEPLOYMENT_TARGET on which Python was built, which may - # be significantly older than the user's current machine. - release, _, machine = platform.mac_ver() - split_ver = release.split('.') - - if machine == "x86_64" and _is_running_32bit(): - machine = "i386" - elif machine == "ppc64" and _is_running_32bit(): - machine = "ppc" - - return 'macosx_{}_{}_{}'.format(split_ver[0], split_ver[1], machine) - - # XXX remove distutils dependency - result = distutils.util.get_platform().replace('.', '_').replace('-', '_') - if result == "linux_x86_64" and _is_running_32bit(): - # 32 bit Python program (running on a 64 bit Linux): pip should only - # install and run 32 bit compiled extensions in that case. - result = "linux_i686" - - return result - - -def is_manylinux1_compatible(): - # Only Linux, and only x86-64 / i686 - if get_platform() not in {"linux_x86_64", "linux_i686"}: - return False - - # Check for presence of _manylinux module - try: - import _manylinux - return bool(_manylinux.manylinux1_compatible) - except (ImportError, AttributeError): - # Fall through to heuristic check below - pass - - # Check glibc version. CentOS 5 uses glibc 2.5. - return glibc.have_compatible_glibc(2, 5) - - -def get_darwin_arches(major, minor, machine): - """Return a list of supported arches (including group arches) for - the given major, minor and machine architecture of a macOS machine. - """ - arches = [] - - def _supports_arch(major, minor, arch): - # Looking at the application support for macOS versions in the chart - # provided by https://en.wikipedia.org/wiki/OS_X#Versions it appears - # our timeline looks roughly like: - # - # 10.0 - Introduces ppc support. - # 10.4 - Introduces ppc64, i386, and x86_64 support, however the ppc64 - # and x86_64 support is CLI only, and cannot be used for GUI - # applications. - # 10.5 - Extends ppc64 and x86_64 support to cover GUI applications. - # 10.6 - Drops support for ppc64 - # 10.7 - Drops support for ppc - # - # Given that we do not know if we're installing a CLI or a GUI - # application, we must be conservative and assume it might be a GUI - # application and behave as if ppc64 and x86_64 support did not occur - # until 10.5. - # - # Note: The above information is taken from the "Application support" - # column in the chart not the "Processor support" since I believe - # that we care about what instruction sets an application can use - # not which processors the OS supports. - if arch == 'ppc': - return (major, minor) <= (10, 5) - if arch == 'ppc64': - return (major, minor) == (10, 5) - if arch == 'i386': - return (major, minor) >= (10, 4) - if arch == 'x86_64': - return (major, minor) >= (10, 5) - if arch in groups: - for garch in groups[arch]: - if _supports_arch(major, minor, garch): - return True - return False - - groups = OrderedDict([ - ("fat", ("i386", "ppc")), - ("intel", ("x86_64", "i386")), - ("fat64", ("x86_64", "ppc64")), - ("fat32", ("x86_64", "i386", "ppc")), - ]) - - if _supports_arch(major, minor, machine): - arches.append(machine) - - for garch in groups: - if machine in groups[garch] and _supports_arch(major, minor, garch): - arches.append(garch) - - arches.append('universal') - - return arches - - -def get_supported(versions=None, noarch=False, platform=None, - impl=None, abi=None): - """Return a list of supported tags for each version specified in - `versions`. - - :param versions: a list of string versions, of the form ["33", "32"], - or None. The first version will be assumed to support our ABI. - :param platform: specify the exact platform you want valid - tags for, or None. If None, use the local system platform. - :param impl: specify the exact implementation you want valid - tags for, or None. If None, use the local interpreter impl. - :param abi: specify the exact abi you want valid - tags for, or None. If None, use the local interpreter abi. - """ - supported = [] - - # Versions must be given with respect to the preference - if versions is None: - versions = [] - version_info = get_impl_version_info() - major = version_info[:-1] - # Support all previous minor Python versions. - for minor in range(version_info[-1], -1, -1): - versions.append(''.join(map(str, major + (minor,)))) - - impl = impl or get_abbr_impl() - - abis = [] - - abi = abi or get_abi_tag() - if abi: - abis[0:0] = [abi] - - abi3s = set() - import imp - for suffix in imp.get_suffixes(): - if suffix[0].startswith('.abi'): - abi3s.add(suffix[0].split('.', 2)[1]) - - abis.extend(sorted(list(abi3s))) - - abis.append('none') - - if not noarch: - arch = platform or get_platform() - if arch.startswith('macosx'): - # support macosx-10.6-intel on macosx-10.9-x86_64 - match = _osx_arch_pat.match(arch) - if match: - name, major, minor, actual_arch = match.groups() - tpl = '{}_{}_%i_%s'.format(name, major) - arches = [] - for m in reversed(range(int(minor) + 1)): - for a in get_darwin_arches(int(major), m, actual_arch): - arches.append(tpl % (m, a)) - else: - # arch pattern didn't match (?!) - arches = [arch] - elif platform is None and is_manylinux1_compatible(): - arches = [arch.replace('linux', 'manylinux1'), arch] - else: - arches = [arch] - - # Current version, current API (built specifically for our Python): - for abi in abis: - for arch in arches: - supported.append(('%s%s' % (impl, versions[0]), abi, arch)) - - # abi3 modules compatible with older version of Python - for version in versions[1:]: - # abi3 was introduced in Python 3.2 - if version in {'31', '30'}: - break - for abi in abi3s: # empty set if not Python 3 - for arch in arches: - supported.append(("%s%s" % (impl, version), abi, arch)) - - # Has binaries, does not use the Python API: - for arch in arches: - supported.append(('py%s' % (versions[0][0]), 'none', arch)) - - # No abi / arch, but requires our implementation: - supported.append(('%s%s' % (impl, versions[0]), 'none', 'any')) - # Tagged specifically as being cross-version compatible - # (with just the major version specified) - supported.append(('%s%s' % (impl, versions[0][0]), 'none', 'any')) - - # No abi / arch, generic Python - for i, version in enumerate(versions): - supported.append(('py%s' % (version,), 'none', 'any')) - if i == 0: - supported.append(('py%s' % (version[0]), 'none', 'any')) - - return supported - - -implementation_tag = get_impl_tag() diff --git a/venv/lib/python2.7/site-packages/setuptools/pep425tags.pyc b/venv/lib/python2.7/site-packages/setuptools/pep425tags.pyc deleted file mode 100644 index 528b4149f2d8855bacd0827d8a4a9f2ff35748ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10313 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 diff --git a/venv/lib/python2.7/site-packages/setuptools/py27compat.py b/venv/lib/python2.7/site-packages/setuptools/py27compat.py deleted file mode 100644 index 2985011..0000000 --- a/venv/lib/python2.7/site-packages/setuptools/py27compat.py +++ /dev/null @@ -1,28 +0,0 @@ -""" -Compatibility Support for Python 2.7 and earlier -""" - -import platform - -from setuptools.extern import six - - -def get_all_headers(message, key): - """ - Given an HTTPMessage, return all headers matching a given key. - """ - return message.get_all(key) - - -if six.PY2: - def get_all_headers(message, key): - return message.getheaders(key) - - -linux_py2_ascii = ( - platform.system() == 'Linux' and - six.PY2 -) - -rmtree_safe = str if linux_py2_ascii else lambda x: x -"""Workaround for http://bugs.python.org/issue24672""" diff --git a/venv/lib/python2.7/site-packages/setuptools/py27compat.pyc b/venv/lib/python2.7/site-packages/setuptools/py27compat.pyc deleted file mode 100644 index d3a5dee401f86c10a3d87e08fd111a451d338c99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1261 zcmc&zOK;Oa5FW>Q)AFdqiOU`%MB_F^DM+ZQ)B`=xDoS&JNXXjQ8+Q}G*qsEs;)2RQ z<_Ey++69i>vhs{aqnU3W`>p$PzyI?40tg3IZMY|hHmnM@*W+@vDPZ>``Cb){FP<{D}&h@~dWONOT zECMsogIpNjKB;d2E7A_!J5q}C7M(4fUij-j4}ykbh=Mv*&?*{$HA zP?{wigIk$KjI+q*tVKDr5LE{qLW~6Zlru0Lpm8J>ply%h2jl{)bVin!E4k$;ye(JW zGK)F56SYXcu8+rG(xb6@Jr3UJ;%#`Rj_5?WH}i6tAIelC)jGuEtH_^tnmW!g z%VPbnnU|x}!0vUJm-vKg)-C$=SbcJ7(=IgscX##1O(ucWICkWz0h*et*zKUxCbe)t zQcdPyi|h|F-4ubj{0Fi8FrmbciWb*Z-Vklfb}i-m=U0 z!z}Q988&LA%*6d6!%!3`R5~?@b}g2QlTRaTo48V=NGva6vmT%L;&UBHSv@FJ x_=v&?RSDs1z7&5KVy&If*ls1s!c8pB4B51~>ULwV@zm{gdd^=3.2 - from tempfile import TemporaryDirectory -except ImportError: - import shutil - import tempfile - - class TemporaryDirectory: - """ - Very simple temporary directory context manager. - Will try to delete afterward, but will also ignore OS and similar - errors on deletion. - """ - - def __init__(self, **kwargs): - self.name = None # Handle mkdtemp raising an exception - self.name = tempfile.mkdtemp(**kwargs) - - def __enter__(self): - return self.name - - def __exit__(self, exctype, excvalue, exctrace): - try: - shutil.rmtree(self.name, True) - except OSError: # removal errors are not the only possible - pass - self.name = None diff --git a/venv/lib/python2.7/site-packages/setuptools/py31compat.pyc b/venv/lib/python2.7/site-packages/setuptools/py31compat.pyc deleted file mode 100644 index 9c07d4602ddbdcf2846e58a0d43ddd1e03aa654a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1712 zcmd5+UvJYe5I-krp=Fx@O&SspY z2gn(y5XuM!5wL@52O`;maTm-NV2sg*08|?WZNC})5C$RS_-jEP!4H6QfKPb1V(=07 z_IquNQ~bfvW9YfNX!d1UYa>kasxUHh+BCZlIHQ{!Gl7n*x_NP z<6J7~WGseGniFC2NAcmr#V52wD68XQRB0pQy?!jJoT3#SVmJ^{rap zGEcU$Z99FMpPF?XqdM77>Y`pND(i$&Yi{G+h`&#)bd%a?t?a*U-E3}Tx~zqJTsIys z=S5XG&X+O1B}%|L%;$#kL-Qq0OKdPPM^`zZS1A$mIY~*|*G#8_5IC2pD#Q6be6R!$ zSVpvH5=PHv8=Yna91>!lRsb%9^MKm!4n$ZgYP(fxJKsw)31ACc(WfH%O4_dzS19kA z(itgzQhc@d&19y7z5Z)bVoEvl;_>P75|Pu)HT6t8=pPG(XGlo&!iY>>b5aQkCUr_0 zxsSf>q5&4N6}HGC=07oWAyE%-?q~z&rOqdc9!WWz=Q`s&B|oJb)7xmSn0fCyTEKt$ z77>djRP9zf=tP}x28_VY(PLjB6Oxdx6&*l^(uqt7Ymr!pEB-Eb3%xh=iFLD*lPLcK cqP|2sv!XmB8QLW@?Vufo!7^5Ifh`1o0X@E)`Tzg` diff --git a/venv/lib/python2.7/site-packages/setuptools/py33compat.py b/venv/lib/python2.7/site-packages/setuptools/py33compat.py deleted file mode 100644 index 87cf539..0000000 --- a/venv/lib/python2.7/site-packages/setuptools/py33compat.py +++ /dev/null @@ -1,55 +0,0 @@ -import dis -import array -import collections - -try: - import html -except ImportError: - html = None - -from setuptools.extern import six -from setuptools.extern.six.moves import html_parser - -__metaclass__ = type - -OpArg = collections.namedtuple('OpArg', 'opcode arg') - - -class Bytecode_compat: - def __init__(self, code): - self.code = code - - def __iter__(self): - """Yield '(op,arg)' pair for each operation in code object 'code'""" - - bytes = array.array('b', self.code.co_code) - eof = len(self.code.co_code) - - ptr = 0 - extended_arg = 0 - - while ptr < eof: - - op = bytes[ptr] - - if op >= dis.HAVE_ARGUMENT: - - arg = bytes[ptr + 1] + bytes[ptr + 2] * 256 + extended_arg - ptr += 3 - - if op == dis.EXTENDED_ARG: - long_type = six.integer_types[-1] - extended_arg = arg * long_type(65536) - continue - - else: - arg = None - ptr += 1 - - yield OpArg(op, arg) - - -Bytecode = getattr(dis, 'Bytecode', Bytecode_compat) - - -unescape = getattr(html, 'unescape', html_parser.HTMLParser().unescape) diff --git a/venv/lib/python2.7/site-packages/setuptools/py33compat.pyc b/venv/lib/python2.7/site-packages/setuptools/py33compat.pyc deleted file mode 100644 index 594dc1aa98104aa2093887b3cf1b050ddf3af0ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1962 zcmd5-TW=dh6h5`ItCN&z= zNU-cvUZ+We1`QIjNrP)7JsPc0TA{Q`m+-JkX+UX{(i;6jbV>ATutsv7BzD(HuF)m@ zww%VNv_Y~#qwBnG)OMyer*PQ4hIF#O@f~ypSnG3+*>oYW@wJ`gQ5kC^wdErGQ10oW zX@XN_qEgw3_0Xw<|iRDU5o`W3S6($*?DYb?>yGM6P2e@o8Fsg zZ?>b4i=W1KcTbBuyZYX4@}-$RNZ;r?_=aWgs8?p??W{01&hy*$?*1@(+B4Fgl~$?T z{F^OjJ3EWax67HW!)Fv_MP{Su26)3skw~~0Y;%!gHh+RxTndtNS&jsaJig!y!Iy!& zml{DAs2B9OP0$KWf2BDVcr+%`f4Cy~w0Tjbd6iI$QI*D3(!VVYK-9)27ZTemV1c5W z8*^|Mfzt(aA15!j1~m3aza?9vQJoRCc~PS|7S|LFrdeM<#k-k{|nzB|M= z`5Y`q7S9Eiy}*jYEF7RZPp1B|B9VLg|H zo72o##@ds;=ly6e{Px*?|KP~3K+}JD)IWIKf6UqtGP!kGVdYTj$j(Y>9P|!UAwv$P z%NHE-TXD{h@h*(>A=QbSORL??}4Q=BgMv2OkEQEz*rXLR_W; zLjK31?FAz6*1aaiEdeT4MN2gN0DPArzI+EoJdsfZT=1iqsPrs{7zPl-4UqTgIqv^> zupwiojbS+K06DnOuX>sj&I)OgxRi@<`BjJ9Aj3L{WiC;94xj?M3q)}1bcXLHrP8*q zwbCKCN_!pTeH+Y97Vjz55#aHalg0g{KDtoz+q5%}|bplcP_YKfK? Lcy0g2t+xLUD>uDt diff --git a/venv/lib/python2.7/site-packages/setuptools/sandbox.py b/venv/lib/python2.7/site-packages/setuptools/sandbox.py deleted file mode 100644 index 685f3f7..0000000 --- a/venv/lib/python2.7/site-packages/setuptools/sandbox.py +++ /dev/null @@ -1,491 +0,0 @@ -import os -import sys -import tempfile -import operator -import functools -import itertools -import re -import contextlib -import pickle -import textwrap - -from setuptools.extern import six -from setuptools.extern.six.moves import builtins, map - -import pkg_resources.py31compat - -if sys.platform.startswith('java'): - import org.python.modules.posix.PosixModule as _os -else: - _os = sys.modules[os.name] -try: - _file = file -except NameError: - _file = None -_open = open -from distutils.errors import DistutilsError -from pkg_resources import working_set - - -__all__ = [ - "AbstractSandbox", "DirectorySandbox", "SandboxViolation", "run_setup", -] - - -def _execfile(filename, globals, locals=None): - """ - Python 3 implementation of execfile. - """ - mode = 'rb' - with open(filename, mode) as stream: - script = stream.read() - if locals is None: - locals = globals - code = compile(script, filename, 'exec') - exec(code, globals, locals) - - -@contextlib.contextmanager -def save_argv(repl=None): - saved = sys.argv[:] - if repl is not None: - sys.argv[:] = repl - try: - yield saved - finally: - sys.argv[:] = saved - - -@contextlib.contextmanager -def save_path(): - saved = sys.path[:] - try: - yield saved - finally: - sys.path[:] = saved - - -@contextlib.contextmanager -def override_temp(replacement): - """ - Monkey-patch tempfile.tempdir with replacement, ensuring it exists - """ - pkg_resources.py31compat.makedirs(replacement, exist_ok=True) - - saved = tempfile.tempdir - - tempfile.tempdir = replacement - - try: - yield - finally: - tempfile.tempdir = saved - - -@contextlib.contextmanager -def pushd(target): - saved = os.getcwd() - os.chdir(target) - try: - yield saved - finally: - os.chdir(saved) - - -class UnpickleableException(Exception): - """ - An exception representing another Exception that could not be pickled. - """ - - @staticmethod - def dump(type, exc): - """ - Always return a dumped (pickled) type and exc. If exc can't be pickled, - wrap it in UnpickleableException first. - """ - try: - return pickle.dumps(type), pickle.dumps(exc) - except Exception: - # get UnpickleableException inside the sandbox - from setuptools.sandbox import UnpickleableException as cls - return cls.dump(cls, cls(repr(exc))) - - -class ExceptionSaver: - """ - A Context Manager that will save an exception, serialized, and restore it - later. - """ - - def __enter__(self): - return self - - def __exit__(self, type, exc, tb): - if not exc: - return - - # dump the exception - self._saved = UnpickleableException.dump(type, exc) - self._tb = tb - - # suppress the exception - return True - - def resume(self): - "restore and re-raise any exception" - - if '_saved' not in vars(self): - return - - type, exc = map(pickle.loads, self._saved) - six.reraise(type, exc, self._tb) - - -@contextlib.contextmanager -def save_modules(): - """ - Context in which imported modules are saved. - - Translates exceptions internal to the context into the equivalent exception - outside the context. - """ - saved = sys.modules.copy() - with ExceptionSaver() as saved_exc: - yield saved - - sys.modules.update(saved) - # remove any modules imported since - del_modules = ( - mod_name for mod_name in sys.modules - if mod_name not in saved - # exclude any encodings modules. See #285 - and not mod_name.startswith('encodings.') - ) - _clear_modules(del_modules) - - saved_exc.resume() - - -def _clear_modules(module_names): - for mod_name in list(module_names): - del sys.modules[mod_name] - - -@contextlib.contextmanager -def save_pkg_resources_state(): - saved = pkg_resources.__getstate__() - try: - yield saved - finally: - pkg_resources.__setstate__(saved) - - -@contextlib.contextmanager -def setup_context(setup_dir): - temp_dir = os.path.join(setup_dir, 'temp') - with save_pkg_resources_state(): - with save_modules(): - hide_setuptools() - with save_path(): - with save_argv(): - with override_temp(temp_dir): - with pushd(setup_dir): - # ensure setuptools commands are available - __import__('setuptools') - yield - - -def _needs_hiding(mod_name): - """ - >>> _needs_hiding('setuptools') - True - >>> _needs_hiding('pkg_resources') - True - >>> _needs_hiding('setuptools_plugin') - False - >>> _needs_hiding('setuptools.__init__') - True - >>> _needs_hiding('distutils') - True - >>> _needs_hiding('os') - False - >>> _needs_hiding('Cython') - True - """ - pattern = re.compile(r'(setuptools|pkg_resources|distutils|Cython)(\.|$)') - return bool(pattern.match(mod_name)) - - -def hide_setuptools(): - """ - Remove references to setuptools' modules from sys.modules to allow the - invocation to import the most appropriate setuptools. This technique is - necessary to avoid issues such as #315 where setuptools upgrading itself - would fail to find a function declared in the metadata. - """ - modules = filter(_needs_hiding, sys.modules) - _clear_modules(modules) - - -def run_setup(setup_script, args): - """Run a distutils setup script, sandboxed in its directory""" - setup_dir = os.path.abspath(os.path.dirname(setup_script)) - with setup_context(setup_dir): - try: - sys.argv[:] = [setup_script] + list(args) - sys.path.insert(0, setup_dir) - # reset to include setup dir, w/clean callback list - working_set.__init__() - working_set.callbacks.append(lambda dist: dist.activate()) - - # __file__ should be a byte string on Python 2 (#712) - dunder_file = ( - setup_script - if isinstance(setup_script, str) else - setup_script.encode(sys.getfilesystemencoding()) - ) - - with DirectorySandbox(setup_dir): - ns = dict(__file__=dunder_file, __name__='__main__') - _execfile(setup_script, ns) - except SystemExit as v: - if v.args and v.args[0]: - raise - # Normal exit, just return - - -class AbstractSandbox: - """Wrap 'os' module and 'open()' builtin for virtualizing setup scripts""" - - _active = False - - def __init__(self): - self._attrs = [ - name for name in dir(_os) - if not name.startswith('_') and hasattr(self, name) - ] - - def _copy(self, source): - for name in self._attrs: - setattr(os, name, getattr(source, name)) - - def __enter__(self): - self._copy(self) - if _file: - builtins.file = self._file - builtins.open = self._open - self._active = True - - def __exit__(self, exc_type, exc_value, traceback): - self._active = False - if _file: - builtins.file = _file - builtins.open = _open - self._copy(_os) - - def run(self, func): - """Run 'func' under os sandboxing""" - with self: - return func() - - def _mk_dual_path_wrapper(name): - original = getattr(_os, name) - - def wrap(self, src, dst, *args, **kw): - if self._active: - src, dst = self._remap_pair(name, src, dst, *args, **kw) - return original(src, dst, *args, **kw) - - return wrap - - for name in ["rename", "link", "symlink"]: - if hasattr(_os, name): - locals()[name] = _mk_dual_path_wrapper(name) - - def _mk_single_path_wrapper(name, original=None): - original = original or getattr(_os, name) - - def wrap(self, path, *args, **kw): - if self._active: - path = self._remap_input(name, path, *args, **kw) - return original(path, *args, **kw) - - return wrap - - if _file: - _file = _mk_single_path_wrapper('file', _file) - _open = _mk_single_path_wrapper('open', _open) - for name in [ - "stat", "listdir", "chdir", "open", "chmod", "chown", "mkdir", - "remove", "unlink", "rmdir", "utime", "lchown", "chroot", "lstat", - "startfile", "mkfifo", "mknod", "pathconf", "access" - ]: - if hasattr(_os, name): - locals()[name] = _mk_single_path_wrapper(name) - - def _mk_single_with_return(name): - original = getattr(_os, name) - - def wrap(self, path, *args, **kw): - if self._active: - path = self._remap_input(name, path, *args, **kw) - return self._remap_output(name, original(path, *args, **kw)) - return original(path, *args, **kw) - - return wrap - - for name in ['readlink', 'tempnam']: - if hasattr(_os, name): - locals()[name] = _mk_single_with_return(name) - - def _mk_query(name): - original = getattr(_os, name) - - def wrap(self, *args, **kw): - retval = original(*args, **kw) - if self._active: - return self._remap_output(name, retval) - return retval - - return wrap - - for name in ['getcwd', 'tmpnam']: - if hasattr(_os, name): - locals()[name] = _mk_query(name) - - def _validate_path(self, path): - """Called to remap or validate any path, whether input or output""" - return path - - def _remap_input(self, operation, path, *args, **kw): - """Called for path inputs""" - return self._validate_path(path) - - def _remap_output(self, operation, path): - """Called for path outputs""" - return self._validate_path(path) - - def _remap_pair(self, operation, src, dst, *args, **kw): - """Called for path pairs like rename, link, and symlink operations""" - return ( - self._remap_input(operation + '-from', src, *args, **kw), - self._remap_input(operation + '-to', dst, *args, **kw) - ) - - -if hasattr(os, 'devnull'): - _EXCEPTIONS = [os.devnull,] -else: - _EXCEPTIONS = [] - - -class DirectorySandbox(AbstractSandbox): - """Restrict operations to a single subdirectory - pseudo-chroot""" - - write_ops = dict.fromkeys([ - "open", "chmod", "chown", "mkdir", "remove", "unlink", "rmdir", - "utime", "lchown", "chroot", "mkfifo", "mknod", "tempnam", - ]) - - _exception_patterns = [ - # Allow lib2to3 to attempt to save a pickled grammar object (#121) - r'.*lib2to3.*\.pickle$', - ] - "exempt writing to paths that match the pattern" - - def __init__(self, sandbox, exceptions=_EXCEPTIONS): - self._sandbox = os.path.normcase(os.path.realpath(sandbox)) - self._prefix = os.path.join(self._sandbox, '') - self._exceptions = [ - os.path.normcase(os.path.realpath(path)) - for path in exceptions - ] - AbstractSandbox.__init__(self) - - def _violation(self, operation, *args, **kw): - from setuptools.sandbox import SandboxViolation - raise SandboxViolation(operation, args, kw) - - if _file: - - def _file(self, path, mode='r', *args, **kw): - if mode not in ('r', 'rt', 'rb', 'rU', 'U') and not self._ok(path): - self._violation("file", path, mode, *args, **kw) - return _file(path, mode, *args, **kw) - - def _open(self, path, mode='r', *args, **kw): - if mode not in ('r', 'rt', 'rb', 'rU', 'U') and not self._ok(path): - self._violation("open", path, mode, *args, **kw) - return _open(path, mode, *args, **kw) - - def tmpnam(self): - self._violation("tmpnam") - - def _ok(self, path): - active = self._active - try: - self._active = False - realpath = os.path.normcase(os.path.realpath(path)) - return ( - self._exempted(realpath) - or realpath == self._sandbox - or realpath.startswith(self._prefix) - ) - finally: - self._active = active - - def _exempted(self, filepath): - start_matches = ( - filepath.startswith(exception) - for exception in self._exceptions - ) - pattern_matches = ( - re.match(pattern, filepath) - for pattern in self._exception_patterns - ) - candidates = itertools.chain(start_matches, pattern_matches) - return any(candidates) - - def _remap_input(self, operation, path, *args, **kw): - """Called for path inputs""" - if operation in self.write_ops and not self._ok(path): - self._violation(operation, os.path.realpath(path), *args, **kw) - return path - - def _remap_pair(self, operation, src, dst, *args, **kw): - """Called for path pairs like rename, link, and symlink operations""" - if not self._ok(src) or not self._ok(dst): - self._violation(operation, src, dst, *args, **kw) - return (src, dst) - - def open(self, file, flags, mode=0o777, *args, **kw): - """Called for low-level os.open()""" - if flags & WRITE_FLAGS and not self._ok(file): - self._violation("os.open", file, flags, mode, *args, **kw) - return _os.open(file, flags, mode, *args, **kw) - - -WRITE_FLAGS = functools.reduce( - operator.or_, [getattr(_os, a, 0) for a in - "O_WRONLY O_RDWR O_APPEND O_CREAT O_TRUNC O_TEMPORARY".split()] -) - - -class SandboxViolation(DistutilsError): - """A setup script attempted to modify the filesystem outside the sandbox""" - - tmpl = textwrap.dedent(""" - SandboxViolation: {cmd}{args!r} {kwargs} - - The package setup script has attempted to modify files on your system - that are not within the EasyInstall build area, and has been aborted. - - This package cannot be safely installed by EasyInstall, and may not - support alternate installation locations even if you run its setup - script by hand. Please inform the package's author and the EasyInstall - maintainers to find out if a fix or workaround is available. - """).lstrip() - - def __str__(self): - cmd, args, kwargs = self.args - return self.tmpl.format(**locals()) diff --git a/venv/lib/python2.7/site-packages/setuptools/sandbox.pyc b/venv/lib/python2.7/site-packages/setuptools/sandbox.pyc deleted file mode 100644 index 80d286d9a5763b402bad5106804e708a246b1f58..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21826 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 max_wildcards: - # Issue #17980: avoid denials of service by refusing more - # than one wildcard per fragment. A survey of established - # policy among SSL implementations showed it to be a - # reasonable choice. - raise CertificateError( - "too many wildcards in certificate DNS name: " + repr(dn)) - - # speed up common case w/o wildcards - if not wildcards: - return dn.lower() == hostname.lower() - - # RFC 6125, section 6.4.3, subitem 1. - # The client SHOULD NOT attempt to match a presented identifier in which - # the wildcard character comprises a label other than the left-most label. - if leftmost == '*': - # When '*' is a fragment by itself, it matches a non-empty dotless - # fragment. - pats.append('[^.]+') - elif leftmost.startswith('xn--') or hostname.startswith('xn--'): - # RFC 6125, section 6.4.3, subitem 3. - # The client SHOULD NOT attempt to match a presented identifier - # where the wildcard character is embedded within an A-label or - # U-label of an internationalized domain name. - pats.append(re.escape(leftmost)) - else: - # Otherwise, '*' matches any dotless string, e.g. www* - pats.append(re.escape(leftmost).replace(r'\*', '[^.]*')) - - # add the remaining fragments, ignore any wildcards - for frag in remainder: - pats.append(re.escape(frag)) - - pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE) - return pat.match(hostname) - - def match_hostname(cert, hostname): - """Verify that *cert* (in decoded format as returned by - SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125 - rules are followed, but IP addresses are not accepted for *hostname*. - - CertificateError is raised on failure. On success, the function - returns nothing. - """ - if not cert: - raise ValueError("empty or no certificate") - dnsnames = [] - san = cert.get('subjectAltName', ()) - for key, value in san: - if key == 'DNS': - if _dnsname_match(value, hostname): - return - dnsnames.append(value) - if not dnsnames: - # The subject is only checked when there is no dNSName entry - # in subjectAltName - for sub in cert.get('subject', ()): - for key, value in sub: - # XXX according to RFC 2818, the most specific Common Name - # must be used. - if key == 'commonName': - if _dnsname_match(value, hostname): - return - dnsnames.append(value) - if len(dnsnames) > 1: - raise CertificateError("hostname %r " - "doesn't match either of %s" - % (hostname, ', '.join(map(repr, dnsnames)))) - elif len(dnsnames) == 1: - raise CertificateError("hostname %r " - "doesn't match %r" - % (hostname, dnsnames[0])) - else: - raise CertificateError("no appropriate commonName or " - "subjectAltName fields were found") - - -class VerifyingHTTPSHandler(HTTPSHandler): - """Simple verifying handler: no auth, subclasses, timeouts, etc.""" - - def __init__(self, ca_bundle): - self.ca_bundle = ca_bundle - HTTPSHandler.__init__(self) - - def https_open(self, req): - return self.do_open( - lambda host, **kw: VerifyingHTTPSConn(host, self.ca_bundle, **kw), req - ) - - -class VerifyingHTTPSConn(HTTPSConnection): - """Simple verifying connection: no auth, subclasses, timeouts, etc.""" - - def __init__(self, host, ca_bundle, **kw): - HTTPSConnection.__init__(self, host, **kw) - self.ca_bundle = ca_bundle - - def connect(self): - sock = socket.create_connection( - (self.host, self.port), getattr(self, 'source_address', None) - ) - - # Handle the socket if a (proxy) tunnel is present - if hasattr(self, '_tunnel') and getattr(self, '_tunnel_host', None): - self.sock = sock - self._tunnel() - # http://bugs.python.org/issue7776: Python>=3.4.1 and >=2.7.7 - # change self.host to mean the proxy server host when tunneling is - # being used. Adapt, since we are interested in the destination - # host for the match_hostname() comparison. - actual_host = self._tunnel_host - else: - actual_host = self.host - - if hasattr(ssl, 'create_default_context'): - ctx = ssl.create_default_context(cafile=self.ca_bundle) - self.sock = ctx.wrap_socket(sock, server_hostname=actual_host) - else: - # This is for python < 2.7.9 and < 3.4? - self.sock = ssl.wrap_socket( - sock, cert_reqs=ssl.CERT_REQUIRED, ca_certs=self.ca_bundle - ) - try: - match_hostname(self.sock.getpeercert(), actual_host) - except CertificateError: - self.sock.shutdown(socket.SHUT_RDWR) - self.sock.close() - raise - - -def opener_for(ca_bundle=None): - """Get a urlopen() replacement that uses ca_bundle for verification""" - return urllib.request.build_opener( - VerifyingHTTPSHandler(ca_bundle or find_ca_bundle()) - ).open - - -# from jaraco.functools -def once(func): - @functools.wraps(func) - def wrapper(*args, **kwargs): - if not hasattr(func, 'always_returns'): - func.always_returns = func(*args, **kwargs) - return func.always_returns - return wrapper - - -@once -def get_win_certfile(): - try: - import wincertstore - except ImportError: - return None - - class CertFile(wincertstore.CertFile): - def __init__(self): - super(CertFile, self).__init__() - atexit.register(self.close) - - def close(self): - try: - super(CertFile, self).close() - except OSError: - pass - - _wincerts = CertFile() - _wincerts.addstore('CA') - _wincerts.addstore('ROOT') - return _wincerts.name - - -def find_ca_bundle(): - """Return an existing CA bundle path, or None""" - extant_cert_paths = filter(os.path.isfile, cert_paths) - return ( - get_win_certfile() - or next(extant_cert_paths, None) - or _certifi_where() - ) - - -def _certifi_where(): - try: - return __import__('certifi').where() - except (ImportError, ResolutionError, ExtractionError): - pass diff --git a/venv/lib/python2.7/site-packages/setuptools/ssl_support.pyc b/venv/lib/python2.7/site-packages/setuptools/ssl_support.pyc deleted file mode 100644 index 744449267200ff98ea370f335c8d165e43384750..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9597 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 diff --git a/venv/lib/python2.7/site-packages/setuptools/unicode_utils.py b/venv/lib/python2.7/site-packages/setuptools/unicode_utils.py deleted file mode 100644 index 7c63efd..0000000 --- a/venv/lib/python2.7/site-packages/setuptools/unicode_utils.py +++ /dev/null @@ -1,44 +0,0 @@ -import unicodedata -import sys - -from setuptools.extern import six - - -# HFS Plus uses decomposed UTF-8 -def decompose(path): - if isinstance(path, six.text_type): - return unicodedata.normalize('NFD', path) - try: - path = path.decode('utf-8') - path = unicodedata.normalize('NFD', path) - path = path.encode('utf-8') - except UnicodeError: - pass # Not UTF-8 - return path - - -def filesys_decode(path): - """ - Ensure that the given path is decoded, - NONE when no expected encoding works - """ - - if isinstance(path, six.text_type): - return path - - fs_enc = sys.getfilesystemencoding() or 'utf-8' - candidates = fs_enc, 'utf-8' - - for enc in candidates: - try: - return path.decode(enc) - except UnicodeDecodeError: - continue - - -def try_encode(string, enc): - "turn unicode encoding into a functional routine" - try: - return string.encode(enc) - except UnicodeEncodeError: - return None diff --git a/venv/lib/python2.7/site-packages/setuptools/unicode_utils.pyc b/venv/lib/python2.7/site-packages/setuptools/unicode_utils.pyc deleted file mode 100644 index 07ebdda8e6e5bfc992c4f66ff78e52132d4abbf7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1688 zcmc&#ZEw>s5I!ea$4WQW4)`1)O;i(GHZfI0AcVvUp9m-gZA?N{NZi(2>SVUFwbS|m zjepD!fIFvq5r1G-eL0`c_W7RYT=&m%edE{4j|Aq;!S6fl`Xh=Ie+)8!qZ^&U5wms& zG6%*k9J#W_HKB9%vy4JpJ0?KsLcMi*Qm0C4ey|862Wd zuT8OpHlpyuzNSb@GuYf~KcGmEn+ij;}@*Z3bmk6;w&~iIEz&<$g`9y z9b8O;=}Yxfo}cV=PUUt-?RJtqJ$aR0sBLV+BKR5xj<>uB+lzQmL}g;>5D|YWLQl1Mf`cJ91Ceo!Lq5LVE20z`O5+^(eangp zeoA3vX+>TG-N#jydPyu(fwbbjW@88iyp>v{nZwOsS+lXX-6NLYmx<{XvNd6S<5t zU*$++$wOP$5n**V>s?!bHtUA69_EtUGi-TkqY(CJ6({aL&-C;dH6~`BX@ss@kok*b` zlF2!Txnz>>w0Hb@@S4LKTlC)04KYYM3@U&Lz_JetV9r2x;ETb$1Cs=v%@K4}7s?*^ zOJI!2B-)0-3l%J-t*ruXldMf??80PmCZ-fzSqQI!t$nTn9+Fci z6jBHDdRC*h=C7_%K19Ap2|}!u5V%YFw#}7`nHdS#gg{#WcV0JBRJ@sb{$?vljrgkN z%Tqryi*hvnFvGDw8|UYty^t$EBovN6ai`rtn}E}*8sO-z5D$E_%YVB5%!ym#4h_6| Tx3aF(H6tFPvENBppQY>.+?)-(?P\d.*?) - ((-(?P\d.*?))?-(?P.+?)-(?P.+?)-(?P.+?) - )\.whl$""", - re.VERBOSE).match - -NAMESPACE_PACKAGE_INIT = '''\ -try: - __import__('pkg_resources').declare_namespace(__name__) -except ImportError: - __path__ = __import__('pkgutil').extend_path(__path__, __name__) -''' - - -def unpack(src_dir, dst_dir): - '''Move everything under `src_dir` to `dst_dir`, and delete the former.''' - for dirpath, dirnames, filenames in os.walk(src_dir): - subdir = os.path.relpath(dirpath, src_dir) - for f in filenames: - src = os.path.join(dirpath, f) - dst = os.path.join(dst_dir, subdir, f) - os.renames(src, dst) - for n, d in reversed(list(enumerate(dirnames))): - src = os.path.join(dirpath, d) - dst = os.path.join(dst_dir, subdir, d) - if not os.path.exists(dst): - # Directory does not exist in destination, - # rename it and prune it from os.walk list. - os.renames(src, dst) - del dirnames[n] - # Cleanup. - for dirpath, dirnames, filenames in os.walk(src_dir, topdown=True): - assert not filenames - os.rmdir(dirpath) - - -class Wheel: - - def __init__(self, filename): - match = WHEEL_NAME(os.path.basename(filename)) - if match is None: - raise ValueError('invalid wheel name: %r' % filename) - self.filename = filename - for k, v in match.groupdict().items(): - setattr(self, k, v) - - def tags(self): - '''List tags (py_version, abi, platform) supported by this wheel.''' - return itertools.product( - self.py_version.split('.'), - self.abi.split('.'), - self.platform.split('.'), - ) - - def is_compatible(self): - '''Is the wheel is compatible with the current platform?''' - supported_tags = pep425tags.get_supported() - return next((True for t in self.tags() if t in supported_tags), False) - - def egg_name(self): - return pkg_resources.Distribution( - project_name=self.project_name, version=self.version, - platform=(None if self.platform == 'any' else get_platform()), - ).egg_name() + '.egg' - - def get_dist_info(self, zf): - # find the correct name of the .dist-info dir in the wheel file - for member in zf.namelist(): - dirname = posixpath.dirname(member) - if (dirname.endswith('.dist-info') and - canonicalize_name(dirname).startswith( - canonicalize_name(self.project_name))): - return dirname - raise ValueError("unsupported wheel format. .dist-info not found") - - def install_as_egg(self, destination_eggdir): - '''Install wheel as an egg directory.''' - with zipfile.ZipFile(self.filename) as zf: - self._install_as_egg(destination_eggdir, zf) - - def _install_as_egg(self, destination_eggdir, zf): - dist_basename = '%s-%s' % (self.project_name, self.version) - dist_info = self.get_dist_info(zf) - dist_data = '%s.data' % dist_basename - egg_info = os.path.join(destination_eggdir, 'EGG-INFO') - - self._convert_metadata(zf, destination_eggdir, dist_info, egg_info) - self._move_data_entries(destination_eggdir, dist_data) - self._fix_namespace_packages(egg_info, destination_eggdir) - - @staticmethod - def _convert_metadata(zf, destination_eggdir, dist_info, egg_info): - def get_metadata(name): - with zf.open(posixpath.join(dist_info, name)) as fp: - value = fp.read().decode('utf-8') if PY3 else fp.read() - return email.parser.Parser().parsestr(value) - - wheel_metadata = get_metadata('WHEEL') - # Check wheel format version is supported. - wheel_version = parse_version(wheel_metadata.get('Wheel-Version')) - wheel_v1 = ( - parse_version('1.0') <= wheel_version < parse_version('2.0dev0') - ) - if not wheel_v1: - raise ValueError( - 'unsupported wheel format version: %s' % wheel_version) - # Extract to target directory. - os.mkdir(destination_eggdir) - zf.extractall(destination_eggdir) - # Convert metadata. - dist_info = os.path.join(destination_eggdir, dist_info) - dist = pkg_resources.Distribution.from_location( - destination_eggdir, dist_info, - metadata=pkg_resources.PathMetadata(destination_eggdir, dist_info), - ) - - # Note: Evaluate and strip markers now, - # as it's difficult to convert back from the syntax: - # foobar; "linux" in sys_platform and extra == 'test' - def raw_req(req): - req.marker = None - return str(req) - install_requires = list(sorted(map(raw_req, dist.requires()))) - extras_require = { - extra: sorted( - req - for req in map(raw_req, dist.requires((extra,))) - if req not in install_requires - ) - for extra in dist.extras - } - os.rename(dist_info, egg_info) - os.rename( - os.path.join(egg_info, 'METADATA'), - os.path.join(egg_info, 'PKG-INFO'), - ) - setup_dist = setuptools.Distribution( - attrs=dict( - install_requires=install_requires, - extras_require=extras_require, - ), - ) - write_requirements( - setup_dist.get_command_obj('egg_info'), - None, - os.path.join(egg_info, 'requires.txt'), - ) - - @staticmethod - def _move_data_entries(destination_eggdir, dist_data): - """Move data entries to their correct location.""" - dist_data = os.path.join(destination_eggdir, dist_data) - dist_data_scripts = os.path.join(dist_data, 'scripts') - if os.path.exists(dist_data_scripts): - egg_info_scripts = os.path.join( - destination_eggdir, 'EGG-INFO', 'scripts') - os.mkdir(egg_info_scripts) - for entry in os.listdir(dist_data_scripts): - # Remove bytecode, as it's not properly handled - # during easy_install scripts install phase. - if entry.endswith('.pyc'): - os.unlink(os.path.join(dist_data_scripts, entry)) - else: - os.rename( - os.path.join(dist_data_scripts, entry), - os.path.join(egg_info_scripts, entry), - ) - os.rmdir(dist_data_scripts) - for subdir in filter(os.path.exists, ( - os.path.join(dist_data, d) - for d in ('data', 'headers', 'purelib', 'platlib') - )): - unpack(subdir, destination_eggdir) - if os.path.exists(dist_data): - os.rmdir(dist_data) - - @staticmethod - def _fix_namespace_packages(egg_info, destination_eggdir): - namespace_packages = os.path.join( - egg_info, 'namespace_packages.txt') - if os.path.exists(namespace_packages): - with open(namespace_packages) as fp: - namespace_packages = fp.read().split() - for mod in namespace_packages: - mod_dir = os.path.join(destination_eggdir, *mod.split('.')) - mod_init = os.path.join(mod_dir, '__init__.py') - if os.path.exists(mod_dir) and not os.path.exists(mod_init): - with open(mod_init, 'w') as fp: - fp.write(NAMESPACE_PACKAGE_INIT) diff --git a/venv/lib/python2.7/site-packages/setuptools/wheel.pyc b/venv/lib/python2.7/site-packages/setuptools/wheel.pyc deleted file mode 100644 index 24e0cea6fc37dcc6adc6edaffcfcf5f93524cbf5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9864 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